mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
Compare commits
312 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cce81cabff | ||
![]() |
08a985d183 | ||
![]() |
816126b13a | ||
![]() |
f2a6278daa | ||
![]() |
c1efc0e066 | ||
![]() |
236897cfcc | ||
![]() |
73b4569c07 | ||
![]() |
25de66ed80 | ||
![]() |
a2bbf6cff8 | ||
![]() |
01367d0731 | ||
![]() |
fedc993e57 | ||
![]() |
b597240cfd | ||
![]() |
127c9fe8f4 | ||
![]() |
ffc35fb5ab | ||
![]() |
aa7639485e | ||
![]() |
a4267d4f77 | ||
![]() |
12880db557 | ||
![]() |
881d7f2f51 | ||
![]() |
93335978ea | ||
![]() |
64f62583ce | ||
![]() |
5530d3051b | ||
![]() |
42326ec708 | ||
![]() |
aa54e3c673 | ||
![]() |
5ce7f4faa5 | ||
![]() |
6d20a438db | ||
![]() |
7f662a93df | ||
![]() |
1758a0cd2e | ||
![]() |
9b003b5428 | ||
![]() |
db7fdd57e4 | ||
![]() |
689da52ddf | ||
![]() |
2a1e2d7d6c | ||
![]() |
cf8af91516 | ||
![]() |
c9ff941600 | ||
![]() |
d389f89c49 | ||
![]() |
e05114806a | ||
![]() |
3074494131 | ||
![]() |
a9e161181c | ||
![]() |
f9db0ab8f9 | ||
![]() |
94cc77b848 | ||
![]() |
f16bec1e0a | ||
![]() |
e2c24abf62 | ||
![]() |
50e3aa1f61 | ||
![]() |
3c15588292 | ||
![]() |
fdab158290 | ||
![]() |
921726e0b8 | ||
![]() |
b5e49df180 | ||
![]() |
49fd4acef8 | ||
![]() |
73aa377264 | ||
![]() |
74e909d17f | ||
![]() |
4b3c150004 | ||
![]() |
5ee7948071 | ||
![]() |
f653317e5b | ||
![]() |
de43299841 | ||
![]() |
e6f5d76abe | ||
![]() |
fecd1eb505 | ||
![]() |
9536a8ec64 | ||
![]() |
06a12246f5 | ||
![]() |
456b660b2a | ||
![]() |
5b81f6a977 | ||
![]() |
c854df8ffa | ||
![]() |
22a34d8d68 | ||
![]() |
0f8969e076 | ||
![]() |
f164e889cc | ||
![]() |
1e2a331518 | ||
![]() |
158ff62aaa | ||
![]() |
79af8a46d1 | ||
![]() |
200bf3229c | ||
![]() |
e0b7d4cc60 | ||
![]() |
4fe11b5ea9 | ||
![]() |
0b590ab147 | ||
![]() |
7a20bb4deb | ||
![]() |
c87c242098 | ||
![]() |
eb92182230 | ||
![]() |
5b9efaa2a0 | ||
![]() |
58f7e6f1fe | ||
![]() |
9538dcb6e7 | ||
![]() |
0080f55ef8 | ||
![]() |
aac91e8763 | ||
![]() |
5c0adf9a28 | ||
![]() |
9963a99868 | ||
![]() |
515a531abf | ||
![]() |
d3d16ab7b6 | ||
![]() |
d08027360f | ||
![]() |
70f6ede7b8 | ||
![]() |
c1c70a53be | ||
![]() |
f89bfba5dc | ||
![]() |
c1a66bf9e7 | ||
![]() |
e98c725043 | ||
![]() |
ad527a7033 | ||
![]() |
59706d4698 | ||
![]() |
7addef4f5f | ||
![]() |
08d0a378f8 | ||
![]() |
01381ed084 | ||
![]() |
2c72908f76 | ||
![]() |
32ba71693c | ||
![]() |
7fff3192a6 | ||
![]() |
83aa818c00 | ||
![]() |
56d61bdef3 | ||
![]() |
ebd86b32bd | ||
![]() |
08c718d232 | ||
![]() |
512831dea9 | ||
![]() |
a36bbb0cda | ||
![]() |
8a9e0f0b01 | ||
![]() |
076fd69131 | ||
![]() |
587f7f544e | ||
![]() |
178c486b83 | ||
![]() |
ad1748b8be | ||
![]() |
004f88dae9 | ||
![]() |
97fe824b80 | ||
![]() |
758176dd32 | ||
![]() |
854c1980cc | ||
![]() |
840002b63a | ||
![]() |
47a447dbb0 | ||
![]() |
a1d47cf64a | ||
![]() |
a5bb4c1874 | ||
![]() |
22b593215f | ||
![]() |
68181acec7 | ||
![]() |
3af35fa610 | ||
![]() |
2c12d4f2de | ||
![]() |
bbac9c559c | ||
![]() |
03eaa62902 | ||
![]() |
dcca5ed469 | ||
![]() |
2aa46f5a52 | ||
![]() |
ff3c27ab20 | ||
![]() |
833408c663 | ||
![]() |
38d9f98221 | ||
![]() |
ac4b4266b4 | ||
![]() |
b90bbd9dcf | ||
![]() |
e8f69e197c | ||
![]() |
9922a7095b | ||
![]() |
3c836144e2 | ||
![]() |
8c4a593fb0 | ||
![]() |
0e282833e6 | ||
![]() |
54753caf94 | ||
![]() |
fcba3bed95 | ||
![]() |
d348ac66de | ||
![]() |
fd4f5e7d51 | ||
![]() |
c77fcd2cbc | ||
![]() |
ee385abfef | ||
![]() |
49335ba8a8 | ||
![]() |
8ac186ce17 | ||
![]() |
ca2322a4da | ||
![]() |
a1e7afac76 | ||
![]() |
2f75092d8b | ||
![]() |
6f9e710ec9 | ||
![]() |
0b12d160bb | ||
![]() |
330b45a1ed | ||
![]() |
5f0a0d0363 | ||
![]() |
ad01c2d966 | ||
![]() |
fb5ed82401 | ||
![]() |
eaa7f10b36 | ||
![]() |
f2c8dbe57a | ||
![]() |
447b0459aa | ||
![]() |
e31c64e42e | ||
![]() |
32411b2a90 | ||
![]() |
32f850556e | ||
![]() |
fd94f53e25 | ||
![]() |
4aa7e06a56 | ||
![]() |
033b76af14 | ||
![]() |
e37a5f4d06 | ||
![]() |
58e12e0141 | ||
![]() |
147678b0f0 | ||
![]() |
e6cbd00871 | ||
![]() |
1eb7458af9 | ||
![]() |
38cf5b82b2 | ||
![]() |
a5c59c4b77 | ||
![]() |
d190cc6e40 | ||
![]() |
8234ce1e5f | ||
![]() |
e962e4e1f5 | ||
![]() |
ee970a3fce | ||
![]() |
9242faaa49 | ||
![]() |
b813f7ee56 | ||
![]() |
7f64ef05d5 | ||
![]() |
9cb593c9e4 | ||
![]() |
cfb343d262 | ||
![]() |
9c811c2318 | ||
![]() |
7b97ad6e2f | ||
![]() |
fdea2a2e92 | ||
![]() |
aa0085b57d | ||
![]() |
3fa489c0f9 | ||
![]() |
fbee409f47 | ||
![]() |
7a8aa4eb84 | ||
![]() |
d4bbaa41c3 | ||
![]() |
bb23fe159f | ||
![]() |
b1a02389f6 | ||
![]() |
f10ddcaa17 | ||
![]() |
77f0ce0673 | ||
![]() |
7fc486757d | ||
![]() |
dfc3fdb88b | ||
![]() |
3769bd2a68 | ||
![]() |
80d1b3b204 | ||
![]() |
e66fd28831 | ||
![]() |
1cabf5c31e | ||
![]() |
8341f8cb6a | ||
![]() |
1fc36fce9b | ||
![]() |
33dbb07559 | ||
![]() |
e510c50a24 | ||
![]() |
c345035e12 | ||
![]() |
9bb4789b32 | ||
![]() |
7e26814cfa | ||
![]() |
33855cfbee | ||
![]() |
98bb3e0366 | ||
![]() |
52744fb784 | ||
![]() |
08e5208835 | ||
![]() |
187079842f | ||
![]() |
ef2c5d2df6 | ||
![]() |
92a0a9c197 | ||
![]() |
90e46f535c | ||
![]() |
02fc573e31 | ||
![]() |
b8c7223da7 | ||
![]() |
7b53e25dd5 | ||
![]() |
f8f9d2f65c | ||
![]() |
19e12701f3 | ||
![]() |
24c7311162 | ||
![]() |
599914934c | ||
![]() |
8fdc66d138 | ||
![]() |
83caae7586 | ||
![]() |
1f599e62c6 | ||
![]() |
4e174fd5bf | ||
![]() |
edf3560dd5 | ||
![]() |
7452bf39fb | ||
![]() |
c2bac6d1ef | ||
![]() |
47cd8ccfc8 | ||
![]() |
ec6cab28a5 | ||
![]() |
45de1067bd | ||
![]() |
7ab04b0bcb | ||
![]() |
1a71d44b43 | ||
![]() |
1ea273fba0 | ||
![]() |
591be6c2fd | ||
![]() |
6b02457190 | ||
![]() |
87e5b6d41e | ||
![]() |
7f0c506fea | ||
![]() |
539c2df378 | ||
![]() |
4399e2ab31 | ||
![]() |
210eeff481 | ||
![]() |
95e72dd339 | ||
![]() |
a6d9369204 | ||
![]() |
ab80045329 | ||
![]() |
94aaeac194 | ||
![]() |
4bec5cef01 | ||
![]() |
1500d213e7 | ||
![]() |
2dbe61789d | ||
![]() |
3f9bed938e | ||
![]() |
619d27da81 | ||
![]() |
bfd0f6e744 | ||
![]() |
6d71cabbda | ||
![]() |
317664f88c | ||
![]() |
e7cddd47a5 | ||
![]() |
393dfae33e | ||
![]() |
c69ea0e4d8 | ||
![]() |
59fdcf0ae9 | ||
![]() |
f22ea9eb21 | ||
![]() |
752588ffcd | ||
![]() |
a0f6d7d361 | ||
![]() |
1b5232c2d0 | ||
![]() |
089e68e85e | ||
![]() |
a9ec7cff4f | ||
![]() |
63c2b3642c | ||
![]() |
5e04124211 | ||
![]() |
bbfd4ac280 | ||
![]() |
28fd0ba201 | ||
![]() |
305c026f4e | ||
![]() |
b836042a02 | ||
![]() |
ec95b6bfbe | ||
![]() |
6049ecfc6e | ||
![]() |
6a31381c8e | ||
![]() |
7f8bcf8075 | ||
![]() |
b84a47ad3f | ||
![]() |
f91d0c1693 | ||
![]() |
cd65424b00 | ||
![]() |
944e0f24ae | ||
![]() |
d396a45e64 | ||
![]() |
c0d5ebaaf3 | ||
![]() |
c3b42cc297 | ||
![]() |
4f32d436bb | ||
![]() |
4268a875fa | ||
![]() |
2ec2ef8bbf | ||
![]() |
7ba29029e1 | ||
![]() |
bbdbe62930 | ||
![]() |
b95241dcfe | ||
![]() |
8cc1cd6f2c | ||
![]() |
f7947b3fe3 | ||
![]() |
4c06dd7107 | ||
![]() |
d6db83805d | ||
![]() |
25f4d0199d | ||
![]() |
3bcd5cf308 | ||
![]() |
ce38cf9040 | ||
![]() |
adc2704da0 | ||
![]() |
f999d87f68 | ||
![]() |
7f8446ab82 | ||
![]() |
4d2b61a766 | ||
![]() |
1f3661238a | ||
![]() |
5f236d4d42 | ||
![]() |
8fb3856ea6 | ||
![]() |
418985f90b | ||
![]() |
2c738fa28e | ||
![]() |
8a8ac2e3d1 | ||
![]() |
cf65fd890d | ||
![]() |
6a86fc8067 | ||
![]() |
528039f80b | ||
![]() |
b5875ae890 | ||
![]() |
8801834804 | ||
![]() |
a14a2c9684 | ||
![]() |
269e73168e | ||
![]() |
19eec6305b | ||
![]() |
9930d50f99 | ||
![]() |
9427137dbd | ||
![]() |
c10fd17d19 | ||
![]() |
3c26b98b65 | ||
![]() |
6e357459e6 | ||
![]() |
fe42511c54 | ||
![]() |
32f507ce15 |
211 changed files with 36088 additions and 5727 deletions
6
.github/workflows/main-codeql.yml
vendored
6
.github/workflows/main-codeql.yml
vendored
|
@ -47,6 +47,12 @@ jobs:
|
|||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
name: Install required packages
|
||||
with:
|
||||
packages: libopenal-dev libpulse-dev portaudio19-dev libasound2-dev libjack-dev libpipewire-0.3-dev qtbase5-dev libdbus-1-dev
|
||||
version: "0.1"
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
|
|
246
.github/workflows/shared-build-linux.yml
vendored
Normal file
246
.github/workflows/shared-build-linux.yml
vendored
Normal file
|
@ -0,0 +1,246 @@
|
|||
##########################
|
||||
#
|
||||
# Linux
|
||||
# Ubuntu 22.04
|
||||
#
|
||||
# Using this version instead of 24.04 to use a lower GLIBC version (2.34).
|
||||
# ARM is used for more efficiency, and x64 is used for legacy architectures like PowerPC.
|
||||
##########################
|
||||
name: Linux build workflow
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
environment:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: RelWithDebInfo
|
||||
RELEASE_STAGE: ${{ vars.RELEASE_STAGE || 'unstable' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
{name: 'amd64', os: "ubuntu-22.04-arm", package: 'x86-64-linux-gnu', triple: 'x86_64-linux-gnu', arch_option: 'linux-x86_64'},
|
||||
{name: 'i686', os: "ubuntu-22.04-arm", package: 'i686-linux-gnu', triple: 'i686-linux-gnu', arch_option: 'linux-x86'},
|
||||
{name: 'arm64', os: "ubuntu-22.04-arm", package: 'aarch64-linux-gnu', triple: 'aarch64-linux-gnu', arch_option: 'linux-aarch64'},
|
||||
{name: 'armhf', os: "ubuntu-22.04-arm", package: 'arm-linux-gnueabihf', triple: 'arm-linux-gnueabihf', arch_option: 'linux-armv4'},
|
||||
{name: 'powerpc', os: "ubuntu-22.04", package: 'powerpc-linux-gnu', triple: 'powerpc-linux-gnu', arch_option: 'linux-ppc'},
|
||||
{name: 'ppc64', os: "ubuntu-22.04", package: 'powerpc64-linux-gnu', triple: 'powerpc64-linux-gnu', arch_option: 'linux-ppc64'},
|
||||
{name: 'ppc64el', os: "ubuntu-22.04-arm", package: 'powerpc64le-linux-gnu', triple: 'powerpc64le-linux-gnu', arch_option: 'linux-ppc64le'}
|
||||
]
|
||||
|
||||
name: "Building for platform linux-${{matrix.architecture.name}}"
|
||||
runs-on: ${{ matrix.architecture.os }}
|
||||
environment: ${{ inputs.environment }}
|
||||
env:
|
||||
wolfssl-version: 'v5.7.6-stable'
|
||||
curl-version: '8_12_1'
|
||||
openal-soft-branch: '1.24.3'
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
name: Install required packages
|
||||
with:
|
||||
packages: flex bison ninja-build cmake clang libpulse-dev portaudio19-dev libasound2-dev libjack-dev libpipewire-0.3-dev qtbase5-dev libdbus-1-dev
|
||||
version: "${{ runner.os }}-${{ runner.arch }}-v1"
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "HOST_TRIPLE=$(gcc -dumpmachine)" >> $GITHUB_ENV
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
name: Install required cross-platform packages (${{ matrix.architecture.package }})
|
||||
if: env.HOST_TRIPLE != matrix.architecture.triple
|
||||
with:
|
||||
packages: gcc-12-${{ matrix.architecture.package }} g++-12-${{ matrix.architecture.package }}
|
||||
version: "${{ runner.os }}-${{ runner.arch }}-v1"
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $GITHUB_ENV
|
||||
echo "CC=clang" >> $GITHUB_ENV
|
||||
echo "CXX=clang++" >> $GITHUB_ENV
|
||||
echo "CFLAGS='--target=${{ matrix.architecture.triple }}'" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS='--target=${{ matrix.architecture.triple }}'" >> $GITHUB_ENV
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
# Workaround for when changing the runner OS version
|
||||
cmake-arguments: "-DCACHE_OS_VERSION=Ubuntu_22.04"
|
||||
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
- name: Cache OpenAL
|
||||
id: cache-openal-soft
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/soft-oal/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-openal-soft-${{ env.openal-soft-branch }}-v1
|
||||
|
||||
# soft-oal setup
|
||||
- name: Checkout soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '${{ env.openal-soft-branch }}'
|
||||
|
||||
- name: Configure and install soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DALSOFT_UTILS=OFF \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install'
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# WolfSSL
|
||||
###
|
||||
- name: Cache WolfSSL
|
||||
id: cache-wolfssl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/wolfssl/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-wolfssl-${{ env.wolfssl-version }}-v1
|
||||
|
||||
# WolfSSL setup
|
||||
- name: Checkout WolfSSL
|
||||
if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'wolfssl/wolfssl'
|
||||
path: 'thirdparties/wolfssl'
|
||||
ref: '${{ env.wolfssl-version }}'
|
||||
|
||||
# WolfSSL build
|
||||
- name: Configure and install wolfssl
|
||||
if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/wolfssl
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/wolfssl/install' \
|
||||
-DCMAKE_C_FLAGS="$CFLAGS -fPIC" \
|
||||
-DCMAKE_CXX_FLAGS="$CFLAGS -fPIC" \
|
||||
-DBUILD_SHARED_LIBS=OFF -DWOLFSSL_OPENSSLEXTRA=ON -DWOLFSSL_ASM=OFF -DWOLFSSL_EXAMPLES=OFF -DWOLFSSL_CURL=ON
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# cURL
|
||||
###
|
||||
- name: Cache cURL
|
||||
id: cache-curl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/curl/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-curl-${{ env.curl-version }}-v1
|
||||
|
||||
# cURL setup
|
||||
- name: Checkout cURL
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'curl/curl'
|
||||
path: 'thirdparties/curl'
|
||||
ref: 'curl-${{ env.curl-version }}'
|
||||
|
||||
# cURL build
|
||||
- name: Configure and install curl
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/curl
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/curl/install' \
|
||||
-DCURL_USE_LIBPSL=OFF \
|
||||
-DCURL_USE_WOLFSSL=ON \
|
||||
-DCURL_ZLIB="" \
|
||||
-DCURL_BROTLI="" \
|
||||
-DCURL_ZSTD="" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="-lm" \
|
||||
-DWolfSSL_ROOT='${{github.workspace}}/thirdparties/wolfssl/install'
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM=--log-level=VERBOSE \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' \
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal' \
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/install/include' \
|
||||
-DCURL_ROOT='${{github.workspace}}/thirdparties/curl/install' \
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} \
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'" >> $GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
# Copy libraries
|
||||
mkdir ${{github.workspace}}/package
|
||||
cp -l ${{steps.sdl.outputs.prefix}}/lib/libSDL2-2.0.so.0 '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/soft-oal/install/lib/libopenal.so.1 '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/curl/install/lib*/libcurl.so.4 '${{github.workspace}}/package/'
|
||||
if [ -d ${{github.workspace}}/install/bin ]; then cp -r ${{github.workspace}}/install/bin/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
if [ -d ${{github.workspace}}/install/lib ]; then cp -r ${{github.workspace}}/install/lib/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
|
||||
###
|
||||
# Artifacts
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-linux-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path:
|
||||
${{github.workspace}}/package
|
239
.github/workflows/shared-build-macos.yml
vendored
Normal file
239
.github/workflows/shared-build-macos.yml
vendored
Normal file
|
@ -0,0 +1,239 @@
|
|||
##########################
|
||||
#
|
||||
# Apple macOS
|
||||
# macOS 15
|
||||
#
|
||||
# This version is used as the OS, as it's faster than other versions.
|
||||
##########################
|
||||
name: MacOS build workflow
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
environment:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: RelWithDebInfo
|
||||
RELEASE_STAGE: ${{ vars.RELEASE_STAGE || 'unstable' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
#{name: 'x86_64', triple: 'x86_64-apple-macos10.8'},
|
||||
#{name: 'arm64', triple: 'arm64-apple-macos11'}
|
||||
#{name: 'x86_64', build_name: 'x86_64'},
|
||||
#{name: 'arm64', build_name: 'arm64'},
|
||||
# Compile into an universal binary
|
||||
{name: 'multiarch(arm64-x86_64)', build_name: 'arm64;x86_64' }
|
||||
]
|
||||
|
||||
name: "Building for platform macos-${{matrix.architecture.name}}"
|
||||
runs-on: "macos-15"
|
||||
env:
|
||||
openal-soft-branch: '1.24.3'
|
||||
wolfssl-version: 'v5.7.6-stable'
|
||||
curl-version: '8_12_1'
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
- name: Install required packages
|
||||
run: |
|
||||
brew install git flex bison ninja cmake llvm perl
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $GITHUB_ENV
|
||||
echo "CC=clang" >> $GITHUB_ENV
|
||||
echo "CXX=clang++" >> $GITHUB_ENV
|
||||
echo "MACOSX_DEPLOYMENT_TARGET=10.15" >> $GITHUB_ENV
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
cmake-arguments: "-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}'
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on"
|
||||
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
- name: Cache OpenAL
|
||||
id: cache-openal-soft
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/soft-oal/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-openal-soft-${{ env.openal-soft-branch }}-v1
|
||||
|
||||
# soft-oal setup
|
||||
# Use GCC instead of Clang because of missing SSE intrinsics
|
||||
# It also doesn't enable altivec support on PowerPC by default
|
||||
- name: Checkout soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '${{ env.openal-soft-branch }}'
|
||||
|
||||
# soft-oal build
|
||||
- name: Configure and install soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install' \
|
||||
-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# WolfSSL
|
||||
###
|
||||
# FIXME: Figure out how to compile WolfSSL cross-architecture
|
||||
#
|
||||
# - name: Cache WolfSSL
|
||||
# id: cache-wolfssl
|
||||
# uses: actions/cache@v4
|
||||
# with:
|
||||
# path: 'thirdparties/wolfssl_install'
|
||||
# key: ${{ runner.os }}-${{ matrix.architecture.name }}-wolfssl-${{ env.wolfssl-version }}-v1
|
||||
#
|
||||
# # WolfSSL setup
|
||||
# - name: Checkout WolfSSL
|
||||
# if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
||||
# uses: actions/checkout@v4
|
||||
# with:
|
||||
# repository: 'wolfssl/wolfssl'
|
||||
# path: 'thirdparties/wolfssl'
|
||||
# ref: '${{ env.wolfssl-version }}'
|
||||
#
|
||||
# # WolfSSL build
|
||||
# - name: Configure and install wolfssl
|
||||
# if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
||||
# working-directory: ${{github.workspace}}/thirdparties/wolfssl
|
||||
# run: |
|
||||
# cmake -B ./build \
|
||||
# -DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/wolfssl_install' \
|
||||
# -DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
# -DBUILD_SHARED_LIBS=OFF -DWOLFSSL_OPENSSLEXTRA=ON -DWOLFSSL_ASM=OFF -DWOLFSSL_EXAMPLES=OFF -DWOLFSSL_CURL=ON
|
||||
# cmake --build ./build --config Release --parallel
|
||||
# cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# cURL
|
||||
###
|
||||
- name: Cache cURL
|
||||
id: cache-curl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/curl/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-curl-${{ env.curl-version }}-v1
|
||||
|
||||
# cURL setup
|
||||
- name: Checkout cURL
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'curl/curl'
|
||||
path: 'thirdparties/curl'
|
||||
ref: 'curl-${{ env.curl-version }}'
|
||||
|
||||
# cURL build
|
||||
- name: Configure and install curl
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/curl
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/curl/install' \
|
||||
-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
-DCURL_USE_LIBPSL=OFF \
|
||||
-DCURL_USE_WOLFSSL=OFF \
|
||||
-DCURL_USE_LIBSSH2=OFF \
|
||||
-DUSE_LIBIDN2=OFF \
|
||||
-DUSE_NGHTTP2=OFF \
|
||||
-DCURL_ENABLE_SSL=OFF \
|
||||
-DCURL_ZLIB="" \
|
||||
-DCURL_BROTLI="" \
|
||||
-DCURL_ZSTD="" \
|
||||
-DWolfSSL_ROOT='${{github.workspace}}/thirdparties/wolfssl_install'
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM=--log-level=VERBOSE \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on \
|
||||
-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal/install' \
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/install/include/AL' \
|
||||
-DCURL_ROOT='${{github.workspace}}/thirdparties/curl/install' \
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} \
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'" >> $GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
# Create hard-link and copy symbolic links
|
||||
mkdir ${{github.workspace}}/package
|
||||
cp -l ${{steps.sdl.outputs.prefix}}/lib/libSDL2-2.0.0.dylib '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/soft-oal/install/lib/libopenal.1.dylib '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/curl/install/lib*/libcurl.4.dylib '${{github.workspace}}/package/'
|
||||
if [ -d ${{github.workspace}}/install/bin ]; then cp -r ${{github.workspace}}/install/bin/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
if [ -d ${{github.workspace}}/install/lib ]; then cp -r ${{github.workspace}}/install/lib/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
|
||||
###
|
||||
# Artifacts
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-macos-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path:
|
||||
${{github.workspace}}/package
|
259
.github/workflows/shared-build-windows.yml
vendored
Normal file
259
.github/workflows/shared-build-windows.yml
vendored
Normal file
|
@ -0,0 +1,259 @@
|
|||
##########################
|
||||
#
|
||||
# Microsoft Windows
|
||||
# Windows Server 2025
|
||||
#
|
||||
##########################
|
||||
name: Windows build workflow
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
environment:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: RelWithDebInfo
|
||||
RELEASE_STAGE: ${{ vars.RELEASE_STAGE || 'unstable' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
{name: 'x64', os: 'windows-2025', config: 'x64', toolset: 'x64', arch_option: 'VC-WIN64A' },
|
||||
{name: 'x86', os: 'windows-2025', config: 'Win32', toolset: 'x64_x86', arch_option: 'VC-WIN32' },
|
||||
{name: 'arm64', os: 'windows-11-arm', config: 'ARM64', toolset: 'x64_arm64', arch_option: 'VC-WIN64-ARM' }
|
||||
]
|
||||
|
||||
name: "Building for platform windows-${{matrix.architecture.name}}"
|
||||
runs-on: ${{ matrix.architecture.os }}
|
||||
environment: ${{ inputs.environment }}
|
||||
env:
|
||||
flexbison-branch: 'v2.5.25'
|
||||
wolfssl-version: 'v5.7.6-stable'
|
||||
curl-version: '8_12_1'
|
||||
openal-soft-branch: '1.24.3'
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
- name: Cache Flex/Bison
|
||||
id: cache-flexbison
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/winflexbison-install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-flexbison-${{ env.flexbison-branch }}-v1
|
||||
|
||||
- name: Install Flex/Bison
|
||||
if: steps.cache-flexbison.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
mkdir thirdparties && cd thirdparties
|
||||
git clone --depth 1 --single-branch --branch ${{ env.flexbison-branch }} https://github.com/lexxmark/winflexbison.git
|
||||
cmake -B winflexbison-build -DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/winflexbison-install' ./winflexbison
|
||||
cmake --build winflexbison-build --config Release --parallel
|
||||
cmake --install winflexbison-build --config Release
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $env:GITHUB_ENV
|
||||
echo "CC=cl.exe" >> $env:GITHUB_ENV
|
||||
echo "CXX=cl.exe" >> $env:GITHUB_ENV
|
||||
pushd "$($env:PROGRAMFILES)\Microsoft Visual Studio\*\*\VC\Auxiliary\Build"
|
||||
cmd /c "vcvarsall.bat ${{ matrix.architecture.toolset }} & set" | ForEach-Object {
|
||||
if ($_ -match "=") {
|
||||
# Split into key=value
|
||||
$var = $_.split("=", 2);
|
||||
echo "$($var[0])=$($var[1])" >> $env:GITHUB_ENV
|
||||
}
|
||||
}
|
||||
popd
|
||||
|
||||
- name: Cache Required Packages
|
||||
id: cache-required-packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'C:\Packages'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-required-packages-v1
|
||||
|
||||
- name: Install required packages
|
||||
if: steps.cache-required-packages.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
$DownloadPath="$($env:USERPROFILE)\Downloads"
|
||||
if ("${{ matrix.architecture.config }}" -ieq "ARM64") {
|
||||
Invoke-WebRequest "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-winarm64.zip" -OutFile "$DownloadPath\ninja-win.zip"
|
||||
} else {
|
||||
Invoke-WebRequest "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-win.zip" -OutFile "$DownloadPath\ninja-win.zip"
|
||||
}
|
||||
Expand-Archive -Path "$DownloadPath\ninja-win.zip" -DestinationPath "C:\Packages\ninja"
|
||||
Invoke-WebRequest "https://download.qt.io/official_releases/jom/jom.zip" -OutFile "$DownloadPath\jom.zip"
|
||||
Expand-Archive -Path "$DownloadPath\jom.zip" -DestinationPath "C:\Packages\jom"
|
||||
|
||||
- name: Setup required packages path
|
||||
run: |
|
||||
$env:PATH += ";C:\Packages\ninja;C:\Packages\jom;"
|
||||
echo "PATH=$($env:PATH)" >> $env:GITHUB_ENV
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
cmake-arguments: ""
|
||||
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
- name: Cache OpenAL
|
||||
id: cache-openal-soft
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/soft-oal/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-openal-soft-${{ env.openal-soft-branch }}-v1
|
||||
|
||||
# soft-oal setup
|
||||
- name: Checkout soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '${{ env.openal-soft-branch }}'
|
||||
|
||||
# soft-oal build
|
||||
# Statically link the CRT runtime into OAL as a workaround to prevent crashes
|
||||
- name: Configure and install soft-oal
|
||||
if: steps.cache-openal-soft.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build `
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install' `
|
||||
-DALSOFT_BUILD_ROUTER=OFF `
|
||||
-DALSOFT_REQUIRE_WINMM=ON `
|
||||
-DALSOFT_REQUIRE_DSOUND=ON `
|
||||
-DALSOFT_REQUIRE_WASAPI=ON `
|
||||
-DCMAKE_C_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_C_FLAGS_MINSIZEREL="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_MINSIZEREL="/MT /O1 /Ob1 /DNDEBUG" `
|
||||
-DCMAKE_C_FLAGS_RELWITHDEBINFO="/MT /Zi /O2 /Ob1 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /Zi /O2 /Ob1 /DNDEBUG"
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
# Unfortunately soft-oal produces a binary called OpenAL32 even in 64-bit
|
||||
if (("x64", "ARM64") -icontains "${{ matrix.architecture.config }}") { Rename-Item -Path '.\install\bin\OpenAL32.dll' -NewName 'OpenAL64.dll' }
|
||||
|
||||
###
|
||||
# cURL
|
||||
#
|
||||
# Uses Schannel as SSL backend, native CAs are used
|
||||
###
|
||||
- name: Cache cURL
|
||||
id: cache-curl
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'thirdparties/curl/install'
|
||||
key: ${{ runner.os }}-${{ matrix.architecture.name }}-curl-${{ env.curl-version }}-v1
|
||||
|
||||
# cURL setup
|
||||
- name: Checkout cURL
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'curl/curl'
|
||||
path: 'thirdparties/curl'
|
||||
ref: 'curl-${{ env.curl-version }}'
|
||||
|
||||
# cURL build
|
||||
- name: Configure and install curl
|
||||
if: steps.cache-curl.outputs.cache-hit != 'true'
|
||||
working-directory: ${{github.workspace}}/thirdparties/curl
|
||||
run: |
|
||||
cmake -B ./build `
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/curl/install' `
|
||||
-DCURL_USE_LIBPSL=OFF `
|
||||
-DCURL_USE_SCHANNEL=ON
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM= `
|
||||
--log-level=VERBOSE `
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' `
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} `
|
||||
-DBISON_EXECUTABLE='${{github.workspace}}/thirdparties/winflexbison-install/win_bison.exe' `
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal' `
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/install/include' `
|
||||
-DCURL_ROOT='${{github.workspace}}/thirdparties/curl/install' `
|
||||
-DFLEX_EXECUTABLE='${{github.workspace}}/thirdparties/winflexbison-install/win_flex.exe' `
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'".Replace("`r", "").Replace("`n", "") >> $env:GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
New-Item -ItemType Directory '${{github.workspace}}/package'
|
||||
Copy-Item '${{steps.sdl.outputs.prefix}}/bin/*.dll' -Destination '${{github.workspace}}/package'
|
||||
Copy-Item '${{github.workspace}}/thirdparties/soft-oal/install/bin/*.dll' -Destination '${{github.workspace}}/package'
|
||||
Copy-Item '${{github.workspace}}/thirdparties/curl/install/bin/*.dll' -Destination '${{github.workspace}}/package'
|
||||
if (Test-Path ${{github.workspace}}/install/bin) { Copy-Item '${{github.workspace}}/install/bin/*' -Include '*.dll','*.exe','*.pdb' -Destination '${{github.workspace}}/package' }
|
||||
if (Test-Path ${{github.workspace}}/install/lib) { Copy-Item '${{github.workspace}}/install/lib/*' -Include '*.dll','*.exe','*.pdb' -Destination '${{github.workspace}}/package' }
|
||||
|
||||
###
|
||||
# Artifact
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-windows-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{github.workspace}}/package
|
||||
!${{github.workspace}}/package/**/*.pdb
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-windows-${{matrix.architecture.name}}-pdb
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{github.workspace}}/package
|
464
.github/workflows/shared-build.yml
vendored
464
.github/workflows/shared-build.yml
vendored
|
@ -7,468 +7,18 @@ on:
|
|||
required: true
|
||||
type: string
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: RelWithDebInfo
|
||||
RELEASE_STAGE: ${{ vars.RELEASE_STAGE || 'unstable' }}
|
||||
|
||||
jobs:
|
||||
##########################
|
||||
#
|
||||
# Linux
|
||||
# Ubuntu 22.04
|
||||
#
|
||||
# Using this version instead of 24.04 to use a lower GLIBC version (2.34)
|
||||
##########################
|
||||
build-platform-linux:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
{name: 'amd64', triple: 'x86_64-linux-gnu'},
|
||||
{name: 'i686', triple: 'i686-linux-gnu'},
|
||||
{name: 'arm64', triple: 'aarch64-linux-gnu'},
|
||||
{name: 'armhf', triple: 'arm-linux-gnueabihf'},
|
||||
{name: 'powerpc', triple: 'powerpc-linux-gnu'},
|
||||
{name: 'ppc64', triple: 'powerpc64-linux-gnu'},
|
||||
{name: 'ppc64el', triple: 'powerpc64le-linux-gnu'}
|
||||
]
|
||||
|
||||
name: "Building for platform linux-${{matrix.architecture.name}}"
|
||||
runs-on: "ubuntu-22.04"
|
||||
environment: ${{ inputs.environment }}
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
name: Install required packages
|
||||
uses: ./.github/workflows/shared-build-linux.yml
|
||||
with:
|
||||
packages: flex bison ninja-build cmake clang libpulse-dev portaudio19-dev libasound2-dev libjack-dev libpipewire-0.3-dev qtbase5-dev libdbus-1-dev
|
||||
version: "0.1"
|
||||
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
name: Install required cross-platform packages (${{ matrix.architecture.triple }})
|
||||
if: matrix.architecture.name != 'amd64'
|
||||
with:
|
||||
packages: gcc-12-${{ matrix.architecture.triple }} g++-12-${{ matrix.architecture.triple }}
|
||||
version: "0.1"
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $GITHUB_ENV
|
||||
echo "CC=clang" >> $GITHUB_ENV
|
||||
echo "CXX=clang++" >> $GITHUB_ENV
|
||||
echo "CFLAGS='--target=${{ matrix.architecture.triple }}'" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS='--target=${{ matrix.architecture.triple }}'" >> $GITHUB_ENV
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
# Workaround for when changing the runner OS version
|
||||
cmake-arguments: "-DCACHE_OS_VERSION=Ubuntu_22.04"
|
||||
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
|
||||
# soft-oal setup
|
||||
- name: Checkout soft-oal
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '1.24.1'
|
||||
|
||||
- name: Configure and install soft-oal
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install'
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM=--log-level=VERBOSE \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' \
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal' \
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/include' \
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} \
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'" >> $GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
# Copy libraries
|
||||
mkdir ${{github.workspace}}/package
|
||||
cp -l ${{steps.sdl.outputs.prefix}}/lib/libSDL2-2.0.so.0 '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/soft-oal/install/lib/libopenal.so.1 '${{github.workspace}}/package/'
|
||||
if [ -d ${{github.workspace}}/install/bin ]; then cp -r ${{github.workspace}}/install/bin/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
if [ -d ${{github.workspace}}/install/lib ]; then cp -r ${{github.workspace}}/install/lib/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
|
||||
###
|
||||
# Artifacts
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-linux-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path:
|
||||
${{github.workspace}}/package
|
||||
|
||||
##########################
|
||||
#
|
||||
# Microsoft Windows
|
||||
# Windows Server 2022
|
||||
#
|
||||
##########################
|
||||
build-platform-windows:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
{name: 'x64', config: 'x64', toolset: 'x64' },
|
||||
{name: 'x86', config: 'Win32', toolset: 'x64_x86' },
|
||||
{name: 'arm64', config: 'ARM64', toolset: 'x64_arm64' }
|
||||
]
|
||||
|
||||
name: "Building for platform windows-${{matrix.architecture.name}}"
|
||||
runs-on: "windows-2022"
|
||||
environment: ${{ inputs.environment }}
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
#
|
||||
# Commented out for now, chocolatey servers started complaining about too many requests
|
||||
#
|
||||
#- name: Install required packages
|
||||
# run: |
|
||||
# choco install -y ninja
|
||||
|
||||
- name: Install required packages
|
||||
run: |
|
||||
$DownloadPath="$($env:USERPROFILE)\Downloads"
|
||||
Invoke-WebRequest "https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-win.zip" -OutFile "$DownloadPath\ninja-win.zip"
|
||||
Expand-Archive -Path "$DownloadPath\ninja-win.zip" -DestinationPath "$($env:PROGRAMFILES)\ninja"
|
||||
echo "$($env:PROGRAMFILES)\ninja" >> $GITHUB_PATH
|
||||
|
||||
- name: Install Flex/Bison
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
mkdir thirdparties && cd thirdparties
|
||||
git clone --depth 1 --single-branch --branch v2.5.25 https://github.com/lexxmark/winflexbison.git
|
||||
cmake -B winflexbison-build -DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/winflexbison-install' ./winflexbison
|
||||
cmake --build winflexbison-build --config Release --parallel
|
||||
cmake --install winflexbison-build --config Release
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $env:GITHUB_ENV
|
||||
echo "CC=cl.exe" >> $env:GITHUB_ENV
|
||||
echo "CXX=cl.exe" >> $env:GITHUB_ENV
|
||||
pushd "$($env:PROGRAMFILES)\Microsoft Visual Studio\*\*\VC\Auxiliary\Build"
|
||||
cmd /c "vcvarsall.bat ${{ matrix.architecture.toolset }} & set" | ForEach-Object {
|
||||
if ($_ -match "=") {
|
||||
# Split into key=value
|
||||
$var = $_.split("=", 2);
|
||||
echo "$($var[0])=$($var[1])" >> $env:GITHUB_ENV
|
||||
}
|
||||
}
|
||||
popd
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
cmake-arguments: ""
|
||||
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
|
||||
# soft-oal setup
|
||||
- name: Checkout soft-oal
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '1.24.1'
|
||||
|
||||
# soft-oal build
|
||||
# Statically link the CRT runtime into OAL as a workaround to prevent crashes
|
||||
- name: Configure and install soft-oal
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build `
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install' `
|
||||
-DALSOFT_BUILD_ROUTER=OFF `
|
||||
-DALSOFT_REQUIRE_WINMM=ON `
|
||||
-DALSOFT_REQUIRE_DSOUND=ON `
|
||||
-DALSOFT_REQUIRE_WASAPI=ON `
|
||||
-DCMAKE_C_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_C_FLAGS_MINSIZEREL="/MT /O2 /Ob2 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_MINSIZEREL="/MT /O1 /Ob1 /DNDEBUG" `
|
||||
-DCMAKE_C_FLAGS_RELWITHDEBINFO="/MT /Zi /O2 /Ob1 /DNDEBUG" `
|
||||
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /Zi /O2 /Ob1 /DNDEBUG"
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
# Unfortunately soft-oal produces a binary called OpenAL32 even in 64-bit
|
||||
if (("x64", "ARM64") -icontains "${{ matrix.architecture.config }}") { Rename-Item -Path '.\install\bin\OpenAL32.dll' -NewName 'OpenAL64.dll' }
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM= `
|
||||
--log-level=VERBOSE `
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' `
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} `
|
||||
-DBISON_EXECUTABLE='${{github.workspace}}/thirdparties/winflexbison-install/win_bison.exe' `
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal' `
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/include' `
|
||||
-DFLEX_EXECUTABLE='${{github.workspace}}/thirdparties/winflexbison-install/win_flex.exe' `
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'".Replace("`r", "").Replace("`n", "") >> $env:GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
New-Item -ItemType Directory '${{github.workspace}}/package'
|
||||
Copy-Item '${{steps.sdl.outputs.prefix}}/bin/*.dll' -Destination '${{github.workspace}}/package'
|
||||
Copy-Item '${{github.workspace}}/thirdparties/soft-oal/install/bin/*.dll' -Destination '${{github.workspace}}/package'
|
||||
if (Test-Path ${{github.workspace}}/install/bin) { Copy-Item '${{github.workspace}}/install/bin/*' -Include '*.dll','*.exe','*.pdb' -Destination '${{github.workspace}}/package' }
|
||||
if (Test-Path ${{github.workspace}}/install/lib) { Copy-Item '${{github.workspace}}/install/lib/*' -Include '*.dll','*.exe','*.pdb' -Destination '${{github.workspace}}/package' }
|
||||
|
||||
###
|
||||
# Artifact
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-windows-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{github.workspace}}/package
|
||||
!${{github.workspace}}/package/**/*.pdb
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-windows-${{matrix.architecture.name}}-pdb
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{github.workspace}}/package
|
||||
|
||||
##########################
|
||||
#
|
||||
# Apple macOS
|
||||
# macOS 14
|
||||
#
|
||||
# This version is used as the OS, as older versions are slower.
|
||||
##########################
|
||||
build-platform-macos:
|
||||
strategy:
|
||||
matrix:
|
||||
architecture: [
|
||||
#{name: 'x86_64', triple: 'x86_64-apple-macos10.8'},
|
||||
#{name: 'arm64', triple: 'arm64-apple-macos11'}
|
||||
#{name: 'x86_64', build_name: 'x86_64'},
|
||||
#{name: 'arm64', build_name: 'arm64'},
|
||||
# Compile into an universal binary
|
||||
{name: 'multiarch(arm64-x86_64)', build_name: 'arm64;x86_64' }
|
||||
]
|
||||
|
||||
name: "Building for platform macos-${{matrix.architecture.name}}"
|
||||
runs-on: "macos-15"
|
||||
environment: ${{inputs.environment}}
|
||||
|
||||
steps:
|
||||
###
|
||||
# Packages
|
||||
###
|
||||
|
||||
# Install required packages
|
||||
# Paths on x86_64 and ARM64 are different for homebrew
|
||||
- name: Install required packages
|
||||
run: |
|
||||
brew update && brew install git flex bison ninja cmake llvm ninja
|
||||
|
||||
- name: Settings
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
echo "CMAKE_GENERATOR=Ninja Multi-Config" >> $GITHUB_ENV
|
||||
echo "CC=clang" >> $GITHUB_ENV
|
||||
echo "CXX=clang++" >> $GITHUB_ENV
|
||||
echo "MACOSX_DEPLOYMENT_TARGET=10.15" >> $GITHUB_ENV
|
||||
|
||||
###
|
||||
# SDL
|
||||
###
|
||||
|
||||
# Setup SDL
|
||||
- name: Set up SDL
|
||||
id: sdl
|
||||
uses: libsdl-org/setup-sdl@main
|
||||
build-platform-windows:
|
||||
uses: ./.github/workflows/shared-build-windows.yml
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
cmake-arguments: "-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}'
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on"
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
environment: ${{inputs.environment}}
|
||||
|
||||
# soft-oal setup
|
||||
# Use GCC instead of Clang because of missing SSE intrinsics
|
||||
# It also doesn't enable altivec support on PowerPC by default
|
||||
- name: Checkout soft-oal
|
||||
uses: actions/checkout@v4
|
||||
build-platform-macos:
|
||||
uses: ./.github/workflows/shared-build-macos.yml
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '1.24.1'
|
||||
|
||||
- name: Configure and install soft-oal
|
||||
working-directory: ${{github.workspace}}/thirdparties/soft-oal
|
||||
run: |
|
||||
cmake -B ./build \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/thirdparties/soft-oal/install' \
|
||||
-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on
|
||||
cmake --build ./build --config Release --parallel
|
||||
cmake --install ./build --config Release
|
||||
|
||||
###
|
||||
# Project
|
||||
###
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: 'source'
|
||||
|
||||
- name: CMake Settings
|
||||
run: |
|
||||
echo "CMAKE_PARAM=--log-level=VERBOSE \
|
||||
-DCMAKE_INSTALL_PREFIX='${{github.workspace}}/install' \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on \
|
||||
-DCMAKE_OSX_ARCHITECTURES='${{ matrix.architecture.build_name }}' \
|
||||
-DOPENAL_LIBRARY='${{github.workspace}}/thirdparties/soft-oal/install' \
|
||||
-DOPENAL_INCLUDE_DIR='${{github.workspace}}/thirdparties/soft-oal/install/include/AL' \
|
||||
-DGIT_REVISION_BUILD_NUMBER=${{ github.run_number }} \
|
||||
-DPRODUCT_VERSION_STAGE='${{ env.RELEASE_STAGE }}'" >> $GITHUB_ENV
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake -B ./build ${{ env.CMAKE_PARAM }} ./source
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
run: |
|
||||
cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel
|
||||
|
||||
- name: Test
|
||||
working-directory: ${{github.workspace}}
|
||||
# Execute tests defined by the CMake configuration.
|
||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
||||
run: |
|
||||
cd "${{github.workspace}}/build"
|
||||
ctest -C ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Install
|
||||
working-directory: ${{github.workspace}}
|
||||
# Install to the directory defined in CMAKE_INSTALL_PREFIX
|
||||
run: |
|
||||
cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||
# Create hard-link and copy symbolic links
|
||||
mkdir ${{github.workspace}}/package
|
||||
cp -l ${{steps.sdl.outputs.prefix}}/lib/libSDL2-2.0.0.dylib '${{github.workspace}}/package/'
|
||||
cp -l ${{github.workspace}}/thirdparties/soft-oal/install/lib/libopenal.1.dylib '${{github.workspace}}/package/'
|
||||
if [ -d ${{github.workspace}}/install/bin ]; then cp -r ${{github.workspace}}/install/bin/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
if [ -d ${{github.workspace}}/install/lib ]; then cp -r ${{github.workspace}}/install/lib/openmohaa/. '${{github.workspace}}/package'; fi
|
||||
|
||||
###
|
||||
# Artifacts
|
||||
###
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: out-macos-${{matrix.architecture.name}}
|
||||
if-no-files-found: error
|
||||
path:
|
||||
${{github.workspace}}/package
|
||||
environment: ${{inputs.environment}}
|
||||
|
|
12
README.md
12
README.md
|
@ -16,7 +16,9 @@ The main goal of OpenMoHAA is to ensure the future and continuity of **Medal of
|
|||
|
||||
- [Downloading and installing OpenMoHAA](docs/getting_started_installation.md)
|
||||
- [Running OpenMoHAA and using expansion assets](docs/getting_started_running.md)
|
||||
- [Dedicated server configuration](docs/configuration/server.md)
|
||||
- [Game configuration](docs/configuration.md)
|
||||
|
||||
If you encounter any issues, please refer to the [FAQ](docs/faq.md) for possible solutions.
|
||||
|
||||
## Current state
|
||||
|
||||
|
@ -35,7 +37,13 @@ One of the big multiplayer features are bots. They were introduced for testing a
|
|||
## Features
|
||||
|
||||
- [List of new features](docs/features.md)
|
||||
- [Scripting commands](https://htmlpreview.github.io/?https://github.com/openmoh/openmohaa/blob/main/docs/features_g_allclasses.html)
|
||||
- [Scripting](docs/scripting.md)
|
||||
|
||||
## Reporting issues
|
||||
|
||||
If you encounter a bug, report it by creating a new [issue](https://github.com/openmoh/openmohaa/issues). Make sure to select the `Bug report` template and fill in the appropriate fields.
|
||||
|
||||
If you need help or have a problem, you can head over to the [discussions](https://github.com/openmoh/openmohaa/discussions) or join the OpenMoHAA Discord server (the link is at the bottom of this README).
|
||||
|
||||
## Compiling
|
||||
|
||||
|
|
551
code/AL/al.h
551
code/AL/al.h
|
@ -1,8 +1,40 @@
|
|||
#ifndef AL_AL_H
|
||||
#define AL_AL_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
/* NOLINTBEGIN */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
#ifdef _MSVC_LANG
|
||||
#define AL_CPLUSPLUS _MSVC_LANG
|
||||
#else
|
||||
#define AL_CPLUSPLUS __cplusplus
|
||||
#endif
|
||||
|
||||
#ifndef AL_DISABLE_NOEXCEPT
|
||||
#if AL_CPLUSPLUS >= 201103L
|
||||
#define AL_API_NOEXCEPT noexcept
|
||||
#else
|
||||
#define AL_API_NOEXCEPT
|
||||
#endif
|
||||
#if AL_CPLUSPLUS >= 201703L
|
||||
#define AL_API_NOEXCEPT17 noexcept
|
||||
#else
|
||||
#define AL_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#else /* AL_DISABLE_NOEXCEPT */
|
||||
|
||||
#define AL_API_NOEXCEPT
|
||||
#define AL_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#undef AL_CPLUSPLUS
|
||||
|
||||
#else /* __cplusplus */
|
||||
|
||||
#define AL_API_NOEXCEPT
|
||||
#define AL_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#ifndef AL_API
|
||||
|
@ -15,14 +47,14 @@ extern "C" {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#ifdef _WIN32
|
||||
#define AL_APIENTRY __cdecl
|
||||
#else
|
||||
#define AL_APIENTRY
|
||||
#endif
|
||||
|
||||
|
||||
/** Deprecated macro. */
|
||||
/* Deprecated macros. */
|
||||
#define OPENAL
|
||||
#define ALAPI AL_API
|
||||
#define ALAPIENTRY AL_APIENTRY
|
||||
|
@ -30,7 +62,7 @@ extern "C" {
|
|||
#define AL_ILLEGAL_ENUM AL_INVALID_ENUM
|
||||
#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
|
||||
|
||||
/** Supported AL version. */
|
||||
/* Supported AL versions. */
|
||||
#define AL_VERSION_1_0
|
||||
#define AL_VERSION_1_1
|
||||
|
||||
|
@ -40,43 +72,43 @@ typedef char ALboolean;
|
|||
/** character */
|
||||
typedef char ALchar;
|
||||
|
||||
/** signed 8-bit 2's complement integer */
|
||||
/** signed 8-bit integer */
|
||||
typedef signed char ALbyte;
|
||||
|
||||
/** unsigned 8-bit integer */
|
||||
typedef unsigned char ALubyte;
|
||||
|
||||
/** signed 16-bit 2's complement integer */
|
||||
/** signed 16-bit integer */
|
||||
typedef short ALshort;
|
||||
|
||||
/** unsigned 16-bit integer */
|
||||
typedef unsigned short ALushort;
|
||||
|
||||
/** signed 32-bit 2's complement integer */
|
||||
/** signed 32-bit integer */
|
||||
typedef int ALint;
|
||||
|
||||
/** unsigned 32-bit integer */
|
||||
typedef unsigned int ALuint;
|
||||
|
||||
/** non-negative 32-bit binary integer size */
|
||||
/** non-negative 32-bit integer size */
|
||||
typedef int ALsizei;
|
||||
|
||||
/** enumerated 32-bit value */
|
||||
/** 32-bit enumeration value */
|
||||
typedef int ALenum;
|
||||
|
||||
/** 32-bit IEEE754 floating-point */
|
||||
/** 32-bit IEEE-754 floating-point */
|
||||
typedef float ALfloat;
|
||||
|
||||
/** 64-bit IEEE754 floating-point */
|
||||
/** 64-bit IEEE-754 floating-point */
|
||||
typedef double ALdouble;
|
||||
|
||||
/** void type (for opaque pointers only) */
|
||||
/** void type (opaque pointers only) */
|
||||
typedef void ALvoid;
|
||||
|
||||
|
||||
/* Enumerant values begin at column 50. No tabs. */
|
||||
/* Enumeration values begin at column 50. Do not use tabs. */
|
||||
|
||||
/** "no distance model" or "no buffer" */
|
||||
/** No distance model or no buffer */
|
||||
#define AL_NONE 0
|
||||
|
||||
/** Boolean False. */
|
||||
|
@ -89,10 +121,10 @@ typedef void ALvoid;
|
|||
/**
|
||||
* Relative source.
|
||||
* Type: ALboolean
|
||||
* Range: [AL_TRUE, AL_FALSE]
|
||||
* Range: [AL_FALSE, AL_TRUE]
|
||||
* Default: AL_FALSE
|
||||
*
|
||||
* Specifies if the Source has relative coordinates.
|
||||
* Specifies if the source uses relative coordinates.
|
||||
*/
|
||||
#define AL_SOURCE_RELATIVE 0x202
|
||||
|
||||
|
@ -103,7 +135,8 @@ typedef void ALvoid;
|
|||
* Range: [0 - 360]
|
||||
* Default: 360
|
||||
*
|
||||
* The angle covered by the inner cone, where the source will not attenuate.
|
||||
* The angle covered by the inner cone, the area within which the source will
|
||||
* not be attenuated by direction.
|
||||
*/
|
||||
#define AL_CONE_INNER_ANGLE 0x1001
|
||||
|
||||
|
@ -112,8 +145,8 @@ typedef void ALvoid;
|
|||
* Range: [0 - 360]
|
||||
* Default: 360
|
||||
*
|
||||
* The angle covered by the outer cone, where the source will be fully
|
||||
* attenuated.
|
||||
* The angle covered by the outer cone, the area outside of which the source
|
||||
* will be fully attenuated by direction.
|
||||
*/
|
||||
#define AL_CONE_OUTER_ANGLE 0x1002
|
||||
|
||||
|
@ -123,7 +156,7 @@ typedef void ALvoid;
|
|||
* Range: [0.5 - 2.0]
|
||||
* Default: 1.0
|
||||
*
|
||||
* A multiplier for the frequency (sample rate) of the source's buffer.
|
||||
* A multiplier for the sample rate of the source's buffer.
|
||||
*/
|
||||
#define AL_PITCH 0x1003
|
||||
|
||||
|
@ -134,12 +167,12 @@ typedef void ALvoid;
|
|||
*
|
||||
* The source or listener location in three dimensional space.
|
||||
*
|
||||
* OpenAL, like OpenGL, uses a right handed coordinate system, where in a
|
||||
* frontal default view X (thumb) points right, Y points up (index finger), and
|
||||
* Z points towards the viewer/camera (middle finger).
|
||||
* OpenAL uses a right handed coordinate system, like OpenGL, where with a
|
||||
* default view, X points right (thumb), Y points up (index finger), and Z
|
||||
* points towards the viewer/camera (middle finger).
|
||||
*
|
||||
* To switch from a left handed coordinate system, flip the sign on the Z
|
||||
* coordinate.
|
||||
* To change from or to a left handed coordinate system, negate the Z
|
||||
* component.
|
||||
*/
|
||||
#define AL_POSITION 0x1004
|
||||
|
||||
|
@ -148,8 +181,11 @@ typedef void ALvoid;
|
|||
* Type: ALfloat[3], ALint[3]
|
||||
* Default: {0, 0, 0}
|
||||
*
|
||||
* Specifies the current direction in local space.
|
||||
* A zero-length vector specifies an omni-directional source (cone is ignored).
|
||||
* Specifies the current direction in local space. A zero-length vector
|
||||
* specifies an omni-directional source (cone is ignored).
|
||||
*
|
||||
* To change from or to a left handed coordinate system, negate the Z
|
||||
* component.
|
||||
*/
|
||||
#define AL_DIRECTION 0x1005
|
||||
|
||||
|
@ -158,26 +194,30 @@ typedef void ALvoid;
|
|||
* Type: ALfloat[3], ALint[3]
|
||||
* Default: {0, 0, 0}
|
||||
*
|
||||
* Specifies the current velocity in local space.
|
||||
* Specifies the current velocity, relative to the position.
|
||||
*
|
||||
* To change from or to a left handed coordinate system, negate the Z
|
||||
* component.
|
||||
*/
|
||||
#define AL_VELOCITY 0x1006
|
||||
|
||||
/**
|
||||
* Source looping.
|
||||
* Type: ALboolean
|
||||
* Range: [AL_TRUE, AL_FALSE]
|
||||
* Range: [AL_FALSE, AL_TRUE]
|
||||
* Default: AL_FALSE
|
||||
*
|
||||
* Specifies whether source is looping.
|
||||
* Specifies whether source playback loops.
|
||||
*/
|
||||
#define AL_LOOPING 0x1007
|
||||
|
||||
/**
|
||||
* Source buffer.
|
||||
* Type: ALuint
|
||||
* Range: any valid Buffer.
|
||||
* Range: any valid Buffer ID
|
||||
* Default: AL_NONE
|
||||
*
|
||||
* Specifies the buffer to provide sound samples.
|
||||
* Specifies the buffer to provide sound samples for a source.
|
||||
*/
|
||||
#define AL_BUFFER 0x1009
|
||||
|
||||
|
@ -186,12 +226,12 @@ typedef void ALvoid;
|
|||
* Type: ALfloat
|
||||
* Range: [0.0 - ]
|
||||
*
|
||||
* A value of 1.0 means unattenuated. Each division by 2 equals an attenuation
|
||||
* of about -6dB. Each multiplicaton by 2 equals an amplification of about
|
||||
* +6dB.
|
||||
* For sources, an initial linear gain value (before attenuation is applied).
|
||||
* For the listener, an output linear gain adjustment.
|
||||
*
|
||||
* A value of 0.0 is meaningless with respect to a logarithmic scale; it is
|
||||
* silent.
|
||||
* A value of 1.0 means unattenuated. Each division by 2 equals an attenuation
|
||||
* of about -6dB. Each multiplication by 2 equals an amplification of about
|
||||
* +6dB.
|
||||
*/
|
||||
#define AL_GAIN 0x100A
|
||||
|
||||
|
@ -200,8 +240,8 @@ typedef void ALvoid;
|
|||
* Type: ALfloat
|
||||
* Range: [0.0 - 1.0]
|
||||
*
|
||||
* The minimum gain allowed for a source, after distance and cone attenation is
|
||||
* applied (if applicable).
|
||||
* The minimum gain allowed for a source, after distance and cone attenuation
|
||||
* are applied (if applicable).
|
||||
*/
|
||||
#define AL_MIN_GAIN 0x100D
|
||||
|
||||
|
@ -210,8 +250,8 @@ typedef void ALvoid;
|
|||
* Type: ALfloat
|
||||
* Range: [0.0 - 1.0]
|
||||
*
|
||||
* The maximum gain allowed for a source, after distance and cone attenation is
|
||||
* applied (if applicable).
|
||||
* The maximum gain allowed for a source, after distance and cone attenuation
|
||||
* are applied (if applicable).
|
||||
*/
|
||||
#define AL_MAX_GAIN 0x100E
|
||||
|
||||
|
@ -221,20 +261,22 @@ typedef void ALvoid;
|
|||
* Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0}
|
||||
*
|
||||
* Effectively two three dimensional vectors. The first vector is the front (or
|
||||
* "at") and the second is the top (or "up").
|
||||
* "at") and the second is the top (or "up"). Both vectors are relative to the
|
||||
* listener position.
|
||||
*
|
||||
* Both vectors are in local space.
|
||||
* To change from or to a left handed coordinate system, negate the Z
|
||||
* component of both vectors.
|
||||
*/
|
||||
#define AL_ORIENTATION 0x100F
|
||||
|
||||
/**
|
||||
* Source state (query only).
|
||||
* Type: ALint
|
||||
* Type: ALenum
|
||||
* Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED]
|
||||
*/
|
||||
#define AL_SOURCE_STATE 0x1010
|
||||
|
||||
/** Source state value. */
|
||||
/* Source state values. */
|
||||
#define AL_INITIAL 0x1011
|
||||
#define AL_PLAYING 0x1012
|
||||
#define AL_PAUSED 0x1013
|
||||
|
@ -267,9 +309,9 @@ typedef void ALvoid;
|
|||
* Range: [0.0 - ]
|
||||
* Default: 1.0
|
||||
*
|
||||
* The distance in units that no attenuation occurs.
|
||||
* The distance in units that no distance attenuation occurs.
|
||||
*
|
||||
* At 0.0, no distance attenuation ever occurs on non-linear attenuation models.
|
||||
* At 0.0, no distance attenuation occurs with non-linear attenuation models.
|
||||
*/
|
||||
#define AL_REFERENCE_DISTANCE 0x1020
|
||||
|
||||
|
@ -292,7 +334,7 @@ typedef void ALvoid;
|
|||
* Default: 0.0
|
||||
*
|
||||
* The gain attenuation applied when the listener is outside of the source's
|
||||
* outer cone.
|
||||
* outer cone angle.
|
||||
*/
|
||||
#define AL_CONE_OUTER_GAIN 0x1022
|
||||
|
||||
|
@ -300,7 +342,7 @@ typedef void ALvoid;
|
|||
* Source maximum distance.
|
||||
* Type: ALfloat
|
||||
* Range: [0.0 - ]
|
||||
* Default: +inf
|
||||
* Default: FLT_MAX
|
||||
*
|
||||
* The distance above which the source is not attenuated any further with a
|
||||
* clamped distance model, or where attenuation reaches 0.0 gain for linear
|
||||
|
@ -308,16 +350,16 @@ typedef void ALvoid;
|
|||
*/
|
||||
#define AL_MAX_DISTANCE 0x1023
|
||||
|
||||
/** Source buffer position, in seconds */
|
||||
/** Source buffer offset, in seconds */
|
||||
#define AL_SEC_OFFSET 0x1024
|
||||
/** Source buffer position, in sample frames */
|
||||
/** Source buffer offset, in sample frames */
|
||||
#define AL_SAMPLE_OFFSET 0x1025
|
||||
/** Source buffer position, in bytes */
|
||||
/** Source buffer offset, in bytes */
|
||||
#define AL_BYTE_OFFSET 0x1026
|
||||
|
||||
/**
|
||||
* Source type (query only).
|
||||
* Type: ALint
|
||||
* Type: ALenum
|
||||
* Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED]
|
||||
*
|
||||
* A Source is Static if a Buffer has been attached using AL_BUFFER.
|
||||
|
@ -330,31 +372,30 @@ typedef void ALvoid;
|
|||
*/
|
||||
#define AL_SOURCE_TYPE 0x1027
|
||||
|
||||
/** Source type value. */
|
||||
/* Source type values. */
|
||||
#define AL_STATIC 0x1028
|
||||
#define AL_STREAMING 0x1029
|
||||
#define AL_UNDETERMINED 0x1030
|
||||
|
||||
/** Buffer format specifier. */
|
||||
/** Unsigned 8-bit mono buffer format. */
|
||||
#define AL_FORMAT_MONO8 0x1100
|
||||
/** Signed 16-bit mono buffer format. */
|
||||
#define AL_FORMAT_MONO16 0x1101
|
||||
/** Unsigned 8-bit stereo buffer format. */
|
||||
#define AL_FORMAT_STEREO8 0x1102
|
||||
/** Signed 16-bit stereo buffer format. */
|
||||
#define AL_FORMAT_STEREO16 0x1103
|
||||
|
||||
/** Buffer frequency (query only). */
|
||||
/** Buffer frequency/sample rate (query only). */
|
||||
#define AL_FREQUENCY 0x2001
|
||||
/** Buffer bits per sample (query only). */
|
||||
#define AL_BITS 0x2002
|
||||
/** Buffer channel count (query only). */
|
||||
#define AL_CHANNELS 0x2003
|
||||
/** Buffer data size (query only). */
|
||||
/** Buffer data size in bytes (query only). */
|
||||
#define AL_SIZE 0x2004
|
||||
|
||||
/**
|
||||
* Buffer state.
|
||||
*
|
||||
* Not for public use.
|
||||
*/
|
||||
/* Buffer state. Not for public use. */
|
||||
#define AL_UNUSED 0x2010
|
||||
#define AL_PENDING 0x2011
|
||||
#define AL_PROCESSED 0x2012
|
||||
|
@ -363,32 +404,31 @@ typedef void ALvoid;
|
|||
/** No error. */
|
||||
#define AL_NO_ERROR 0
|
||||
|
||||
/** Invalid name paramater passed to AL call. */
|
||||
/** Invalid name (ID) passed to an AL call. */
|
||||
#define AL_INVALID_NAME 0xA001
|
||||
|
||||
/** Invalid enum parameter passed to AL call. */
|
||||
/** Invalid enumeration passed to AL call. */
|
||||
#define AL_INVALID_ENUM 0xA002
|
||||
|
||||
/** Invalid value parameter passed to AL call. */
|
||||
/** Invalid value passed to AL call. */
|
||||
#define AL_INVALID_VALUE 0xA003
|
||||
|
||||
/** Illegal AL call. */
|
||||
#define AL_INVALID_OPERATION 0xA004
|
||||
|
||||
/** Not enough memory. */
|
||||
/** Not enough memory to execute the AL call. */
|
||||
#define AL_OUT_OF_MEMORY 0xA005
|
||||
|
||||
|
||||
/** Context string: Vendor ID. */
|
||||
/** Context string: Vendor name. */
|
||||
#define AL_VENDOR 0xB001
|
||||
/** Context string: Version. */
|
||||
#define AL_VERSION 0xB002
|
||||
/** Context string: Renderer ID. */
|
||||
/** Context string: Renderer name. */
|
||||
#define AL_RENDERER 0xB003
|
||||
/** Context string: Space-separated extension list. */
|
||||
#define AL_EXTENSIONS 0xB004
|
||||
|
||||
|
||||
/**
|
||||
* Doppler scale.
|
||||
* Type: ALfloat
|
||||
|
@ -398,7 +438,6 @@ typedef void ALvoid;
|
|||
* Scale for source and listener velocities.
|
||||
*/
|
||||
#define AL_DOPPLER_FACTOR 0xC000
|
||||
AL_API void AL_APIENTRY alDopplerFactor(ALfloat value);
|
||||
|
||||
/**
|
||||
* Doppler velocity (deprecated).
|
||||
|
@ -406,7 +445,6 @@ AL_API void AL_APIENTRY alDopplerFactor(ALfloat value);
|
|||
* A multiplier applied to the Speed of Sound.
|
||||
*/
|
||||
#define AL_DOPPLER_VELOCITY 0xC001
|
||||
AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value);
|
||||
|
||||
/**
|
||||
* Speed of Sound, in units per second.
|
||||
|
@ -415,14 +453,13 @@ AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value);
|
|||
* Default: 343.3
|
||||
*
|
||||
* The speed at which sound waves are assumed to travel, when calculating the
|
||||
* doppler effect.
|
||||
* doppler effect from source and listener velocities.
|
||||
*/
|
||||
#define AL_SPEED_OF_SOUND 0xC003
|
||||
AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
|
||||
|
||||
/**
|
||||
* Distance attenuation model.
|
||||
* Type: ALint
|
||||
* Type: ALenum
|
||||
* Range: [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED,
|
||||
* AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED,
|
||||
* AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED]
|
||||
|
@ -439,9 +476,8 @@ AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
|
|||
* distance calculated is clamped between the reference and max distances.
|
||||
*/
|
||||
#define AL_DISTANCE_MODEL 0xD000
|
||||
AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
|
||||
|
||||
/** Distance model value. */
|
||||
/* Distance model values. */
|
||||
#define AL_INVERSE_DISTANCE 0xD001
|
||||
#define AL_INVERSE_DISTANCE_CLAMPED 0xD002
|
||||
#define AL_LINEAR_DISTANCE 0xD003
|
||||
|
@ -449,208 +485,223 @@ AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
|
|||
#define AL_EXPONENT_DISTANCE 0xD005
|
||||
#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
|
||||
|
||||
/** Renderer State management. */
|
||||
AL_API void AL_APIENTRY alEnable(ALenum capability);
|
||||
AL_API void AL_APIENTRY alDisable(ALenum capability);
|
||||
AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability);
|
||||
#ifndef AL_NO_PROTOTYPES
|
||||
/* Renderer State management. */
|
||||
AL_API void AL_APIENTRY alEnable(ALenum capability) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDisable(ALenum capability) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability) AL_API_NOEXCEPT;
|
||||
|
||||
/** State retrieval. */
|
||||
AL_API const ALchar* AL_APIENTRY alGetString(ALenum param);
|
||||
AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values);
|
||||
AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values);
|
||||
AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values);
|
||||
AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values);
|
||||
AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param);
|
||||
AL_API ALint AL_APIENTRY alGetInteger(ALenum param);
|
||||
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param);
|
||||
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param);
|
||||
/* Context state setting. */
|
||||
AL_API void AL_APIENTRY alDopplerFactor(ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel) AL_API_NOEXCEPT;
|
||||
|
||||
/* Context state retrieval. */
|
||||
AL_API const ALchar* AL_APIENTRY alGetString(ALenum param) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetFloatv(ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetDoublev(ALenum param, ALdouble *values) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum param) AL_API_NOEXCEPT;
|
||||
AL_API ALint AL_APIENTRY alGetInteger(ALenum param) AL_API_NOEXCEPT;
|
||||
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param) AL_API_NOEXCEPT;
|
||||
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param) AL_API_NOEXCEPT;
|
||||
|
||||
/**
|
||||
* Error retrieval.
|
||||
*
|
||||
* Obtain the first error generated in the AL context since the last check.
|
||||
* Obtain the first error generated in the AL context since the last call to
|
||||
* this function.
|
||||
*/
|
||||
AL_API ALenum AL_APIENTRY alGetError(void);
|
||||
AL_API ALenum AL_APIENTRY alGetError(void) AL_API_NOEXCEPT;
|
||||
|
||||
/** Query for the presence of an extension on the AL context. */
|
||||
AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname) AL_API_NOEXCEPT;
|
||||
/**
|
||||
* Extension support.
|
||||
*
|
||||
* Query for the presence of an extension, and obtain any appropriate function
|
||||
* pointers and enum values.
|
||||
* Retrieve the address of a function. The returned function may be context-
|
||||
* specific.
|
||||
*/
|
||||
AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname);
|
||||
AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname);
|
||||
AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename);
|
||||
AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname) AL_API_NOEXCEPT;
|
||||
/**
|
||||
* Retrieve the value of an enum. The returned value may be context-specific.
|
||||
*/
|
||||
AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename) AL_API_NOEXCEPT;
|
||||
|
||||
|
||||
/** Set Listener parameters */
|
||||
AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values);
|
||||
AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values);
|
||||
/* Set listener parameters. */
|
||||
AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
/** Get Listener parameters */
|
||||
AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values);
|
||||
AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value);
|
||||
AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values);
|
||||
/* Get listener parameters. */
|
||||
AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetListeneri(ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
|
||||
/** Create Source objects. */
|
||||
AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources);
|
||||
/** Delete Source objects. */
|
||||
AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources);
|
||||
/** Verify a handle is a valid Source. */
|
||||
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source);
|
||||
/** Create source objects. */
|
||||
AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources) AL_API_NOEXCEPT;
|
||||
/** Delete source objects. */
|
||||
AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
/** Verify an ID is for a valid source. */
|
||||
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source) AL_API_NOEXCEPT;
|
||||
|
||||
/** Set Source parameters. */
|
||||
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values);
|
||||
AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values);
|
||||
/* Set source parameters. */
|
||||
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
/** Get Source parameters. */
|
||||
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values);
|
||||
AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value);
|
||||
AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values);
|
||||
/* Get source parameters. */
|
||||
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
|
||||
/** Play, replay, or resume (if paused) a list of Sources */
|
||||
AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources);
|
||||
/** Stop a list of Sources */
|
||||
AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources);
|
||||
/** Rewind a list of Sources */
|
||||
AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources);
|
||||
/** Pause a list of Sources */
|
||||
AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources);
|
||||
/** Play, restart, or resume a source, setting its state to AL_PLAYING. */
|
||||
AL_API void AL_APIENTRY alSourcePlay(ALuint source) AL_API_NOEXCEPT;
|
||||
/** Stop a source, setting its state to AL_STOPPED if playing or paused. */
|
||||
AL_API void AL_APIENTRY alSourceStop(ALuint source) AL_API_NOEXCEPT;
|
||||
/** Rewind a source, setting its state to AL_INITIAL. */
|
||||
AL_API void AL_APIENTRY alSourceRewind(ALuint source) AL_API_NOEXCEPT;
|
||||
/** Pause a source, setting its state to AL_PAUSED if playing. */
|
||||
AL_API void AL_APIENTRY alSourcePause(ALuint source) AL_API_NOEXCEPT;
|
||||
|
||||
/** Play, replay, or resume a Source */
|
||||
AL_API void AL_APIENTRY alSourcePlay(ALuint source);
|
||||
/** Stop a Source */
|
||||
AL_API void AL_APIENTRY alSourceStop(ALuint source);
|
||||
/** Rewind a Source (set playback postiton to beginning) */
|
||||
AL_API void AL_APIENTRY alSourceRewind(ALuint source);
|
||||
/** Pause a Source */
|
||||
AL_API void AL_APIENTRY alSourcePause(ALuint source);
|
||||
/** Play, restart, or resume a list of sources atomically. */
|
||||
AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
/** Stop a list of sources atomically. */
|
||||
AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
/** Rewind a list of sources atomically. */
|
||||
AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
/** Pause a list of sources atomically. */
|
||||
AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
|
||||
/** Queue buffers onto a source */
|
||||
AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers);
|
||||
AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers) AL_API_NOEXCEPT;
|
||||
/** Unqueue processed buffers from a source */
|
||||
AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers);
|
||||
AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers) AL_API_NOEXCEPT;
|
||||
|
||||
|
||||
/** Create Buffer objects */
|
||||
AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers);
|
||||
/** Delete Buffer objects */
|
||||
AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers);
|
||||
/** Verify a handle is a valid Buffer */
|
||||
AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer);
|
||||
/** Create buffer objects */
|
||||
AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers) AL_API_NOEXCEPT;
|
||||
/** Delete buffer objects */
|
||||
AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers) AL_API_NOEXCEPT;
|
||||
/** Verify an ID is a valid buffer (including the NULL buffer) */
|
||||
AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer) AL_API_NOEXCEPT;
|
||||
|
||||
/** Specifies the data to be copied into a buffer */
|
||||
AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);
|
||||
/**
|
||||
* Copies data into the buffer, interpreting it using the specified format and
|
||||
* samplerate.
|
||||
*/
|
||||
AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate) AL_API_NOEXCEPT;
|
||||
|
||||
/** Set Buffer parameters, */
|
||||
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values);
|
||||
AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values);
|
||||
/* Set buffer parameters. */
|
||||
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
/** Get Buffer parameters. */
|
||||
AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values);
|
||||
AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value);
|
||||
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values);
|
||||
/* Get buffer parameters. */
|
||||
AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
#endif /* AL_NO_PROTOTYPES */
|
||||
|
||||
/** Pointer-to-function type, useful for dynamically getting AL entry points. */
|
||||
typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability);
|
||||
typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability);
|
||||
typedef const ALchar* (AL_APIENTRY *LPALGETSTRING)(ALenum param);
|
||||
typedef void (AL_APIENTRY *LPALGETBOOLEANV)(ALenum param, ALboolean *values);
|
||||
typedef void (AL_APIENTRY *LPALGETINTEGERV)(ALenum param, ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALGETFLOATV)(ALenum param, ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALGETDOUBLEV)(ALenum param, ALdouble *values);
|
||||
typedef ALboolean (AL_APIENTRY *LPALGETBOOLEAN)(ALenum param);
|
||||
typedef ALint (AL_APIENTRY *LPALGETINTEGER)(ALenum param);
|
||||
typedef ALfloat (AL_APIENTRY *LPALGETFLOAT)(ALenum param);
|
||||
typedef ALdouble (AL_APIENTRY *LPALGETDOUBLE)(ALenum param);
|
||||
typedef ALenum (AL_APIENTRY *LPALGETERROR)(void);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEXTENSIONPRESENT)(const ALchar *extname);
|
||||
typedef void* (AL_APIENTRY *LPALGETPROCADDRESS)(const ALchar *fname);
|
||||
typedef ALenum (AL_APIENTRY *LPALGETENUMVALUE)(const ALchar *ename);
|
||||
typedef void (AL_APIENTRY *LPALLISTENERF)(ALenum param, ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3F)(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
typedef void (AL_APIENTRY *LPALLISTENERFV)(ALenum param, const ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALLISTENERI)(ALenum param, ALint value);
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3I)(ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
typedef void (AL_APIENTRY *LPALLISTENERIV)(ALenum param, const ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERF)(ALenum param, ALfloat *value);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3F)(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERFV)(ALenum param, ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERI)(ALenum param, ALint *value);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3I)(ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERIV)(ALenum param, ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALGENSOURCES)(ALsizei n, ALuint *sources);
|
||||
typedef void (AL_APIENTRY *LPALDELETESOURCES)(ALsizei n, const ALuint *sources);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISSOURCE)(ALuint source);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEF)(ALuint source, ALenum param, ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3F)(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEFV)(ALuint source, ALenum param, const ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEI)(ALuint source, ALenum param, ALint value);
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEIV)(ALuint source, ALenum param, const ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEF)(ALuint source, ALenum param, ALfloat *value);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3F)(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEFV)(ALuint source, ALenum param, ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEI)(ALuint source, ALenum param, ALint *value);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3I)(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEIV)(ALuint source, ALenum param, ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYV)(ALsizei n, const ALuint *sources);
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOPV)(ALsizei n, const ALuint *sources);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWINDV)(ALsizei n, const ALuint *sources);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSEV)(ALsizei n, const ALuint *sources);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAY)(ALuint source);
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOP)(ALuint source);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWIND)(ALuint source);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSE)(ALuint source);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEQUEUEBUFFERS)(ALuint source, ALsizei nb, const ALuint *buffers);
|
||||
typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALsizei nb, ALuint *buffers);
|
||||
typedef void (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers);
|
||||
typedef void (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISBUFFER)(ALuint buffer);
|
||||
typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);
|
||||
typedef void (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
typedef void (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALBUFFERI)(ALuint buffer, ALenum param, ALint value);
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3I)(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
typedef void (AL_APIENTRY *LPALBUFFERIV)(ALuint buffer, ALenum param, const ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERF)(ALuint buffer, ALenum param, ALfloat *value);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3F)(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERFV)(ALuint buffer, ALenum param, ALfloat *values);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERI)(ALuint buffer, ALenum param, ALint *value);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3I)(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERIV)(ALuint buffer, ALenum param, ALint *values);
|
||||
typedef void (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value);
|
||||
typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel);
|
||||
/* Pointer-to-function types, useful for storing dynamically loaded AL entry
|
||||
* points.
|
||||
*/
|
||||
typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef const ALchar* (AL_APIENTRY *LPALGETSTRING)(ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBOOLEANV)(ALenum param, ALboolean *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETINTEGERV)(ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFLOATV)(ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETDOUBLEV)(ALenum param, ALdouble *values) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALGETBOOLEAN)(ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALint (AL_APIENTRY *LPALGETINTEGER)(ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALfloat (AL_APIENTRY *LPALGETFLOAT)(ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALdouble (AL_APIENTRY *LPALGETDOUBLE)(ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPALGETERROR)(void) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEXTENSIONPRESENT)(const ALchar *extname) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY *LPALGETPROCADDRESS)(const ALchar *fname) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPALGETENUMVALUE)(const ALchar *ename) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERF)(ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3F)(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERFV)(ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERI)(ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3I)(ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERIV)(ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERF)(ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3F)(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERFV)(ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERI)(ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3I)(ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERIV)(ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENSOURCES)(ALsizei n, ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETESOURCES)(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISSOURCE)(ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEF)(ALuint source, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3F)(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEFV)(ALuint source, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEI)(ALuint source, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEIV)(ALuint source, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEF)(ALuint source, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3F)(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEFV)(ALuint source, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEI)(ALuint source, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3I)(ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEIV)(ALuint source, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYV)(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOPV)(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWINDV)(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSEV)(ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAY)(ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOP)(ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWIND)(ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSE)(ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEQUEUEBUFFERS)(ALuint source, ALsizei nb, const ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALsizei nb, ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISBUFFER)(ALuint buffer) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERI)(ALuint buffer, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3I)(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERIV)(ALuint buffer, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERF)(ALuint buffer, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3F)(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERFV)(ALuint buffer, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERI)(ALuint buffer, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3I)(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERIV)(ALuint buffer, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel) AL_API_NOEXCEPT17;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
/* NOLINTEND */
|
||||
|
||||
#endif /* AL_AL_H */
|
||||
|
|
230
code/AL/alc.h
230
code/AL/alc.h
|
@ -1,8 +1,40 @@
|
|||
#ifndef AL_ALC_H
|
||||
#define AL_ALC_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
/* NOLINTBEGIN */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
||||
#ifdef _MSVC_LANG
|
||||
#define ALC_CPLUSPLUS _MSVC_LANG
|
||||
#else
|
||||
#define ALC_CPLUSPLUS __cplusplus
|
||||
#endif
|
||||
|
||||
#ifndef AL_DISABLE_NOEXCEPT
|
||||
#if ALC_CPLUSPLUS >= 201103L
|
||||
#define ALC_API_NOEXCEPT noexcept
|
||||
#else
|
||||
#define ALC_API_NOEXCEPT
|
||||
#endif
|
||||
#if ALC_CPLUSPLUS >= 201703L
|
||||
#define ALC_API_NOEXCEPT17 noexcept
|
||||
#else
|
||||
#define ALC_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#else /* AL_DISABLE_NOEXCEPT */
|
||||
|
||||
#define ALC_API_NOEXCEPT
|
||||
#define ALC_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#undef ALC_CPLUSPLUS
|
||||
|
||||
#else /* __cplusplus */
|
||||
|
||||
#define ALC_API_NOEXCEPT
|
||||
#define ALC_API_NOEXCEPT17
|
||||
#endif
|
||||
|
||||
#ifndef ALC_API
|
||||
|
@ -15,14 +47,14 @@ extern "C" {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#ifdef _WIN32
|
||||
#define ALC_APIENTRY __cdecl
|
||||
#else
|
||||
#define ALC_APIENTRY
|
||||
#endif
|
||||
|
||||
|
||||
/** Deprecated macro. */
|
||||
/* Deprecated macros. */
|
||||
#define ALCAPI ALC_API
|
||||
#define ALCAPIENTRY ALC_APIENTRY
|
||||
#define ALC_INVALID 0
|
||||
|
@ -31,9 +63,9 @@ extern "C" {
|
|||
#define ALC_VERSION_0_1 1
|
||||
|
||||
/** Opaque device handle */
|
||||
typedef struct ALCdevice_struct ALCdevice;
|
||||
typedef struct ALCdevice ALCdevice;
|
||||
/** Opaque context handle */
|
||||
typedef struct ALCcontext_struct ALCcontext;
|
||||
typedef struct ALCcontext ALCcontext;
|
||||
|
||||
/** 8-bit boolean */
|
||||
typedef char ALCboolean;
|
||||
|
@ -41,41 +73,41 @@ typedef char ALCboolean;
|
|||
/** character */
|
||||
typedef char ALCchar;
|
||||
|
||||
/** signed 8-bit 2's complement integer */
|
||||
/** signed 8-bit integer */
|
||||
typedef signed char ALCbyte;
|
||||
|
||||
/** unsigned 8-bit integer */
|
||||
typedef unsigned char ALCubyte;
|
||||
|
||||
/** signed 16-bit 2's complement integer */
|
||||
/** signed 16-bit integer */
|
||||
typedef short ALCshort;
|
||||
|
||||
/** unsigned 16-bit integer */
|
||||
typedef unsigned short ALCushort;
|
||||
|
||||
/** signed 32-bit 2's complement integer */
|
||||
/** signed 32-bit integer */
|
||||
typedef int ALCint;
|
||||
|
||||
/** unsigned 32-bit integer */
|
||||
typedef unsigned int ALCuint;
|
||||
|
||||
/** non-negative 32-bit binary integer size */
|
||||
/** non-negative 32-bit integer size */
|
||||
typedef int ALCsizei;
|
||||
|
||||
/** enumerated 32-bit value */
|
||||
/** 32-bit enumeration value */
|
||||
typedef int ALCenum;
|
||||
|
||||
/** 32-bit IEEE754 floating-point */
|
||||
/** 32-bit IEEE-754 floating-point */
|
||||
typedef float ALCfloat;
|
||||
|
||||
/** 64-bit IEEE754 floating-point */
|
||||
/** 64-bit IEEE-754 floating-point */
|
||||
typedef double ALCdouble;
|
||||
|
||||
/** void type (for opaque pointers only) */
|
||||
typedef void ALCvoid;
|
||||
|
||||
|
||||
/* Enumerant values begin at column 50. No tabs. */
|
||||
/* Enumeration values begin at column 50. Do not use tabs. */
|
||||
|
||||
/** Boolean False. */
|
||||
#define ALC_FALSE 0
|
||||
|
@ -89,7 +121,7 @@ typedef void ALCvoid;
|
|||
/** Context attribute: <int> Hz. */
|
||||
#define ALC_REFRESH 0x1008
|
||||
|
||||
/** Context attribute: AL_TRUE or AL_FALSE. */
|
||||
/** Context attribute: AL_TRUE or AL_FALSE synchronous context? */
|
||||
#define ALC_SYNC 0x1009
|
||||
|
||||
/** Context attribute: <int> requested Mono (3D) Sources. */
|
||||
|
@ -107,30 +139,32 @@ typedef void ALCvoid;
|
|||
/** Invalid context handle. */
|
||||
#define ALC_INVALID_CONTEXT 0xA002
|
||||
|
||||
/** Invalid enum parameter passed to an ALC call. */
|
||||
/** Invalid enumeration passed to an ALC call. */
|
||||
#define ALC_INVALID_ENUM 0xA003
|
||||
|
||||
/** Invalid value parameter passed to an ALC call. */
|
||||
/** Invalid value passed to an ALC call. */
|
||||
#define ALC_INVALID_VALUE 0xA004
|
||||
|
||||
/** Out of memory. */
|
||||
#define ALC_OUT_OF_MEMORY 0xA005
|
||||
|
||||
|
||||
/** Runtime ALC version. */
|
||||
/** Runtime ALC major version. */
|
||||
#define ALC_MAJOR_VERSION 0x1000
|
||||
/** Runtime ALC minor version. */
|
||||
#define ALC_MINOR_VERSION 0x1001
|
||||
|
||||
/** Context attribute list properties. */
|
||||
/** Context attribute list size. */
|
||||
#define ALC_ATTRIBUTES_SIZE 0x1002
|
||||
/** Context attribute list properties. */
|
||||
#define ALC_ALL_ATTRIBUTES 0x1003
|
||||
|
||||
/** String for the default device specifier. */
|
||||
#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
|
||||
/**
|
||||
* String for the given device's specifier.
|
||||
* Device specifier string.
|
||||
*
|
||||
* If device handle is NULL, it is instead a null-char separated list of
|
||||
* If device handle is NULL, it is instead a null-character separated list of
|
||||
* strings of known device specifiers (list ends with an empty string).
|
||||
*/
|
||||
#define ALC_DEVICE_SPECIFIER 0x1005
|
||||
|
@ -141,9 +175,9 @@ typedef void ALCvoid;
|
|||
/** Capture extension */
|
||||
#define ALC_EXT_CAPTURE 1
|
||||
/**
|
||||
* String for the given capture device's specifier.
|
||||
* Capture device specifier string.
|
||||
*
|
||||
* If device handle is NULL, it is instead a null-char separated list of
|
||||
* If device handle is NULL, it is instead a null-character separated list of
|
||||
* strings of known capture device specifiers (list ends with an empty string).
|
||||
*/
|
||||
#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
|
||||
|
@ -158,80 +192,116 @@ typedef void ALCvoid;
|
|||
/** String for the default extended device specifier. */
|
||||
#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012
|
||||
/**
|
||||
* String for the given extended device's specifier.
|
||||
* Device's extended specifier string.
|
||||
*
|
||||
* If device handle is NULL, it is instead a null-char separated list of
|
||||
* If device handle is NULL, it is instead a null-character separated list of
|
||||
* strings of known extended device specifiers (list ends with an empty string).
|
||||
*/
|
||||
#define ALC_ALL_DEVICES_SPECIFIER 0x1013
|
||||
|
||||
|
||||
/** Context management. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context);
|
||||
ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context);
|
||||
ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context);
|
||||
ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context);
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void);
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context);
|
||||
#ifndef ALC_NO_PROTOTYPES
|
||||
/* Context management. */
|
||||
|
||||
/** Device management. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device);
|
||||
/** Create and attach a context to the given device. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrlist) ALC_API_NOEXCEPT;
|
||||
/**
|
||||
* Makes the given context the active process-wide context. Passing NULL clears
|
||||
* the active context.
|
||||
*/
|
||||
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
/** Resumes processing updates for the given context. */
|
||||
ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
/** Suspends updates for the given context. */
|
||||
ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
/** Remove a context from its device and destroys it. */
|
||||
ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
/** Returns the currently active context. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void) ALC_API_NOEXCEPT;
|
||||
/** Returns the device that a particular context is attached to. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
|
||||
/* Device management. */
|
||||
|
||||
/** Opens the named playback device. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename) ALC_API_NOEXCEPT;
|
||||
/** Closes the given playback device. */
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
|
||||
/* Error support. */
|
||||
|
||||
/** Obtain the most recent Device error. */
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
|
||||
/* Extension support. */
|
||||
|
||||
/**
|
||||
* Error support.
|
||||
*
|
||||
* Obtain the most recent Device error.
|
||||
* Query for the presence of an extension on the device. Pass a NULL device to
|
||||
* query a device-inspecific extension.
|
||||
*/
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname) ALC_API_NOEXCEPT;
|
||||
/**
|
||||
* Retrieve the address of a function. Given a non-NULL device, the returned
|
||||
* function may be device-specific.
|
||||
*/
|
||||
ALC_API ALCvoid* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname) ALC_API_NOEXCEPT;
|
||||
/**
|
||||
* Retrieve the value of an enum. Given a non-NULL device, the returned value
|
||||
* may be device-specific.
|
||||
*/
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname) ALC_API_NOEXCEPT;
|
||||
|
||||
/* Query functions. */
|
||||
|
||||
/** Returns information about the device, and error strings. */
|
||||
ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param) ALC_API_NOEXCEPT;
|
||||
/** Returns information about the device and the version of OpenAL. */
|
||||
ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) ALC_API_NOEXCEPT;
|
||||
|
||||
/* Capture functions. */
|
||||
|
||||
/**
|
||||
* Extension support.
|
||||
*
|
||||
* Query for the presence of an extension, and obtain any appropriate
|
||||
* function pointers and enum values.
|
||||
* Opens the named capture device with the given frequency, format, and buffer
|
||||
* size.
|
||||
*/
|
||||
ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname);
|
||||
ALC_API void* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname);
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname);
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize) ALC_API_NOEXCEPT;
|
||||
/** Closes the given capture device. */
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
/** Starts capturing samples into the device buffer. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
/** Stops capturing samples. Samples in the device buffer remain available. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
/** Reads samples from the device buffer. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) ALC_API_NOEXCEPT;
|
||||
#endif /* ALC_NO_PROTOTYPES */
|
||||
|
||||
/** Query function. */
|
||||
ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param);
|
||||
ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
|
||||
/* Pointer-to-function types, useful for storing dynamically loaded ALC entry
|
||||
* points.
|
||||
*/
|
||||
typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCSUSPENDCONTEXT)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCDESTROYCONTEXT)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef ALCcontext* (ALC_APIENTRY *LPALCGETCURRENTCONTEXT)(void) ALC_API_NOEXCEPT17;
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCGETCONTEXTSDEVICE)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname) ALC_API_NOEXCEPT17;
|
||||
typedef ALCvoid* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname) ALC_API_NOEXCEPT17;
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname) ALC_API_NOEXCEPT17;
|
||||
typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) ALC_API_NOEXCEPT17;
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCCAPTUREOPENDEVICE)(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCCAPTURECLOSEDEVICE)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) ALC_API_NOEXCEPT17;
|
||||
|
||||
/** Capture function. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device);
|
||||
ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device);
|
||||
ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device);
|
||||
ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
|
||||
|
||||
/** Pointer-to-function type, useful for dynamically getting ALC entry points. */
|
||||
typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context);
|
||||
typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context);
|
||||
typedef void (ALC_APIENTRY *LPALCSUSPENDCONTEXT)(ALCcontext *context);
|
||||
typedef void (ALC_APIENTRY *LPALCDESTROYCONTEXT)(ALCcontext *context);
|
||||
typedef ALCcontext* (ALC_APIENTRY *LPALCGETCURRENTCONTEXT)(void);
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCGETCONTEXTSDEVICE)(ALCcontext *context);
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device);
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname);
|
||||
typedef void* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname);
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname);
|
||||
typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param);
|
||||
typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
|
||||
typedef ALCdevice* (ALC_APIENTRY *LPALCCAPTUREOPENDEVICE)(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCCAPTURECLOSEDEVICE)(ALCdevice *device);
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device);
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device);
|
||||
typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
/* NOLINTEND */
|
||||
|
||||
#endif /* AL_ALC_H */
|
||||
|
|
897
code/AL/alext.h
897
code/AL/alext.h
|
@ -1,38 +1,22 @@
|
|||
/**
|
||||
* OpenAL cross platform audio library
|
||||
* Copyright (C) 2008 by authors.
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
* Or go to http://www.gnu.org/copyleft/lgpl.html
|
||||
*/
|
||||
|
||||
#ifndef AL_ALEXT_H
|
||||
#define AL_ALEXT_H
|
||||
|
||||
/* NOLINTBEGIN */
|
||||
#include <stddef.h>
|
||||
/* Define int64_t and uint64_t types */
|
||||
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
||||
#include <inttypes.h>
|
||||
#elif defined(_WIN32) && defined(__GNUC__)
|
||||
/* Define int64 and uint64 types */
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
||||
(defined(__cplusplus) && __cplusplus >= 201103L)
|
||||
#include <stdint.h>
|
||||
typedef int64_t _alsoft_int64_t;
|
||||
typedef uint64_t _alsoft_uint64_t;
|
||||
#elif defined(_WIN32)
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef __int64 _alsoft_int64_t;
|
||||
typedef unsigned __int64 _alsoft_uint64_t;
|
||||
#else
|
||||
/* Fallback if nothing above works */
|
||||
#include <inttypes.h>
|
||||
#include <stdint.h>
|
||||
typedef int64_t _alsoft_int64_t;
|
||||
typedef uint64_t _alsoft_uint64_t;
|
||||
#endif
|
||||
|
||||
#include "alc.h"
|
||||
|
@ -42,6 +26,8 @@ typedef unsigned __int64 uint64_t;
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct _GUID;
|
||||
|
||||
#ifndef AL_LOKI_IMA_ADPCM_format
|
||||
#define AL_LOKI_IMA_ADPCM_format 1
|
||||
#define AL_FORMAT_IMA_ADPCM_MONO16_EXT 0x10000
|
||||
|
@ -97,6 +83,31 @@ extern "C" {
|
|||
|
||||
#ifndef AL_EXT_MCFORMATS
|
||||
#define AL_EXT_MCFORMATS 1
|
||||
/* Provides support for surround sound buffer formats with 8, 16, and 32-bit
|
||||
* samples.
|
||||
*
|
||||
* QUAD8: Unsigned 8-bit, Quadraphonic (Front Left, Front Right, Rear Left,
|
||||
* Rear Right).
|
||||
* QUAD16: Signed 16-bit, Quadraphonic.
|
||||
* QUAD32: 32-bit float, Quadraphonic.
|
||||
* REAR8: Unsigned 8-bit, Rear Stereo (Rear Left, Rear Right).
|
||||
* REAR16: Signed 16-bit, Rear Stereo.
|
||||
* REAR32: 32-bit float, Rear Stereo.
|
||||
* 51CHN8: Unsigned 8-bit, 5.1 Surround (Front Left, Front Right, Front Center,
|
||||
* LFE, Side Left, Side Right). Note that some audio systems may label
|
||||
* 5.1's Side channels as Rear or Surround; they are equivalent for the
|
||||
* purposes of this extension.
|
||||
* 51CHN16: Signed 16-bit, 5.1 Surround.
|
||||
* 51CHN32: 32-bit float, 5.1 Surround.
|
||||
* 61CHN8: Unsigned 8-bit, 6.1 Surround (Front Left, Front Right, Front Center,
|
||||
* LFE, Rear Center, Side Left, Side Right).
|
||||
* 61CHN16: Signed 16-bit, 6.1 Surround.
|
||||
* 61CHN32: 32-bit float, 6.1 Surround.
|
||||
* 71CHN8: Unsigned 8-bit, 7.1 Surround (Front Left, Front Right, Front Center,
|
||||
* LFE, Rear Left, Rear Right, Side Left, Side Right).
|
||||
* 71CHN16: Signed 16-bit, 7.1 Surround.
|
||||
* 71CHN32: 32-bit float, 7.1 Surround.
|
||||
*/
|
||||
#define AL_FORMAT_QUAD8 0x1204
|
||||
#define AL_FORMAT_QUAD16 0x1205
|
||||
#define AL_FORMAT_QUAD32 0x1206
|
||||
|
@ -133,9 +144,9 @@ extern "C" {
|
|||
|
||||
#ifndef AL_EXT_STATIC_BUFFER
|
||||
#define AL_EXT_STATIC_BUFFER 1
|
||||
typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei);
|
||||
typedef void (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALuint,ALenum,ALvoid*,ALsizei,ALsizei) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq);
|
||||
void AL_APIENTRY alBufferDataStatic(const ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -151,11 +162,11 @@ AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format,
|
|||
|
||||
#ifndef ALC_EXT_thread_local_context
|
||||
#define ALC_EXT_thread_local_context 1
|
||||
typedef ALCboolean (ALC_APIENTRY*PFNALCSETTHREADCONTEXTPROC)(ALCcontext *context);
|
||||
typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void);
|
||||
typedef ALCboolean (ALC_APIENTRY*PFNALCSETTHREADCONTEXTPROC)(ALCcontext *context) ALC_API_NOEXCEPT17;
|
||||
typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context);
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context) ALC_API_NOEXCEPT;
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -168,9 +179,9 @@ ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void);
|
|||
#define AL_SOFT_buffer_sub_data 1
|
||||
#define AL_BYTE_RW_OFFSETS_SOFT 0x1031
|
||||
#define AL_SAMPLE_RW_OFFSETS_SOFT 0x1032
|
||||
typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei);
|
||||
typedef void (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length);
|
||||
AL_API void AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -187,12 +198,12 @@ AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const
|
|||
#define AL_FOLDBACK_EVENT_STOP 0x4113
|
||||
#define AL_FOLDBACK_MODE_MONO 0x4101
|
||||
#define AL_FOLDBACK_MODE_STEREO 0x4102
|
||||
typedef void (AL_APIENTRY*LPALFOLDBACKCALLBACK)(ALenum,ALsizei);
|
||||
typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTART)(ALenum,ALsizei,ALsizei,ALfloat*,LPALFOLDBACKCALLBACK);
|
||||
typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTOP)(void);
|
||||
typedef void (AL_APIENTRY*LPALFOLDBACKCALLBACK)(ALenum,ALsizei) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTART)(ALenum,ALsizei,ALsizei,ALfloat*,LPALFOLDBACKCALLBACK) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALREQUESTFOLDBACKSTOP)(void) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alRequestFoldbackStart(ALenum mode,ALsizei count,ALsizei length,ALfloat *mem,LPALFOLDBACKCALLBACK callback);
|
||||
AL_API void AL_APIENTRY alRequestFoldbackStop(void);
|
||||
AL_API void AL_APIENTRY alRequestFoldbackStart(ALenum mode,ALsizei count,ALsizei length,ALfloat *mem,LPALFOLDBACKCALLBACK callback) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alRequestFoldbackStop(void) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -255,15 +266,15 @@ AL_API void AL_APIENTRY alRequestFoldbackStop(void);
|
|||
#define AL_SAMPLE_LENGTH_SOFT 0x200A
|
||||
#define AL_SEC_LENGTH_SOFT 0x200B
|
||||
|
||||
typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*);
|
||||
typedef void (AL_APIENTRY*LPALBUFFERSUBSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,const ALvoid*);
|
||||
typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*);
|
||||
typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum);
|
||||
typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALBUFFERSUBSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,const ALvoid*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data);
|
||||
AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data);
|
||||
AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data);
|
||||
AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format);
|
||||
AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -294,13 +305,13 @@ AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format);
|
|||
#define ALC_6POINT1_SOFT 0x1505
|
||||
#define ALC_7POINT1_SOFT 0x1506
|
||||
|
||||
typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(const ALCchar*);
|
||||
typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice*,ALCsizei,ALCenum,ALCenum);
|
||||
typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice*,ALCvoid*,ALCsizei);
|
||||
typedef ALCdevice* (ALC_APIENTRY*LPALCLOOPBACKOPENDEVICESOFT)(const ALCchar*) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY*LPALCISRENDERFORMATSUPPORTEDSOFT)(ALCdevice*,ALCsizei,ALCenum,ALCenum) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY*LPALCRENDERSAMPLESSOFT)(ALCdevice*,ALCvoid*,ALCsizei) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName);
|
||||
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type);
|
||||
ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceName) AL_API_NOEXCEPT;
|
||||
ALC_API ALCboolean ALC_APIENTRY alcIsRenderFormatSupportedSOFT(ALCdevice *device, ALCsizei freq, ALCenum channels, ALCenum type) AL_API_NOEXCEPT;
|
||||
ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffer, ALCsizei samples) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -318,38 +329,764 @@ ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffe
|
|||
#define AL_SOFT_source_latency 1
|
||||
#define AL_SAMPLE_OFFSET_LATENCY_SOFT 0x1200
|
||||
#define AL_SEC_OFFSET_LATENCY_SOFT 0x1201
|
||||
typedef int64_t ALint64SOFT;
|
||||
typedef uint64_t ALuint64SOFT;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble);
|
||||
typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble);
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEDSOFT)(ALuint,ALenum,ALdouble*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCE3DSOFT)(ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEDVSOFT)(ALuint,ALenum,ALdouble*);
|
||||
typedef void (AL_APIENTRY*LPALSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT);
|
||||
typedef void (AL_APIENTRY*LPALSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT);
|
||||
typedef void (AL_APIENTRY*LPALSOURCEI64VSOFT)(ALuint,ALenum,const ALint64SOFT*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*);
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEI64VSOFT)(ALuint,ALenum,ALint64SOFT*);
|
||||
typedef _alsoft_int64_t ALint64SOFT;
|
||||
typedef _alsoft_uint64_t ALuint64SOFT;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEDSOFT)(ALuint,ALenum,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCE3DSOFT)(ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEDVSOFT)(ALuint,ALenum,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEI64VSOFT)(ALuint,ALenum,const ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEI64SOFT)(ALuint,ALenum,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCE3I64SOFT)(ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETSOURCEI64VSOFT)(ALuint,ALenum,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value);
|
||||
AL_API void AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3);
|
||||
AL_API void AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values);
|
||||
AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value);
|
||||
AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3);
|
||||
AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values);
|
||||
AL_API void AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value);
|
||||
AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3);
|
||||
AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values);
|
||||
AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value);
|
||||
AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3);
|
||||
AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values);
|
||||
AL_API void AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdouble *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALint64SOFT *values) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT *value) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64SOFT *values) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_EXT_DEFAULT_FILTER_ORDER
|
||||
#define ALC_EXT_DEFAULT_FILTER_ORDER 1
|
||||
#define ALC_DEFAULT_FILTER_ORDER 0x1100
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_deferred_updates
|
||||
#define AL_SOFT_deferred_updates 1
|
||||
#define AL_DEFERRED_UPDATES_SOFT 0xC002
|
||||
typedef void (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alDeferUpdatesSOFT(void) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alProcessUpdatesSOFT(void) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_block_alignment
|
||||
#define AL_SOFT_block_alignment 1
|
||||
#define AL_UNPACK_BLOCK_ALIGNMENT_SOFT 0x200C
|
||||
#define AL_PACK_BLOCK_ALIGNMENT_SOFT 0x200D
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_MSADPCM
|
||||
#define AL_SOFT_MSADPCM 1
|
||||
#define AL_FORMAT_MONO_MSADPCM_SOFT 0x1302
|
||||
#define AL_FORMAT_STEREO_MSADPCM_SOFT 0x1303
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_source_length
|
||||
#define AL_SOFT_source_length 1
|
||||
/*#define AL_BYTE_LENGTH_SOFT 0x2009*/
|
||||
/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/
|
||||
/*#define AL_SEC_LENGTH_SOFT 0x200B*/
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_buffer_length_query
|
||||
#define AL_SOFT_buffer_length_query 1
|
||||
/*#define AL_BYTE_LENGTH_SOFT 0x2009*/
|
||||
/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/
|
||||
/*#define AL_SEC_LENGTH_SOFT 0x200B*/
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_pause_device
|
||||
#define ALC_SOFT_pause_device 1
|
||||
typedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_EXT_BFORMAT
|
||||
#define AL_EXT_BFORMAT 1
|
||||
/* Provides support for B-Format ambisonic buffers (first-order, FuMa scaling
|
||||
* and layout).
|
||||
*
|
||||
* BFORMAT2D_8: Unsigned 8-bit, 3-channel non-periphonic (WXY).
|
||||
* BFORMAT2D_16: Signed 16-bit, 3-channel non-periphonic (WXY).
|
||||
* BFORMAT2D_FLOAT32: 32-bit float, 3-channel non-periphonic (WXY).
|
||||
* BFORMAT3D_8: Unsigned 8-bit, 4-channel periphonic (WXYZ).
|
||||
* BFORMAT3D_16: Signed 16-bit, 4-channel periphonic (WXYZ).
|
||||
* BFORMAT3D_FLOAT32: 32-bit float, 4-channel periphonic (WXYZ).
|
||||
*/
|
||||
#define AL_FORMAT_BFORMAT2D_8 0x20021
|
||||
#define AL_FORMAT_BFORMAT2D_16 0x20022
|
||||
#define AL_FORMAT_BFORMAT2D_FLOAT32 0x20023
|
||||
#define AL_FORMAT_BFORMAT3D_8 0x20031
|
||||
#define AL_FORMAT_BFORMAT3D_16 0x20032
|
||||
#define AL_FORMAT_BFORMAT3D_FLOAT32 0x20033
|
||||
#endif
|
||||
|
||||
#ifndef AL_EXT_MULAW_BFORMAT
|
||||
#define AL_EXT_MULAW_BFORMAT 1
|
||||
#define AL_FORMAT_BFORMAT2D_MULAW 0x10031
|
||||
#define AL_FORMAT_BFORMAT3D_MULAW 0x10032
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_HRTF
|
||||
#define ALC_SOFT_HRTF 1
|
||||
#define ALC_HRTF_SOFT 0x1992
|
||||
#define ALC_DONT_CARE_SOFT 0x0002
|
||||
#define ALC_HRTF_STATUS_SOFT 0x1993
|
||||
#define ALC_HRTF_DISABLED_SOFT 0x0000
|
||||
#define ALC_HRTF_ENABLED_SOFT 0x0001
|
||||
#define ALC_HRTF_DENIED_SOFT 0x0002
|
||||
#define ALC_HRTF_REQUIRED_SOFT 0x0003
|
||||
#define ALC_HRTF_HEADPHONES_DETECTED_SOFT 0x0004
|
||||
#define ALC_HRTF_UNSUPPORTED_FORMAT_SOFT 0x0005
|
||||
#define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994
|
||||
#define ALC_HRTF_SPECIFIER_SOFT 0x1995
|
||||
#define ALC_HRTF_ID_SOFT 0x1996
|
||||
typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index) ALC_API_NOEXCEPT;
|
||||
ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_gain_clamp_ex
|
||||
#define AL_SOFT_gain_clamp_ex 1
|
||||
#define AL_GAIN_LIMIT_SOFT 0x200E
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_source_resampler
|
||||
#define AL_SOFT_source_resampler
|
||||
#define AL_NUM_RESAMPLERS_SOFT 0x1210
|
||||
#define AL_DEFAULT_RESAMPLER_SOFT 0x1211
|
||||
#define AL_SOURCE_RESAMPLER_SOFT 0x1212
|
||||
#define AL_RESAMPLER_NAME_SOFT 0x1213
|
||||
typedef const ALchar* (AL_APIENTRY*LPALGETSTRINGISOFT)(ALenum pname, ALsizei index) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_source_spatialize
|
||||
#define AL_SOFT_source_spatialize
|
||||
#define AL_SOURCE_SPATIALIZE_SOFT 0x1214
|
||||
#define AL_AUTO_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_output_limiter
|
||||
#define ALC_SOFT_output_limiter
|
||||
#define ALC_OUTPUT_LIMITER_SOFT 0x199A
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_device_clock
|
||||
#define ALC_SOFT_device_clock 1
|
||||
typedef _alsoft_int64_t ALCint64SOFT;
|
||||
typedef _alsoft_uint64_t ALCuint64SOFT;
|
||||
#define ALC_DEVICE_CLOCK_SOFT 0x1600
|
||||
#define ALC_DEVICE_LATENCY_SOFT 0x1601
|
||||
#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602
|
||||
#define AL_SAMPLE_OFFSET_CLOCK_SOFT 0x1202
|
||||
#define AL_SEC_OFFSET_CLOCK_SOFT 0x1203
|
||||
typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_direct_channels_remix
|
||||
#define AL_SOFT_direct_channels_remix 1
|
||||
#define AL_DROP_UNMATCHED_SOFT 0x0001
|
||||
#define AL_REMIX_UNMATCHED_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_bformat_ex
|
||||
#define AL_SOFT_bformat_ex 1
|
||||
#define AL_AMBISONIC_LAYOUT_SOFT 0x1997
|
||||
#define AL_AMBISONIC_SCALING_SOFT 0x1998
|
||||
|
||||
/* Ambisonic layouts */
|
||||
#define AL_FUMA_SOFT 0x0000
|
||||
#define AL_ACN_SOFT 0x0001
|
||||
|
||||
/* Ambisonic scalings (normalization) */
|
||||
/*#define AL_FUMA_SOFT*/
|
||||
#define AL_SN3D_SOFT 0x0001
|
||||
#define AL_N3D_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_loopback_bformat
|
||||
#define ALC_SOFT_loopback_bformat 1
|
||||
#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997
|
||||
#define ALC_AMBISONIC_SCALING_SOFT 0x1998
|
||||
#define ALC_AMBISONIC_ORDER_SOFT 0x1999
|
||||
#define ALC_MAX_AMBISONIC_ORDER_SOFT 0x199B
|
||||
|
||||
#define ALC_BFORMAT3D_SOFT 0x1507
|
||||
|
||||
/* Ambisonic layouts */
|
||||
#define ALC_FUMA_SOFT 0x0000
|
||||
#define ALC_ACN_SOFT 0x0001
|
||||
|
||||
/* Ambisonic scalings (normalization) */
|
||||
/*#define ALC_FUMA_SOFT*/
|
||||
#define ALC_SN3D_SOFT 0x0001
|
||||
#define ALC_N3D_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_effect_target
|
||||
#define AL_SOFT_effect_target
|
||||
#define AL_EFFECTSLOT_TARGET_SOFT 0x199C
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_events
|
||||
#define AL_SOFT_events 1
|
||||
#define AL_EVENT_CALLBACK_FUNCTION_SOFT 0x19A2
|
||||
#define AL_EVENT_CALLBACK_USER_PARAM_SOFT 0x19A3
|
||||
#define AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT 0x19A4
|
||||
#define AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT 0x19A5
|
||||
#define AL_EVENT_TYPE_DISCONNECTED_SOFT 0x19A6
|
||||
typedef void (AL_APIENTRY*ALEVENTPROCSOFT)(ALenum eventType, ALuint object, ALuint param,
|
||||
ALsizei length, const ALchar *message, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALEVENTCONTROLSOFT)(ALsizei count, const ALenum *types, ALboolean enable) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALEVENTCALLBACKSOFT)(ALEVENTPROCSOFT callback, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY*LPALGETPOINTERSOFT)(ALenum pname) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETPOINTERVSOFT)(ALenum pname, void **values) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *userParam) AL_API_NOEXCEPT;
|
||||
AL_API void* AL_APIENTRY alGetPointerSOFT(ALenum pname) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_reopen_device
|
||||
#define ALC_SOFT_reopen_device
|
||||
typedef ALCboolean (ALC_APIENTRY*LPALCREOPENDEVICESOFT)(ALCdevice *device,
|
||||
const ALCchar *deviceName, const ALCint *attribs) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device, const ALCchar *deviceName,
|
||||
const ALCint *attribs) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_callback_buffer
|
||||
#define AL_SOFT_callback_buffer
|
||||
#define AL_BUFFER_CALLBACK_FUNCTION_SOFT 0x19A0
|
||||
#define AL_BUFFER_CALLBACK_USER_PARAM_SOFT 0x19A1
|
||||
typedef ALsizei (AL_APIENTRY*ALBUFFERCALLBACKTYPESOFT)(ALvoid *userptr, ALvoid *sampledata, ALsizei numbytes) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALBUFFERCALLBACKSOFT)(ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETBUFFERPTRSOFT)(ALuint buffer, ALenum param, ALvoid **value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETBUFFER3PTRSOFT)(ALuint buffer, ALenum param, ALvoid **value1, ALvoid **value2, ALvoid **value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETBUFFERPTRVSOFT)(ALuint buffer, ALenum param, ALvoid **values) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alBufferCallbackSOFT(ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferPtrSOFT(ALuint buffer, ALenum param, ALvoid **ptr) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBuffer3PtrSOFT(ALuint buffer, ALenum param, ALvoid **ptr0, ALvoid **ptr1, ALvoid **ptr2) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetBufferPtrvSOFT(ALuint buffer, ALenum param, ALvoid **ptr) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_UHJ
|
||||
#define AL_SOFT_UHJ
|
||||
#define AL_FORMAT_UHJ2CHN8_SOFT 0x19A2
|
||||
#define AL_FORMAT_UHJ2CHN16_SOFT 0x19A3
|
||||
#define AL_FORMAT_UHJ2CHN_FLOAT32_SOFT 0x19A4
|
||||
#define AL_FORMAT_UHJ3CHN8_SOFT 0x19A5
|
||||
#define AL_FORMAT_UHJ3CHN16_SOFT 0x19A6
|
||||
#define AL_FORMAT_UHJ3CHN_FLOAT32_SOFT 0x19A7
|
||||
#define AL_FORMAT_UHJ4CHN8_SOFT 0x19A8
|
||||
#define AL_FORMAT_UHJ4CHN16_SOFT 0x19A9
|
||||
#define AL_FORMAT_UHJ4CHN_FLOAT32_SOFT 0x19AA
|
||||
|
||||
#define AL_STEREO_MODE_SOFT 0x19B0
|
||||
#define AL_NORMAL_SOFT 0x0000
|
||||
#define AL_SUPER_STEREO_SOFT 0x0001
|
||||
#define AL_SUPER_STEREO_WIDTH_SOFT 0x19B1
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_UHJ_ex
|
||||
#define AL_SOFT_UHJ_ex
|
||||
#define AL_FORMAT_UHJ2CHN_MULAW_SOFT 0x19B3
|
||||
#define AL_FORMAT_UHJ2CHN_ALAW_SOFT 0x19B4
|
||||
#define AL_FORMAT_UHJ2CHN_IMA4_SOFT 0x19B5
|
||||
#define AL_FORMAT_UHJ2CHN_MSADPCM_SOFT 0x19B6
|
||||
#define AL_FORMAT_UHJ3CHN_MULAW_SOFT 0x19B7
|
||||
#define AL_FORMAT_UHJ3CHN_ALAW_SOFT 0x19B8
|
||||
#define AL_FORMAT_UHJ4CHN_MULAW_SOFT 0x19B9
|
||||
#define AL_FORMAT_UHJ4CHN_ALAW_SOFT 0x19BA
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_output_mode
|
||||
#define ALC_SOFT_output_mode
|
||||
#define ALC_OUTPUT_MODE_SOFT 0x19AC
|
||||
#define ALC_ANY_SOFT 0x19AD
|
||||
/*#define ALC_MONO_SOFT 0x1500*/
|
||||
/*#define ALC_STEREO_SOFT 0x1501*/
|
||||
#define ALC_STEREO_BASIC_SOFT 0x19AE
|
||||
#define ALC_STEREO_UHJ_SOFT 0x19AF
|
||||
#define ALC_STEREO_HRTF_SOFT 0x19B2
|
||||
/*#define ALC_QUAD_SOFT 0x1503*/
|
||||
#define ALC_SURROUND_5_1_SOFT 0x1504
|
||||
#define ALC_SURROUND_6_1_SOFT 0x1505
|
||||
#define ALC_SURROUND_7_1_SOFT 0x1506
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_source_start_delay
|
||||
#define AL_SOFT_source_start_delay
|
||||
typedef void (AL_APIENTRY*LPALSOURCEPLAYATTIMESOFT)(ALuint source, ALint64SOFT start_time) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEPLAYATTIMEVSOFT)(ALsizei n, const ALuint *sources, ALint64SOFT start_time) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
void AL_APIENTRY alSourcePlayAtTimeSOFT(ALuint source, ALint64SOFT start_time) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePlayAtTimevSOFT(ALsizei n, const ALuint *sources, ALint64SOFT start_time) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_EXT_debug
|
||||
#define ALC_EXT_debug
|
||||
#define ALC_CONTEXT_FLAGS_EXT 0x19CF
|
||||
#define ALC_CONTEXT_DEBUG_BIT_EXT 0x0001
|
||||
#endif
|
||||
|
||||
#ifndef AL_EXT_debug
|
||||
#define AL_EXT_debug
|
||||
#define AL_DONT_CARE_EXT 0x0002
|
||||
#define AL_DEBUG_OUTPUT_EXT 0x19B2
|
||||
#define AL_DEBUG_CALLBACK_FUNCTION_EXT 0x19B3
|
||||
#define AL_DEBUG_CALLBACK_USER_PARAM_EXT 0x19B4
|
||||
#define AL_DEBUG_SOURCE_API_EXT 0x19B5
|
||||
#define AL_DEBUG_SOURCE_AUDIO_SYSTEM_EXT 0x19B6
|
||||
#define AL_DEBUG_SOURCE_THIRD_PARTY_EXT 0x19B7
|
||||
#define AL_DEBUG_SOURCE_APPLICATION_EXT 0x19B8
|
||||
#define AL_DEBUG_SOURCE_OTHER_EXT 0x19B9
|
||||
#define AL_DEBUG_TYPE_ERROR_EXT 0x19BA
|
||||
#define AL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_EXT 0x19BB
|
||||
#define AL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_EXT 0x19BC
|
||||
#define AL_DEBUG_TYPE_PORTABILITY_EXT 0x19BD
|
||||
#define AL_DEBUG_TYPE_PERFORMANCE_EXT 0x19BE
|
||||
#define AL_DEBUG_TYPE_MARKER_EXT 0x19BF
|
||||
#define AL_DEBUG_TYPE_PUSH_GROUP_EXT 0x19C0
|
||||
#define AL_DEBUG_TYPE_POP_GROUP_EXT 0x19C1
|
||||
#define AL_DEBUG_TYPE_OTHER_EXT 0x19C2
|
||||
#define AL_DEBUG_SEVERITY_HIGH_EXT 0x19C3
|
||||
#define AL_DEBUG_SEVERITY_MEDIUM_EXT 0x19C4
|
||||
#define AL_DEBUG_SEVERITY_LOW_EXT 0x19C5
|
||||
#define AL_DEBUG_SEVERITY_NOTIFICATION_EXT 0x19C6
|
||||
#define AL_DEBUG_LOGGED_MESSAGES_EXT 0x19C7
|
||||
#define AL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_EXT 0x19C8
|
||||
#define AL_MAX_DEBUG_MESSAGE_LENGTH_EXT 0x19C9
|
||||
#define AL_MAX_DEBUG_LOGGED_MESSAGES_EXT 0x19CA
|
||||
#define AL_MAX_DEBUG_GROUP_STACK_DEPTH_EXT 0x19CB
|
||||
#define AL_MAX_LABEL_LENGTH_EXT 0x19CC
|
||||
#define AL_STACK_OVERFLOW_EXT 0x19CD
|
||||
#define AL_STACK_UNDERFLOW_EXT 0x19CE
|
||||
#define AL_CONTEXT_FLAGS_EXT 0x19CF
|
||||
#define AL_BUFFER_EXT 0x1009 /* Same as AL_BUFFER */
|
||||
#define AL_SOURCE_EXT 0x19D0
|
||||
#define AL_FILTER_EXT 0x19D1
|
||||
#define AL_EFFECT_EXT 0x19D2
|
||||
#define AL_AUXILIARY_EFFECT_SLOT_EXT 0x19D3
|
||||
|
||||
typedef void (AL_APIENTRY*ALDEBUGPROCEXT)(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGECALLBACKEXT)(ALDEBUGPROCEXT callback, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGEINSERTEXT)(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGECONTROLEXT)(ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALPUSHDEBUGGROUPEXT)(ALenum source, ALuint id, ALsizei length, const ALchar *message) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALPOPDEBUGGROUPEXT)(void) AL_API_NOEXCEPT17;
|
||||
typedef ALuint (AL_APIENTRY*LPALGETDEBUGMESSAGELOGEXT)(ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALOBJECTLABELEXT)(ALenum identifier, ALuint name, ALsizei length, const ALchar *label) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETOBJECTLABELEXT)(ALenum identifier, ALuint name, ALsizei bufSize, ALsizei *length, ALchar *label) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY*LPALGETPOINTEREXT)(ALenum pname) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETPOINTERVEXT)(ALenum pname, void **values) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
void AL_APIENTRY alDebugMessageCallbackEXT(ALDEBUGPROCEXT callback, void *userParam) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDebugMessageInsertEXT(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDebugMessageControlEXT(ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alPushDebugGroupEXT(ALenum source, ALuint id, ALsizei length, const ALchar *message) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alPopDebugGroupEXT(void) AL_API_NOEXCEPT;
|
||||
ALuint AL_APIENTRY alGetDebugMessageLogEXT(ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alObjectLabelEXT(ALenum identifier, ALuint name, ALsizei length, const ALchar *label) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetObjectLabelEXT(ALenum identifier, ALuint name, ALsizei bufSize, ALsizei *length, ALchar *label) AL_API_NOEXCEPT;
|
||||
void* AL_APIENTRY alGetPointerEXT(ALenum pname) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetPointervEXT(ALenum pname, void **values) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_system_events
|
||||
#define ALC_SOFT_system_events
|
||||
#define ALC_PLAYBACK_DEVICE_SOFT 0x19D4
|
||||
#define ALC_CAPTURE_DEVICE_SOFT 0x19D5
|
||||
#define ALC_EVENT_TYPE_DEFAULT_DEVICE_CHANGED_SOFT 0x19D6
|
||||
#define ALC_EVENT_TYPE_DEVICE_ADDED_SOFT 0x19D7
|
||||
#define ALC_EVENT_TYPE_DEVICE_REMOVED_SOFT 0x19D8
|
||||
#define ALC_EVENT_SUPPORTED_SOFT 0x19D9
|
||||
#define ALC_EVENT_NOT_SUPPORTED_SOFT 0x19DA
|
||||
typedef void (ALC_APIENTRY*ALCEVENTPROCTYPESOFT)(ALCenum eventType, ALCenum deviceType,
|
||||
ALCdevice *device, ALCsizei length, const ALCchar *message, void *userParam) ALC_API_NOEXCEPT17;
|
||||
typedef ALCenum (ALC_APIENTRY*LPALCEVENTISSUPPORTEDSOFT)(ALCenum eventType, ALCenum deviceType) ALC_API_NOEXCEPT17;
|
||||
typedef ALCboolean (ALC_APIENTRY*LPALCEVENTCONTROLSOFT)(ALCsizei count, const ALCenum *events, ALCboolean enable) ALC_API_NOEXCEPT17;
|
||||
typedef void (ALC_APIENTRY*LPALCEVENTCALLBACKSOFT)(ALCEVENTPROCTYPESOFT callback, void *userParam) ALC_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALCenum ALC_APIENTRY alcEventIsSupportedSOFT(ALCenum eventType, ALCenum deviceType) ALC_API_NOEXCEPT;
|
||||
ALCboolean ALC_APIENTRY alcEventControlSOFT(ALCsizei count, const ALCenum *events, ALCboolean enable) ALC_API_NOEXCEPT;
|
||||
void ALC_APIENTRY alcEventCallbackSOFT(ALCEVENTPROCTYPESOFT callback, void *userParam) ALC_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_EXT_direct_context
|
||||
#define AL_EXT_direct_context
|
||||
typedef ALCvoid* (ALC_APIENTRY *LPALCGETPROCADDRESS2)(ALCdevice *device, const ALCchar *funcname) AL_API_NOEXCEPT17;
|
||||
|
||||
typedef void (AL_APIENTRY *LPALENABLEDIRECT)(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDISABLEDIRECT)(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISENABLEDDIRECT)(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDOPPLERFACTORDIRECT)(ALCcontext *context, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSPEEDOFSOUNDDIRECT)(ALCcontext *context, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDISTANCEMODELDIRECT)(ALCcontext *context, ALenum distanceModel) AL_API_NOEXCEPT17;
|
||||
typedef const ALchar* (AL_APIENTRY *LPALGETSTRINGDIRECT)(ALCcontext *context, ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBOOLEANVDIRECT)(ALCcontext *context, ALenum param, ALboolean *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETINTEGERVDIRECT)(ALCcontext *context, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFLOATVDIRECT)(ALCcontext *context, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETDOUBLEVDIRECT)(ALCcontext *context, ALenum param, ALdouble *values) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALGETBOOLEANDIRECT)(ALCcontext *context, ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALint (AL_APIENTRY *LPALGETINTEGERDIRECT)(ALCcontext *context, ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALfloat (AL_APIENTRY *LPALGETFLOATDIRECT)(ALCcontext *context, ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALdouble (AL_APIENTRY *LPALGETDOUBLEDIRECT)(ALCcontext *context, ALenum param) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPALGETERRORDIRECT)(ALCcontext *context) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEXTENSIONPRESENTDIRECT)(ALCcontext *context, const ALchar *extname) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY *LPALGETPROCADDRESSDIRECT)(ALCcontext *context, const ALchar *fname) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPALGETENUMVALUEDIRECT)(ALCcontext *context, const ALchar *ename) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERFDIRECT)(ALCcontext *context, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3FDIRECT)(ALCcontext *context, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERFVDIRECT)(ALCcontext *context, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERIDIRECT)(ALCcontext *context, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENER3IDIRECT)(ALCcontext *context, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALLISTENERIVDIRECT)(ALCcontext *context, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERFDIRECT)(ALCcontext *context, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3FDIRECT)(ALCcontext *context, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERFVDIRECT)(ALCcontext *context, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERIDIRECT)(ALCcontext *context, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENER3IDIRECT)(ALCcontext *context, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETLISTENERIVDIRECT)(ALCcontext *context, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENSOURCESDIRECT)(ALCcontext *context, ALsizei n, ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETESOURCESDIRECT)(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISSOURCEDIRECT)(ALCcontext *context, ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEFDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3FDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEFVDIRECT)(ALCcontext *context, ALuint source, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEIDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3IDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEIVDIRECT)(ALCcontext *context, ALuint source, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEFDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3FDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEFVDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEIDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3IDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEIVDIRECT)(ALCcontext *context, ALuint source, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYDIRECT)(ALCcontext *context, ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOPDIRECT)(ALCcontext *context, ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWINDDIRECT)(ALCcontext *context, ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSEDIRECT)(ALCcontext *context, ALuint source) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYVDIRECT)(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCESTOPVDIRECT)(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEREWINDVDIRECT)(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPAUSEVDIRECT)(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEQUEUEBUFFERSDIRECT)(ALCcontext *context, ALuint source, ALsizei nb, const ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERSDIRECT)(ALCcontext *context, ALuint source, ALsizei nb, ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENBUFFERSDIRECT)(ALCcontext *context, ALsizei n, ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEBUFFERSDIRECT)(ALCcontext *context, ALsizei n, const ALuint *buffers) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISBUFFERDIRECT)(ALCcontext *context, ALuint buffer) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERDATADIRECT)(ALCcontext *context, ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERFDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3FDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERFVDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERIDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFER3IDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALBUFFERIVDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERFDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3FDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERFVDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERIDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3IDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERIVDIRECT)(ALCcontext *context, ALuint buffer, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
/* ALC_EXT_EFX */
|
||||
typedef void (AL_APIENTRY *LPALGENEFFECTSDIRECT)(ALCcontext *context, ALsizei n, ALuint *effects) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEEFFECTSDIRECT)(ALCcontext *context, ALsizei n, const ALuint *effects) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEFFECTDIRECT)(ALCcontext *context, ALuint effect) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTIDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTIVDIRECT)(ALCcontext *context, ALuint effect, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTFDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTFVDIRECT)(ALCcontext *context, ALuint effect, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTIDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTIVDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTFDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTFVDIRECT)(ALCcontext *context, ALuint effect, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENFILTERSDIRECT)(ALCcontext *context, ALsizei n, ALuint *filters) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEFILTERSDIRECT)(ALCcontext *context, ALsizei n, const ALuint *filters) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISFILTERDIRECT)(ALCcontext *context, ALuint filter) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERIDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERIVDIRECT)(ALCcontext *context, ALuint filter, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERFDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERFVDIRECT)(ALCcontext *context, ALuint filter, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERIDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERIVDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERFDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERFVDIRECT)(ALCcontext *context, ALuint filter, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTSDIRECT)(ALCcontext *context, ALsizei n, ALuint *effectslots) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTSDIRECT)(ALCcontext *context, ALsizei n, const ALuint *effectslots) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOTDIRECT)(ALCcontext *context, ALuint effectslot) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIVDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, const ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFVDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, const ALfloat *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALint *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIVDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALint *values) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat *value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFVDIRECT)(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat *values) AL_API_NOEXCEPT17;
|
||||
/* AL_EXT_BUFFER_DATA_STATIC */
|
||||
typedef void (AL_APIENTRY *LPALBUFFERDATASTATICDIRECT)(ALCcontext *context, ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq) AL_API_NOEXCEPT17;
|
||||
/* AL_EXT_debug */
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGECALLBACKDIRECTEXT)(ALCcontext *context, ALDEBUGPROCEXT callback, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGEINSERTDIRECTEXT)(ALCcontext *context, ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALDEBUGMESSAGECONTROLDIRECTEXT)(ALCcontext *context, ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALPUSHDEBUGGROUPDIRECTEXT)(ALCcontext *context, ALenum source, ALuint id, ALsizei length, const ALchar *message) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALPOPDEBUGGROUPDIRECTEXT)(ALCcontext *context) AL_API_NOEXCEPT17;
|
||||
typedef ALuint (AL_APIENTRY*LPALGETDEBUGMESSAGELOGDIRECTEXT)(ALCcontext *context, ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALOBJECTLABELDIRECTEXT)(ALCcontext *context, ALenum identifier, ALuint name, ALsizei length, const ALchar *label) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETOBJECTLABELDIRECTEXT)(ALCcontext *context, ALenum identifier, ALuint name, ALsizei bufSize, ALsizei *length, ALchar *label) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY*LPALGETPOINTERDIRECTEXT)(ALCcontext *context, ALenum pname) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY*LPALGETPOINTERVDIRECTEXT)(ALCcontext *context, ALenum pname, void **values) AL_API_NOEXCEPT17;
|
||||
/* AL_EXT_FOLDBACK */
|
||||
typedef void (AL_APIENTRY *LPALREQUESTFOLDBACKSTARTDIRECT)(ALCcontext *context, ALenum mode, ALsizei count, ALsizei length, ALfloat *mem, LPALFOLDBACKCALLBACK callback) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALREQUESTFOLDBACKSTOPDIRECT)(ALCcontext *context) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_buffer_sub_data */
|
||||
typedef void (AL_APIENTRY *LPALBUFFERSUBDATADIRECTSOFT)(ALCcontext *context, ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_source_latency */
|
||||
typedef void (AL_APIENTRY *LPALSOURCEDDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALdouble) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3DDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALdouble,ALdouble,ALdouble) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEDVDIRECTSOFT)(ALCcontext*,ALuint,ALenum,const ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEDDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3DDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALdouble*,ALdouble*,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEDVDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALdouble*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEI64DIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALint64SOFT) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCE3I64DIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALint64SOFT,ALint64SOFT,ALint64SOFT) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEI64VDIRECTSOFT)(ALCcontext*,ALuint,ALenum,const ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEI64DIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCE3I64DIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALint64SOFT*,ALint64SOFT*,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETSOURCEI64VDIRECTSOFT)(ALCcontext*,ALuint,ALenum,ALint64SOFT*) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_deferred_updates */
|
||||
typedef void (AL_APIENTRY *LPALDEFERUPDATESDIRECTSOFT)(ALCcontext *context) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALPROCESSUPDATESDIRECTSOFT)(ALCcontext *context) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_source_resampler */
|
||||
typedef const ALchar* (AL_APIENTRY *LPALGETSTRINGIDIRECTSOFT)(ALCcontext *context, ALenum pname, ALsizei index) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_events */
|
||||
typedef void (AL_APIENTRY *LPALEVENTCONTROLDIRECTSOFT)(ALCcontext *context, ALsizei count, const ALenum *types, ALboolean enable) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEVENTCALLBACKDIRECTSOFT)(ALCcontext *context, ALEVENTPROCSOFT callback, void *userParam) AL_API_NOEXCEPT17;
|
||||
typedef void* (AL_APIENTRY *LPALGETPOINTERDIRECTSOFT)(ALCcontext *context, ALenum pname) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETPOINTERVDIRECTSOFT)(ALCcontext *context, ALenum pname, void **values) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_callback_buffer */
|
||||
typedef void (AL_APIENTRY *LPALBUFFERCALLBACKDIRECTSOFT)(ALCcontext *context, ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERPTRDIRECTSOFT)(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **value) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFER3PTRDIRECTSOFT)(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **value1, ALvoid **value2, ALvoid **value3) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETBUFFERPTRVDIRECTSOFT)(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **values) AL_API_NOEXCEPT17;
|
||||
/* AL_SOFT_source_start_delay */
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYATTIMEDIRECTSOFT)(ALCcontext *context, ALuint source, ALint64SOFT start_time) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALSOURCEPLAYATTIMEVDIRECTSOFT)(ALCcontext *context, ALsizei n, const ALuint *sources, ALint64SOFT start_time) AL_API_NOEXCEPT17;
|
||||
/* EAX */
|
||||
typedef ALenum (AL_APIENTRY *LPEAXSETDIRECT)(ALCcontext *context, const struct _GUID *property_set_id, ALuint property_id, ALuint source_id, ALvoid *value, ALuint value_size) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPEAXGETDIRECT)(ALCcontext *context, const struct _GUID *property_set_id, ALuint property_id, ALuint source_id, ALvoid *value, ALuint value_size) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPEAXSETBUFFERMODEDIRECT)(ALCcontext *context, ALsizei n, const ALuint *buffers, ALint value) AL_API_NOEXCEPT17;
|
||||
typedef ALenum (AL_APIENTRY *LPEAXGETBUFFERMODEDIRECT)(ALCcontext *context, ALuint buffer, ALint *pReserved) AL_API_NOEXCEPT17;
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
ALCvoid* ALC_APIENTRY alcGetProcAddress2(ALCdevice *device, const ALCchar *funcName) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alEnableDirect(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDisableDirect(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsEnabledDirect(ALCcontext *context, ALenum capability) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alDopplerFactorDirect(ALCcontext *context, ALfloat value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSpeedOfSoundDirect(ALCcontext *context, ALfloat value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDistanceModelDirect(ALCcontext *context, ALenum distanceModel) AL_API_NOEXCEPT;
|
||||
|
||||
const ALchar* AL_APIENTRY alGetStringDirect(ALCcontext *context, ALenum param) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBooleanvDirect(ALCcontext *context, ALenum param, ALboolean *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetIntegervDirect(ALCcontext *context, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetFloatvDirect(ALCcontext *context, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetDoublevDirect(ALCcontext *context, ALenum param, ALdouble *values) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alGetBooleanDirect(ALCcontext *context, ALenum param) AL_API_NOEXCEPT;
|
||||
ALint AL_APIENTRY alGetIntegerDirect(ALCcontext *context, ALenum param) AL_API_NOEXCEPT;
|
||||
ALfloat AL_APIENTRY alGetFloatDirect(ALCcontext *context, ALenum param) AL_API_NOEXCEPT;
|
||||
ALdouble AL_APIENTRY alGetDoubleDirect(ALCcontext *context, ALenum param) AL_API_NOEXCEPT;
|
||||
|
||||
ALenum AL_APIENTRY alGetErrorDirect(ALCcontext *context) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsExtensionPresentDirect(ALCcontext *context, const ALchar *extname) AL_API_NOEXCEPT;
|
||||
void* AL_APIENTRY alGetProcAddressDirect(ALCcontext *context, const ALchar *fname) AL_API_NOEXCEPT;
|
||||
ALenum AL_APIENTRY alGetEnumValueDirect(ALCcontext *context, const ALchar *ename) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alListenerfDirect(ALCcontext *context, ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alListener3fDirect(ALCcontext *context, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alListenerfvDirect(ALCcontext *context, ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alListeneriDirect(ALCcontext *context, ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alListener3iDirect(ALCcontext *context, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alListenerivDirect(ALCcontext *context, ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListenerfDirect(ALCcontext *context, ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListener3fDirect(ALCcontext *context, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListenerfvDirect(ALCcontext *context, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListeneriDirect(ALCcontext *context, ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListener3iDirect(ALCcontext *context, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetListenerivDirect(ALCcontext *context, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alGenSourcesDirect(ALCcontext *context, ALsizei n, ALuint *sources) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDeleteSourcesDirect(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsSourceDirect(ALCcontext *context, ALuint source) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcefDirect(ALCcontext *context, ALuint source, ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSource3fDirect(ALCcontext *context, ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcefvDirect(ALCcontext *context, ALuint source, ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceiDirect(ALCcontext *context, ALuint source, ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSource3iDirect(ALCcontext *context, ALuint source, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceivDirect(ALCcontext *context, ALuint source, ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcefDirect(ALCcontext *context, ALuint source, ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSource3fDirect(ALCcontext *context, ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcefvDirect(ALCcontext *context, ALuint source, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourceiDirect(ALCcontext *context, ALuint source, ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSource3iDirect(ALCcontext *context, ALuint source, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourceivDirect(ALCcontext *context, ALuint source, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePlayDirect(ALCcontext *context, ALuint source) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceStopDirect(ALCcontext *context, ALuint source) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceRewindDirect(ALCcontext *context, ALuint source) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePauseDirect(ALCcontext *context, ALuint source) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePlayvDirect(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceStopvDirect(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceRewindvDirect(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePausevDirect(ALCcontext *context, ALsizei n, const ALuint *sources) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceQueueBuffersDirect(ALCcontext *context, ALuint source, ALsizei nb, const ALuint *buffers) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourceUnqueueBuffersDirect(ALCcontext *context, ALuint source, ALsizei nb, ALuint *buffers) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alGenBuffersDirect(ALCcontext *context, ALsizei n, ALuint *buffers) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDeleteBuffersDirect(ALCcontext *context, ALsizei n, const ALuint *buffers) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsBufferDirect(ALCcontext *context, ALuint buffer) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBufferDataDirect(ALCcontext *context, ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBufferfDirect(ALCcontext *context, ALuint buffer, ALenum param, ALfloat value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBuffer3fDirect(ALCcontext *context, ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBufferfvDirect(ALCcontext *context, ALuint buffer, ALenum param, const ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBufferiDirect(ALCcontext *context, ALuint buffer, ALenum param, ALint value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBuffer3iDirect(ALCcontext *context, ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alBufferivDirect(ALCcontext *context, ALuint buffer, ALenum param, const ALint *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferfDirect(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBuffer3fDirect(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferfvDirect(ALCcontext *context, ALuint buffer, ALenum param, ALfloat *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferiDirect(ALCcontext *context, ALuint buffer, ALenum param, ALint *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBuffer3iDirect(ALCcontext *context, ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferivDirect(ALCcontext *context, ALuint buffer, ALenum param, ALint *values) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alGenEffectsDirect(ALCcontext *context, ALsizei n, ALuint *effects) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDeleteEffectsDirect(ALCcontext *context, ALsizei n, const ALuint *effects) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsEffectDirect(ALCcontext *context, ALuint effect) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alEffectiDirect(ALCcontext *context, ALuint effect, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alEffectivDirect(ALCcontext *context, ALuint effect, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alEffectfDirect(ALCcontext *context, ALuint effect, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alEffectfvDirect(ALCcontext *context, ALuint effect, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetEffectiDirect(ALCcontext *context, ALuint effect, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetEffectivDirect(ALCcontext *context, ALuint effect, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetEffectfDirect(ALCcontext *context, ALuint effect, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetEffectfvDirect(ALCcontext *context, ALuint effect, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alGenFiltersDirect(ALCcontext *context, ALsizei n, ALuint *filters) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDeleteFiltersDirect(ALCcontext *context, ALsizei n, const ALuint *filters) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsFilterDirect(ALCcontext *context, ALuint filter) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alFilteriDirect(ALCcontext *context, ALuint filter, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alFilterivDirect(ALCcontext *context, ALuint filter, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alFilterfDirect(ALCcontext *context, ALuint filter, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alFilterfvDirect(ALCcontext *context, ALuint filter, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetFilteriDirect(ALCcontext *context, ALuint filter, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetFilterivDirect(ALCcontext *context, ALuint filter, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetFilterfDirect(ALCcontext *context, ALuint filter, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetFilterfvDirect(ALCcontext *context, ALuint filter, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alGenAuxiliaryEffectSlotsDirect(ALCcontext *context, ALsizei n, ALuint *effectslots) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDeleteAuxiliaryEffectSlotsDirect(ALCcontext *context, ALsizei n, const ALuint *effectslots) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY alIsAuxiliaryEffectSlotDirect(ALCcontext *context, ALuint effectslot) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alAuxiliaryEffectSlotiDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alAuxiliaryEffectSlotivDirect(ALCcontext *context, ALuint effectslot, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alAuxiliaryEffectSlotfDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alAuxiliaryEffectSlotfvDirect(ALCcontext *context, ALuint effectslot, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetAuxiliaryEffectSlotiDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetAuxiliaryEffectSlotivDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetAuxiliaryEffectSlotfDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetAuxiliaryEffectSlotfvDirect(ALCcontext *context, ALuint effectslot, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alBufferDataStaticDirect(ALCcontext *context, ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alDebugMessageCallbackDirectEXT(ALCcontext *context, ALDEBUGPROCEXT callback, void *userParam) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDebugMessageInsertDirectEXT(ALCcontext *context, ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alDebugMessageControlDirectEXT(ALCcontext *context, ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alPushDebugGroupDirectEXT(ALCcontext *context, ALenum source, ALuint id, ALsizei length, const ALchar *message) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alPopDebugGroupDirectEXT(ALCcontext *context) AL_API_NOEXCEPT;
|
||||
ALuint AL_APIENTRY alGetDebugMessageLogDirectEXT(ALCcontext *context, ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alObjectLabelDirectEXT(ALCcontext *context, ALenum identifier, ALuint name, ALsizei length, const ALchar *label) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetObjectLabelDirectEXT(ALCcontext *context, ALenum identifier, ALuint name, ALsizei bufSize, ALsizei *length, ALchar *label) AL_API_NOEXCEPT;
|
||||
void* AL_APIENTRY alGetPointerDirectEXT(ALCcontext *context, ALenum pname) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetPointervDirectEXT(ALCcontext *context, ALenum pname, void **values) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alRequestFoldbackStartDirect(ALCcontext *context, ALenum mode, ALsizei count, ALsizei length, ALfloat *mem, LPALFOLDBACKCALLBACK callback) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alRequestFoldbackStopDirect(ALCcontext *context) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alBufferSubDataDirectSOFT(ALCcontext *context, ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alSourcedDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALdouble value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSource3dDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALdouble value1, ALdouble value2, ALdouble value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcedvDirectSOFT(ALCcontext *context, ALuint source, ALenum param, const ALdouble *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcedDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALdouble *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSource3dDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALdouble *value1, ALdouble *value2, ALdouble *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcedvDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALdouble *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcei64DirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALint64SOFT value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSource3i64DirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALint64SOFT value1, ALint64SOFT value2, ALint64SOFT value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcei64vDirectSOFT(ALCcontext *context, ALuint source, ALenum param, const ALint64SOFT *values) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcei64DirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALint64SOFT *value) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSource3i64DirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALint64SOFT *value1, ALint64SOFT *value2, ALint64SOFT *value3) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetSourcei64vDirectSOFT(ALCcontext *context, ALuint source, ALenum param, ALint64SOFT *values) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alDeferUpdatesDirectSOFT(ALCcontext *context) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alProcessUpdatesDirectSOFT(ALCcontext *context) AL_API_NOEXCEPT;
|
||||
|
||||
const ALchar* AL_APIENTRY alGetStringiDirectSOFT(ALCcontext *context, ALenum pname, ALsizei index) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alEventControlDirectSOFT(ALCcontext *context, ALsizei count, const ALenum *types, ALboolean enable) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alEventCallbackDirectSOFT(ALCcontext *context, ALEVENTPROCSOFT callback, void *userParam) AL_API_NOEXCEPT;
|
||||
void* AL_APIENTRY alGetPointerDirectSOFT(ALCcontext *context, ALenum pname) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetPointervDirectSOFT(ALCcontext *context, ALenum pname, void **values) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alBufferCallbackDirectSOFT(ALCcontext *context, ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferPtrDirectSOFT(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **ptr) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBuffer3PtrDirectSOFT(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **ptr0, ALvoid **ptr1, ALvoid **ptr2) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alGetBufferPtrvDirectSOFT(ALCcontext *context, ALuint buffer, ALenum param, ALvoid **ptr) AL_API_NOEXCEPT;
|
||||
|
||||
void AL_APIENTRY alSourcePlayAtTimeDirectSOFT(ALCcontext *context, ALuint source, ALint64SOFT start_time) AL_API_NOEXCEPT;
|
||||
void AL_APIENTRY alSourcePlayAtTimevDirectSOFT(ALCcontext *context, ALsizei n, const ALuint *sources, ALint64SOFT start_time) AL_API_NOEXCEPT;
|
||||
|
||||
ALenum AL_APIENTRY EAXSetDirect(ALCcontext *context, const struct _GUID *property_set_id, ALuint property_id, ALuint source_id, ALvoid *value, ALuint value_size) AL_API_NOEXCEPT;
|
||||
ALenum AL_APIENTRY EAXGetDirect(ALCcontext *context, const struct _GUID *property_set_id, ALuint property_id, ALuint source_id, ALvoid *value, ALuint value_size) AL_API_NOEXCEPT;
|
||||
ALboolean AL_APIENTRY EAXSetBufferModeDirect(ALCcontext *context, ALsizei n, const ALuint *buffers, ALint value) AL_API_NOEXCEPT;
|
||||
ALenum AL_APIENTRY EAXGetBufferModeDirect(ALCcontext *context, ALuint buffer, ALint *pReserved) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_bformat_hoa
|
||||
#define AL_SOFT_bformat_hoa
|
||||
#define AL_UNPACK_AMBISONIC_ORDER_SOFT 0x199D
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
/* NOLINTEND */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#ifndef EFX_PRESETS_H
|
||||
#define EFX_PRESETS_H
|
||||
/* NOLINTBEGIN */
|
||||
|
||||
#ifndef EFXEAXREVERBPROPERTIES_DEFINED
|
||||
#define EFXEAXREVERBPROPERTIES_DEFINED
|
||||
|
@ -345,7 +346,7 @@ typedef struct {
|
|||
/* Driving Presets */
|
||||
|
||||
#define EFX_REVERB_PRESET_DRIVING_COMMENTATOR \
|
||||
{ 1.0000f, 0.0000f, 3.1623f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 }
|
||||
{ 1.0000f, 0.0000f, 0.3162f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 }
|
||||
|
||||
#define EFX_REVERB_PRESET_DRIVING_PITGARAGE \
|
||||
{ 0.4287f, 0.5900f, 0.3162f, 0.7079f, 0.5623f, 1.7200f, 0.9300f, 0.8700f, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 }
|
||||
|
@ -399,4 +400,5 @@ typedef struct {
|
|||
#define EFX_REVERB_PRESET_SMALLWATERROOM \
|
||||
{ 1.0000f, 0.7000f, 0.3162f, 0.4477f, 1.0000f, 1.5100f, 1.2500f, 1.1400f, 0.8913f, 0.0200f, { 0.0000f, 0.0000f, 0.0000f }, 1.4125f, 0.0300f, { 0.0000f, 0.0000f, 0.0000f }, 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x0 }
|
||||
|
||||
/* NOLINTEND */
|
||||
#endif /* EFX_PRESETS_H */
|
||||
|
|
135
code/AL/efx.h
135
code/AL/efx.h
|
@ -1,6 +1,8 @@
|
|||
#ifndef AL_EFX_H
|
||||
#define AL_EFX_H
|
||||
|
||||
/* NOLINTBEGIN */
|
||||
#include <float.h>
|
||||
|
||||
#include "alc.h"
|
||||
#include "al.h"
|
||||
|
@ -203,80 +205,80 @@ extern "C" {
|
|||
|
||||
|
||||
/* Effect object function types. */
|
||||
typedef void (AL_APIENTRY *LPALGENEFFECTS)(ALsizei, ALuint*);
|
||||
typedef void (AL_APIENTRY *LPALDELETEEFFECTS)(ALsizei, const ALuint*);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEFFECT)(ALuint);
|
||||
typedef void (AL_APIENTRY *LPALEFFECTI)(ALuint, ALenum, ALint);
|
||||
typedef void (AL_APIENTRY *LPALEFFECTIV)(ALuint, ALenum, const ALint*);
|
||||
typedef void (AL_APIENTRY *LPALEFFECTF)(ALuint, ALenum, ALfloat);
|
||||
typedef void (AL_APIENTRY *LPALEFFECTFV)(ALuint, ALenum, const ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTI)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTIV)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTF)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTFV)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGENEFFECTS)(ALsizei, ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEEFFECTS)(ALsizei, const ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISEFFECT)(ALuint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTI)(ALuint, ALenum, ALint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTIV)(ALuint, ALenum, const ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTF)(ALuint, ALenum, ALfloat) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALEFFECTFV)(ALuint, ALenum, const ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTI)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTIV)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTF)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETEFFECTFV)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
|
||||
/* Filter object function types. */
|
||||
typedef void (AL_APIENTRY *LPALGENFILTERS)(ALsizei, ALuint*);
|
||||
typedef void (AL_APIENTRY *LPALDELETEFILTERS)(ALsizei, const ALuint*);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISFILTER)(ALuint);
|
||||
typedef void (AL_APIENTRY *LPALFILTERI)(ALuint, ALenum, ALint);
|
||||
typedef void (AL_APIENTRY *LPALFILTERIV)(ALuint, ALenum, const ALint*);
|
||||
typedef void (AL_APIENTRY *LPALFILTERF)(ALuint, ALenum, ALfloat);
|
||||
typedef void (AL_APIENTRY *LPALFILTERFV)(ALuint, ALenum, const ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERI)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERIV)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERF)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERFV)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGENFILTERS)(ALsizei, ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEFILTERS)(ALsizei, const ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISFILTER)(ALuint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERI)(ALuint, ALenum, ALint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERIV)(ALuint, ALenum, const ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERF)(ALuint, ALenum, ALfloat) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALFILTERFV)(ALuint, ALenum, const ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERI)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERIV)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERF)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETFILTERFV)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
|
||||
/* Auxiliary Effect Slot object function types. */
|
||||
typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTS)(ALsizei, ALuint*);
|
||||
typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTS)(ALsizei, const ALuint*);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOT)(ALuint);
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint);
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, const ALint*);
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat);
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, const ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, ALint*);
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*);
|
||||
typedef void (AL_APIENTRY *LPALGENAUXILIARYEFFECTSLOTS)(ALsizei, ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALDELETEAUXILIARYEFFECTSLOTS)(ALsizei, const ALuint*) AL_API_NOEXCEPT17;
|
||||
typedef ALboolean (AL_APIENTRY *LPALISAUXILIARYEFFECTSLOT)(ALuint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, const ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, const ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTI)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint, ALenum, ALint*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*) AL_API_NOEXCEPT17;
|
||||
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects);
|
||||
AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect);
|
||||
AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
|
||||
AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters);
|
||||
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter);
|
||||
AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
|
||||
AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots);
|
||||
AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots) AL_API_NOEXCEPT;
|
||||
AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue) AL_API_NOEXCEPT;
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues) AL_API_NOEXCEPT;
|
||||
#endif
|
||||
|
||||
/* Filter ranges and defaults. */
|
||||
|
@ -757,5 +759,6 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum p
|
|||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
/* NOLINTEND */
|
||||
|
||||
#endif /* AL_EFX_H */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -638,20 +638,13 @@ void CG_HudDrawElements()
|
|||
|
||||
cgi.R_SetColor(cgi.HudDrawElements[i].vColor);
|
||||
if (cgi.HudDrawElements[i].string[0]) {
|
||||
fontheader_t* pFont = cgi.HudDrawElements[i].pFont;
|
||||
fontheader_t *pFont = cgi.HudDrawElements[i].pFont;
|
||||
if (!pFont) {
|
||||
pFont = cgs.media.hudDrawFont;
|
||||
}
|
||||
|
||||
if (cgi.HudDrawElements[i].bVirtualScreen) {
|
||||
cgi.R_DrawString(
|
||||
pFont,
|
||||
cgi.LV_ConvertString(cgi.HudDrawElements[i].string),
|
||||
fX,
|
||||
fY,
|
||||
-1,
|
||||
virtualScale
|
||||
);
|
||||
cgi.R_DrawString(pFont, cgi.LV_ConvertString(cgi.HudDrawElements[i].string), fX, fY, -1, virtualScale);
|
||||
} else {
|
||||
cgi.R_DrawString(
|
||||
pFont,
|
||||
|
@ -750,7 +743,17 @@ void CG_DrawObjectives()
|
|||
vColor[0] = 0.2f;
|
||||
vColor[3] = cg.ObjectivesCurrentAlpha * 0.75;
|
||||
cgi.R_SetColor(vColor);
|
||||
cgi.R_DrawStretchPic(fX, fY, 450.0 * cgs.uiHiResScale[0], fWidth * cgs.uiHiResScale[1], 0.0, 0.0, 1.0, 1.0, cgs.media.objectivesBackShader);
|
||||
cgi.R_DrawStretchPic(
|
||||
fX,
|
||||
fY,
|
||||
450.0 * cgs.uiHiResScale[0],
|
||||
fWidth * cgs.uiHiResScale[1],
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
cgs.media.objectivesBackShader
|
||||
);
|
||||
|
||||
fX = 30.0;
|
||||
fY = fObjectivesTop + 10;
|
||||
|
@ -759,10 +762,24 @@ void CG_DrawObjectives()
|
|||
vColor[2] = 1.0;
|
||||
vColor[3] = cg.ObjectivesCurrentAlpha;
|
||||
cgi.R_SetColor(vColor);
|
||||
cgi.R_DrawString(cgs.media.objectiveFont, cgi.LV_ConvertString("Mission Objectives:"), fX, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.objectiveFont,
|
||||
cgi.LV_ConvertString("Mission Objectives:"),
|
||||
fX,
|
||||
fY / cgs.uiHiResScale[1],
|
||||
-1,
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
fY = fY + 5.0;
|
||||
|
||||
cgi.R_DrawString(cgs.media.objectiveFont, "_______________________________________________________", fX, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.objectiveFont,
|
||||
"_______________________________________________________",
|
||||
fX,
|
||||
fY / cgs.uiHiResScale[1],
|
||||
-1,
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
fHeight = fObjectivesTop + 35 * cgs.uiHiResScale[1];
|
||||
|
||||
for (i = 0; i < MAX_OBJECTIVES; ++i) {
|
||||
|
@ -905,12 +922,28 @@ void CG_DrawPlayerEntInfo()
|
|||
|
||||
if (handle) {
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawStretchPic(fX, fY, 16.0 * cgs.uiHiResScale[0], 16.0 * cgs.uiHiResScale[1], 0.0, 0.0, 1.0, 1.0, handle);
|
||||
cgi.R_DrawStretchPic(
|
||||
fX, fY, 16.0 * cgs.uiHiResScale[0], 16.0 * cgs.uiHiResScale[1], 0.0, 0.0, 1.0, 1.0, handle
|
||||
);
|
||||
}
|
||||
|
||||
cgi.R_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.hudDrawFont, (char *)pszName, fX / cgs.uiHiResScale[0] + 24.0, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(cgs.media.hudDrawFont, va("%i", cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]), fX / cgs.uiHiResScale[0] + 24.0, fY / cgs.uiHiResScale[1] + 20.0, -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.hudDrawFont,
|
||||
(char *)pszName,
|
||||
fX / cgs.uiHiResScale[0] + 24.0,
|
||||
fY / cgs.uiHiResScale[1],
|
||||
-1,
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.hudDrawFont,
|
||||
va("%i", cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]),
|
||||
fX / cgs.uiHiResScale[0] + 24.0,
|
||||
fY / cgs.uiHiResScale[1] + 20.0,
|
||||
-1,
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
void CG_UpdateAttackerDisplay()
|
||||
|
@ -981,12 +1014,14 @@ void CG_UpdateAttackerDisplay()
|
|||
}
|
||||
|
||||
cgi.R_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszName, fX / cgs.uiHiResScale[0] + 32.0, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszName, fX / cgs.uiHiResScale[0] + 32.0, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
void CG_UpdateCountdown()
|
||||
{
|
||||
const char* message = "";
|
||||
const char *message = "";
|
||||
|
||||
if (!cg.snap) {
|
||||
return;
|
||||
|
@ -1012,7 +1047,8 @@ void CG_UpdateCountdown()
|
|||
}
|
||||
}
|
||||
|
||||
static void CG_RemoveStopwatch() {
|
||||
static void CG_RemoveStopwatch()
|
||||
{
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_fuse\n");
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_fuse_wet\n");
|
||||
|
@ -1095,7 +1131,9 @@ void CG_DrawInstantMessageMenu()
|
|||
x = 8.0;
|
||||
y = ((float)cgs.glconfig.vidHeight - h) * 0.5;
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawStretchPic(x * cgs.uiHiResScale[0], y, w * cgs.uiHiResScale[0], h * cgs.uiHiResScale[1], 0.0, 0.0, 1.0, 1.0, handle);
|
||||
cgi.R_DrawStretchPic(
|
||||
x * cgs.uiHiResScale[0], y, w * cgs.uiHiResScale[0], h * cgs.uiHiResScale[1], 0.0, 0.0, 1.0, 1.0, handle
|
||||
);
|
||||
}
|
||||
|
||||
void CG_DrawSpectatorView_ver_15()
|
||||
|
@ -1118,10 +1156,14 @@ void CG_DrawSpectatorView_ver_15()
|
|||
if (!bOnTeam) {
|
||||
cgi.Key_GetKeysForCommand("+attackprimary", &iKey1, &iKey2);
|
||||
pszString = cgi.LV_ConvertString(va("Press Fire(%s) to join the battle!", cgi.Key_KeynumToBindString(iKey1)));
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = cgs.glconfig.vidHeight - 64.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = cgs.glconfig.vidHeight - 64.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
if (cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW) {
|
||||
|
@ -1134,10 +1176,14 @@ void CG_DrawSpectatorView_ver_15()
|
|||
cgi.Key_KeynumToBindString(iKey1b))
|
||||
);
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 40.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 40.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
if (!bOnTeam && (cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW)) {
|
||||
|
@ -1145,10 +1191,14 @@ void CG_DrawSpectatorView_ver_15()
|
|||
pszString =
|
||||
cgi.LV_ConvertString(va("Press Use(%s) to enter free spectate mode.", cgi.Key_KeynumToBindString(iKey1)));
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
if (!(cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW)) {
|
||||
|
@ -1158,20 +1208,27 @@ void CG_DrawSpectatorView_ver_15()
|
|||
va("Press Use(%s) to enter player following spectate mode.", cgi.Key_KeynumToBindString(iKey1))
|
||||
);
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
if ((cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW) != 0 && cg.snap && cg.snap->ps.stats[STAT_INFOCLIENT] != -1) {
|
||||
if ((cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW) != 0 && cg.snap
|
||||
&& cg.snap->ps.stats[STAT_INFOCLIENT] != -1) {
|
||||
int iClientNum;
|
||||
qhandle_t hShader;
|
||||
vec4_t color;
|
||||
char buf[128];
|
||||
|
||||
iClientNum = cg.snap->ps.stats[STAT_INFOCLIENT];
|
||||
Com_sprintf(buf, sizeof(buf), "%s : %i", cg.clientinfo[iClientNum].name, cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]);
|
||||
Com_sprintf(
|
||||
buf, sizeof(buf), "%s : %i", cg.clientinfo[iClientNum].name, cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]
|
||||
);
|
||||
|
||||
hShader = 0;
|
||||
color[0] = 0.5;
|
||||
|
@ -1179,10 +1236,14 @@ void CG_DrawSpectatorView_ver_15()
|
|||
color[2] = 0.5;
|
||||
color[3] = 1.0;
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) - 16) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 80.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- (cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) - 16) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 80.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, buf, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, buf, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
|
||||
if (cg.clientinfo[iClientNum].team == TEAM_ALLIES) {
|
||||
hShader = cgi.R_RegisterShader("textures/hud/allies");
|
||||
|
@ -1234,10 +1295,14 @@ void CG_DrawSpectatorView_ver_6()
|
|||
pszString = cgi.LV_ConvertString(va("Press Use(%s) to follow a player.", cgi.Key_KeynumToBindString(iKey1)));
|
||||
}
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 40.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 40.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
|
||||
if (!bOnTeam && (cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW)) {
|
||||
cgi.Key_GetKeysForCommand("+moveup", &iKey1, &iKey2);
|
||||
|
@ -1248,10 +1313,14 @@ void CG_DrawSpectatorView_ver_6()
|
|||
cgi.Key_KeynumToBindString(iKey1b))
|
||||
);
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0;
|
||||
fX = (float)(cgs.glconfig.vidWidth
|
||||
- cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) * cgs.uiHiResScale[0])
|
||||
* 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0 * cgs.uiHiResScale[1];
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1351,17 +1420,7 @@ void CG_DrawCrosshair()
|
|||
y = (cgs.glconfig.vidHeight - height) * 0.5f;
|
||||
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawStretchPic(
|
||||
x,
|
||||
y,
|
||||
width * cgs.uiHiResScale[0],
|
||||
height * cgs.uiHiResScale[1],
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
shader
|
||||
);
|
||||
cgi.R_DrawStretchPic(x, y, width * cgs.uiHiResScale[0], height * cgs.uiHiResScale[1], 0, 0, 1, 1, shader);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1392,15 +1451,17 @@ void CG_DrawVote()
|
|||
percentNo = cgs.numVotesNo * 100 / (cgs.numUndecidedVotes + cgs.numVotesNo + cgs.numVotesYes);
|
||||
percentUndecided = cgs.numUndecidedVotes * 100 / (cgs.numUndecidedVotes + cgs.numVotesNo + cgs.numVotesYes);
|
||||
|
||||
x = 8;
|
||||
y = (cgs.glconfig.vidHeight > 480) ? (cgs.glconfig.vidHeight * 0.725f) : (cgs.glconfig.vidHeight * 0.75f);
|
||||
x = 8 * cgs.uiHiResScale[0];
|
||||
y = ((cgs.glconfig.vidHeight > 480) ? (cgs.glconfig.vidHeight * 0.725f) : (cgs.glconfig.vidHeight * 0.75f));
|
||||
|
||||
cgi.R_SetColor(NULL);
|
||||
|
||||
text = va("%s: %s", cgi.LV_ConvertString("Vote Running"), cgs.voteString);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, text, x, y, -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, text, x / cgs.uiHiResScale[0], y / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
|
||||
y += 12;
|
||||
y += 12 * cgs.uiHiResScale[1];
|
||||
|
||||
text =
|
||||
va("%s: %isec %s: %i%% %s: %i%% %s: %i%%",
|
||||
|
@ -1412,7 +1473,9 @@ void CG_DrawVote()
|
|||
percentNo,
|
||||
cgi.LV_ConvertString("Undecided"),
|
||||
percentUndecided);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, text, x, y, -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, text, x / cgs.uiHiResScale[0], y / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
|
||||
if (cg.snap && !cg.snap->ps.voted) {
|
||||
col[0] = 0.5;
|
||||
|
@ -1421,15 +1484,19 @@ void CG_DrawVote()
|
|||
col[3] = 1.0;
|
||||
cgi.R_SetColor(col);
|
||||
|
||||
y += 12;
|
||||
y += 12 * cgs.uiHiResScale[1];
|
||||
|
||||
text = cgi.LV_ConvertString("Vote now, it's your patriotic duty!");
|
||||
cgi.R_DrawString(cgs.media.attackerFont, text, x, y, -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, text, x / cgs.uiHiResScale[0], y / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
|
||||
y += 12;
|
||||
y += 12 * cgs.uiHiResScale[1];
|
||||
|
||||
text = cgi.LV_ConvertString("To vote Yes, press F1. To vote No, press F2.");
|
||||
cgi.R_DrawString(cgs.media.attackerFont, text, x, y, -1, cgs.uiHiResScale);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, text, x / cgs.uiHiResScale[0], y / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
cgi.R_SetColor(NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -270,6 +270,8 @@ extern "C" {
|
|||
qhandle_t hAlliedPlayerModelHandle;
|
||||
dtiki_t *pAxisPlayerModel;
|
||||
qhandle_t hAxisPlayerModelHandle;
|
||||
qboolean serverAlliedModelValid;
|
||||
qboolean serverAxisModelValid;
|
||||
|
||||
// view eyes
|
||||
vec3_t vOffsetViewAngles;
|
||||
|
@ -510,6 +512,7 @@ extern "C" {
|
|||
// Added in OPM
|
||||
//
|
||||
extern cvar_t *cg_fov;
|
||||
extern cvar_t *cg_cheats;
|
||||
|
||||
//
|
||||
// cg_main.c
|
||||
|
@ -530,6 +533,9 @@ extern "C" {
|
|||
//
|
||||
// cg_modelanim.cpp
|
||||
//
|
||||
void CG_ProcessPlayerModel();
|
||||
void CG_ServerModelLoaded(const char* name, qhandle_t handle);
|
||||
void CG_ServerModelUnloaded(qhandle_t handle);
|
||||
void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime);
|
||||
void CG_AttachEntity(
|
||||
refEntity_t *entity, refEntity_t *parent, dtiki_t *tiki, int tagnum, qboolean use_angles, vec3_t attach_offset
|
||||
|
|
|
@ -116,6 +116,7 @@ cvar_t *ui_timemessage;
|
|||
// Added in OPM
|
||||
//
|
||||
cvar_t *cg_fov;
|
||||
cvar_t *cg_cheats;
|
||||
|
||||
/*
|
||||
=================
|
||||
|
@ -214,6 +215,7 @@ void CG_RegisterCvars(void)
|
|||
//
|
||||
|
||||
cg_fov = cgi.Cvar_Get("cg_fov", "80", CVAR_ARCHIVE);
|
||||
cg_cheats = cgi.Cvar_Get("cheats", "0", CVAR_USERINFO | CVAR_SERVERINFO | CVAR_LATCH);
|
||||
}
|
||||
/*
|
||||
===============
|
||||
|
@ -365,6 +367,8 @@ void CG_ProcessConfigString(int num, qboolean modelOnly)
|
|||
if (tiki) {
|
||||
CG_ProcessCacheInitCommands(tiki);
|
||||
}
|
||||
|
||||
CG_ServerModelLoaded(str, hModel);
|
||||
} else {
|
||||
// clear out the model
|
||||
if (hOldModel && CG_IsHandleUnique(hOldModel)) {
|
||||
|
@ -372,6 +376,10 @@ void CG_ProcessConfigString(int num, qboolean modelOnly)
|
|||
cgi.R_UnregisterServerModel(hOldModel);
|
||||
}
|
||||
cgs.model_draw[num - CS_MODELS] = 0;
|
||||
|
||||
if (!str || !str[0]) {
|
||||
CG_ServerModelUnloaded(hOldModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -26,6 +26,33 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "cg_local.h"
|
||||
#include "tiki.h"
|
||||
|
||||
static qboolean cg_forceModelAllowed = qfalse;
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_GetPlayerModelTiki
|
||||
===============
|
||||
*/
|
||||
const char *CG_GetPlayerModelTiki(const char *modelName)
|
||||
{
|
||||
return va("models/player/%s.tik", modelName);
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_GetPlayerLocalModelTiki
|
||||
===============
|
||||
*/
|
||||
const char *CG_GetPlayerLocalModelTiki(const char *modelName)
|
||||
{
|
||||
return va("models/player/%s.tik", modelName);
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_PlayerTeamIcon
|
||||
===============
|
||||
*/
|
||||
void CG_PlayerTeamIcon(refEntity_t *pModel, entityState_t *pPlayerState)
|
||||
{
|
||||
qboolean bInArtillery, bInTeam, bSpecialIcon;
|
||||
|
@ -187,7 +214,7 @@ CG_InterpolateAnimParms
|
|||
Interpolate between current and next entity
|
||||
===============
|
||||
*/
|
||||
void CG_InterpolateAnimParms(entityState_t* state, entityState_t* sNext, refEntity_t* model)
|
||||
void CG_InterpolateAnimParms(entityState_t *state, entityState_t *sNext, refEntity_t *model)
|
||||
{
|
||||
static cvar_t *vmEntity = NULL;
|
||||
int i;
|
||||
|
@ -214,7 +241,8 @@ void CG_InterpolateAnimParms(entityState_t* state, entityState_t* sNext, refEnti
|
|||
(sNext->frameInfo[i].weight - state->frameInfo[i].weight) * t + state->frameInfo[i].weight;
|
||||
|
||||
if (sNext->frameInfo[i].time >= state->frameInfo[i].time) {
|
||||
model->frameInfo[i].time = (sNext->frameInfo[i].time - state->frameInfo[i].time) * t + state->frameInfo[i].time;
|
||||
model->frameInfo[i].time =
|
||||
(sNext->frameInfo[i].time - state->frameInfo[i].time) * t + state->frameInfo[i].time;
|
||||
} else {
|
||||
animLength = cgi.Anim_Time(model->tiki, sNext->frameInfo[i].index);
|
||||
if (!animLength) {
|
||||
|
@ -298,7 +326,7 @@ CG_CastFootShadow
|
|||
Cast complex foot shadow using lights
|
||||
===============
|
||||
*/
|
||||
void CG_CastFootShadow(const vec_t* vLightPos, vec_t* vLightIntensity, int iTag, refEntity_t* model)
|
||||
void CG_CastFootShadow(const vec_t *vLightPos, vec_t *vLightIntensity, int iTag, refEntity_t *model)
|
||||
{
|
||||
int i;
|
||||
float fAlpha;
|
||||
|
@ -321,8 +349,7 @@ void CG_CastFootShadow(const vec_t* vLightPos, vec_t* vLightIntensity, int iTag,
|
|||
VectorMA(vPos, vEnd[i], model->axis[i], vPos);
|
||||
}
|
||||
|
||||
if (cg_shadowdebug->integer)
|
||||
{
|
||||
if (cg_shadowdebug->integer) {
|
||||
vec3_t vDir;
|
||||
|
||||
//
|
||||
|
@ -377,8 +404,7 @@ void CG_CastFootShadow(const vec_t* vLightPos, vec_t* vLightIntensity, int iTag,
|
|||
VectorMA(vPos, -96.0, vDelta, vEnd);
|
||||
CG_Trace(&trace, vPos, vec3_origin, vec3_origin, vEnd, 0, MASK_FOOTSHADOW, qfalse, qtrue, "CG_CastFootShadow");
|
||||
|
||||
if (cg_shadowdebug->integer)
|
||||
{
|
||||
if (cg_shadowdebug->integer) {
|
||||
cgi.R_DebugLine(vPos, vLightPos, 0.75, 0.75, 0.5, 1.0);
|
||||
cgi.R_DebugLine(vPos, vEnd, 1.0, 1.0, 1.0, 1.0);
|
||||
}
|
||||
|
@ -445,7 +471,15 @@ CG_CastSimpleFeetShadow
|
|||
Cast basic feet shadow
|
||||
===============
|
||||
*/
|
||||
void CG_CastSimpleFeetShadow(const trace_t* pTrace, float fWidth, float fAlpha, int iRightTag, int iLeftTag, const dtiki_t* tiki, refEntity_t* model)
|
||||
void CG_CastSimpleFeetShadow(
|
||||
const trace_t *pTrace,
|
||||
float fWidth,
|
||||
float fAlpha,
|
||||
int iRightTag,
|
||||
int iLeftTag,
|
||||
const dtiki_t *tiki,
|
||||
refEntity_t *model
|
||||
)
|
||||
{
|
||||
int i;
|
||||
float fShadowYaw;
|
||||
|
@ -555,10 +589,8 @@ qboolean CG_EntityShadow(centity_t *cent, refEntity_t *model)
|
|||
|
||||
iNumLights = Q_clamp(cg_shadowscount->integer, 1, 8);
|
||||
iNumLights = cgi.R_GatherLightSources(model->origin, avLightPos, avLightIntensity, iNumLights);
|
||||
if (iNumLights)
|
||||
{
|
||||
for (iCurrLight = 0; iCurrLight < iNumLights; iCurrLight++)
|
||||
{
|
||||
if (iNumLights) {
|
||||
for (iCurrLight = 0; iCurrLight < iNumLights; iCurrLight++) {
|
||||
CG_CastFootShadow(avLightPos[iCurrLight], avLightIntensity[iCurrLight], iTagL, model);
|
||||
CG_CastFootShadow(avLightPos[iCurrLight], avLightIntensity[iCurrLight], iTagR, model);
|
||||
}
|
||||
|
@ -725,6 +757,11 @@ void CG_AttachEntity(
|
|||
VectorAdd(entity->origin, vOrigin, entity->lightingOrigin);
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_AttachEyeEntity
|
||||
===============
|
||||
*/
|
||||
void CG_AttachEyeEntity(
|
||||
refEntity_t *entity, refEntity_t *parent, dtiki_t *tiki, int tagnum, qboolean use_angles, vec_t *attach_offset
|
||||
)
|
||||
|
@ -737,8 +774,7 @@ void CG_AttachEyeEntity(
|
|||
AnglesToAxis(cg.refdefViewAngles, entity->axis);
|
||||
}
|
||||
|
||||
if (attach_offset[0] || attach_offset[1] || attach_offset[2])
|
||||
{
|
||||
if (attach_offset[0] || attach_offset[1] || attach_offset[2]) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
VectorMA(entity->origin, attach_offset[i], entity->axis[i], entity->origin);
|
||||
}
|
||||
|
@ -750,15 +786,146 @@ void CG_AttachEyeEntity(
|
|||
VectorCopy(parent->lightingOrigin, entity->lightingOrigin);
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_IsValidServerModel
|
||||
===============
|
||||
*/
|
||||
qboolean CG_IsValidServerModel(const char *modelpath)
|
||||
{
|
||||
const char *str;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < MAX_MODELS; i++) {
|
||||
str = CG_ConfigString(CS_MODELS + i);
|
||||
if (!Q_stricmp(str, modelpath)) {
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_CheckValidModels
|
||||
|
||||
This verifies the allied player model and the german player model:
|
||||
- If they don't exist on the client, reset to the default allied player model
|
||||
- If they don't exist on the server, don't allow forceModel so the client explicitly know the skin isn't supported
|
||||
===============
|
||||
*/
|
||||
void CG_CheckValidModels()
|
||||
{
|
||||
const char *modelpath;
|
||||
qboolean isDirty = qfalse;
|
||||
|
||||
if (dm_playermodel->modified) {
|
||||
// Check for allied model
|
||||
modelpath = va("models/player/%s.tik", dm_playermodel->string);
|
||||
if (!cgi.R_RegisterModel(modelpath)) {
|
||||
cgi.Printf(
|
||||
"Allied model '%s' is invalid, resetting to '%s'\n", dm_playermodel->string, dm_playermodel->resetString
|
||||
);
|
||||
|
||||
cgi.Cvar_Set("dm_playermodel", dm_playermodel->resetString);
|
||||
modelpath = va("models/player/%s.tik", dm_playermodel->string);
|
||||
}
|
||||
|
||||
cg.serverAlliedModelValid = CG_IsValidServerModel(modelpath);
|
||||
}
|
||||
|
||||
if (dm_playergermanmodel->modified) {
|
||||
// Check for axis model
|
||||
modelpath = va("models/player/%s.tik", dm_playergermanmodel->string);
|
||||
if (!cgi.R_RegisterModel(modelpath)) {
|
||||
cgi.Printf(
|
||||
"Allied model '%s' is invalid, resetting to '%s'\n",
|
||||
dm_playergermanmodel->string,
|
||||
dm_playergermanmodel->resetString
|
||||
);
|
||||
|
||||
cgi.Cvar_Set("dm_playergermanmodel", dm_playergermanmodel->resetString);
|
||||
modelpath = va("models/player/%s.tik", dm_playergermanmodel->string);
|
||||
}
|
||||
|
||||
cg.serverAxisModelValid = CG_IsValidServerModel(modelpath);
|
||||
}
|
||||
|
||||
if (dm_playermodel->modified || dm_playergermanmodel->modified) {
|
||||
cg_forceModelAllowed = cg.serverAlliedModelValid && cg.serverAxisModelValid;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_ServerModelLoaded
|
||||
===============
|
||||
*/
|
||||
void CG_ServerModelLoaded(const char *name, qhandle_t handle)
|
||||
{
|
||||
if (!Q_stricmpn(name, "models/player/", 14) && (!cg.serverAlliedModelValid || !cg.serverAxisModelValid)) {
|
||||
char modelName[MAX_QPATH];
|
||||
COM_StripExtension(name + 14, modelName, sizeof(modelName));
|
||||
|
||||
//
|
||||
// The player model has been loaded on the server
|
||||
// so try again parsing
|
||||
//
|
||||
if (!Q_stricmp(modelName, dm_playermodel->string)) {
|
||||
dm_playermodel->modified = qtrue;
|
||||
}
|
||||
if (!Q_stricmp(modelName, dm_playergermanmodel->string)) {
|
||||
dm_playergermanmodel->modified = qtrue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_ServerModelUnloaded
|
||||
===============
|
||||
*/
|
||||
void CG_ServerModelUnloaded(qhandle_t handle)
|
||||
{
|
||||
#if 0
|
||||
if (cg.serverAlliedModelValid && handle == cg.hAlliedPlayerModelHandle) {
|
||||
dm_playermodel->modified = qtrue;
|
||||
}
|
||||
if (cg.serverAxisModelValid && handle == cg.hAxisPlayerModelHandle) {
|
||||
dm_playergermanmodel->modified = qtrue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_UpdateForceModels
|
||||
===============
|
||||
*/
|
||||
void CG_UpdateForceModels()
|
||||
{
|
||||
qhandle_t hModel;
|
||||
char* pszAlliesPartial;
|
||||
char* pszAxisPartial;
|
||||
char *pszAlliesPartial;
|
||||
char *pszAxisPartial;
|
||||
char szAlliesModel[256];
|
||||
char szAxisModel[256];
|
||||
qboolean isDirty;
|
||||
|
||||
if (cg.pAlliedPlayerModel && cg.pAxisPlayerModel && !dm_playermodel->modified && !dm_playergermanmodel->modified) {
|
||||
isDirty = dm_playermodel->modified || dm_playergermanmodel->modified || cg_forceModel->modified;
|
||||
|
||||
if (!cg_forceModelAllowed) {
|
||||
if (isDirty) {
|
||||
cgi.Printf(
|
||||
"One or more of the selected players model don't exist on the server or are not loaded, using the "
|
||||
"default skin\n"
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (cg.pAlliedPlayerModel && cg.pAxisPlayerModel && !isDirty) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -767,8 +934,12 @@ void CG_UpdateForceModels()
|
|||
|
||||
Com_sprintf(szAlliesModel, sizeof(szAlliesModel), "models/player/%s.tik", pszAlliesPartial);
|
||||
Com_sprintf(szAxisModel, sizeof(szAxisModel), "models/player/%s.tik", pszAxisPartial);
|
||||
|
||||
hModel = cg.serverAlliedModelValid ? cgi.R_RegisterModel(szAlliesModel) : 0;
|
||||
if (!hModel) {
|
||||
Com_sprintf(szAlliesModel, sizeof(szAlliesModel), "models/player/%s.tik", dm_playermodel->resetString);
|
||||
hModel = cgi.R_RegisterModel(szAlliesModel);
|
||||
if (!hModel) hModel = cgi.R_RegisterModel("models/player/american_army.tik");
|
||||
}
|
||||
|
||||
if (hModel) {
|
||||
cg.hAlliedPlayerModelHandle = hModel;
|
||||
|
@ -778,11 +949,14 @@ void CG_UpdateForceModels()
|
|||
}
|
||||
} else {
|
||||
cg.hAlliedPlayerModelHandle = 0;
|
||||
cg.pAlliedPlayerModel = 0;
|
||||
cg.pAlliedPlayerModel = NULL;
|
||||
}
|
||||
|
||||
hModel = cg.serverAxisModelValid ? cgi.R_RegisterModel(szAxisModel) : 0;
|
||||
if (!hModel) {
|
||||
Com_sprintf(szAxisModel, sizeof(szAxisModel), "models/player/%s.tik", dm_playergermanmodel->resetString);
|
||||
hModel = cgi.R_RegisterModel(szAxisModel);
|
||||
if (!hModel) hModel = cgi.R_RegisterModel("models/player/german_wehrmacht_soldier.tik");
|
||||
}
|
||||
|
||||
if (hModel) {
|
||||
cg.hAxisPlayerModelHandle = hModel;
|
||||
|
@ -796,10 +970,35 @@ void CG_UpdateForceModels()
|
|||
}
|
||||
|
||||
// Clear modified flag
|
||||
dm_playermodel->modified = qfalse;
|
||||
dm_playergermanmodel->modified = qfalse;
|
||||
//dm_playermodel->modified = qfalse;
|
||||
//dm_playergermanmodel->modified = qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_ProcessPlayerModel
|
||||
|
||||
Checks player models, and update force models
|
||||
===============
|
||||
*/
|
||||
void CG_ProcessPlayerModel()
|
||||
{
|
||||
CG_CheckValidModels();
|
||||
if (cg_forceModel->integer) {
|
||||
CG_UpdateForceModels();
|
||||
}
|
||||
|
||||
// Clear modified flag
|
||||
dm_playermodel->modified = qfalse;
|
||||
dm_playergermanmodel->modified = qfalse;
|
||||
cg_forceModel->modified = qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CG_ModelAnim
|
||||
===============
|
||||
*/
|
||||
void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime)
|
||||
{
|
||||
entityState_t *s1;
|
||||
|
@ -940,8 +1139,8 @@ void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime)
|
|||
model.tiki = cgi.R_Model_GetHandle(cgs.model_draw[s1->modelindex]);
|
||||
|
||||
if (s1->number != cg.snap->ps.clientNum && (s1->eType == ET_PLAYER || (s1->eFlags & EF_DEAD))) {
|
||||
if (cg_forceModel->integer) {
|
||||
CG_UpdateForceModels();
|
||||
if (cg_forceModel->integer && cg_forceModelAllowed) {
|
||||
//CG_UpdateForceModels();
|
||||
|
||||
if (s1->eFlags & EF_AXIS) {
|
||||
model.hModel = cg.hAxisPlayerModelHandle;
|
||||
|
@ -965,9 +1164,9 @@ void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime)
|
|||
if (!model.hModel || !model.tiki) {
|
||||
// Use a model in case it still doesn't exist
|
||||
if (s1->eFlags & EF_AXIS) {
|
||||
model.hModel = cgi.R_RegisterModel("models/player/german_wehrmacht_soldier.tik");
|
||||
model.hModel = cgi.R_RegisterModel(CG_GetPlayerModelTiki(dm_playergermanmodel->resetString));
|
||||
} else {
|
||||
model.hModel = cgi.R_RegisterModel("models/player/american_army.tik");
|
||||
model.hModel = cgi.R_RegisterModel(CG_GetPlayerModelTiki(dm_playermodel->resetString));
|
||||
}
|
||||
model.tiki = cgi.R_Model_GetHandle(model.hModel);
|
||||
model.hOldModel = cgs.model_draw[s1->modelindex];
|
||||
|
@ -1213,9 +1412,9 @@ void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime)
|
|||
}
|
||||
} else {
|
||||
if (cg.snap->ps.stats[STAT_TEAM] == TEAM_AXIS) {
|
||||
hModel = cgi.R_RegisterModel("models/player/german_wehrmacht_soldier_fps.tik");
|
||||
hModel = cgi.R_RegisterModel(CG_GetPlayerLocalModelTiki(dm_playergermanmodel->resetString));
|
||||
} else {
|
||||
hModel = cgi.R_RegisterModel("models/player/american_army_fps.tik");
|
||||
hModel = cgi.R_RegisterModel(CG_GetPlayerLocalModelTiki(dm_playermodel->resetString));
|
||||
}
|
||||
|
||||
if (hModel) {
|
||||
|
|
|
@ -85,7 +85,12 @@ void CG_MakeBulletHoleSound(const vec3_t i_vPos, const vec3_t i_vNorm, int iLarg
|
|||
iSurfType = SURF_PUDDLE;
|
||||
}
|
||||
|
||||
if (trace.fraction == 1.0f || trace.startsolid || (trace.surfaceFlags & SURF_SKY)) {
|
||||
if (trace.fraction == 1) {
|
||||
// no reason to make a sound if it nothing was hit
|
||||
return;
|
||||
}
|
||||
|
||||
if ((trace.surfaceFlags & SURF_SKY) || !CG_CheckMakeMarkOnEntity(trace.entityNum)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -253,7 +258,12 @@ CG_MakeBulletHole(const vec3_t i_vPos, const vec3_t i_vNorm, int iLarge, trace_t
|
|||
iSurfType = SURF_PUDDLE;
|
||||
}
|
||||
|
||||
if (trace.fraction == 1.0f || trace.startsolid || (trace.surfaceFlags & SURF_SKY)) {
|
||||
if (trace.fraction == 1.0f || trace.startsolid) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (trace.surfaceFlags & SURF_SKY) {
|
||||
// ignore sky surfaces
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -479,10 +489,11 @@ static void CG_MakeBulletTracerInternal(
|
|||
int iNumImpacts;
|
||||
trace_t tImpacts[128];
|
||||
float fImpSndDistRA;
|
||||
static float fImpSndDistLA;
|
||||
float fImpSndDistLA;
|
||||
float fImpSndDistRB;
|
||||
float fImpSndDistLB;
|
||||
int iImpSndIndexRA;
|
||||
int iImpSndIndexLA;
|
||||
int iImpSndIndexRB;
|
||||
int iImpSndIndexLB;
|
||||
float fVolume;
|
||||
|
@ -584,7 +595,8 @@ static void CG_MakeBulletTracerInternal(
|
|||
|| (trace.contents & CONTENTS_WATER))
|
||||
&& iContinueCount < 5) {
|
||||
if (bInWater) {
|
||||
VectorSubtract(trace.endpos, vDir, vTmp);
|
||||
VectorMA(trace.endpos, -1.0, vDir, vTmp);
|
||||
|
||||
if (!(trace.contents & CONTENTS_FLUID) && !(trace.surfaceFlags & SURF_PUDDLE)
|
||||
&& !(cgi.CM_PointContents(vTmp, 0) & CONTENTS_FLUID)) {
|
||||
CG_MakeBubbleTrail(vTrailStart, trace.endpos, iLarge, alpha);
|
||||
|
@ -596,8 +608,7 @@ static void CG_MakeBulletTracerInternal(
|
|||
bInWater = qtrue;
|
||||
}
|
||||
|
||||
VectorAdd(vDir, vDir, vTraceStart);
|
||||
VectorAdd(vTraceStart, vTraceStart, trace.endpos);
|
||||
VectorMA(trace.endpos, 2.0, vDir, vTraceStart);
|
||||
|
||||
iContinueCount++;
|
||||
} else {
|
||||
|
@ -659,30 +670,30 @@ static void CG_MakeBulletTracerInternal(
|
|||
if (iNumImpacts > 2) {
|
||||
fImpSndDistRA = 9999.0f;
|
||||
fImpSndDistRB = 9999.0f;
|
||||
iImpSndIndexRA = 0;
|
||||
iImpSndIndexRB = 0;
|
||||
fImpSndDistLA = 9999.0f;
|
||||
fImpSndDistLB = 9999.0f;
|
||||
iImpSndIndexRA = 0;
|
||||
iImpSndIndexLA = 0;
|
||||
iImpSndIndexRB = 0;
|
||||
iImpSndIndexLB = 0;
|
||||
|
||||
for (iBullet = 0; iBullet < iNumImpacts; iBullet++) {
|
||||
CG_MakeBulletHole(
|
||||
tImpacts[iImpSndIndexLB].endpos,
|
||||
tImpacts[iImpSndIndexLB].plane.normal,
|
||||
iLarge,
|
||||
&tImpacts[iImpSndIndexLB],
|
||||
qfalse
|
||||
tImpacts[iBullet].endpos, tImpacts[iBullet].plane.normal, iLarge, &tImpacts[iBullet], qfalse
|
||||
);
|
||||
|
||||
VectorSubtract(tImpacts[iImpSndIndexLB].endpos, cg.SoundOrg, vTmp);
|
||||
VectorSubtract(tImpacts[iBullet].endpos, cg.SoundOrg, vTmp);
|
||||
iHeadDist = VectorLength(vTmp);
|
||||
|
||||
if (DotProduct(vTmp, cg.SoundAxis[1]) <= 0.f) {
|
||||
if (iHeadDist < 9999.0f || iHeadDist < fImpSndDistLB) {
|
||||
if (iHeadDist < 9999.0f) {
|
||||
fImpSndDistRA = iHeadDist;
|
||||
fImpSndDistLB = 9999.0;
|
||||
if (iHeadDist < fImpSndDistLA || iHeadDist < fImpSndDistLB) {
|
||||
if (iHeadDist < fImpSndDistLA) {
|
||||
iImpSndIndexLB = iImpSndIndexLA;
|
||||
fImpSndDistLB = fImpSndDistLA;
|
||||
iImpSndIndexRA = iBullet;
|
||||
fImpSndDistRA = iHeadDist;
|
||||
} else if (iHeadDist < fImpSndDistLB) {
|
||||
iImpSndIndexLB = iBullet;
|
||||
fImpSndDistLB = iHeadDist;
|
||||
}
|
||||
}
|
||||
|
@ -690,15 +701,15 @@ static void CG_MakeBulletTracerInternal(
|
|||
if (iHeadDist < fImpSndDistRA || iHeadDist < fImpSndDistRB) {
|
||||
if (iHeadDist < fImpSndDistRA) {
|
||||
iImpSndIndexRB = iImpSndIndexRA;
|
||||
fImpSndDistRB = fImpSndDistRA;
|
||||
iImpSndIndexRA = iBullet;
|
||||
fImpSndDistRA = iHeadDist;
|
||||
} else if (iHeadDist < fImpSndDistRB) {
|
||||
fImpSndDistRB = iHeadDist;
|
||||
iImpSndIndexRB = iBullet;
|
||||
fImpSndDistRB = iHeadDist;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iImpSndIndexLB++;
|
||||
}
|
||||
|
||||
if (fImpSndDistRA < 9999.0f) {
|
||||
|
@ -718,6 +729,24 @@ static void CG_MakeBulletTracerInternal(
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (fImpSndDistLA < 9999.0f) {
|
||||
CG_MakeBulletHoleSound(
|
||||
tImpacts[iImpSndIndexLA].endpos,
|
||||
tImpacts[iImpSndIndexLA].plane.normal,
|
||||
iLarge,
|
||||
&tImpacts[iImpSndIndexLA]
|
||||
);
|
||||
|
||||
if (fImpSndDistLB < 9999.0f) {
|
||||
CG_MakeBulletHoleSound(
|
||||
tImpacts[iImpSndIndexLB].endpos,
|
||||
tImpacts[iImpSndIndexLB].plane.normal,
|
||||
iLarge,
|
||||
&tImpacts[iImpSndIndexLB]
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (iBullet = 0; iBullet < iNumImpacts; iBullet++) {
|
||||
CG_MakeBulletHole(
|
||||
|
@ -1638,8 +1667,8 @@ void CG_ParseCGMessage_ver_15()
|
|||
CG_HudDrawFont(iInfo);
|
||||
break;
|
||||
|
||||
case CGM_NOTIFY_KILL:
|
||||
case CGM_NOTIFY_HIT:
|
||||
case CGM_NOTIFY_KILL:
|
||||
if (cg.snap) {
|
||||
const char *soundName;
|
||||
int iOldEnt;
|
||||
|
@ -1647,12 +1676,11 @@ void CG_ParseCGMessage_ver_15()
|
|||
iOldEnt = current_entity_number;
|
||||
|
||||
current_entity_number = cg.snap->ps.clientNum;
|
||||
if (iType == CGM_NOTIFY_HIT) {
|
||||
soundName = "dm_kill_notify";
|
||||
if (iType == CGM_NOTIFY_KILL) {
|
||||
commandManager.PlaySound("dm_kill_notify", NULL, CHAN_LOCAL, 2.0, -1, -1, 1);
|
||||
} else {
|
||||
soundName = "dm_hit_notify";
|
||||
commandManager.PlaySound("dm_hit_notify", NULL, CHAN_LOCAL, 2.0, -1, -1, 1);
|
||||
}
|
||||
commandManager.PlaySound(soundName, NULL, CHAN_LOCAL, 2.0, -1, -1, 1);
|
||||
|
||||
current_entity_number = iOldEnt;
|
||||
}
|
||||
|
@ -2029,15 +2057,15 @@ void CG_ParseCGMessage_ver_6()
|
|||
CG_HudDrawFont(iInfo);
|
||||
break;
|
||||
|
||||
case CGM6_NOTIFY_KILL:
|
||||
case CGM6_NOTIFY_HIT:
|
||||
case CGM6_NOTIFY_KILL:
|
||||
if (cg.snap) {
|
||||
int iOldEnt;
|
||||
|
||||
iOldEnt = current_entity_number;
|
||||
|
||||
current_entity_number = cg.snap->ps.clientNum;
|
||||
if (iType == CGM6_NOTIFY_HIT) {
|
||||
if (iType == CGM6_NOTIFY_KILL) {
|
||||
commandManager.PlaySound("dm_kill_notify", NULL, CHAN_LOCAL, 2.0, -1, -1, 1);
|
||||
} else {
|
||||
commandManager.PlaySound("dm_hit_notify", NULL, CHAN_LOCAL, 2.0, -1, -1, 1);
|
||||
|
|
|
@ -122,6 +122,7 @@ functions exported to the main executable
|
|||
cvar_t *(*Cvar_Get)(const char *var_name, const char *value, int flags);
|
||||
cvar_t *(*Cvar_Find)(const char *var_name);
|
||||
void (*Cvar_Set)(const char *var_name, const char *value);
|
||||
void (*Cvar_CheckRange)(cvar_t* var, float min, float max, qboolean integral);
|
||||
|
||||
// ClientCommand and ConsoleCommand parameter access
|
||||
int (*Argc)(void);
|
||||
|
|
|
@ -26,8 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
|
||||
#include "cg_local.h"
|
||||
#include "../fgame/bg_voteoptions.h"
|
||||
|
||||
static qboolean CG_IsStatementFiltered(char *cmd);
|
||||
#include "cg_servercmds_filter.h"
|
||||
|
||||
/*
|
||||
================
|
||||
|
@ -458,237 +457,3 @@ void CG_ExecuteNewServerCommands(int latestSequence, qboolean differentServer)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// List of client variables allowed to be changed by the server
|
||||
//
|
||||
static const char *whiteListedVariables[] = {
|
||||
"r_fastsky", // some mods set this variable to make the sky uniform
|
||||
"ui_hud",
|
||||
"subtitle0",
|
||||
"subtitle1",
|
||||
"subtitle2",
|
||||
"subtitle3"
|
||||
};
|
||||
|
||||
//
|
||||
// List of client variables allowed to be changed by the server
|
||||
//
|
||||
static const char *whiteListedLocalServerVariables[] = {"ui_hidemouse", "ui_showmouse", "cg_marks_add"};
|
||||
|
||||
//
|
||||
// List of commands allowed to be executed by the server
|
||||
//
|
||||
static const char *whiteListedCommands[] = {
|
||||
"primarydmweapon",
|
||||
"pushmenu",
|
||||
"pushmenu_teamselect",
|
||||
"pushmenu_weaponselect",
|
||||
"popmenu",
|
||||
"wait",
|
||||
"globalwidgetcommand", // used for mods adding custom HUDs
|
||||
"ui_addhud",
|
||||
"ui_removehud",
|
||||
"tmstart",
|
||||
"tmstartloop",
|
||||
"tmstop",
|
||||
"tmvolume",
|
||||
"`stufftext",
|
||||
"+moveup", // workaround for mods that want to prevent inactivity when handling the spectate
|
||||
"-moveup",
|
||||
"screenshot",
|
||||
"screenshotJPEG",
|
||||
"levelshot"
|
||||
};
|
||||
|
||||
//
|
||||
// List of commands allowed to be executed by the server
|
||||
//
|
||||
static const char *whiteListedLocalServerCommands[] = {
|
||||
"spmap", // Used by briefings
|
||||
"map",
|
||||
"disconnect",
|
||||
"cinematic",
|
||||
"showmenu",
|
||||
"hidemenu"
|
||||
};
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsVariableFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsVariableFiltered(const char *name)
|
||||
{
|
||||
cvar_t *var;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedVariables); i++) {
|
||||
if (!Q_stricmp(name, whiteListedVariables[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
if (cgs.localServer) {
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedLocalServerVariables); i++) {
|
||||
if (!Q_stricmp(name, whiteListedLocalServerVariables[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Filtered
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsSetVariableFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsSetVariableFiltered(const char *name, char type)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
if (!CG_IsVariableFiltered(name)) {
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (type != 'u' && type != 's') {
|
||||
// Don't allow custom info variables to avoid flooding
|
||||
// the client with many serverinfo and userinfo variables
|
||||
|
||||
var = cgi.Cvar_Find(name);
|
||||
if (!var) {
|
||||
// Allow as it doesn't exist
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (var->flags & CVAR_USER_CREATED) {
|
||||
// Allow, it's user-created, wouldn't cause issues
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
// Filtered
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsCommandFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsCommandFiltered(const char *name)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedCommands); i++) {
|
||||
if (!Q_stricmp(name, whiteListedCommands[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
if (cgs.localServer) {
|
||||
// Allow more commands when the client is hosting the server
|
||||
// Mostly used on single-player mode, like when briefings switch to the next map
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedLocalServerCommands); i++) {
|
||||
if (!Q_stricmp(name, whiteListedLocalServerCommands[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Test variables
|
||||
//
|
||||
return CG_IsVariableFiltered(name);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
RemoveEndToken
|
||||
====================
|
||||
*/
|
||||
static qboolean RemoveEndToken(char* com_token) {
|
||||
char* p;
|
||||
|
||||
for (p = com_token; p[0]; p++) {
|
||||
if (*p == ';') {
|
||||
*p = 0;
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsStatementFiltered
|
||||
|
||||
Returns whether or not the statement is filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsStatementFiltered(char *cmd)
|
||||
{
|
||||
char* parsed;
|
||||
char* p;
|
||||
char com_token[256];
|
||||
qboolean bNextStatement = qfalse;
|
||||
|
||||
parsed = cmd;
|
||||
|
||||
for (Q_strncpyz(com_token, COM_ParseExt(&parsed, qtrue), sizeof(com_token)); com_token[0]; Q_strncpyz(com_token, COM_ParseExt(&parsed, qtrue), sizeof(com_token))) {
|
||||
bNextStatement = RemoveEndToken(com_token);
|
||||
|
||||
if (com_token[0] == ';') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(com_token, "set") || !Q_stricmp(com_token, "setu") || !Q_stricmp(com_token, "seta")
|
||||
|| !Q_stricmp(com_token, "sets")) {
|
||||
char type = com_token[3];
|
||||
|
||||
//
|
||||
// variable
|
||||
//
|
||||
Q_strncpyz(com_token, COM_ParseExt(&parsed, qfalse), sizeof(com_token));
|
||||
bNextStatement |= RemoveEndToken(com_token);
|
||||
if (com_token[0] == ';') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CG_IsSetVariableFiltered(com_token, type)) {
|
||||
return qtrue;
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// normal command
|
||||
//
|
||||
if (CG_IsCommandFiltered(com_token)) {
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bNextStatement) {
|
||||
// Skip up to the next statement
|
||||
while (parsed && parsed[0]) {
|
||||
char c = parsed[0];
|
||||
|
||||
parsed++;
|
||||
if (c == '\n' || c == ';') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
292
code/cgame/cg_servercmds_filter.c
Normal file
292
code/cgame/cg_servercmds_filter.c
Normal file
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// DESCRIPTION:
|
||||
// cg_servercmds_filter.c -- filtered server commands
|
||||
|
||||
#include "cg_local.h"
|
||||
#include "cg_servercmds_filter.h"
|
||||
|
||||
//
|
||||
// List of variables allowed to be changed by the server
|
||||
//
|
||||
static const char *whiteListedVariables[] = {
|
||||
// some mods set this variable to make the sky uniform
|
||||
"r_fastsky",
|
||||
|
||||
"ui_hud",
|
||||
"subtitle0",
|
||||
"subtitle1",
|
||||
"subtitle2",
|
||||
"subtitle3",
|
||||
"name",
|
||||
|
||||
// for 3rd person server
|
||||
"cg_3rd_person",
|
||||
"cg_cameraverticaldisplacement"
|
||||
};
|
||||
|
||||
//
|
||||
// List of variables allowed to be changed by the server
|
||||
//
|
||||
static const char *whiteListedLocalServerVariables[] = {"ui_hidemouse", "ui_showmouse", "cg_marks_add"};
|
||||
|
||||
//
|
||||
// List of commands allowed to be executed by the server
|
||||
//
|
||||
static const char *whiteListedCommands[] = {
|
||||
//
|
||||
// HUD
|
||||
//==========
|
||||
"pushmenu",
|
||||
"pushmenu_teamselect",
|
||||
"pushmenu_weaponselect",
|
||||
"popmenu",
|
||||
"globalwidgetcommand", // used for mods adding custom HUDs
|
||||
"ui_addhud",
|
||||
"ui_removehud",
|
||||
"echo", // to print stuff client-side
|
||||
|
||||
//
|
||||
// Sounds
|
||||
//==========
|
||||
"tmstart",
|
||||
"tmstartloop",
|
||||
"tmstop",
|
||||
"tmvolume",
|
||||
"play",
|
||||
"playmp3",
|
||||
"stopmp3",
|
||||
|
||||
//
|
||||
// Misc
|
||||
//==========
|
||||
"primarydmweapon",
|
||||
"wait",
|
||||
"+moveup", // workaround for mods that want to prevent inactivity when handling the spectate
|
||||
"-moveup",
|
||||
"screenshot",
|
||||
"screenshotJPEG",
|
||||
"levelshot",
|
||||
"`stufftext" // Stufftext detection from Reborn, the player gets kicked without it
|
||||
};
|
||||
|
||||
//
|
||||
// List of commands allowed to be executed locally
|
||||
// (when the client also runs the server)
|
||||
//
|
||||
static const char *whiteListedLocalServerCommands[] = {
|
||||
// Used by briefings
|
||||
"spmap",
|
||||
"map",
|
||||
"disconnect",
|
||||
|
||||
"cinematic",
|
||||
"showmenu",
|
||||
"hidemenu"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsVariableFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsVariableFiltered(const char *name)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedVariables); i++) {
|
||||
if (!Q_stricmp(name, whiteListedVariables[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
if (cgs.localServer) {
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedLocalServerVariables); i++) {
|
||||
if (!Q_stricmp(name, whiteListedLocalServerVariables[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Filtered
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsSetVariableFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsSetVariableFiltered(const char *name, char type)
|
||||
{
|
||||
cvar_t *var;
|
||||
|
||||
if (!CG_IsVariableFiltered(name)) {
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (type != 'u' && type != 's') {
|
||||
// Don't allow custom info variables to avoid flooding
|
||||
// the client with many serverinfo and userinfo variables
|
||||
|
||||
var = cgi.Cvar_Find(name);
|
||||
if (!var) {
|
||||
// Allow as it doesn't exist
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (var->flags & CVAR_USER_CREATED) {
|
||||
// Allow, it's user-created, wouldn't cause issues
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
// Filtered
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsCommandFiltered
|
||||
|
||||
Returns whether or not the variable should be filtered
|
||||
====================
|
||||
*/
|
||||
static qboolean CG_IsCommandFiltered(const char *name)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedCommands); i++) {
|
||||
if (!Q_stricmp(name, whiteListedCommands[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
if (cgs.localServer) {
|
||||
// Allow more commands when the client is hosting the server
|
||||
// Mostly used on single-player mode, like when briefings switch to the next map
|
||||
for (i = 0; i < ARRAY_LEN(whiteListedLocalServerCommands); i++) {
|
||||
if (!Q_stricmp(name, whiteListedLocalServerCommands[i])) {
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Test variables
|
||||
//
|
||||
return CG_IsVariableFiltered(name);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
RemoveEndToken
|
||||
====================
|
||||
*/
|
||||
static qboolean RemoveEndToken(char* com_token) {
|
||||
char* p;
|
||||
|
||||
for (p = com_token; p[0]; p++) {
|
||||
if (*p == ';') {
|
||||
*p = 0;
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CG_IsStatementFiltered
|
||||
|
||||
Returns whether or not the statement is filtered
|
||||
====================
|
||||
*/
|
||||
qboolean CG_IsStatementFiltered(char *cmd)
|
||||
{
|
||||
char* parsed;
|
||||
char com_token[256];
|
||||
qboolean bNextStatement = qfalse;
|
||||
|
||||
parsed = cmd;
|
||||
|
||||
for (Q_strncpyz(com_token, COM_ParseExt(&parsed, qtrue), sizeof(com_token)); com_token[0]; Q_strncpyz(com_token, COM_ParseExt(&parsed, qtrue), sizeof(com_token))) {
|
||||
bNextStatement = RemoveEndToken(com_token);
|
||||
|
||||
if (com_token[0] == ';') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(com_token, "set") || !Q_stricmp(com_token, "setu") || !Q_stricmp(com_token, "seta")
|
||||
|| !Q_stricmp(com_token, "sets") || !Q_stricmp(com_token, "append")) {
|
||||
char type;
|
||||
|
||||
if (Q_stricmp(com_token, "append")) {
|
||||
type = com_token[3];
|
||||
} else {
|
||||
type = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// variable
|
||||
//
|
||||
Q_strncpyz(com_token, COM_ParseExt(&parsed, qfalse), sizeof(com_token));
|
||||
bNextStatement |= RemoveEndToken(com_token);
|
||||
if (com_token[0] == ';') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CG_IsSetVariableFiltered(com_token, type)) {
|
||||
return qtrue;
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// normal command
|
||||
//
|
||||
if (CG_IsCommandFiltered(com_token)) {
|
||||
return qtrue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bNextStatement) {
|
||||
// Skip up to the next statement
|
||||
while (parsed && parsed[0]) {
|
||||
char c = parsed[0];
|
||||
|
||||
parsed++;
|
||||
if (c == '\n' || c == ';') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
||||
|
30
code/cgame/cg_servercmds_filter.h
Normal file
30
code/cgame/cg_servercmds_filter.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// DESCRIPTION:
|
||||
// cg_servercmds_filter.h -- filtered server commands
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cg_local.h"
|
||||
|
||||
qboolean CG_IsStatementFiltered(char *cmd);
|
|
@ -131,7 +131,7 @@ void ClientGameCommandManager::FreeAllTempModels(void)
|
|||
//===============
|
||||
void ClientGameCommandManager::FreeSomeTempModels(void)
|
||||
{
|
||||
ctempmodel_t* model;
|
||||
ctempmodel_t *model;
|
||||
int count = 0;
|
||||
unsigned int i;
|
||||
unsigned int numToFree;
|
||||
|
@ -159,10 +159,10 @@ void ClientGameCommandManager::FreeSomeTempModels(void)
|
|||
//===============
|
||||
// FreeSpawnthing
|
||||
//===============
|
||||
void ClientGameCommandManager::FreeSpawnthing(spawnthing_t* sp)
|
||||
void ClientGameCommandManager::FreeSpawnthing(spawnthing_t *sp)
|
||||
{
|
||||
ctempmodel_t* model;
|
||||
ctempmodel_t* prev;
|
||||
ctempmodel_t *model;
|
||||
ctempmodel_t *prev;
|
||||
|
||||
if (sp->numtempmodels) {
|
||||
for (model = m_active_tempmodels.prev; model != &m_active_tempmodels; model = prev) {
|
||||
|
@ -230,9 +230,14 @@ void ClientGameCommandManager::InitializeTempModelCvars(void)
|
|||
{
|
||||
cg_showtempmodels = cgi.Cvar_Get("cg_showtempmodels", "0", 0);
|
||||
cg_detail = cgi.Cvar_Get("detail", "1", CVAR_ARCHIVE);
|
||||
|
||||
cg_effectdetail = cgi.Cvar_Get("cg_effectdetail", "0.2", CVAR_ARCHIVE);
|
||||
cgi.Cvar_CheckRange(cg_effectdetail, 0.2, 1.0, qfalse);
|
||||
|
||||
cg_effect_physicsrate = cgi.Cvar_Get("cg_effect_physicsrate", "10", CVAR_ARCHIVE);
|
||||
cg_max_tempmodels = cgi.Cvar_Get("cg_max_tempmodels", "1100", CVAR_ARCHIVE);
|
||||
cgi.Cvar_CheckRange(cg_max_tempmodels, 200, MAX_TEMPMODELS, qtrue);
|
||||
|
||||
cg_reserve_tempmodels = cgi.Cvar_Get("cg_reserve_tempmodels", "200", CVAR_ARCHIVE);
|
||||
|
||||
if (cg_max_tempmodels->integer > MAX_TEMPMODELS) {
|
||||
|
@ -562,8 +567,8 @@ qboolean ClientGameCommandManager::TempModelPhysics(ctempmodel_t *p, float ftime
|
|||
|
||||
// If linked to the parent or hardlinked, get the parent's origin
|
||||
if ((p->cgd.flags & (T_PARENTLINK | T_HARDLINK)) && (p->cgd.parent != ENTITYNUM_NONE)) {
|
||||
centity_t* pc;
|
||||
refEntity_t* e;
|
||||
centity_t *pc;
|
||||
refEntity_t *e;
|
||||
|
||||
pc = &cg_entities[p->cgd.parent];
|
||||
if (!pc->currentValid) {
|
||||
|
@ -577,8 +582,7 @@ qboolean ClientGameCommandManager::TempModelPhysics(ctempmodel_t *p, float ftime
|
|||
|
||||
parentOrigin = e->origin;
|
||||
vectoangles(e->axis[0], parentAngles);
|
||||
}
|
||||
else if (p->cgd.flags & T_SWARM) {
|
||||
} else if (p->cgd.flags & T_SWARM) {
|
||||
p->cgd.parentOrigin = p->cgd.velocity + p->cgd.accel * ftime * scale;
|
||||
}
|
||||
|
||||
|
@ -891,7 +895,8 @@ void ClientGameCommandManager::AddTempModels(void)
|
|||
refEntity_t *old_ent;
|
||||
|
||||
// To counteract cg.time going backwards
|
||||
if (lastTempModelFrameTime && ((cg.time < lastTempModelFrameTime) || (cg.time - lastTempModelFrameTime > TOO_MUCH_TIME_PASSED))) {
|
||||
if (lastTempModelFrameTime
|
||||
&& ((cg.time < lastTempModelFrameTime) || (cg.time - lastTempModelFrameTime > TOO_MUCH_TIME_PASSED))) {
|
||||
p = m_active_tempmodels.prev;
|
||||
for (; p != &m_active_tempmodels; p = next) {
|
||||
next = p->prev;
|
||||
|
|
|
@ -963,6 +963,9 @@ void CG_DrawActiveFrame(int serverTime, int frameTime, stereoFrame_t stereoView,
|
|||
cg.bIntermissionDisplay = qfalse;
|
||||
}
|
||||
|
||||
// Added in OPM
|
||||
CG_ProcessPlayerModel();
|
||||
|
||||
// build the render lists
|
||||
if (!cg.hyperspace) {
|
||||
CG_AddPacketEntities(); // after calcViewValues, so predicted player state is correct
|
||||
|
|
|
@ -7,6 +7,11 @@ add_subdirectory("../cgame" "./cgame")
|
|||
file(GLOB SOURCES_CLIENT "./*.c*")
|
||||
file(GLOB_RECURSE SOURCES_UILIB "../uilib/*.c*")
|
||||
|
||||
set(SOURCES_CLIENT ${SOURCES_CLIENT}
|
||||
# Gamespy
|
||||
"${CMAKE_SOURCE_DIR}/code/gamespy/cl_gamespy.c"
|
||||
)
|
||||
|
||||
# Made as an interface and not static, as static only links used methods
|
||||
add_library(omohclient INTERFACE)
|
||||
target_compile_definitions(omohclient INTERFACE APP_MODULE)
|
||||
|
|
|
@ -629,6 +629,7 @@ void CL_InitCGameDLL( clientGameImport_t *cgi, clientGameExport_t **cge ) {
|
|||
cgi->Cvar_Get = Cvar_Get;
|
||||
cgi->Cvar_Find = Cvar_FindVar;
|
||||
cgi->Cvar_Set = Cvar_Set;
|
||||
cgi->Cvar_CheckRange = Cvar_CheckRange;
|
||||
|
||||
cgi->Argc = Cmd_Argc;
|
||||
cgi->Args = Cmd_Args;
|
||||
|
|
|
@ -866,8 +866,8 @@ qboolean CL_ReadyToSendPacket( void ) {
|
|||
}
|
||||
|
||||
// check for exceeding cl_maxpackets
|
||||
if ( cl_maxpackets->integer < 15 ) {
|
||||
Cvar_Set( "cl_maxpackets", "15" );
|
||||
if ( cl_maxpackets->integer < 30 ) {
|
||||
Cvar_Set( "cl_maxpackets", "30" );
|
||||
} else if ( cl_maxpackets->integer > 125 ) {
|
||||
Cvar_Set( "cl_maxpackets", "125" );
|
||||
}
|
||||
|
|
640
code/client/cl_instantAction.cpp
Normal file
640
code/client/cl_instantAction.cpp
Normal file
|
@ -0,0 +1,640 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "cl_ui.h"
|
||||
#include "cl_instantAction.h"
|
||||
#include "cl_uiserverlist.h"
|
||||
#include "../gamespy/sv_gamespy.h"
|
||||
|
||||
Event EV_UIInstantAction_AcceptServer
|
||||
(
|
||||
"acceptserver",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Connect to the current server"
|
||||
);
|
||||
|
||||
Event EV_UIInstantAction_RejectServer
|
||||
(
|
||||
"rejectserver",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Reject the current server"
|
||||
);
|
||||
|
||||
Event EV_UIInstantAction_Cancel
|
||||
(
|
||||
"ia_cancel",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"cancel the server update"
|
||||
);
|
||||
|
||||
Event EV_UIInstantAction_Refresh
|
||||
(
|
||||
"ia_refresh",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Refresh the server list"
|
||||
);
|
||||
|
||||
CLASS_DECLARATION(UIWidget, UIInstantAction, NULL) {
|
||||
{&EV_UIInstantAction_AcceptServer, &UIInstantAction::Connect },
|
||||
{&EV_UIInstantAction_RejectServer, &UIInstantAction::Reject },
|
||||
{&EV_UIInstantAction_Cancel, &UIInstantAction::CancelRefresh},
|
||||
{&EV_UIInstantAction_Refresh, &UIInstantAction::Refresh },
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
struct ServerListInstance {
|
||||
int iServerType;
|
||||
UIInstantAction *pServerList;
|
||||
};
|
||||
|
||||
ServerListInstance g_IAServerListInst[2];
|
||||
|
||||
UIInstantAction::UIInstantAction()
|
||||
{
|
||||
state = IA_INITIALIZE;
|
||||
numFoundServers = 0;
|
||||
numServers = 0;
|
||||
minPlayers = 3;
|
||||
startingMaxPing = 100;
|
||||
endingMaxPing = 1500;
|
||||
maxServers = -1;
|
||||
servers = NULL;
|
||||
doneList[0] = false;
|
||||
doneList[1] = false;
|
||||
serverList[0] = NULL;
|
||||
serverList[1] = NULL;
|
||||
|
||||
ReadIniFile();
|
||||
EnableServerInfo(false);
|
||||
|
||||
menuManager.PassEventToWidget("ia_cancel_button", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_refresh_button", new Event(EV_Widget_Disable));
|
||||
}
|
||||
|
||||
UIInstantAction::~UIInstantAction()
|
||||
{
|
||||
CleanUp();
|
||||
}
|
||||
|
||||
void UIInstantAction::CleanUp()
|
||||
{
|
||||
if (serverList[0]) {
|
||||
ServerListFree(serverList[0]);
|
||||
serverList[0] = NULL;
|
||||
}
|
||||
|
||||
if (serverList[1]) {
|
||||
ServerListFree(serverList[1]);
|
||||
serverList[1] = NULL;
|
||||
}
|
||||
|
||||
if (servers) {
|
||||
delete[] servers;
|
||||
servers = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void UIInstantAction::Init()
|
||||
{
|
||||
const char *secret_key;
|
||||
const char *game_name;
|
||||
|
||||
static const unsigned int iNumConcurrent = 10;
|
||||
|
||||
numFoundServers = 0;
|
||||
numServers = 0;
|
||||
doneList[0] = false;
|
||||
doneList[1] = false;
|
||||
|
||||
EnableServerInfo(false);
|
||||
|
||||
menuManager.PassEventToWidget("ia_cancel_button", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_refresh_button", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_noserverfound", new Event(EV_Widget_Disable));
|
||||
|
||||
Cvar_Set("ia_search_percentage", va("%d %%", 0));
|
||||
|
||||
if (com_target_game->integer < target_game_e::TG_MOHTT) {
|
||||
g_IAServerListInst[0].iServerType = com_target_game->integer;
|
||||
g_IAServerListInst[0].pServerList = this;
|
||||
|
||||
game_name = GS_GetGameName(com_target_game->integer);
|
||||
secret_key = GS_GetGameKey(com_target_game->integer);
|
||||
|
||||
serverList[0] = ServerListNew(
|
||||
game_name,
|
||||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void *)&IAServerListCallBack,
|
||||
1,
|
||||
(void *)&g_IAServerListInst[0]
|
||||
);
|
||||
|
||||
ServerListClear(serverList[0]);
|
||||
} else {
|
||||
g_IAServerListInst[0].iServerType = target_game_e::TG_MOHTT;
|
||||
g_IAServerListInst[0].pServerList = this;
|
||||
|
||||
game_name = GS_GetGameName(target_game_e::TG_MOHTT);
|
||||
secret_key = GS_GetGameKey(target_game_e::TG_MOHTT);
|
||||
|
||||
serverList[0] = ServerListNew(
|
||||
game_name,
|
||||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void *)&IAServerListCallBack,
|
||||
1,
|
||||
(void *)&g_IAServerListInst[0]
|
||||
);
|
||||
|
||||
ServerListClear(serverList[0]);
|
||||
|
||||
g_IAServerListInst[1].iServerType = target_game_e::TG_MOHTA;
|
||||
g_IAServerListInst[1].pServerList = this;
|
||||
|
||||
game_name = GS_GetGameName(target_game_e::TG_MOHTA);
|
||||
secret_key = GS_GetGameKey(target_game_e::TG_MOHTA);
|
||||
|
||||
serverList[1] = ServerListNew(
|
||||
game_name,
|
||||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void *)&IAServerListCallBack,
|
||||
1,
|
||||
(void *)&g_IAServerListInst[1]
|
||||
);
|
||||
|
||||
ServerListClear(serverList[1]);
|
||||
}
|
||||
|
||||
state = IA_WAITING;
|
||||
numFoundServers = 0;
|
||||
|
||||
ServerListUpdate(serverList[0], true);
|
||||
|
||||
if (serverList[1]) {
|
||||
ServerListUpdate(serverList[1], true);
|
||||
}
|
||||
|
||||
menuManager.PassEventToWidget("ia_cancel_button", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("searchstatus", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("searchstatuslable", new Event(EV_Widget_Enable));
|
||||
}
|
||||
|
||||
int UIInstantAction::GetServerIndex(int maxPing, int gameType)
|
||||
{
|
||||
int bestPing = 1500;
|
||||
int bestServer = -1;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < numFoundServers; i++) {
|
||||
const IAServer_t& IAServer = servers[i];
|
||||
|
||||
char *gameVer;
|
||||
float fGameVer;
|
||||
int ping;
|
||||
int numPlayers;
|
||||
|
||||
if (IAServer.rejected) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip servers that don't match the provided game type
|
||||
if (ServerGetIntValue(IAServer.server, "g_gametype_i", 1) != gameType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip servers with high ping
|
||||
ping = ServerGetPing(IAServer.server);
|
||||
if (ping > maxPing) {
|
||||
continue;
|
||||
}
|
||||
|
||||
gameVer = ServerGetStringValue(IAServer.server, "gamever", "1.00");
|
||||
if (com_target_demo->integer && *gameVer != 'd') {
|
||||
// Skip retail servers on demo game
|
||||
continue;
|
||||
} else if (!com_target_demo->integer && *gameVer == 'd') {
|
||||
// Skip demo servers on retail game
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip incompatible servers
|
||||
fGameVer = atof(gameVer);
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
if (IAServer.serverGame.serverType == target_game_e::TG_MOHTT) {
|
||||
if (fabs(fGameVer) < 2.3f) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (fabs(fGameVer) < 2.1f) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (fabs(fGameVer - com_target_version->value) > 0.1f) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Skip servers with a password
|
||||
if (ServerGetIntValue(IAServer.server, "password", 0)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip servers that don't match the minimum number of players
|
||||
numPlayers = ServerGetIntValue(IAServer.server, "numplayers", 0);
|
||||
if (numPlayers < minPlayers) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip full servers
|
||||
if (numPlayers == ServerGetIntValue(IAServer.server, "maxplayers", 0)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip servers with an higher ping than the best one
|
||||
if (ping >= bestPing) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Found a potential server
|
||||
//
|
||||
|
||||
bestPing = ping;
|
||||
bestServer = i;
|
||||
}
|
||||
|
||||
return bestServer;
|
||||
}
|
||||
|
||||
void UIInstantAction::ReadIniFile()
|
||||
{
|
||||
char *buffer;
|
||||
const char *p;
|
||||
const char *pVal;
|
||||
int intValue;
|
||||
char value[32];
|
||||
|
||||
if (!FS_ReadFileEx("iaction.ini", (void **)&buffer, qtrue)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (p = buffer; p; p = strstr(pVal, "\n")) {
|
||||
if (sscanf(p, "%31s", value) != 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
pVal = strstr(p, "=");
|
||||
if (!pVal) {
|
||||
break;
|
||||
}
|
||||
|
||||
pVal++;
|
||||
|
||||
if (sscanf(pVal, "%d", &intValue) != 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!Q_stricmpn(value, "MinPlayers", 10)) {
|
||||
minPlayers = intValue;
|
||||
}
|
||||
|
||||
if (!Q_stricmpn(value, "StartingMaxPing", 15)) {
|
||||
startingMaxPing = intValue;
|
||||
}
|
||||
|
||||
if (!Q_stricmpn(value, "EndingMaxPing", 13)) {
|
||||
endingMaxPing = intValue;
|
||||
}
|
||||
|
||||
if (!Q_stricmpn(value, "MaxServers", 10)) {
|
||||
maxServers = intValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UIInstantAction::FindServer()
|
||||
{
|
||||
int ping;
|
||||
int i;
|
||||
|
||||
currentServer = -1;
|
||||
state = IA_NONE;
|
||||
|
||||
for (ping = startingMaxPing; ping < endingMaxPing; ping += 100) {
|
||||
//
|
||||
// Find the best server starting from FFA gametype first
|
||||
//
|
||||
for (i = 1; i < 7; i++) {
|
||||
currentServer = GetServerIndex(ping, i);
|
||||
if (currentServer >= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentServer >= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
menuManager.PassEventToWidget("ia_refresh_button", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_cancel_button", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("searchstatus", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("searchstatuslable", new Event(EV_Widget_Disable));
|
||||
|
||||
if (currentServer < 0) {
|
||||
EnableServerInfo(false);
|
||||
|
||||
menuManager.PassEventToWidget("ia_noserverfound", new Event(EV_Widget_Enable));
|
||||
return;
|
||||
}
|
||||
|
||||
const IAServer_t& IAServer = servers[currentServer];
|
||||
const char *hostname = ServerGetStringValue(IAServer.server, "hostname", "(NONE)");
|
||||
const char *gametype = ServerGetStringValue(IAServer.server, "gametype", "(NONE)");
|
||||
int numplayers = ServerGetIntValue(IAServer.server, "numplayers", 0);
|
||||
int maxplayers = ServerGetIntValue(IAServer.server, "maxplayers", 0);
|
||||
ping = ServerGetPing(IAServer.server);
|
||||
|
||||
Cvar_Set("ia_servername", va(" %s", hostname));
|
||||
Cvar_Set("ia_ping", va("%d", ping));
|
||||
Cvar_Set("ia_gametype", va("%s", gametype));
|
||||
Cvar_Set("ia_players", va("%d", numplayers));
|
||||
Cvar_Set("ia_maxplayers", va("%d", maxplayers));
|
||||
|
||||
EnableServerInfo(true);
|
||||
}
|
||||
|
||||
void UIInstantAction::Connect(Event *ev)
|
||||
{
|
||||
char *gameVer;
|
||||
float fGameVer;
|
||||
bool bDiffVersion;
|
||||
char command[256];
|
||||
|
||||
if (currentServer < 0 || currentServer < numServers) {
|
||||
return;
|
||||
}
|
||||
|
||||
const IAServer_t& IAServer = servers[currentServer];
|
||||
|
||||
gameVer = ServerGetStringValue(IAServer.server, "gamever", "1.00");
|
||||
if (gameVer[0] == 'd') {
|
||||
gameVer++;
|
||||
}
|
||||
|
||||
// Skip incompatible servers
|
||||
fGameVer = atof(gameVer);
|
||||
bDiffVersion = false;
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
if (IAServer.serverGame.serverType == target_game_e::TG_MOHTT) {
|
||||
if (fabs(fGameVer) < 2.3f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
} else {
|
||||
if (fabs(fGameVer) < 2.1f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (fabs(fGameVer - com_target_version->value) > 0.1f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (bDiffVersion) {
|
||||
if (fGameVer - com_target_version->value > 0) {
|
||||
// Older version
|
||||
UI_SetReturnMenuToCurrent();
|
||||
Cvar_Set("com_errormessage", va("Server is version %s, you are using %s", gameVer, "2.40"));
|
||||
UI_PushMenu("wrongversion");
|
||||
} else {
|
||||
// Server version is newer
|
||||
Cvar_Set("dm_serverstatus", va("Can not connect to v%s server, you are using v%s", gameVer, "2.40"));
|
||||
}
|
||||
}
|
||||
|
||||
UI_SetReturnMenuToCurrent();
|
||||
Cvar_Set("g_servertype", va("%d", servers[currentServer].serverGame.serverType));
|
||||
|
||||
Com_sprintf(
|
||||
command,
|
||||
sizeof(command),
|
||||
"connect %s:%i\n",
|
||||
ServerGetAddress(IAServer.server),
|
||||
ServerGetIntValue(IAServer.server, "hostport", PORT_SERVER)
|
||||
);
|
||||
Cbuf_AddText(command);
|
||||
}
|
||||
|
||||
void UIInstantAction::Reject(Event *ev)
|
||||
{
|
||||
servers[currentServer].rejected = 1;
|
||||
FindServer();
|
||||
}
|
||||
|
||||
void UIInstantAction::Draw()
|
||||
{
|
||||
switch (state) {
|
||||
case IA_INITIALIZE:
|
||||
Init();
|
||||
break;
|
||||
case IA_UPDATE:
|
||||
Update();
|
||||
break;
|
||||
case IA_FINISHED:
|
||||
FindServer();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (serverList[0]) {
|
||||
ServerListThink(serverList[0]);
|
||||
}
|
||||
|
||||
if (serverList[1]) {
|
||||
ServerListThink(serverList[1]);
|
||||
}
|
||||
}
|
||||
|
||||
void UIInstantAction::Update()
|
||||
{
|
||||
numFoundServers = 0;
|
||||
|
||||
// count the total number of servers from both server list
|
||||
numServers = ServerListCount(serverList[0]);
|
||||
if (serverList[1]) {
|
||||
numServers += ServerListCount(serverList[1]);
|
||||
}
|
||||
|
||||
state = IA_FINISHED;
|
||||
servers = new IAServer_t[numServers];
|
||||
|
||||
ServerListHalt(serverList[0]);
|
||||
if (serverList[1]) {
|
||||
ServerListHalt(serverList[1]);
|
||||
}
|
||||
|
||||
ServerListThink(serverList[0]);
|
||||
if (serverList[1]) {
|
||||
ServerListThink(serverList[1]);
|
||||
}
|
||||
|
||||
state = IA_SEARCHING;
|
||||
|
||||
// Start updating the first list
|
||||
doneList[0] = false;
|
||||
ServerListClear(serverList[0]);
|
||||
ServerListUpdate(serverList[0], true);
|
||||
|
||||
// Update the second optional list
|
||||
if (serverList[1]) {
|
||||
doneList[1] = false;
|
||||
ServerListClear(serverList[1]);
|
||||
ServerListUpdate(serverList[1], true);
|
||||
}
|
||||
}
|
||||
|
||||
int UIInstantAction::AddServer(GServer server, const ServerGame_t& serverGame)
|
||||
{
|
||||
servers[numFoundServers].server = server;
|
||||
servers[numFoundServers].serverGame = serverGame;
|
||||
servers[numFoundServers].rejected = false;
|
||||
numFoundServers++;
|
||||
|
||||
return numFoundServers;
|
||||
}
|
||||
|
||||
void UIInstantAction::CancelRefresh(Event *ev)
|
||||
{
|
||||
state = IA_FINISHED;
|
||||
ServerListHalt(serverList[0]);
|
||||
ServerListHalt(serverList[1]);
|
||||
}
|
||||
|
||||
void UIInstantAction::Refresh(Event *ev)
|
||||
{
|
||||
state = IA_INITIALIZE;
|
||||
}
|
||||
|
||||
void UIInstantAction::EnableServerInfo(bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
menuManager.PassEventToWidget("iaservername_label", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_servername_field", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_ping_label", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_ping_field", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_gametype_label", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_gametype_field", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_players_label", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_players_field", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_maxplayers_label", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("ia_maxplayers_field", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("acceptserver", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("rejectserver", new Event(EV_Widget_Enable));
|
||||
} else {
|
||||
menuManager.PassEventToWidget("iaservername_label", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_servername_field", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_ping_label", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_ping_field", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_gametype_label", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_gametype_field", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_players_label", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_players_field", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_maxplayers_label", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("ia_maxplayers_field", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("acceptserver", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("rejectserver", new Event(EV_Widget_Disable));
|
||||
}
|
||||
}
|
||||
|
||||
void UIInstantAction::IAServerListCallBack(GServerList serverlist, int msg, void *instance, void *param1, void *param2)
|
||||
{
|
||||
const ServerListInstance *pInstance = (const ServerListInstance *)instance;
|
||||
UIInstantAction *pServerList = pInstance->pServerList;
|
||||
|
||||
if (msg == LIST_PROGRESS) {
|
||||
if (pServerList->state == IA_WAITING) {
|
||||
if (pInstance->iServerType == com_target_game->integer) {
|
||||
pServerList->doneList[0] = true;
|
||||
}
|
||||
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT && pInstance->iServerType == target_game_e::TG_MOHTA) {
|
||||
pServerList->doneList[1] = true;
|
||||
}
|
||||
|
||||
if (pServerList->doneList[0] && (!pServerList->serverList[1] || pServerList->doneList[1])) {
|
||||
pServerList->state = IA_UPDATE;
|
||||
}
|
||||
} else if (pServerList->state == IA_SEARCHING) {
|
||||
ServerGame_t serverGame;
|
||||
serverGame.serverType = pInstance->iServerType;
|
||||
const int serverIndex = pServerList->AddServer((GServer)param1, serverGame);
|
||||
|
||||
Cvar_Set("ia_search_percentage", va("%d %%", 100 * serverIndex / pServerList->numServers));
|
||||
|
||||
if (pServerList->maxServers >= 0 && serverIndex >= pServerList->maxServers) {
|
||||
// Reached the maximum number of servers, stop there
|
||||
pServerList->doneList[0] = true;
|
||||
ServerListHalt(pServerList->serverList[0]);
|
||||
|
||||
if (pServerList->serverList[1]) {
|
||||
pServerList->doneList[1] = true;
|
||||
ServerListHalt(pServerList->serverList[1]);
|
||||
}
|
||||
|
||||
pServerList->state = IA_FINISHED;
|
||||
}
|
||||
}
|
||||
} else if (msg == LIST_STATECHANGED && ServerListState(serverlist) == GServerListState::sl_idle) {
|
||||
if (pInstance->iServerType == com_target_game->integer) {
|
||||
pServerList->doneList[0] = true;
|
||||
}
|
||||
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT && pInstance->iServerType == target_game_e::TG_MOHTA) {
|
||||
pServerList->doneList[1] = true;
|
||||
}
|
||||
|
||||
if (pServerList->doneList[0] && (!pServerList->serverList[1] || pServerList->doneList[1])) {
|
||||
if (pServerList->state == IA_WAITING) {
|
||||
pServerList->state = IA_UPDATE;
|
||||
}
|
||||
if (pServerList->state == IA_SEARCHING) {
|
||||
pServerList->state = IA_FINISHED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
103
code/client/cl_instantAction.h
Normal file
103
code/client/cl_instantAction.h
Normal file
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// Added in 2.30
|
||||
// Instantly find a server matching common criterias
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../gamespy/goaceng.h"
|
||||
|
||||
typedef struct {
|
||||
int serverType;
|
||||
} ServerGame_t;
|
||||
|
||||
typedef struct {
|
||||
GServer server;
|
||||
ServerGame_t serverGame;
|
||||
bool rejected;
|
||||
} IAServer_t;
|
||||
|
||||
enum IAState_e {
|
||||
IA_NONE,
|
||||
IA_INITIALIZE,
|
||||
IA_WAITING,
|
||||
IA_UPDATE,
|
||||
IA_SEARCHING,
|
||||
IA_FINISHED
|
||||
};
|
||||
|
||||
class UIInstantAction : public UIWidget
|
||||
{
|
||||
public:
|
||||
CLASS_PROTOTYPE(UIInstantAction);
|
||||
|
||||
public:
|
||||
UIInstantAction();
|
||||
~UIInstantAction() override;
|
||||
|
||||
void CleanUp();
|
||||
void Init();
|
||||
|
||||
int GetServerIndex(int maxPing, int gameType);
|
||||
void ReadIniFile();
|
||||
void FindServer();
|
||||
void Connect(Event *ev);
|
||||
void Reject(Event *ev);
|
||||
void Draw();
|
||||
void Update();
|
||||
int AddServer(GServer server, const ServerGame_t& serverGame);
|
||||
void CancelRefresh(Event *ev);
|
||||
void Refresh(Event *ev);
|
||||
void EnableServerInfo(bool enable);
|
||||
|
||||
private:
|
||||
static void IAServerListCallBack(GServerList serverlist, int msg, void *instance, void *param1, void *param2);
|
||||
|
||||
private:
|
||||
//
|
||||
// List
|
||||
//
|
||||
bool doneList[2];
|
||||
GServerList serverList[2];
|
||||
int maxServers;
|
||||
|
||||
//
|
||||
// Current states
|
||||
//
|
||||
IAState_e state;
|
||||
int numServers;
|
||||
int numFoundServers;
|
||||
|
||||
//
|
||||
// Filters
|
||||
//
|
||||
int minPlayers;
|
||||
int startingMaxPing;
|
||||
int endingMaxPing;
|
||||
|
||||
//
|
||||
// Servers
|
||||
//
|
||||
IAServer_t *servers;
|
||||
int currentServer;
|
||||
};
|
|
@ -29,6 +29,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "../qcommon/localization.h"
|
||||
#include "../qcommon/bg_compat.h"
|
||||
#include "../sys/sys_local.h"
|
||||
#include "../sys/sys_update_checker.h"
|
||||
#include "../uilib/uimessage.h"
|
||||
|
||||
extern "C" {
|
||||
#include "../sys/sys_loadlib.h"
|
||||
|
@ -171,6 +173,7 @@ void CL_ServerStatus_f(void);
|
|||
void CL_ServerStatusResponse( netadr_t from, msg_t *msg );
|
||||
|
||||
static qboolean cl_bCLSystemStarted = qfalse;
|
||||
static qboolean cl_updateNotified = qfalse;
|
||||
|
||||
/*
|
||||
===============
|
||||
|
@ -2597,6 +2600,36 @@ void CL_SetFrameNumber(int frameNumber) {
|
|||
re.SetFrameNumber(frameNumber);
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_VerifyUpdate
|
||||
|
||||
Check for a new version and display a message box
|
||||
when a new version is available
|
||||
==================
|
||||
*/
|
||||
void CL_VerifyUpdate() {
|
||||
if (cl_updateNotified) {
|
||||
return;
|
||||
}
|
||||
|
||||
int lastMajor, lastMinor, lastPatch;
|
||||
if (updateChecker.CheckNewVersion(lastMajor, lastMinor, lastPatch)) {
|
||||
cl_updateNotified = true;
|
||||
|
||||
const char *updateText =
|
||||
va("A new update is available!\n"
|
||||
"The latest version is v%d.%d.%d (you are running v%s).\n"
|
||||
"Check https://github.com/openmoh/openmohaa for more.",
|
||||
lastMajor,
|
||||
lastMinor,
|
||||
lastPatch,
|
||||
PRODUCT_VERSION_NUMBER_STRING);
|
||||
|
||||
UIMessageDialog::ShowMessageBox("Update available", updateText);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_Frame
|
||||
|
@ -2635,6 +2668,8 @@ void CL_Frame ( int msec ) {
|
|||
S_TriggeredMusic_PlayIntroMusic();
|
||||
UI_MenuEscape("main");
|
||||
}
|
||||
|
||||
CL_VerifyUpdate();
|
||||
} else if (clc.state == CA_CINEMATIC) {
|
||||
UI_ForceMenuOff(qtrue);
|
||||
}
|
||||
|
@ -3618,8 +3653,8 @@ void CL_Init( void ) {
|
|||
cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE );
|
||||
|
||||
// userinfo
|
||||
name = Cvar_Get ("name", "UnnamedSoldier", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
cl_rate = Cvar_Get ("rate", "5000", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
name = Cvar_Get ("name", va("UnnamedSoldier#%d", rand() % 100000), CVAR_USERINFO | CVAR_ARCHIVE);
|
||||
cl_rate = Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
Cvar_Get ("snaps", "20", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
Cvar_Get ("password", "", CVAR_USERINFO);
|
||||
Cvar_Get ("dm_playermodel", "american_army", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
|
@ -3685,6 +3720,12 @@ void CL_Init( void ) {
|
|||
|
||||
end = Sys_Milliseconds();
|
||||
|
||||
if (com_gotOriginalConfig) {
|
||||
// Added in OPM
|
||||
// Apply config tweaks after loading the original config
|
||||
CL_ApplyOriginalConfigTweaks();
|
||||
}
|
||||
|
||||
Com_Printf( "----- Client Initialization Complete ----- %i ms\n", start - end );
|
||||
}
|
||||
|
||||
|
@ -4861,3 +4902,15 @@ void TIKI_CG_Command_ProcessFile(char* filename, qboolean quiet, dtiki_t* curTik
|
|||
|
||||
Com_Printf("NO CGE \n");
|
||||
}
|
||||
|
||||
void CL_ApplyOriginalConfigTweaks()
|
||||
{
|
||||
cvar_t* snaps = Cvar_Get("snaps", "", 0);
|
||||
|
||||
// Those variables are not editable via UI so reset them
|
||||
// snaps/maxpackets can also have wrong values due to them being changed
|
||||
// via stufftext
|
||||
|
||||
Cvar_Set("snaps", snaps->resetString);
|
||||
Cvar_Set("cl_maxpackets", cl_maxpackets->resetString);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "../qcommon/q_version.h"
|
||||
|
||||
#include "cl_ui.h"
|
||||
#include "cl_uigamespy.h"
|
||||
|
||||
#include <ctime>
|
||||
|
||||
|
@ -152,6 +153,10 @@ static str scoreboard_menuname;
|
|||
static str ui_sCurrentLoadingMenu;
|
||||
static Container<Menu *> hudList;
|
||||
|
||||
const UColor UWhiteChatMessageColor(0.75, 0.75, 0.75);
|
||||
const UColor URedChatMessageColor(1.0, 0.25, 0.25);
|
||||
const UColor UGreenChatMessageColor(0.0, 1.0, 0.25, 1.0);
|
||||
|
||||
void UI_MultiplayerMenuWidgetsUpdate(void);
|
||||
void UI_MultiplayerMainMenuWidgetsUpdate(void);
|
||||
void UI_MainMenuWidgetsUpdate(void);
|
||||
|
@ -1303,7 +1308,7 @@ UI_PrintConsole
|
|||
*/
|
||||
void UI_PrintConsole(const char *msg)
|
||||
{
|
||||
UColor *pColor = NULL;
|
||||
const UColor *pColor = NULL;
|
||||
const char *pszString;
|
||||
char szString[1024];
|
||||
char szBlah[1024];
|
||||
|
@ -1325,7 +1330,7 @@ void UI_PrintConsole(const char *msg)
|
|||
break;
|
||||
case MESSAGE_CHAT_WHITE:
|
||||
bDMMessage = qtrue;
|
||||
pColor = &UGrey;
|
||||
pColor = &UWhiteChatMessageColor;
|
||||
break;
|
||||
case MESSAGE_WHITE:
|
||||
bBold = qtrue;
|
||||
|
@ -1333,11 +1338,11 @@ void UI_PrintConsole(const char *msg)
|
|||
break;
|
||||
case MESSAGE_CHAT_RED:
|
||||
bDeathMessage = MESSAGE_CHAT_RED;
|
||||
pColor = &ULightRed;
|
||||
pColor = &URedChatMessageColor;
|
||||
break;
|
||||
case MESSAGE_CHAT_GREEN:
|
||||
bDeathMessage = MESSAGE_CHAT_GREEN;
|
||||
pColor = &UGreen;
|
||||
pColor = &UGreenChatMessageColor;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -4367,11 +4372,9 @@ UI_ShowScoreboard_f
|
|||
void UI_ShowScoreboard_f(const char *pszMenuName)
|
||||
{
|
||||
if (pszMenuName) {
|
||||
if (scoreboard_menuname.length()) {
|
||||
if (str::icmp(scoreboard_menuname, pszMenuName)) {
|
||||
if (scoreboard_menuname.length() && str::icmp(scoreboard_menuname, pszMenuName) && scoreboard_menu) {
|
||||
scoreboard_menu->ForceHide();
|
||||
}
|
||||
}
|
||||
|
||||
scoreboard_menuname = pszMenuName;
|
||||
}
|
||||
|
@ -4419,8 +4422,11 @@ void UI_HideScoreboard_f(void)
|
|||
}
|
||||
|
||||
if (scoreboard_menuname.length()) {
|
||||
// Fixed in 2.30 (scoreboard_menu check)
|
||||
if (scoreboard_menu) {
|
||||
scoreboard_menu->ForceHide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ScoreboardListItem : public UIListCtrlItem
|
||||
|
@ -5342,6 +5348,7 @@ void CL_InitializeUI(void)
|
|||
Cmd_AddCommand("setreturnmenu", UI_SetReturnMenuToCurrent);
|
||||
Cmd_AddCommand("gotoreturnmenu", UI_PushReturnMenu_f);
|
||||
Cmd_AddCommand("salesscreen", UI_SalesScreen_f);
|
||||
Cmd_AddCommand("launchgamespy", UI_LaunchGameSpy_f);
|
||||
|
||||
if (developer->integer) {
|
||||
UColor bgColor;
|
||||
|
|
|
@ -51,6 +51,9 @@ extern inventory_t client_inv;
|
|||
extern bind_t client_bind;
|
||||
extern cvar_t *cl_greenfps;
|
||||
extern qboolean server_loading;
|
||||
extern const UColor UWhiteChatMessageColor;
|
||||
extern const UColor URedChatMessageColor;
|
||||
extern const UColor UGreenChatMessageColor;
|
||||
|
||||
const char *CvarGetForUI(const char *name, const char *defval);
|
||||
void UI_ClearState(void);
|
||||
|
|
|
@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
*/
|
||||
|
||||
#include "cl_ui.h"
|
||||
#include "../qcommon/localization.h"
|
||||
|
||||
Event EV_DMBox_Goin
|
||||
(
|
||||
|
@ -299,23 +300,19 @@ void UIDMBox::Print(const char *text)
|
|||
m_items[m_numitems].flags = 0;
|
||||
|
||||
if (*text == MESSAGE_CHAT_WHITE) {
|
||||
m_items[m_numitems].color = UGrey;
|
||||
m_items[m_numitems].color = UWhiteChatMessageColor;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_BOLD;
|
||||
|
||||
text1 = text + 1;
|
||||
} else if (*text == MESSAGE_CHAT_RED) {
|
||||
m_items[m_numitems].color = ULightRed;
|
||||
m_items[m_numitems].color = URedChatMessageColor;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_DEATH;
|
||||
|
||||
text1 = text + 1;
|
||||
} else if (*text == MESSAGE_CHAT_GREEN) {
|
||||
if (com_target_game->integer >= TG_MOHTA) {
|
||||
m_items[m_numitems].color = ULightGreen;
|
||||
} else {
|
||||
m_items[m_numitems].color = UGreen;
|
||||
}
|
||||
m_items[m_numitems].color = UGreenChatMessageColor;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_DEATH;
|
||||
|
||||
|
@ -325,7 +322,7 @@ void UIDMBox::Print(const char *text)
|
|||
m_items[m_numitems].font = m_font;
|
||||
}
|
||||
|
||||
m_items[m_numitems].string = CalculateBreaks(m_items[m_numitems].font, text1, s_dmboxWidth);
|
||||
m_items[m_numitems].string = CalculateBreaks(m_items[m_numitems].font, Sys_LV_CL_ConvertString(text1), s_dmboxWidth);
|
||||
|
||||
m_numitems++;
|
||||
VerifyBoxOut();
|
||||
|
|
118
code/client/cl_uigamespy.cpp
Normal file
118
code/client/cl_uigamespy.cpp
Normal file
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// cl_uigamespy.cpp
|
||||
#include "cl_uigamespy.h"
|
||||
|
||||
CLASS_DECLARATION(UIFloatingWindow, GameSpyDialog, NULL) {
|
||||
{&W_Deactivated, &UIFloatingWindow::ClosePressed},
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
GameSpyDialog::GameSpyDialog()
|
||||
: overlay(NULL)
|
||||
, label(NULL)
|
||||
, closeButton(NULL)
|
||||
{
|
||||
AddFlag(WF_ALWAYS_TOP);
|
||||
}
|
||||
|
||||
GameSpyDialog::~GameSpyDialog()
|
||||
{
|
||||
if (overlay) {
|
||||
delete overlay;
|
||||
overlay = NULL;
|
||||
}
|
||||
|
||||
if (label) {
|
||||
delete label;
|
||||
label = NULL;
|
||||
}
|
||||
|
||||
if (closeButton) {
|
||||
delete closeButton;
|
||||
closeButton = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void GameSpyDialog::FrameInitialized(void)
|
||||
{
|
||||
UIFloatingWindow::FrameInitialized();
|
||||
|
||||
label = new UILabel();
|
||||
|
||||
label->InitFrame(getChildSpace(), getChildSpace()->getClientFrame(), 0);
|
||||
label->setTitle(
|
||||
"GameSpy's multiplayer matchmaking\n"
|
||||
"and server browsing services, which were\n"
|
||||
"essential for online gaming in many classic\n"
|
||||
"titles including Medal of Honor: Allied Assault,\n"
|
||||
"were permanently shut down in 2014."
|
||||
);
|
||||
label->setForegroundColor(UHudColor);
|
||||
|
||||
closeButton = new UIButton();
|
||||
closeButton->InitFrame(getChildSpace(), UIRect2D(100, 150, 100, 30), 0);
|
||||
closeButton->setTitle("Close");
|
||||
closeButton->AllowActivate(true);
|
||||
closeButton->Connect(this, W_Button_Pressed, W_Deactivated);
|
||||
|
||||
overlay = new UIButton();
|
||||
overlay->InitFrame(NULL, UIRect2D(0, 0, uid.vidWidth, uid.vidHeight), 0);
|
||||
overlay->setBackgroundColor(UColor(0, 0, 0, 0.5f), true);
|
||||
overlay->AllowActivate(true);
|
||||
|
||||
overlay->Connect(this, W_Button_Pressed, W_Deactivated);
|
||||
}
|
||||
|
||||
void GameSpyDialog::Create(
|
||||
UIWidget *parent, const UIRect2D& rect, const char *title, const UColor& bgColor, const UColor& fgColor
|
||||
)
|
||||
{
|
||||
// First call parent's Create
|
||||
UIFloatingWindow::Create(parent, rect, title, bgColor, fgColor);
|
||||
|
||||
// After creation, find minimize button by name and hide it
|
||||
for (UIWidget *child = getFirstChild(); child; child = getNextChild(child)) {
|
||||
if (strcmp(child->getName(), "minimizebutton") == 0) {
|
||||
child->setShow(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UI_LaunchGameSpy_f(void)
|
||||
{
|
||||
GameSpyDialog *dialog = new GameSpyDialog();
|
||||
|
||||
dialog->Create(
|
||||
NULL,
|
||||
UIRect2D((uid.vidWidth - 300) / 2, (uid.vidHeight - 200) / 2, 300, 200),
|
||||
"GameSpy",
|
||||
UColor(0.15f, 0.195f, 0.278f),
|
||||
UHudColor
|
||||
);
|
||||
|
||||
uWinMan.ActivateControl(dialog);
|
||||
|
||||
dialog->Connect(dialog, W_Deactivated, W_Deactivated);
|
||||
}
|
50
code/client/cl_uigamespy.h
Normal file
50
code/client/cl_uigamespy.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// cl_gamespy.h
|
||||
#ifndef __CL_GAMESPY_H__
|
||||
#define __CL_GAMESPY_H__
|
||||
|
||||
#include "cl_ui.h"
|
||||
#include "keycodes.h"
|
||||
|
||||
class GameSpyDialog : public UIFloatingWindow
|
||||
{
|
||||
private:
|
||||
UIButton *overlay;
|
||||
UILabel *label;
|
||||
UIButton *closeButton;
|
||||
|
||||
protected:
|
||||
void FrameInitialized(void) override;
|
||||
|
||||
public:
|
||||
GameSpyDialog();
|
||||
~GameSpyDialog();
|
||||
void
|
||||
Create(UIWidget *parent, const UIRect2D& rect, const char *title, const UColor& bgColor, const UColor& fgColor);
|
||||
|
||||
CLASS_PROTOTYPE(GameSpyDialog);
|
||||
};
|
||||
|
||||
void UI_LaunchGameSpy_f(void);
|
||||
#endif
|
|
@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
*/
|
||||
|
||||
#include "cl_ui.h"
|
||||
#include "../qcommon/localization.h"
|
||||
|
||||
Event EV_GMBox_Goin
|
||||
(
|
||||
|
@ -295,7 +296,7 @@ void UIGMBox::Print(const char *text)
|
|||
|
||||
m_items[m_numitems].flags = 0;
|
||||
|
||||
if (*text == 3) {
|
||||
if (*text == MESSAGE_WHITE) {
|
||||
m_items[m_numitems].color = UWhite;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= GMBOX_ITEM_FLAG_BOLD;
|
||||
|
@ -306,7 +307,7 @@ void UIGMBox::Print(const char *text)
|
|||
m_items[m_numitems].font = m_font;
|
||||
}
|
||||
|
||||
m_items[m_numitems].string = CalculateBreaks(m_items[m_numitems].font, text1, s_gmboxWidth);
|
||||
m_items[m_numitems].string = CalculateBreaks(m_items[m_numitems].font, Sys_LV_CL_ConvertString(text1), s_gmboxWidth);
|
||||
|
||||
m_numitems++;
|
||||
VerifyBoxOut();
|
||||
|
|
|
@ -333,6 +333,7 @@ str FAKKLoadGameItem::getListItemString(int which) const
|
|||
{
|
||||
int numseconds;
|
||||
int numseconds_hours;
|
||||
int seconds;
|
||||
|
||||
// hours
|
||||
numseconds = atol(strings[1]);
|
||||
|
@ -341,17 +342,18 @@ str FAKKLoadGameItem::getListItemString(int which) const
|
|||
|
||||
// minutes
|
||||
numseconds_hours = numseconds % 3600;
|
||||
if (numseconds_hours / 60 <= 9) {
|
||||
if (numseconds_hours / 60 < 10) {
|
||||
itemstring += "0";
|
||||
}
|
||||
itemstring += (numseconds_hours / 60);
|
||||
itemstring += ":";
|
||||
|
||||
// seconds
|
||||
if (numseconds_hours / 60 <= 9) {
|
||||
seconds = numseconds_hours % 60;
|
||||
if (seconds < 10) {
|
||||
itemstring += "0";
|
||||
}
|
||||
itemstring += (numseconds_hours % 60);
|
||||
itemstring += seconds;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
|
@ -360,7 +362,7 @@ str FAKKLoadGameItem::getListItemString(int which) const
|
|||
char buffer[2048];
|
||||
|
||||
time = atol(strings[2]);
|
||||
strftime(buffer, sizeof(buffer), "%a %b %d %H:%M:%S %Y", localtime(&time));
|
||||
strftime(buffer, sizeof(buffer), "%a %b %d %Y %H:%M:%S", localtime(&time));
|
||||
itemstring = buffer;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -25,7 +25,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "../gamespy/sv_gamespy.h"
|
||||
#include "../gamespy/common/gsPlatformSocket.h"
|
||||
|
||||
Event EV_FAKKServerList_Connect(
|
||||
Event EV_FAKKServerList_Connect
|
||||
(
|
||||
"connect",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -33,7 +34,8 @@ Event EV_FAKKServerList_Connect(
|
|||
"Connect to the specified server"
|
||||
);
|
||||
|
||||
Event EV_FAKKServerList_RefreshServerList(
|
||||
Event EV_FAKKServerList_RefreshServerList
|
||||
(
|
||||
"refreshserverlist",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -41,7 +43,8 @@ Event EV_FAKKServerList_RefreshServerList(
|
|||
"Refresh the serverlist"
|
||||
);
|
||||
|
||||
Event EV_FAKKServerList_RefreshLANServerList(
|
||||
Event EV_FAKKServerList_RefreshLANServerList
|
||||
(
|
||||
"refreshlanserverlist",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -49,7 +52,8 @@ Event EV_FAKKServerList_RefreshLANServerList(
|
|||
"Refresh the LAN serverlist"
|
||||
);
|
||||
|
||||
Event EV_FAKKServerList_CancelRefresh(
|
||||
Event EV_FAKKServerList_CancelRefresh
|
||||
(
|
||||
"cancelrefresh",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -57,7 +61,8 @@ Event EV_FAKKServerList_CancelRefresh(
|
|||
"Cancel serverlist Refresh"
|
||||
);
|
||||
|
||||
Event EV_FAKKServerList_LANListing(
|
||||
Event EV_FAKKServerList_LANListing
|
||||
(
|
||||
"lanlisting",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -65,7 +70,8 @@ Event EV_FAKKServerList_LANListing(
|
|||
"Makes this server list to LAN stuff when there's a choice between Internet & LAN servers"
|
||||
);
|
||||
|
||||
Event EV_FAKKServerList_UpdateServer(
|
||||
Event EV_FAKKServerList_UpdateServer
|
||||
(
|
||||
"updateserver",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
|
@ -75,11 +81,12 @@ Event EV_FAKKServerList_UpdateServer(
|
|||
|
||||
struct ServerListInstance {
|
||||
int iServerType;
|
||||
UIFAKKServerList* serverList;
|
||||
UIFAKKServerList *serverList;
|
||||
};
|
||||
|
||||
class FAKKServerListItem : public UIListCtrlItem {
|
||||
UIFAKKServerList* m_parent; // Added in OPM
|
||||
class FAKKServerListItem : public UIListCtrlItem
|
||||
{
|
||||
UIFAKKServerList *m_parent; // Added in OPM
|
||||
str m_strings[6];
|
||||
str m_sVersion;
|
||||
bool m_bDifferentVersion;
|
||||
|
@ -95,13 +102,15 @@ public:
|
|||
int m_iGameSpyPort;
|
||||
|
||||
public:
|
||||
FAKKServerListItem(UIFAKKServerList* parent, str string1, str string2, str string3, str string4, str string5, str string6, str ver);
|
||||
FAKKServerListItem(
|
||||
UIFAKKServerList *parent, str string1, str string2, str string3, str string4, str string5, str string6, str ver
|
||||
);
|
||||
|
||||
griditemtype_t getListItemType(int index) const override;
|
||||
int getListItemValue(int i) const override;
|
||||
str getListItemString(int i) const override;
|
||||
void setListItemString(int i, str sNewString);
|
||||
void DrawListItem(int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont* pFont) override;
|
||||
void DrawListItem(int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont *pFont) override;
|
||||
qboolean IsHeaderEntry() const override;
|
||||
bool IsQueried() const;
|
||||
void SetQueried(bool bIsQueried);
|
||||
|
@ -123,10 +132,17 @@ qboolean g_NeedAdditionalLANSearch = qfalse;
|
|||
qboolean g_bDoneUpdating[2];
|
||||
ServerListInstance g_ServerListInst[2];
|
||||
|
||||
void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, void* param1, void* param2);
|
||||
static void AddFilter(char* filter, const char* value);
|
||||
// Fixed in OPM
|
||||
// It was a static vaariable inside UpdateServerListCallBack
|
||||
// that was set to 0 when the mode changed. This caused some issues
|
||||
static int g_iServerQueryCount = 0;
|
||||
static int g_iServerTotalCount = 0;
|
||||
|
||||
FAKKServerListItem::FAKKServerListItem(UIFAKKServerList* parent, str string1, str string2, str string3, str string4, str string5, str string6, str ver)
|
||||
static void AddFilter(char *filter, const char *value);
|
||||
|
||||
FAKKServerListItem::FAKKServerListItem(
|
||||
UIFAKKServerList *parent, str string1, str string2, str string3, str string4, str string5, str string6, str ver
|
||||
)
|
||||
{
|
||||
m_parent = parent;
|
||||
m_strings[0] = string1;
|
||||
|
@ -163,11 +179,11 @@ void FAKKServerListItem::setListItemString(int i, str sNewString)
|
|||
m_strings[i] = sNewString;
|
||||
}
|
||||
|
||||
void FAKKServerListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont* pFont)
|
||||
void FAKKServerListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont *pFont)
|
||||
{
|
||||
static cvar_t *pColoringType = Cvar_Get("cl_browserdetailedcolors", "0", CVAR_ARCHIVE);
|
||||
UIRect2D newRect = drawRect;
|
||||
vec2_t virtualScale = { 1.f, 1.f };
|
||||
vec2_t virtualScale = {1.f, 1.f};
|
||||
|
||||
/*
|
||||
if (m_parent->isVirtual()) {
|
||||
|
@ -359,17 +375,16 @@ bool FAKKServerListItem::IsDifferentVersion() const
|
|||
return m_bDifferentVersion;
|
||||
}
|
||||
|
||||
CLASS_DECLARATION( UIListCtrl, UIFAKKServerList, NULL )
|
||||
{
|
||||
{ &EV_UIListBase_ItemSelected, &UIFAKKServerList::SelectServer },
|
||||
{ &EV_UIListBase_ItemDoubleClicked, &UIFAKKServerList::ConnectServer },
|
||||
{ &EV_FAKKServerList_RefreshServerList, &UIFAKKServerList::RefreshServerList },
|
||||
{ &EV_FAKKServerList_RefreshLANServerList, &UIFAKKServerList::RefreshLANServerList },
|
||||
{ &EV_FAKKServerList_CancelRefresh, &UIFAKKServerList::CancelRefresh },
|
||||
{ &EV_FAKKServerList_Connect, &UIFAKKServerList::ConnectServer },
|
||||
{ &EV_FAKKServerList_LANListing, &UIFAKKServerList::MakeLANListing },
|
||||
{ &EV_FAKKServerList_UpdateServer, &UIFAKKServerList::UpdateServer },
|
||||
{ NULL, NULL }
|
||||
CLASS_DECLARATION(UIListCtrl, UIFAKKServerList, NULL) {
|
||||
{&EV_UIListBase_ItemSelected, &UIFAKKServerList::SelectServer },
|
||||
{&EV_UIListBase_ItemDoubleClicked, &UIFAKKServerList::ConnectServer },
|
||||
{&EV_FAKKServerList_RefreshServerList, &UIFAKKServerList::RefreshServerList },
|
||||
{&EV_FAKKServerList_RefreshLANServerList, &UIFAKKServerList::RefreshLANServerList},
|
||||
{&EV_FAKKServerList_CancelRefresh, &UIFAKKServerList::CancelRefresh },
|
||||
{&EV_FAKKServerList_Connect, &UIFAKKServerList::ConnectServer },
|
||||
{&EV_FAKKServerList_LANListing, &UIFAKKServerList::MakeLANListing },
|
||||
{&EV_FAKKServerList_UpdateServer, &UIFAKKServerList::UpdateServer },
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
UIFAKKServerList::UIFAKKServerList()
|
||||
|
@ -390,21 +405,19 @@ UIFAKKServerList::UIFAKKServerList()
|
|||
m_iLastSortColumn = 2;
|
||||
}
|
||||
|
||||
void UIFAKKServerList::SelectServer( Event *ev )
|
||||
{
|
||||
}
|
||||
void UIFAKKServerList::SelectServer(Event *ev) {}
|
||||
|
||||
void UIFAKKServerList::ConnectServer( Event *ev )
|
||||
void UIFAKKServerList::ConnectServer(Event *ev)
|
||||
{
|
||||
const FAKKServerListItem* pItem;
|
||||
const FAKKServerListItem *pItem;
|
||||
|
||||
if (getCurrentItem() <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
pItem = static_cast<const FAKKServerListItem*>(GetItem(getCurrentItem()));
|
||||
pItem = static_cast<const FAKKServerListItem *>(GetItem(getCurrentItem()));
|
||||
if (pItem->IsDifferentVersion()) {
|
||||
const char* message;
|
||||
const char *message;
|
||||
float neededVersion = com_target_version->value;
|
||||
float serverVersion = atof(pItem->GetListItemVersion().c_str());
|
||||
|
||||
|
@ -412,12 +425,18 @@ void UIFAKKServerList::ConnectServer( Event *ev )
|
|||
if (fabs(neededVersion - serverVersion) >= 0.1) {
|
||||
UI_SetReturnMenuToCurrent();
|
||||
|
||||
message = va("Server is version %s, you are targeting %s", pItem->GetListItemVersion().c_str(), com_target_version->string);
|
||||
message =
|
||||
va("Server is version %s, you are targeting %s",
|
||||
pItem->GetListItemVersion().c_str(),
|
||||
com_target_version->string);
|
||||
Cvar_Set("com_errormessage", message);
|
||||
|
||||
UI_PushMenu("wrongversion");
|
||||
} else {
|
||||
message = va("Can not connect to v%s server, you are targeting v%s", pItem->GetListItemVersion().c_str(), com_target_version->string);
|
||||
message =
|
||||
va("Can not connect to v%s server, you are targeting v%s",
|
||||
pItem->GetListItemVersion().c_str(),
|
||||
com_target_version->string);
|
||||
|
||||
Cvar_Set("dm_serverstatus", message);
|
||||
}
|
||||
|
@ -432,10 +451,9 @@ void UIFAKKServerList::ConnectServer( Event *ev )
|
|||
}
|
||||
}
|
||||
|
||||
qboolean UIFAKKServerList::KeyEvent( int key, unsigned int time )
|
||||
qboolean UIFAKKServerList::KeyEvent(int key, unsigned int time)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
switch (key) {
|
||||
case K_ENTER:
|
||||
case K_KP_ENTER:
|
||||
ConnectServer(NULL);
|
||||
|
@ -456,17 +474,17 @@ qboolean UIFAKKServerList::KeyEvent( int key, unsigned int time )
|
|||
SelectServer(NULL);
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return qfalse;
|
||||
}
|
||||
break;
|
||||
case 'u':
|
||||
case 'U':
|
||||
if (getCurrentItem() > 0)
|
||||
{
|
||||
const FAKKServerListItem* pItem = static_cast<const FAKKServerListItem*>(GetItem(getCurrentItem()));
|
||||
ServerListAuxUpdate(m_serverList[0], pItem->m_sIP.c_str(), pItem->m_iGameSpyPort, true, GQueryType::qt_status);
|
||||
if (getCurrentItem() > 0) {
|
||||
const FAKKServerListItem *pItem = static_cast<const FAKKServerListItem *>(GetItem(getCurrentItem()));
|
||||
ServerListAuxUpdate(
|
||||
m_serverList[0], pItem->m_sIP.c_str(), pItem->m_iGameSpyPort, true, GQueryType::qt_status
|
||||
);
|
||||
}
|
||||
return UIListCtrl::KeyEvent(key, time);
|
||||
case 'c':
|
||||
|
@ -477,24 +495,32 @@ qboolean UIFAKKServerList::KeyEvent( int key, unsigned int time )
|
|||
case 'I':
|
||||
{
|
||||
int i, j;
|
||||
const FAKKServerListItem* pServerItem1;
|
||||
const FAKKServerListItem* pServerItem2;
|
||||
const FAKKServerListItem *pServerItem1;
|
||||
const FAKKServerListItem *pServerItem2;
|
||||
int iNumErrors = 0;
|
||||
|
||||
for (i = 1; i <= getNumItems(); i++) {
|
||||
pServerItem1 = static_cast<const FAKKServerListItem*>(GetItem(i));
|
||||
pServerItem1 = static_cast<const FAKKServerListItem *>(GetItem(i));
|
||||
|
||||
for (j = i + 1; j <= getNumItems(); j++) {
|
||||
pServerItem2 = static_cast<const FAKKServerListItem*>(GetItem(j));
|
||||
pServerItem2 = static_cast<const FAKKServerListItem *>(GetItem(j));
|
||||
|
||||
if (!str::icmp(pServerItem1->m_sIP.c_str(), pServerItem2->m_sIP.c_str())) {
|
||||
if (pServerItem1->m_iPort == pServerItem2->m_iPort) {
|
||||
Com_DPrintf("*#*#* Duplicate server address: %s:%i\n", pServerItem1->m_sIP.c_str(), pServerItem1->m_iPort);
|
||||
Com_DPrintf(
|
||||
"*#*#* Duplicate server address: %s:%i\n",
|
||||
pServerItem1->m_sIP.c_str(),
|
||||
pServerItem1->m_iPort
|
||||
);
|
||||
iNumErrors++;
|
||||
}
|
||||
|
||||
if (pServerItem1->m_iGameSpyPort == pServerItem2->m_iGameSpyPort) {
|
||||
Com_DPrintf("*#*#* servers at IP %s sharing GameSpy port %i\n", pServerItem1->m_sIP.c_str(), pServerItem1->m_iGameSpyPort);
|
||||
Com_DPrintf(
|
||||
"*#*#* servers at IP %s sharing GameSpy port %i\n",
|
||||
pServerItem1->m_sIP.c_str(),
|
||||
pServerItem1->m_iGameSpyPort
|
||||
);
|
||||
iNumErrors++;
|
||||
}
|
||||
}
|
||||
|
@ -509,7 +535,7 @@ qboolean UIFAKKServerList::KeyEvent( int key, unsigned int time )
|
|||
}
|
||||
}
|
||||
|
||||
void UIFAKKServerList::UpdateUIElement( void )
|
||||
void UIFAKKServerList::UpdateUIElement(void)
|
||||
{
|
||||
float width;
|
||||
|
||||
|
@ -527,13 +553,24 @@ void UIFAKKServerList::UpdateUIElement( void )
|
|||
uWinMan.ActivateControl(this);
|
||||
}
|
||||
|
||||
void UIFAKKServerList::RefreshServerList( Event *ev )
|
||||
void UIFAKKServerList::RefreshServerList(Event *ev)
|
||||
{
|
||||
int i;
|
||||
FAKKServerListItem* pNewServerItem;
|
||||
FAKKServerListItem *pNewServerItem;
|
||||
|
||||
if (m_serverList[0] && ServerListState(m_serverList[0]) != sl_idle) {
|
||||
// Fixed in OPM
|
||||
// Only free the server list if it isn't currently being queried.
|
||||
// The server list must not be queried
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_serverList[1] && ServerListState(m_serverList[1]) != sl_idle) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i <= getNumItems(); i++) {
|
||||
pNewServerItem = static_cast<FAKKServerListItem*>(GetItem(i));
|
||||
pNewServerItem = static_cast<FAKKServerListItem *>(GetItem(i));
|
||||
pNewServerItem->SetQueried(false);
|
||||
pNewServerItem->SetNumPlayers(0);
|
||||
pNewServerItem->SetQueryFailed(false);
|
||||
|
@ -541,6 +578,8 @@ void UIFAKKServerList::RefreshServerList( Event *ev )
|
|||
|
||||
if (m_serverList[0]) {
|
||||
ServerListClear(m_serverList[0]);
|
||||
// Added in 2.0: Free the server list
|
||||
// Since 2.0, the UI no longer refreshes the server list when clicking "Browse Internet Servers"
|
||||
ServerListFree(m_serverList[0]);
|
||||
m_serverList[0] = NULL;
|
||||
}
|
||||
|
@ -551,7 +590,7 @@ void UIFAKKServerList::RefreshServerList( Event *ev )
|
|||
m_serverList[1] = NULL;
|
||||
}
|
||||
|
||||
if (!m_serverList[0]) {
|
||||
if (!m_serverList[0] && (com_target_game->integer < target_game_e::TG_MOHTT || !m_serverList[1])) {
|
||||
NewServerList();
|
||||
}
|
||||
|
||||
|
@ -560,14 +599,14 @@ void UIFAKKServerList::RefreshServerList( Event *ev )
|
|||
|
||||
Cvar_Set("dm_playercount", "0");
|
||||
{
|
||||
char filter[2048] = { 0 };
|
||||
static cvar_t* dm_max_players = Cvar_Get("dm_max_players", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_min_players = Cvar_Get("dm_min_players", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_show_demo_servers = Cvar_Get("dm_show_demo_servers", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_realism_mode = Cvar_Get("dm_realism_mode", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_filter_listen = Cvar_Get("dm_filter_listen", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_filter_empty = Cvar_Get("dm_filter_empty", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_filter_full = Cvar_Get("dm_filter_full", "0", CVAR_ARCHIVE);
|
||||
char filter[2048] = {0};
|
||||
static cvar_t *dm_max_players = Cvar_Get("dm_max_players", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_min_players = Cvar_Get("dm_min_players", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_show_demo_servers = Cvar_Get("dm_show_demo_servers", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_realism_mode = Cvar_Get("dm_realism_mode", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_listen = Cvar_Get("dm_filter_listen", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_empty = Cvar_Get("dm_filter_empty", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_full = Cvar_Get("dm_filter_full", "0", CVAR_ARCHIVE);
|
||||
|
||||
if (dm_min_players->integer) {
|
||||
AddFilter(filter, va("numplayers >= %d", dm_min_players->integer));
|
||||
|
@ -607,25 +646,27 @@ void UIFAKKServerList::RefreshServerList( Event *ev )
|
|||
m_bUpdatingList = true;
|
||||
}
|
||||
|
||||
void UIFAKKServerList::RefreshLANServerList( Event *ev )
|
||||
void UIFAKKServerList::RefreshLANServerList(Event *ev)
|
||||
{
|
||||
int i;
|
||||
FAKKServerListItem* pNewServerItem;
|
||||
FAKKServerListItem *pNewServerItem;
|
||||
|
||||
for (i = 1; i <= getNumItems(); i++) {
|
||||
pNewServerItem = static_cast<FAKKServerListItem*>(GetItem(i));
|
||||
pNewServerItem = static_cast<FAKKServerListItem *>(GetItem(i));
|
||||
pNewServerItem->SetQueried(false);
|
||||
pNewServerItem->SetNumPlayers(0);
|
||||
pNewServerItem->SetQueryFailed(false);
|
||||
}
|
||||
|
||||
if (m_serverList[0]) {
|
||||
ServerListClear(m_serverList[0]);
|
||||
}
|
||||
|
||||
if (m_serverList[1]) {
|
||||
ServerListClear(m_serverList[1]);
|
||||
}
|
||||
|
||||
if (m_serverList[0]) {
|
||||
ServerListClear(m_serverList[0]);
|
||||
} else {
|
||||
if (!m_serverList[0] && (com_target_game->integer < target_game_e::TG_MOHTT || !m_serverList[1])) {
|
||||
NewServerList();
|
||||
}
|
||||
|
||||
|
@ -643,7 +684,8 @@ void UIFAKKServerList::RefreshLANServerList( Event *ev )
|
|||
}
|
||||
}
|
||||
|
||||
static void AddFilter(char* filter, const char* value) {
|
||||
static void AddFilter(char *filter, const char *value)
|
||||
{
|
||||
if (*filter) {
|
||||
strcat(filter, va(" and %s", value));
|
||||
} else {
|
||||
|
@ -651,7 +693,7 @@ static void AddFilter(char* filter, const char* value) {
|
|||
}
|
||||
}
|
||||
|
||||
void UIFAKKServerList::CancelRefresh( Event *ev )
|
||||
void UIFAKKServerList::CancelRefresh(Event *ev)
|
||||
{
|
||||
ServerListHalt(m_serverList[0]);
|
||||
if (m_serverList[1]) {
|
||||
|
@ -659,12 +701,12 @@ void UIFAKKServerList::CancelRefresh( Event *ev )
|
|||
}
|
||||
}
|
||||
|
||||
void UIFAKKServerList::NewServerList( void )
|
||||
void UIFAKKServerList::NewServerList(void)
|
||||
{
|
||||
int iNumConcurrent;
|
||||
const char* secret_key;
|
||||
const char* game_name;
|
||||
cvar_t* pRateCvar = Cvar_Get("rate", "5000", CVAR_ARCHIVE | CVAR_USERINFO);
|
||||
const char *secret_key;
|
||||
const char *game_name;
|
||||
cvar_t *pRateCvar = Cvar_Get("rate", "5000", CVAR_ARCHIVE | CVAR_USERINFO);
|
||||
|
||||
if (pRateCvar->integer <= 3000) {
|
||||
iNumConcurrent = 4;
|
||||
|
@ -676,6 +718,9 @@ void UIFAKKServerList::NewServerList( void )
|
|||
iNumConcurrent = 15;
|
||||
}
|
||||
|
||||
g_iServerQueryCount = 0;
|
||||
g_iServerTotalCount = 0;
|
||||
|
||||
if (com_target_game->integer < target_game_e::TG_MOHTT) {
|
||||
game_name = GS_GetCurrentGameName();
|
||||
secret_key = GS_GetCurrentGameKey();
|
||||
|
@ -689,14 +734,14 @@ void UIFAKKServerList::NewServerList( void )
|
|||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void*)&UpdateServerListCallBack,
|
||||
(void *)&UpdateServerListCallBack,
|
||||
1,
|
||||
(void*)&g_ServerListInst[0]
|
||||
(void *)&g_ServerListInst[0]
|
||||
);
|
||||
|
||||
m_serverList[1] = NULL;
|
||||
} else {
|
||||
static cvar_t* dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", 1);
|
||||
static cvar_t *dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", 1);
|
||||
|
||||
game_name = GS_GetGameName(target_game_e::TG_MOHTT);
|
||||
secret_key = GS_GetGameKey(target_game_e::TG_MOHTT);
|
||||
|
@ -709,9 +754,9 @@ void UIFAKKServerList::NewServerList( void )
|
|||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void*)&UpdateServerListCallBack,
|
||||
(void *)&UpdateServerListCallBack,
|
||||
1,
|
||||
(void*)&g_ServerListInst[0]
|
||||
(void *)&g_ServerListInst[0]
|
||||
);
|
||||
|
||||
if (!dm_omit_spearhead->integer) {
|
||||
|
@ -728,53 +773,56 @@ void UIFAKKServerList::NewServerList( void )
|
|||
game_name,
|
||||
secret_key,
|
||||
iNumConcurrent,
|
||||
(void*)&UpdateServerListCallBack,
|
||||
(void *)&UpdateServerListCallBack,
|
||||
1,
|
||||
(void*)&g_ServerListInst[1]
|
||||
(void *)&g_ServerListInst[1]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UIFAKKServerList::MakeLANListing( Event *ev )
|
||||
void UIFAKKServerList::MakeLANListing(Event *ev)
|
||||
{
|
||||
m_bLANListing = true;
|
||||
}
|
||||
|
||||
void UIFAKKServerList::UpdateServer( Event *ev )
|
||||
void UIFAKKServerList::UpdateServer(Event *ev)
|
||||
{
|
||||
if (m_currentItem <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
FAKKServerListItem* item = (FAKKServerListItem*)GetItem(getCurrentItem());
|
||||
FAKKServerListItem *item = (FAKKServerListItem *)GetItem(getCurrentItem());
|
||||
ServerListAuxUpdate(m_serverList[0], item->m_sIP.c_str(), item->m_iGameSpyPort, true, GQueryType::qt_status);
|
||||
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
const cvar_t* dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", CVAR_ARCHIVE);
|
||||
const cvar_t *dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", CVAR_ARCHIVE);
|
||||
// check for Spearhead
|
||||
if (!dm_omit_spearhead->integer) {
|
||||
ServerListAuxUpdate(m_serverList[1], item->m_sIP.c_str(), item->m_iGameSpyPort, true, GQueryType::qt_status);
|
||||
ServerListAuxUpdate(
|
||||
m_serverList[1], item->m_sIP.c_str(), item->m_iGameSpyPort, true, GQueryType::qt_status
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIListCtrlItem *i2, int columnname )
|
||||
int UIFAKKServerList::ServerCompareFunction(const UIListCtrlItem *i1, const UIListCtrlItem *i2, int columnname)
|
||||
{
|
||||
int iCompResult;
|
||||
int val1, val2;
|
||||
const FAKKServerListItem* fi1 = static_cast<const FAKKServerListItem*>(i1);
|
||||
const FAKKServerListItem* fi2 = static_cast<const FAKKServerListItem*>(i2);
|
||||
const FAKKServerListItem *fi1 = static_cast<const FAKKServerListItem *>(i1);
|
||||
const FAKKServerListItem *fi2 = static_cast<const FAKKServerListItem *>(i2);
|
||||
|
||||
if (fi1->IsFavorite() != fi2->IsFavorite())
|
||||
{
|
||||
if (fi1->IsFavorite() != fi2->IsFavorite()) {
|
||||
if (fi1->IsFavorite()) {
|
||||
iCompResult = -1;
|
||||
} else {
|
||||
iCompResult = 1;
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
} else if (fi1->IsQueried() != fi2->IsQueried()) {
|
||||
if (fi1->IsQueried()) {
|
||||
iCompResult = -1;
|
||||
|
@ -782,16 +830,19 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
iCompResult = 1;
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
} else if (fi1->IsDifferentVersion() != fi2->IsDifferentVersion()) {
|
||||
|
||||
if (fi1->IsDifferentVersion()) {
|
||||
iCompResult = 1;
|
||||
} else {
|
||||
iCompResult = -1;
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
} else if (fi1->IfQueryFailed() != fi2->IfQueryFailed()) {
|
||||
if (fi1->IfQueryFailed()) {
|
||||
iCompResult = 1;
|
||||
|
@ -799,7 +850,9 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
iCompResult = -1;
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
} else if (g_bNumericSort) {
|
||||
val1 = fi1->getListItemValue(columnname);
|
||||
val2 = fi2->getListItemValue(columnname);
|
||||
|
@ -815,8 +868,7 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
iCompResult = str::icmp(fi1->getListItemString(columnname), fi2->getListItemString(columnname));
|
||||
}
|
||||
|
||||
if (!iCompResult)
|
||||
{
|
||||
if (!iCompResult) {
|
||||
if (columnname != -2) {
|
||||
val1 = fi1->getListItemValue(2);
|
||||
val2 = fi2->getListItemValue(2);
|
||||
|
@ -849,11 +901,9 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
|
||||
if (val1 < val2) {
|
||||
iCompResult = 1;
|
||||
}
|
||||
else if (val1 > val2) {
|
||||
} else if (val1 > val2) {
|
||||
iCompResult = -1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
iCompResult = 0;
|
||||
}
|
||||
}
|
||||
|
@ -871,16 +921,17 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
}
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
}
|
||||
|
||||
return iCompResult;
|
||||
}
|
||||
|
||||
void UIFAKKServerList::Draw( void )
|
||||
void UIFAKKServerList::Draw(void)
|
||||
{
|
||||
if (m_serverList[0])
|
||||
{
|
||||
if (m_serverList[0]) {
|
||||
GServerListState listState[2];
|
||||
|
||||
ServerListThink(m_serverList[0]);
|
||||
|
@ -890,22 +941,17 @@ void UIFAKKServerList::Draw( void )
|
|||
|
||||
listState[0] = ServerListState(m_serverList[0]);
|
||||
listState[1] = m_serverList[1] ? ServerListState(m_serverList[1]) : GServerListState::sl_idle;
|
||||
if (listState[0] != GServerListState::sl_idle || listState[1] != GServerListState::sl_idle)
|
||||
{
|
||||
if (listState[0] != GServerListState::sl_idle || listState[1] != GServerListState::sl_idle) {
|
||||
menuManager.PassEventToWidget("refresh", new Event(EV_Widget_Disable));
|
||||
menuManager.PassEventToWidget("cancelrefresh", new Event(EV_Widget_Enable));
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
menuManager.PassEventToWidget("refresh", new Event(EV_Widget_Enable));
|
||||
menuManager.PassEventToWidget("cancelrefresh", new Event(EV_Widget_Disable));
|
||||
}
|
||||
} else if (!m_bHasList) {
|
||||
|
||||
if (m_bLANListing) {
|
||||
RefreshLANServerList(NULL);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
RefreshServerList(NULL);
|
||||
}
|
||||
|
||||
|
@ -927,13 +973,13 @@ void UIFAKKServerList::Draw( void )
|
|||
UIListCtrl::Draw();
|
||||
}
|
||||
|
||||
void UIFAKKServerList::SortByColumn( int column )
|
||||
void UIFAKKServerList::SortByColumn(int column)
|
||||
{
|
||||
int i;
|
||||
bool exists = 0;
|
||||
bool numeric = 0;
|
||||
bool reverse = 0;
|
||||
UIListCtrlItem* selected = NULL;
|
||||
UIListCtrlItem *selected = NULL;
|
||||
bool selvisible = false;
|
||||
|
||||
for (i = 1; i <= m_columnlist.NumObjects(); i++) {
|
||||
|
@ -983,47 +1029,44 @@ void UIFAKKServerList::SortByColumn( int column )
|
|||
}
|
||||
}
|
||||
|
||||
void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, void* param1, void* param2)
|
||||
void UIFAKKServerList::UpdateServerListCallBack(GServerList serverlist, int msg, void *instance, void *param1, void *param2)
|
||||
{
|
||||
int i, j;
|
||||
int iPort, iGameSpyPort;
|
||||
unsigned int iRealIP;
|
||||
str sAddress;
|
||||
GServer server;
|
||||
FAKKServerListItem* pNewServerItem;
|
||||
static int iServerQueryCount = 0;
|
||||
static int iServerTotalCount = 0;
|
||||
UIFAKKServerList* uiServerList;
|
||||
FAKKServerListItem *pNewServerItem;
|
||||
UIFAKKServerList *uiServerList;
|
||||
int iServerType;
|
||||
// filters
|
||||
static cvar_t* dm_filter_empty = Cvar_Get("dm_filter_empty", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_filter_full = Cvar_Get("dm_filter_full", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_filter_pure = Cvar_Get("dm_filter_pure", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_max_ping = Cvar_Get("dm_max_ping", "0", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_free_for_all = Cvar_Get("dm_free_for_all", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_objective_match = Cvar_Get("dm_objective_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_round_based_match = Cvar_Get("dm_round_based_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_team_match = Cvar_Get("dm_team_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_tow_match = Cvar_Get("dm_tow_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_liberation_match = Cvar_Get("dm_liberation_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_run_fast = Cvar_Get("dm_run_fast", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_run_normal = Cvar_Get("dm_run_normal", "1", CVAR_ARCHIVE);
|
||||
static cvar_t* dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_empty = Cvar_Get("dm_filter_empty", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_full = Cvar_Get("dm_filter_full", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_filter_pure = Cvar_Get("dm_filter_pure", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_max_ping = Cvar_Get("dm_max_ping", "0", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_free_for_all = Cvar_Get("dm_free_for_all", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_objective_match = Cvar_Get("dm_objective_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_round_based_match = Cvar_Get("dm_round_based_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_team_match = Cvar_Get("dm_team_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_tow_match = Cvar_Get("dm_tow_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_liberation_match = Cvar_Get("dm_liberation_match", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_run_fast = Cvar_Get("dm_run_fast", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_run_normal = Cvar_Get("dm_run_normal", "1", CVAR_ARCHIVE);
|
||||
static cvar_t *dm_omit_spearhead = Cvar_Get("dm_omit_spearhead", "0", CVAR_ARCHIVE);
|
||||
|
||||
iServerType = ((ServerListInstance*)instance)->iServerType;
|
||||
uiServerList = ((ServerListInstance*)instance)->serverList;
|
||||
iServerType = ((ServerListInstance *)instance)->iServerType;
|
||||
uiServerList = ((ServerListInstance *)instance)->serverList;
|
||||
pNewServerItem = NULL;
|
||||
server = (GServer)param1;
|
||||
|
||||
if (param2)
|
||||
{
|
||||
if (msg == LIST_PROGRESS && param2 == (void*)-1) {
|
||||
if (param2) {
|
||||
if (msg == LIST_PROGRESS && param2 == (void *)-1) {
|
||||
iRealIP = inet_addr(ServerGetAddress(server));
|
||||
ServerGetIntValue(server, "hostport", PORT_SERVER);
|
||||
iGameSpyPort = ServerGetQueryPort(server);
|
||||
|
||||
for (i = 1; i <= uiServerList->getNumItems(); i++) {
|
||||
pNewServerItem = static_cast<FAKKServerListItem*>(uiServerList->GetItem(i));
|
||||
pNewServerItem = static_cast<FAKKServerListItem *>(uiServerList->GetItem(i));
|
||||
if (pNewServerItem->m_uiRealIP == iRealIP && pNewServerItem->m_iGameSpyPort == iGameSpyPort) {
|
||||
break;
|
||||
}
|
||||
|
@ -1036,18 +1079,21 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
return;
|
||||
}
|
||||
|
||||
Cvar_Set("dm_serverstatusbar", va("%i", (int)(uintptr_t)param2));
|
||||
//Cvar_Set("dm_serverstatusbar", va("%i", (int)(uintptr_t)param2));
|
||||
// Fixed in OPM
|
||||
// As both lists are combined, show the correct percentage
|
||||
Cvar_Set("dm_serverstatusbar", va("%i", 100 * g_iServerQueryCount / g_iServerTotalCount));
|
||||
}
|
||||
|
||||
if (msg == LIST_PROGRESS)
|
||||
{
|
||||
const char* pszHostName;
|
||||
if (msg == LIST_PROGRESS) {
|
||||
const char *pszHostName;
|
||||
bool bDiffVersion;
|
||||
bool bIsDemo;
|
||||
str sServerName;
|
||||
str sPlayers;
|
||||
const char* pszGameVer;
|
||||
const char* pszGameVerNumber;
|
||||
const char *pszGameVer;
|
||||
const char *pszGameVerNumber;
|
||||
float fGameVer;
|
||||
|
||||
pszHostName = ServerGetStringValue(server, "hostname", "(NONE)");
|
||||
bDiffVersion = false;
|
||||
|
@ -1061,24 +1107,26 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
bIsDemo = true;
|
||||
}
|
||||
|
||||
fGameVer = atof(pszGameVerNumber);
|
||||
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
if (iServerType == target_game_e::TG_MOHTT) {
|
||||
//if (fabs(atof(pszGameVerNumber) - com_target_version->value) > 0.1f) {
|
||||
//if (fabs(fGameVer - com_target_version->value) > 0.1f) {
|
||||
// bDiffVersion = true;
|
||||
//}
|
||||
if (fabs(atof(pszGameVerNumber)) < 2.3f) {
|
||||
if (fabs(fGameVer) < 2.3f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
} else {
|
||||
//if (fabs(atof(pszGameVerNumber) - com_target_version->value) > 0.3f) {
|
||||
//if (fabs(fGameVer - com_target_version->value) > 0.3f) {
|
||||
// bDiffVersion = true;
|
||||
//}
|
||||
if (fabs(atof(pszGameVerNumber)) < 2.1f) {
|
||||
if (fabs(fGameVer) < 2.1f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (fabs(atof(pszGameVerNumber) - com_target_version->value) > 0.1f) {
|
||||
if (fabs(fGameVer - com_target_version->value) > 0.1f) {
|
||||
bDiffVersion = true;
|
||||
}
|
||||
}
|
||||
|
@ -1096,7 +1144,7 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
sPlayers = va("%d/%d", ServerGetIntValue(server, "numplayers", 0), ServerGetIntValue(server, "maxplayers", 0));
|
||||
|
||||
for (i = 1; i <= uiServerList->getNumItems(); i++) {
|
||||
pNewServerItem = static_cast<FAKKServerListItem*>(uiServerList->GetItem(i));
|
||||
pNewServerItem = static_cast<FAKKServerListItem *>(uiServerList->GetItem(i));
|
||||
if (pNewServerItem->m_uiRealIP == iRealIP && pNewServerItem->m_iGameSpyPort == iGameSpyPort) {
|
||||
break;
|
||||
}
|
||||
|
@ -1124,15 +1172,12 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
pNewServerItem->SetQueried(true);
|
||||
pNewServerItem->SetNumPlayers(ServerGetIntValue(server, "numplayers", 0));
|
||||
|
||||
iServerQueryCount++;
|
||||
Cvar_Set("dm_servercount", va("%d/%d", iServerQueryCount, iServerTotalCount));
|
||||
g_iServerQueryCount++;
|
||||
Cvar_Set("dm_servercount", va("%d/%d", g_iServerQueryCount, g_iServerTotalCount));
|
||||
|
||||
uiServerList->SortByLastSortColumn();
|
||||
}
|
||||
else if (msg == LIST_STATECHANGED)
|
||||
{
|
||||
switch (ServerListState(serverlist))
|
||||
{
|
||||
} else if (msg == LIST_STATECHANGED) {
|
||||
switch (ServerListState(serverlist)) {
|
||||
case GServerListState::sl_idle:
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
if (iServerType == target_game_e::TG_MOHTT) {
|
||||
|
@ -1156,14 +1201,17 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
case GServerListState::sl_listxfer:
|
||||
Cvar_Set("dm_serverstatus", "Getting List.");
|
||||
if (com_target_game->integer >= target_game_e::TG_MOHTT) {
|
||||
if (iServerType == target_game_e::TG_MOHTT) uiServerList->m_bGettingList[0] = true;
|
||||
if (iServerType == target_game_e::TG_MOHTA) uiServerList->m_bGettingList[1] = true;
|
||||
if (iServerType == target_game_e::TG_MOHTT) {
|
||||
uiServerList->m_bGettingList[0] = true;
|
||||
}
|
||||
if (iServerType == target_game_e::TG_MOHTA) {
|
||||
uiServerList->m_bGettingList[1] = true;
|
||||
}
|
||||
} else {
|
||||
uiServerList->m_bGettingList[0] = true;
|
||||
uiServerList->m_bGettingList[1] = false;
|
||||
}
|
||||
uiServerList->m_bUpdatingList = true;
|
||||
iServerQueryCount = 0;
|
||||
return;
|
||||
case GServerListState::sl_lanlist:
|
||||
Cvar_Set("dm_serverstatus", "Searching LAN.");
|
||||
|
@ -1172,18 +1220,22 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
case GServerListState::sl_querying:
|
||||
Cvar_Set("dm_serverstatus", "Querying Servers.");
|
||||
uiServerList->m_bUpdatingList = true;
|
||||
iServerQueryCount = 0;
|
||||
iServerTotalCount = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!uiServerList->m_bGettingList[0] && !uiServerList->m_bGettingList[1]) {
|
||||
return;
|
||||
}
|
||||
//if (!uiServerList->m_bGettingList[0] && !uiServerList->m_bGettingList[1]) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
iServerTotalCount += ServerListCount(serverlist);
|
||||
// Rebuild the number of servers
|
||||
g_iServerTotalCount = 0;
|
||||
for(i = 0; i < ARRAY_LEN(uiServerList->m_serverList); i++) {
|
||||
if (uiServerList->m_bGettingList[i] && uiServerList->m_serverList[i]) {
|
||||
g_iServerTotalCount += ServerListCount(uiServerList->m_serverList[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Removed in 2.0
|
||||
// Only add entries for servers that are queried successfully
|
||||
|
|
|
@ -22,6 +22,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "../gamespy/goaceng.h"
|
||||
|
||||
class UIFAKKServerList : public UIListCtrl {
|
||||
protected:
|
||||
// need a new struct instead of gamespy
|
||||
|
@ -47,6 +49,7 @@ protected:
|
|||
void MakeLANListing( Event *ev );
|
||||
void UpdateServer( Event *ev );
|
||||
static int ServerCompareFunction( const UIListCtrlItem *i1, const UIListCtrlItem *i2, int columnname );
|
||||
static void UpdateServerListCallBack(GServerList serverlist, int msg, void *instance, void *param1, void *param2);
|
||||
public:
|
||||
UIFAKKServerList();
|
||||
|
||||
|
|
|
@ -561,6 +561,7 @@ qboolean CL_CheckPaused(void);
|
|||
|
||||
int CL_GetRefSequence(void);
|
||||
qboolean CL_IsRendererLoaded(void);
|
||||
void CL_ApplyOriginalConfigTweaks();
|
||||
|
||||
//
|
||||
// cl_input
|
||||
|
|
|
@ -36,15 +36,18 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#ifdef USE_LOCAL_HEADERS
|
||||
#include "../AL/al.h"
|
||||
#include "../AL/alc.h"
|
||||
#include "../AL/alext.h"
|
||||
#else
|
||||
#if defined(_MSC_VER) || defined(__APPLE__)
|
||||
// MSVC users must install the OpenAL SDK which doesn't use the AL/*.h scheme.
|
||||
// OSX framework also needs this
|
||||
#include <al.h>
|
||||
#include <alc.h>
|
||||
#include <alext.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#include <AL/alext.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -26,12 +26,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "../server/server.h"
|
||||
#include "snd_codec.h"
|
||||
|
||||
#if defined(_MSC_VER) || defined(__APPLE__)
|
||||
# include <alext.h>
|
||||
#else
|
||||
# include <AL/alext.h>
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
const char *funcname;
|
||||
void **funcptr;
|
||||
|
@ -78,6 +72,8 @@ static float al_current_volume = 0;
|
|||
static unsigned int al_frequency = 22050;
|
||||
static ALCcontext *al_context_id = NULL;
|
||||
static ALCdevice *al_device = NULL;
|
||||
static ALsizei al_default_resampler_index = 0;
|
||||
static ALsizei al_resampler_index = 0;
|
||||
|
||||
static ALboolean (*_alutLoadMP3_LOKI)(unsigned int buffer, const byte *data, int length);
|
||||
static void (*_alReverbScale_LOKI)();
|
||||
|
@ -132,6 +128,13 @@ static ALuint S_OPENAL_Format(float width, int channels);
|
|||
# define ALDRIVER_DEFAULT "libopenal.so.1"
|
||||
#endif
|
||||
|
||||
//
|
||||
// alext
|
||||
//
|
||||
#ifdef AL_SOFT_source_resampler
|
||||
LPALGETSTRINGISOFT qalGetStringiSOFT;
|
||||
#endif
|
||||
|
||||
/*
|
||||
==============
|
||||
__alDieIfError
|
||||
|
@ -271,7 +274,7 @@ S_OPENAL_InitContext
|
|||
static bool S_OPENAL_InitContext()
|
||||
{
|
||||
const char *dev;
|
||||
int attrlist[8];
|
||||
int attrlist[12];
|
||||
|
||||
Com_DPrintf("OpenAL: Context initialization\n");
|
||||
|
||||
|
@ -378,6 +381,11 @@ static bool S_OPENAL_InitContext()
|
|||
|
||||
#ifdef ALC_SOFT_output_mode
|
||||
attrlist[4] = ALC_OUTPUT_MODE_SOFT;
|
||||
// Disable HRTF by default
|
||||
// For example, actual speakers that are recognized as headphones by the OS
|
||||
// will not get forced HRTF
|
||||
attrlist[6] = ALC_HRTF_SOFT;
|
||||
attrlist[7] = ALC_FALSE;
|
||||
|
||||
switch (s_speaker_type->integer) {
|
||||
// Two speakers
|
||||
|
@ -388,6 +396,8 @@ static bool S_OPENAL_InitContext()
|
|||
// Headphones
|
||||
case 1:
|
||||
attrlist[5] = ALC_STEREO_HRTF_SOFT;
|
||||
// Allow HRTF mixing (without forcing in case it's unsupported)
|
||||
attrlist[7] = ALC_DONT_CARE_SOFT;
|
||||
break;
|
||||
// Surround
|
||||
case 2:
|
||||
|
@ -408,8 +418,13 @@ static bool S_OPENAL_InitContext()
|
|||
attrlist[5] = 0;
|
||||
#endif
|
||||
|
||||
attrlist[6] = 0;
|
||||
attrlist[7] = 0;
|
||||
#ifdef ALC_SOFT_output_limiter
|
||||
// Disable limiter
|
||||
attrlist[8] = ALC_OUTPUT_LIMITER_SOFT;
|
||||
attrlist[9] = ALC_FALSE;
|
||||
#endif
|
||||
attrlist[10] = 0;
|
||||
attrlist[11] = 0;
|
||||
|
||||
Com_Printf("OpenAL: Creating AL context...\n");
|
||||
al_context_id = qalcCreateContext(al_device, attrlist);
|
||||
|
@ -452,11 +467,7 @@ S_OPENAL_InitExtensions
|
|||
*/
|
||||
static bool S_OPENAL_InitExtensions()
|
||||
{
|
||||
ima4_ext = qalIsExtensionPresent("AL_EXT_IMA4");
|
||||
soft_block_align = qalIsExtensionPresent("AL_SOFT_block_alignment");
|
||||
|
||||
return true;
|
||||
|
||||
/*
|
||||
extensions_table_t extensions_table[4] = {
|
||||
"alutLoadMP3_LOKI",
|
||||
(void **)&_alutLoadMP3_LOKI,
|
||||
|
@ -468,6 +479,17 @@ static bool S_OPENAL_InitExtensions()
|
|||
(void **)&_alReverbDelay_LOKI,
|
||||
true
|
||||
};
|
||||
*/
|
||||
|
||||
extensions_table_t extensions_table[] = {
|
||||
#ifdef AL_SOFT_source_resampler
|
||||
extensions_table_t {
|
||||
"alGetStringiSOFT", (void **)&qalGetStringiSOFT,
|
||||
false, },
|
||||
#endif
|
||||
extensions_table_t {NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
extensions_table_t *i;
|
||||
|
||||
for (i = extensions_table; i->funcname; ++i) {
|
||||
|
@ -490,6 +512,9 @@ static bool S_OPENAL_InitExtensions()
|
|||
Com_Printf("...found.\n");
|
||||
}
|
||||
|
||||
ima4_ext = qalIsExtensionPresent("AL_EXT_IMA4");
|
||||
soft_block_align = qalIsExtensionPresent("AL_SOFT_block_alignment");
|
||||
|
||||
qalGetError();
|
||||
return true;
|
||||
}
|
||||
|
@ -529,6 +554,11 @@ static bool S_OPENAL_InitChannel(int idx, openal_channel *chan)
|
|||
qalSourcei(chan->source, AL_SOURCE_RELATIVE, true);
|
||||
alDieIfError();
|
||||
|
||||
#ifdef AL_SOFT_source_resampler
|
||||
qalSourcei(chan->source, AL_SOURCE_RESAMPLER_SOFT, al_resampler_index);
|
||||
alDieIfError();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -605,6 +635,28 @@ qboolean S_OPENAL_Init()
|
|||
qalListenerf(AL_GAIN, al_current_volume);
|
||||
alDieIfError();
|
||||
|
||||
#ifdef AL_SOFT_source_resampler
|
||||
if (qalGetStringiSOFT) {
|
||||
size_t numResamplers;
|
||||
size_t i;
|
||||
|
||||
al_default_resampler_index = qalGetInteger(AL_DEFAULT_RESAMPLER_SOFT);
|
||||
alDieIfError();
|
||||
al_resampler_index = al_default_resampler_index;
|
||||
numResamplers = qalGetInteger(AL_NUM_RESAMPLERS_SOFT);
|
||||
alDieIfError();
|
||||
|
||||
for (i = 0; i < numResamplers; i++) {
|
||||
const ALchar *resamplerName = qalGetStringiSOFT(AL_RESAMPLER_NAME_SOFT, i);
|
||||
if (Q_stristr(resamplerName, "spline")) {
|
||||
Com_Printf("OpenAL: Using %s as the resampler.\n", resamplerName);
|
||||
al_resampler_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < MAX_SOUNDSYSTEM_CHANNELS_3D; i++) {
|
||||
if (!S_OPENAL_InitChannel(i, &openal.chan_3D[i])) {
|
||||
return false;
|
||||
|
@ -708,6 +760,8 @@ void S_OPENAL_Shutdown()
|
|||
|
||||
s_bProvidersEmunerated = false;
|
||||
al_initialized = false;
|
||||
|
||||
QAL_Shutdown();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3069,10 +3123,12 @@ bool openal_channel::set_sfx(sfx_t *pSfx)
|
|||
qalGenBuffers(1, &pSfx->buffer);
|
||||
alDieIfError();
|
||||
|
||||
#if AL_SOFT_block_alignment
|
||||
if (pSfx->info.dataalign > 1) {
|
||||
qalBufferi(pSfx->buffer, AL_UNPACK_BLOCK_ALIGNMENT_SOFT, pSfx->info.dataalign);
|
||||
alDieIfError();
|
||||
}
|
||||
#endif
|
||||
|
||||
qalBufferData(
|
||||
pSfx->buffer,
|
||||
|
@ -4451,10 +4507,12 @@ bool openal_channel_two_d_stream::set_sfx(sfx_t *pSfx)
|
|||
return true;
|
||||
}
|
||||
|
||||
#if AL_SOFT_block_alignment
|
||||
if (stream->info.dataalign > 1 && soft_block_align) {
|
||||
qalBufferi(buffers[currentBuf], AL_UNPACK_BLOCK_ALIGNMENT_SOFT, stream->info.dataalign);
|
||||
alDieIfError();
|
||||
}
|
||||
#endif
|
||||
|
||||
qalBufferData(buffers[currentBuf], pSfx->info.format, rawData, bytesRead, stream->info.rate);
|
||||
alDieIfError();
|
||||
|
@ -4595,10 +4653,12 @@ void openal_channel_two_d_stream::update()
|
|||
}
|
||||
}
|
||||
|
||||
#if AL_SOFT_block_alignment
|
||||
if (stream->info.dataalign > 1 && soft_block_align) {
|
||||
qalBufferi(buffers[currentBuf], AL_UNPACK_BLOCK_ALIGNMENT_SOFT, stream->info.dataalign);
|
||||
alDieIfError();
|
||||
}
|
||||
#endif
|
||||
|
||||
qalBufferData(buffers[currentBuf], format, rawData, bytesRead, stream->info.rate);
|
||||
alDieIfError();
|
||||
|
|
|
@ -432,7 +432,7 @@ Event EV_Actor_SetAnimFinal
|
|||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Whether the animation was succesfully finished",
|
||||
"Whether the animation was successfully finished",
|
||||
EV_SETTER
|
||||
);
|
||||
Event EV_Actor_GetWeaponType
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -153,7 +153,7 @@ public:
|
|||
|
||||
void ArchiveRaw(void *data, size_t size);
|
||||
void ArchiveObject(Class *obj);
|
||||
void ArchiveObject(SafePtrBase* obj); // Added in OPM
|
||||
void ArchiveObject(SafePtrBase *obj); // Added in OPM
|
||||
|
||||
qboolean ObjectPositionExists(void *obj);
|
||||
|
||||
|
@ -167,23 +167,29 @@ public:
|
|||
template<class Type>
|
||||
inline void Container<Type>::Archive(Archiver& arc, void (*ArchiveFunc)(Archiver& arc, Type *obj))
|
||||
{
|
||||
Type *obj;
|
||||
int num;
|
||||
int i;
|
||||
|
||||
if (arc.Loading()) {
|
||||
arc.ArchiveInteger(&num);
|
||||
Resize(num);
|
||||
} else {
|
||||
num = numobjects;
|
||||
arc.ArchiveInteger(&num);
|
||||
}
|
||||
|
||||
for (i = 1; i <= num; i++) {
|
||||
if (num > numobjects) {
|
||||
numobjects = num;
|
||||
}
|
||||
|
||||
ArchiveFunc(arc, &objlist[i - 1]);
|
||||
for (i = 0; i < num; i++) {
|
||||
obj = new (objlist + i) Type();
|
||||
ArchiveFunc(arc, obj);
|
||||
}
|
||||
} else {
|
||||
num = numobjects;
|
||||
arc.ArchiveInteger(&num);
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
ArchiveFunc(arc, &objlist[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,7 +293,7 @@ void con_set<key, value>::Archive(Archiver& arc)
|
|||
|
||||
if (arc.Loading()) {
|
||||
if (tableLength != 1) {
|
||||
table = new Entry *[tableLength]();
|
||||
table = new (NewTable(tableLength)) Entry *[tableLength]();
|
||||
memset(table, 0, tableLength * sizeof(Entry *));
|
||||
}
|
||||
|
||||
|
@ -303,7 +309,7 @@ void con_set<key, value>::Archive(Archiver& arc)
|
|||
|
||||
defaultEntry = e;
|
||||
} else {
|
||||
#ifndef NDEBUG
|
||||
# ifndef NDEBUG
|
||||
int total;
|
||||
|
||||
total = 0;
|
||||
|
@ -316,13 +322,13 @@ void con_set<key, value>::Archive(Archiver& arc)
|
|||
}
|
||||
// it must match the number of elements
|
||||
assert(total == count);
|
||||
#else
|
||||
# else
|
||||
for (i = 0; i < tableLength; i++) {
|
||||
for (e = table[i]; e != NULL; e = e->next) {
|
||||
e->Archive(arc);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -770,8 +770,8 @@ movement on the server game.
|
|||
CGM_HUDDRAW_ALPHA,
|
||||
CGM_HUDDRAW_STRING,
|
||||
CGM_HUDDRAW_FONT,
|
||||
CGM_NOTIFY_KILL,
|
||||
CGM_NOTIFY_HIT,
|
||||
CGM_NOTIFY_KILL,
|
||||
CGM_VOICE_CHAT,
|
||||
CGM_FENCEPOST,
|
||||
};
|
||||
|
@ -812,8 +812,8 @@ movement on the server game.
|
|||
CGM6_HUDDRAW_ALPHA,
|
||||
CGM6_HUDDRAW_STRING,
|
||||
CGM6_HUDDRAW_FONT,
|
||||
CGM6_NOTIFY_KILL,
|
||||
CGM6_NOTIFY_HIT,
|
||||
CGM6_NOTIFY_KILL,
|
||||
CGM6_VOICE_CHAT,
|
||||
};
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ Conditional::Conditional()
|
|||
|
||||
Expression::Expression() {}
|
||||
|
||||
Expression::Expression(Expression& exp)
|
||||
Expression::Expression(const Expression& exp)
|
||||
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -184,7 +184,7 @@ private:
|
|||
|
||||
public:
|
||||
Expression();
|
||||
Expression(Expression& exp);
|
||||
Expression(const Expression& exp);
|
||||
Expression(Script& script, State& state);
|
||||
|
||||
void operator=(const Expression& exp);
|
||||
|
|
|
@ -42,8 +42,8 @@ typedef struct spawnsort_s {
|
|||
|
||||
static qboolean SpotWouldTelefrag(float *origin)
|
||||
{
|
||||
static Vector mins = Vector(-16, -16, 1);
|
||||
static Vector maxs = Vector(16, 16, 97);
|
||||
static Vector mins = Vector(-15, -15, 1);
|
||||
static Vector maxs = Vector(15, 15, 96);
|
||||
trace_t trace;
|
||||
|
||||
trace = G_Trace(Vector(origin), mins, maxs, Vector(origin), NULL, MASK_PLAYERSTART, qfalse, "SpotWouldTelefrag");
|
||||
|
@ -58,15 +58,12 @@ static qboolean SpotWouldTelefrag(float *origin)
|
|||
static int compare_spawnsort(const void *pe1, const void *pe2)
|
||||
{
|
||||
float fDelta = ((spawnsort_t *)pe1)->fMetric - ((spawnsort_t *)pe2)->fMetric;
|
||||
|
||||
if (fDelta >= -0.001f) {
|
||||
if (fDelta <= 0.001f) {
|
||||
return 0;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (fDelta < -0.001) {
|
||||
return 1;
|
||||
} else if (fDelta > 0.001) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,7 +80,11 @@ static PlayerStart *GetRandomSpawnpointFromList(spawnsort_t *pSpots, int nSpots)
|
|||
|
||||
qsort(pSpots, nSpots, sizeof(spawnsort_t), compare_spawnsort);
|
||||
|
||||
if (pSpots[0].fMetric > 0.0f) {
|
||||
if (pSpots[0].fMetric <= 0) {
|
||||
// return the spot anyway
|
||||
return pSpots[0].spawnpoint;
|
||||
}
|
||||
|
||||
if (nSpots > 5) {
|
||||
nSpots = 5;
|
||||
}
|
||||
|
@ -91,9 +92,7 @@ static PlayerStart *GetRandomSpawnpointFromList(spawnsort_t *pSpots, int nSpots)
|
|||
fMinPosMetric = pSpots[0].fMetric * nSpots;
|
||||
fTotalMetric = fMinPosMetric;
|
||||
|
||||
if (nSpots <= 1) {
|
||||
fChosen = fMinPosMetric;
|
||||
} else {
|
||||
if (nSpots > 1) {
|
||||
i = 0;
|
||||
fTotalMetric = 0.0f;
|
||||
|
||||
|
@ -113,26 +112,24 @@ static PlayerStart *GetRandomSpawnpointFromList(spawnsort_t *pSpots, int nSpots)
|
|||
}
|
||||
|
||||
fMinPosMetric = fTotalMetric;
|
||||
} else {
|
||||
fChosen = fMinPosMetric;
|
||||
}
|
||||
|
||||
fTotalMetric = (fMinPosMetric - i * fChosen * 0.90f) * G_Random();
|
||||
fTotalMetric = (fMinPosMetric - i * fChosen * 0.9) * G_Random();
|
||||
for (i = 0; i < nSpots - 1; i++) {
|
||||
fTotalMetric -= (nSpots - i) * pSpots[i].fMetric - (fChosen * 0.90f);
|
||||
if (fTotalMetric <= 0.0f) {
|
||||
fTotalMetric -= (nSpots - i) * pSpots[i].fMetric - (fChosen * 0.9);
|
||||
if (fTotalMetric <= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pSpots[i].spawnpoint;
|
||||
} else {
|
||||
// return the spot anyway
|
||||
return pSpots[0].spawnpoint;
|
||||
}
|
||||
}
|
||||
|
||||
float SpawnpointMetric_Ffa(const vec3_t origin, DM_Team *dmTeam, const Player *player)
|
||||
{
|
||||
float fMinEnemyDistSquared = Square(23170);
|
||||
float fMinEnemyDistSquared = Square(23170.f);
|
||||
int i;
|
||||
int nPlayers = dmManager.PlayerCount();
|
||||
float fDist;
|
||||
|
@ -150,12 +147,12 @@ float SpawnpointMetric_Ffa(const vec3_t origin, DM_Team *dmTeam, const Player *p
|
|||
}
|
||||
}
|
||||
|
||||
return fMinEnemyDistSquared - (G_Random(0.25f) + 1.0f) * Square(1024);
|
||||
return fMinEnemyDistSquared - Square(1024) * (G_Random(0.25) + 1.0);
|
||||
}
|
||||
|
||||
float SpawnpointMetric_Team(const vec3_t origin, DM_Team *dmTeam, const Player *player)
|
||||
{
|
||||
float fMinEnemyDistSquared = Square(23170);
|
||||
float fMinEnemyDistSquared = Square(23170.f);
|
||||
float fSumFriendDistSquared = 0.0f;
|
||||
float fDistSquared;
|
||||
float fMetric;
|
||||
|
@ -179,10 +176,10 @@ float SpawnpointMetric_Team(const vec3_t origin, DM_Team *dmTeam, const Player *
|
|||
}
|
||||
}
|
||||
|
||||
fMetric = fMinEnemyDistSquared - (G_Random(0.25f) + 1.0f) * Square(1024);
|
||||
fMetric = fMinEnemyDistSquared - Square(1024) * (G_Random(0.25) + 1.0);
|
||||
|
||||
if (nFriends) {
|
||||
fMetric += 0.25f * ((23170.0f * 23170.0f) - fSumFriendDistSquared / nFriends);
|
||||
fMetric += Square(23170) * 0.25 - fSumFriendDistSquared / nFriends;
|
||||
}
|
||||
|
||||
return fMetric;
|
||||
|
@ -475,8 +472,8 @@ PlayerStart *DM_Team::GetRandomSpawnpointWithMetric(
|
|||
spot = GetRandomSpawnpointFromList(points, numSpots);
|
||||
for (int i = 0; i < numSpots; i++) {
|
||||
// delete all created spawnpoint
|
||||
if (points[numSpots].spawnpoint != spot) {
|
||||
delete points[numSpots].spawnpoint;
|
||||
if (points[i].spawnpoint != spot) {
|
||||
delete points[i].spawnpoint;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1412,26 +1409,26 @@ void DM_Manager::EventDoRoundTransition(Event *ev)
|
|||
}
|
||||
|
||||
if (m_iTeamWin == TEAM_AXIS) {
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("Axis win!\n")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("Axis win!\n")));
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("Axis win!")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("Axis win!")));
|
||||
|
||||
// Play the axis victory sound
|
||||
world->Sound("den_victory_v");
|
||||
|
||||
Unregister(STRING_AXISWIN);
|
||||
level.Unregister(STRING_AXISWIN);
|
||||
} else if (m_iTeamWin == TEAM_ALLIES) {
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("Allies win!\n")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("Allies win!\n")));
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("Allies win!")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("Allies win!")));
|
||||
|
||||
// Play the allies victory sound
|
||||
world->Sound("dfr_victory_v");
|
||||
|
||||
Unregister(STRING_ALLIESWIN);
|
||||
level.Unregister(STRING_ALLIESWIN);
|
||||
} else {
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("It's a draw!\n")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("It's a draw!\n")));
|
||||
G_CenterPrintToAllClients(va("\n\n\n%s\n", gi.LV_ConvertString("It's a draw!")));
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("It's a draw!")));
|
||||
|
||||
Unregister(STRING_DRAW);
|
||||
level.Unregister(STRING_DRAW);
|
||||
}
|
||||
|
||||
G_DisplayScoresToAllClients();
|
||||
|
@ -1846,7 +1843,7 @@ void DM_Manager::BuildTeamInfo_ver6(DM_Team *dmTeam)
|
|||
for (int i = iNumPlayers; i > 0; i--) {
|
||||
pTeamPlayer = dmTeam->m_players.ObjectAt(i);
|
||||
|
||||
if (pTeamPlayer->IsSubclassOfBot()) {
|
||||
if (pTeamPlayer->edict->r.svFlags & SVF_BOT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1891,7 +1888,7 @@ void DM_Manager::BuildTeamInfo_ver15(DM_Team *dmTeam)
|
|||
for (int i = iNumPlayers; i > 0; i--) {
|
||||
pTeamPlayer = dmTeam->m_players.ObjectAt(i);
|
||||
|
||||
if (pTeamPlayer->IsSubclassOfBot()) {
|
||||
if (pTeamPlayer->edict->r.svFlags & SVF_BOT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1903,11 +1900,11 @@ void DM_Manager::BuildTeamInfo_ver15(DM_Team *dmTeam)
|
|||
iPing /= iNumPlayers;
|
||||
}
|
||||
|
||||
if (g_gametype->integer >= GT_TEAM_ROUNDS) {
|
||||
iKills = dmTeam->m_wins_in_a_row;
|
||||
iDeaths = dmTeam->m_teamwins;
|
||||
if (g_gametype->integer == GT_TEAM_ROUNDS || g_gametype->integer == GT_OBJECTIVE || g_gametype->integer == GT_TOW) {
|
||||
iKills = dmTeam->m_teamwins;
|
||||
iDeaths = dmTeam->m_wins_in_a_row;
|
||||
} else {
|
||||
iKills = dmTeam->m_iKills;
|
||||
iKills = dmTeam->m_teamwins;
|
||||
iDeaths = dmTeam->m_iDeaths;
|
||||
}
|
||||
|
||||
|
@ -1965,7 +1962,7 @@ void DM_Manager::BuildPlayerTeamInfo(DM_Team *dmTeam, int *iPlayerList, DM_Team
|
|||
pTeamPlayer->GetNumKills(),
|
||||
pTeamPlayer->GetNumDeaths(),
|
||||
G_TimeString(level.svsFloatTime - pTeamPlayer->edict->client->pers.enterTime),
|
||||
pTeamPlayer->IsSubclassOfBot() ? "bot" : va("%d", pTeamPlayer->client->ps.ping)
|
||||
(pTeamPlayer->edict->r.svFlags & SVF_BOT) ? "bot" : va("%d", pTeamPlayer->client->ps.ping)
|
||||
);
|
||||
} else {
|
||||
Com_sprintf(
|
||||
|
@ -1976,7 +1973,7 @@ void DM_Manager::BuildPlayerTeamInfo(DM_Team *dmTeam, int *iPlayerList, DM_Team
|
|||
pTeamPlayer->GetNumKills(),
|
||||
pTeamPlayer->GetNumDeaths(),
|
||||
G_TimeString(level.svsFloatTime - pTeamPlayer->edict->client->pers.enterTime),
|
||||
pTeamPlayer->IsSubclassOfBot() ? "bot" : va("%d", pTeamPlayer->client->ps.ping)
|
||||
(pTeamPlayer->edict->r.svFlags & SVF_BOT) ? "bot" : va("%d", pTeamPlayer->client->ps.ping)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1217,6 +1217,8 @@ Event EV_CanSee
|
|||
"returns 1 if the entities can see eachother, 0 if not",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
// Added in 2.0
|
||||
Event EV_CanSeeNoEnts
|
||||
(
|
||||
"canseenoents",
|
||||
|
@ -1226,6 +1228,7 @@ Event EV_CanSeeNoEnts
|
|||
"returns 1 if the entities can see eachother, 0 if not; ignores any entities between them",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
Event EV_Entity_InPVS
|
||||
(
|
||||
"inpvs",
|
||||
|
@ -1628,6 +1631,7 @@ CLASS_DECLARATION(SimpleEntity, Entity, NULL) {
|
|||
{&EV_IsTouching, &Entity::IsTouching },
|
||||
{&EV_IsInside, &Entity::IsInside },
|
||||
{&EV_CanSee, &Entity::CanSee },
|
||||
{&EV_CanSeeNoEnts, &Entity::CanSeeNoEnts }, // Added in 2.0
|
||||
{&EV_Entity_InPVS, &Entity::EventInPVS },
|
||||
{&EV_SetShaderData, &Entity::SetShaderData },
|
||||
{&EV_GetVelocity, &Entity::GetVelocity },
|
||||
|
@ -2669,7 +2673,7 @@ void Entity::DamageEvent(Event *ev)
|
|||
Vector momentum;
|
||||
Vector position, direction, normal;
|
||||
int knockback, damageflags, meansofdeath, location;
|
||||
Event *event;
|
||||
Event event;
|
||||
float m;
|
||||
EntityPtr This;
|
||||
|
||||
|
@ -2755,67 +2759,79 @@ void Entity::DamageEvent(Event *ev)
|
|||
|
||||
if (health <= 0) {
|
||||
if (attacker) {
|
||||
event = new Event(EV_GotKill);
|
||||
event->AddEntity(this);
|
||||
event->AddInteger(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(0);
|
||||
const EntityPtr attackerPtr = attacker;
|
||||
|
||||
attacker->ProcessEvent(event);
|
||||
event = Event(EV_GotKill, 5);
|
||||
event.AddEntity(this);
|
||||
event.AddInteger(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(0);
|
||||
|
||||
attackerPtr->ProcessEvent(event);
|
||||
if (attackerPtr) {
|
||||
attackerPtr->delegate_gotKill.Execute(event);
|
||||
}
|
||||
}
|
||||
|
||||
if (!This) {
|
||||
return;
|
||||
}
|
||||
|
||||
event = new Event(EV_Killed);
|
||||
event->AddEntity(attacker);
|
||||
event->AddFloat(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddVector(position);
|
||||
event->AddVector(direction);
|
||||
event->AddVector(normal);
|
||||
event->AddInteger(knockback);
|
||||
event->AddInteger(damageflags);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(location);
|
||||
event = Event(EV_Killed, 10);
|
||||
event.AddEntity(attacker);
|
||||
event.AddFloat(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddVector(position);
|
||||
event.AddVector(direction);
|
||||
event.AddVector(normal);
|
||||
event.AddInteger(knockback);
|
||||
event.AddInteger(damageflags);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(location);
|
||||
|
||||
ProcessEvent(event);
|
||||
|
||||
if (!This) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Notify scripts
|
||||
Unregister(STRING_DAMAGE);
|
||||
if (!This) {
|
||||
return;
|
||||
}
|
||||
|
||||
event = new Event(EV_Pain);
|
||||
event->AddEntity(attacker);
|
||||
event->AddFloat(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddVector(position);
|
||||
event->AddVector(direction);
|
||||
event->AddVector(normal);
|
||||
event->AddInteger(knockback);
|
||||
event->AddInteger(damageflags);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(location);
|
||||
delegate_killed.Execute(event);
|
||||
return;
|
||||
}
|
||||
|
||||
event = Event(EV_Pain, 10);
|
||||
event.AddEntity(attacker);
|
||||
event.AddFloat(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddVector(position);
|
||||
event.AddVector(direction);
|
||||
event.AddVector(normal);
|
||||
event.AddInteger(knockback);
|
||||
event.AddInteger(damageflags);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(location);
|
||||
|
||||
ProcessEvent(event);
|
||||
|
||||
if (!This) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Notify scripts
|
||||
Unregister(STRING_DAMAGE);
|
||||
if (!This) {
|
||||
return;
|
||||
}
|
||||
|
||||
delegate_damage.Execute(event);
|
||||
}
|
||||
|
||||
qboolean Entity::IsTouching(Entity *e1)
|
||||
|
||||
{
|
||||
if (e1->absmin.x > absmax.x) {
|
||||
return false;
|
||||
|
@ -3609,13 +3625,12 @@ void Entity::Sound(
|
|||
}
|
||||
|
||||
if (!name) {
|
||||
name = sound_name.c_str();
|
||||
name = gi.GlobalAlias_FindRandom(sound_name.c_str(), &ret);
|
||||
}
|
||||
|
||||
// Play the sound
|
||||
|
||||
if (name != NULL) {
|
||||
if (ret) {
|
||||
if (name && ret) {
|
||||
aliaschannel = ret->channel;
|
||||
aliasvolume = G_Random() * ret->volumeMod + ret->volume;
|
||||
aliaspitch = G_Random() * ret->pitchMod + ret->pitch;
|
||||
|
@ -3690,10 +3705,10 @@ void Entity::Sound(
|
|||
break;
|
||||
}
|
||||
|
||||
if ((!checkSubtitle || g_subtitle->integer) && ret->subtitle) {
|
||||
if (g_gametype->integer == GT_SINGLE_PLAYER && (ret->forcesubtitle || !checkSubtitle || g_subtitle->integer) && ret->subtitle) {
|
||||
Entity *p = G_GetEntity(0);
|
||||
|
||||
if (g_subtitle->integer == 2 || Square(max_dist) > DistanceSquared(org, p->edict->s.origin)) {
|
||||
if (p && (g_subtitle->integer == 2 || Square(max_dist) > DistanceSquared(org, p->edict->s.origin))) {
|
||||
cvar_t *curSubtitle = gi.Cvar_Get("curSubtitle", "0", 0);
|
||||
int curSub;
|
||||
|
||||
|
@ -3708,7 +3723,6 @@ void Entity::Sound(
|
|||
}
|
||||
|
||||
gi.Sound(&org, num, channel, name, volume, min_dist, pitch, max_dist, ret->streamed);
|
||||
}
|
||||
} else {
|
||||
gi.DPrintf(
|
||||
"ERROR: Entity::Sound: %s needs an alias in ubersound.scr or uberdialog.scr - Please fix.\n",
|
||||
|
|
|
@ -51,6 +51,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "script.h"
|
||||
#include "listener.h"
|
||||
#include "simpleentity.h"
|
||||
#include "../qcommon/delegate.h"
|
||||
|
||||
// modification flags
|
||||
#define FLAG_IGNORE 0
|
||||
|
@ -296,6 +297,12 @@ public:
|
|||
//====
|
||||
#endif
|
||||
|
||||
MulticastDelegate<void (const Event& ev)> delegate_damage;
|
||||
MulticastDelegate<void (const Event& ev)> delegate_killed;
|
||||
MulticastDelegate<void (const Event& ev)> delegate_gotKill;
|
||||
|
||||
public:
|
||||
|
||||
Entity();
|
||||
virtual ~Entity();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -28,7 +28,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
|
||||
static saved_bot_t *saved_bots = NULL;
|
||||
static unsigned int num_saved_bots = 0;
|
||||
static unsigned int current_bot_count = 0;
|
||||
static unsigned int botId = 0;
|
||||
|
||||
Container<str> alliedModelList;
|
||||
|
@ -158,16 +157,16 @@ Begin spawning a new bot entity
|
|||
*/
|
||||
void G_BotBegin(gentity_t *ent)
|
||||
{
|
||||
PlayerBot *player;
|
||||
Player *player;
|
||||
BotController *controller;
|
||||
|
||||
level.spawn_entnum = ent->s.number;
|
||||
player = new PlayerBot;
|
||||
player = new Player;
|
||||
|
||||
G_ClientBegin(ent, NULL);
|
||||
|
||||
controller = botManager.getControllerManager().createController(player);
|
||||
player->setController(controller);
|
||||
//player->setController(controller);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -272,7 +271,7 @@ void G_BotShift(int clientNum)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!ent->entity->IsSubclassOfBot()) {
|
||||
if (!botManager.getControllerManager().findController(ent->entity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -356,7 +355,7 @@ bool G_IsBot(gentity_t *ent)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!ent->entity || !ent->entity->IsSubclassOfBot()) {
|
||||
if (!ent->entity || !botManager.getControllerManager().findController(ent->entity)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -376,7 +375,7 @@ bool G_IsPlayer(gentity_t *ent)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!ent->entity || ent->entity->IsSubclassOfBot()) {
|
||||
if (!ent->entity || botManager.getControllerManager().findController(ent->entity)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -388,7 +387,7 @@ bool G_IsPlayer(gentity_t *ent)
|
|||
G_GetRandomAlliedPlayerModel
|
||||
============
|
||||
*/
|
||||
const char* G_GetRandomAlliedPlayerModel()
|
||||
const char *G_GetRandomAlliedPlayerModel()
|
||||
{
|
||||
if (!alliedModelList.NumObjects()) {
|
||||
return "";
|
||||
|
@ -403,7 +402,7 @@ const char* G_GetRandomAlliedPlayerModel()
|
|||
G_GetRandomGermanPlayerModel
|
||||
============
|
||||
*/
|
||||
const char* G_GetRandomGermanPlayerModel()
|
||||
const char *G_GetRandomGermanPlayerModel()
|
||||
{
|
||||
if (!germanModelList.NumObjects()) {
|
||||
return "";
|
||||
|
@ -438,7 +437,6 @@ void G_AddBot(const saved_bot_t *saved)
|
|||
|
||||
clientNum = e - g_entities;
|
||||
|
||||
current_bot_count++;
|
||||
// increase the unique ID
|
||||
botId++;
|
||||
|
||||
|
@ -504,7 +502,6 @@ void G_RemoveBot(gentity_t *ent)
|
|||
}
|
||||
|
||||
G_ClientDisconnect(ent);
|
||||
current_bot_count--;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -583,17 +580,18 @@ void G_SaveBots()
|
|||
saved_bots = NULL;
|
||||
}
|
||||
|
||||
if (!current_bot_count) {
|
||||
const BotControllerManager& manager = botManager.getControllerManager();
|
||||
unsigned int numSpawnedBots = manager.getControllers().NumObjects();
|
||||
|
||||
if (!numSpawnedBots) {
|
||||
return;
|
||||
}
|
||||
|
||||
saved_bots = new saved_bot_t[current_bot_count];
|
||||
saved_bots = new saved_bot_t[numSpawnedBots];
|
||||
num_saved_bots = 0;
|
||||
|
||||
const BotControllerManager& manager = botManager.getControllerManager();
|
||||
|
||||
count = manager.getControllers().NumObjects();
|
||||
assert(count <= current_bot_count);
|
||||
assert(count <= numSpawnedBots);
|
||||
|
||||
for (n = 1; n <= count; n++) {
|
||||
const BotController *controller = manager.getControllers().ObjectAt(n);
|
||||
|
@ -687,6 +685,18 @@ int G_CountClients()
|
|||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_RestartBots
|
||||
|
||||
Save bots
|
||||
============
|
||||
*/
|
||||
void G_RestartBots()
|
||||
{
|
||||
G_SaveBots();
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_ResetBots
|
||||
|
@ -696,11 +706,8 @@ Save and reset the bot count
|
|||
*/
|
||||
void G_ResetBots()
|
||||
{
|
||||
G_SaveBots();
|
||||
|
||||
botManager.Cleanup();
|
||||
|
||||
current_bot_count = 0;
|
||||
botId = 0;
|
||||
}
|
||||
|
||||
|
@ -754,6 +761,7 @@ void G_SpawnBots()
|
|||
{
|
||||
unsigned int numClients;
|
||||
unsigned int numBotsToSpawn;
|
||||
unsigned int numSpawnedBots;
|
||||
|
||||
//
|
||||
// Check the minimum bot count
|
||||
|
@ -776,12 +784,14 @@ void G_SpawnBots()
|
|||
numBotsToSpawn = Q_min(numBotsToSpawn, sv_maxbots->integer);
|
||||
}
|
||||
|
||||
numSpawnedBots = botManager.getControllerManager().getControllers().NumObjects();
|
||||
|
||||
//
|
||||
// Spawn bots
|
||||
//
|
||||
if (numBotsToSpawn > current_bot_count) {
|
||||
G_AddBots(numBotsToSpawn - current_bot_count);
|
||||
} else if (numBotsToSpawn < current_bot_count) {
|
||||
G_RemoveBots(current_bot_count - numBotsToSpawn);
|
||||
if (numBotsToSpawn > numSpawnedBots) {
|
||||
G_AddBots(numBotsToSpawn - numSpawnedBots);
|
||||
} else if (numBotsToSpawn < numSpawnedBots) {
|
||||
G_RemoveBots(numSpawnedBots - numBotsToSpawn);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -37,9 +37,10 @@ void G_RemoveBots(unsigned int num);
|
|||
bool G_IsBot(gentity_t *ent);
|
||||
bool G_IsPlayer(gentity_t *ent);
|
||||
void G_ResetBots();
|
||||
void G_RestartBots();
|
||||
void G_BotInit();
|
||||
void G_BotFrame();
|
||||
void G_BotPostInit();
|
||||
void G_SpawnBots();
|
||||
const char* G_GetRandomAlliedPlayerModel();
|
||||
const char* G_GetRandomGermanPlayerModel();
|
||||
const char *G_GetRandomAlliedPlayerModel();
|
||||
const char *G_GetRandomGermanPlayerModel();
|
|
@ -757,6 +757,7 @@ void G_ClientUserinfoChanged(gentity_t *ent, const char *u)
|
|||
char *s;
|
||||
gclient_t *client;
|
||||
int clientnum;
|
||||
char oldname[MAX_NAME_LENGTH];
|
||||
|
||||
if (!ent) {
|
||||
return;
|
||||
|
@ -772,10 +773,19 @@ void G_ClientUserinfoChanged(gentity_t *ent, const char *u)
|
|||
|
||||
clientnum = ent - g_entities;
|
||||
|
||||
Q_strncpyz(oldname, client->pers.netname, sizeof(oldname));
|
||||
if (gi.SanitizeName(s, client->pers.netname, sizeof(client->pers.netname))) {
|
||||
gi.Printf("WARNING: had to sanitize the name for client %i\n", clientnum);
|
||||
}
|
||||
|
||||
if (strcmp(oldname, client->pers.netname)) {
|
||||
//
|
||||
// Added in OPM
|
||||
// Print name changes
|
||||
//
|
||||
gi.Printf("Client %i changed name from '%s' to '%s'\n", clientnum, oldname, client->pers.netname);
|
||||
}
|
||||
|
||||
s = Info_ValueForKey(u, "dm_playermodel");
|
||||
|
||||
if (!s) {
|
||||
|
@ -827,6 +837,7 @@ void G_BotConnect(int clientNum, qboolean firstTime, const char *userinfo)
|
|||
|
||||
ent->client = game.clients + clientNum;
|
||||
ent->s.number = clientNum;
|
||||
ent->r.svFlags |= SVF_BOT;
|
||||
|
||||
client = ent->client;
|
||||
|
||||
|
@ -877,8 +888,6 @@ const char *G_ClientConnect(int clientNum, qboolean firstTime, qboolean differen
|
|||
gentity_t *ent;
|
||||
char userinfo[MAX_INFO_STRING];
|
||||
|
||||
gi.DPrintf("TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\n");
|
||||
|
||||
// Added in OPM
|
||||
G_BotShift(clientNum);
|
||||
|
||||
|
|
|
@ -227,9 +227,13 @@ void G_AllocGameData(void)
|
|||
|
||||
void G_DeAllocGameData(void)
|
||||
{
|
||||
// Initialize debug lines
|
||||
// Free up debug lines
|
||||
G_DeAllocDebugLines();
|
||||
|
||||
// Added in OPM
|
||||
// Free up debug strings
|
||||
G_DeAllocDebugStrings();
|
||||
|
||||
// free up the entities
|
||||
if (g_entities) {
|
||||
gi.Free(g_entities);
|
||||
|
@ -914,6 +918,9 @@ void G_Restart(void)
|
|||
|
||||
// Added in 2.0
|
||||
G_ResetSmokeSprites();
|
||||
|
||||
// Added in OPM
|
||||
G_RestartBots();
|
||||
}
|
||||
|
||||
void G_SetFrameNumber(int framenum)
|
||||
|
|
|
@ -365,6 +365,7 @@ void MM_StepSlideMove(void)
|
|||
vec3_t start_hit_origin;
|
||||
vec3_t first_hit_origin;
|
||||
trace_t nostep_groundTrace;
|
||||
qboolean nostep_validGroundTrace;
|
||||
|
||||
VectorCopy(mm->origin, start_o);
|
||||
VectorCopy(mm->velocity, start_v);
|
||||
|
@ -410,6 +411,9 @@ void MM_StepSlideMove(void)
|
|||
VectorCopy(mm->origin, nostep_o);
|
||||
VectorCopy(mm->velocity, nostep_v);
|
||||
memcpy(&nostep_groundTrace, &mml.groundTrace, sizeof(trace_t));
|
||||
// Fixed in OPM
|
||||
// Save the valid ground trace
|
||||
nostep_validGroundTrace = mml.validGroundTrace;
|
||||
|
||||
VectorCopy(up, mm->origin);
|
||||
VectorCopy(start_v, mm->velocity);
|
||||
|
@ -432,6 +436,10 @@ void MM_StepSlideMove(void)
|
|||
VectorCopy(nostep_o, mm->origin);
|
||||
VectorCopy(nostep_v, mm->velocity);
|
||||
memcpy(&mml.groundTrace, &nostep_groundTrace, sizeof(mml.groundTrace));
|
||||
// Fixed in OPM
|
||||
// Do not use the ground trace as it's invalid and would have an invalid entity number
|
||||
mml.validGroundTrace = nostep_validGroundTrace;
|
||||
|
||||
mm->hit_obstacle = first_hit_wall;
|
||||
VectorCopy(first_hit_origin, mm->hit_origin);
|
||||
VectorCopy(first_wall_normal, mm->obstacle_normal);
|
||||
|
|
|
@ -248,6 +248,8 @@ typedef struct gameImport_s {
|
|||
void (*cvar_set)(const char *varName, const char *varValue);
|
||||
cvar_t *(*cvar_set2)(const char *varName, const char *varValue, qboolean force);
|
||||
cvar_t *(*NextCvar)(cvar_t *var);
|
||||
void (*Cvar_CheckRange)(cvar_t* var, float min, float max, qboolean integral);
|
||||
|
||||
int (*Argc)();
|
||||
char *(*Argv)(int arg);
|
||||
char *(*Args)();
|
||||
|
@ -257,6 +259,7 @@ typedef struct gameImport_s {
|
|||
int (*FS_WriteFile)(const char *qpath, const void *buffer, int size);
|
||||
fileHandle_t (*FS_FOpenFileWrite)(const char *fileName);
|
||||
fileHandle_t (*FS_FOpenFileAppend)(const char *fileName);
|
||||
long (*FS_FOpenFile)(const char* qpath, fileHandle_t *file, qboolean uniqueFILE, qboolean quiet);
|
||||
const char *(*FS_PrepFileWrite)(const char *fileName);
|
||||
size_t (*FS_Write)(const void *buffer, size_t size, fileHandle_t fileHandle);
|
||||
size_t (*FS_Read)(void *buffer, size_t len, fileHandle_t fileHandle);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -686,10 +686,17 @@ void GameScript::ArchiveCodePos(Archiver& arc, unsigned char **codePos)
|
|||
|
||||
void GameScript::Close(void)
|
||||
{
|
||||
// Free up catch blocks
|
||||
for (int i = m_CatchBlocks.NumObjects(); i > 0; i--) {
|
||||
delete m_CatchBlocks.ObjectAt(i);
|
||||
}
|
||||
|
||||
// Added in OPM
|
||||
// Free up allocated state scripts
|
||||
for (int i = m_StateScripts.NumObjects(); i > 0; i--) {
|
||||
delete m_StateScripts.ObjectAt(i);
|
||||
}
|
||||
|
||||
m_CatchBlocks.FreeObjectList();
|
||||
|
||||
if (m_ProgToSource) {
|
||||
|
@ -814,7 +821,11 @@ StateScript *GameScript::CreateCatchStateScript(unsigned char *try_begin_code_po
|
|||
|
||||
StateScript *GameScript::CreateSwitchStateScript(void)
|
||||
{
|
||||
return new StateScript;
|
||||
StateScript *stateScript = new StateScript;
|
||||
|
||||
m_StateScripts.AddObject(stateScript);
|
||||
|
||||
return stateScript;
|
||||
}
|
||||
|
||||
StateScript *GameScript::GetCatchStateScript(unsigned char *in, unsigned char *& out)
|
||||
|
@ -866,7 +877,7 @@ ScriptThreadLabel::ScriptThreadLabel()
|
|||
m_Label = STRING_EMPTY;
|
||||
}
|
||||
|
||||
ScriptThread *ScriptThreadLabel::Create(Listener *listener)
|
||||
ScriptThread *ScriptThreadLabel::Create(Listener *listener) const
|
||||
{
|
||||
ScriptClass *scriptClass;
|
||||
ScriptThread *thread;
|
||||
|
@ -896,7 +907,7 @@ ScriptThread *ScriptThreadLabel::Create(Listener *listener)
|
|||
return thread;
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::Execute(Listener *listener)
|
||||
void ScriptThreadLabel::Execute(Listener *listener) const
|
||||
{
|
||||
if (!m_Script) {
|
||||
return;
|
||||
|
@ -909,12 +920,7 @@ void ScriptThreadLabel::Execute(Listener *listener)
|
|||
}
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::Execute(Listener *listener, Event& ev)
|
||||
{
|
||||
Execute(listener, &ev);
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::Execute(Listener *listener, Event *ev)
|
||||
void ScriptThreadLabel::Execute(Listener *listener, Event& ev) const
|
||||
{
|
||||
if (!m_Script) {
|
||||
return;
|
||||
|
@ -927,7 +933,13 @@ void ScriptThreadLabel::Execute(Listener *listener, Event *ev)
|
|||
}
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::Execute(Listener *listener, Event *ev) const
|
||||
{
|
||||
Execute(listener, *ev);
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::Execute(Listener *pSelf, const SafePtr<Listener>& listener, const SafePtr<Listener>& param)
|
||||
const
|
||||
{
|
||||
if (!m_Script) {
|
||||
return;
|
||||
|
@ -1214,7 +1226,7 @@ bool ScriptThreadLabel::TrySetScript(const_str label)
|
|||
return true;
|
||||
}
|
||||
|
||||
void ScriptThreadLabel::GetScriptValue(ScriptVariable *var)
|
||||
void ScriptThreadLabel::GetScriptValue(ScriptVariable *var) const
|
||||
{
|
||||
if (!m_Script) {
|
||||
var->Clear();
|
||||
|
@ -1228,12 +1240,12 @@ void ScriptThreadLabel::GetScriptValue(ScriptVariable *var)
|
|||
var->setConstArrayValue(var_array, 2);
|
||||
}
|
||||
|
||||
bool ScriptThreadLabel::IsSet(void)
|
||||
bool ScriptThreadLabel::IsSet(void) const
|
||||
{
|
||||
return m_Script != NULL;
|
||||
}
|
||||
|
||||
bool ScriptThreadLabel::IsFile(const_str filename)
|
||||
bool ScriptThreadLabel::IsFile(const_str filename) const
|
||||
{
|
||||
return m_Script && m_Script->ConstFilename() == filename && m_Label == STRING_EMPTY;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -119,6 +119,7 @@ class GameScript : public AbstractScript
|
|||
protected:
|
||||
// try/throw variable
|
||||
Container<CatchBlock *> m_CatchBlocks;
|
||||
Container<StateScript *> m_StateScripts;
|
||||
|
||||
public:
|
||||
// program variables
|
||||
|
@ -169,11 +170,11 @@ private:
|
|||
public:
|
||||
ScriptThreadLabel();
|
||||
|
||||
ScriptThread *Create(Listener *listener);
|
||||
void Execute(Listener *listener = NULL);
|
||||
void Execute(Listener *listener, Event& ev);
|
||||
void Execute(Listener *listener, Event *ev);
|
||||
void Execute(Listener *pSelf, const SafePtr<Listener>& listener, const SafePtr<Listener>& param);
|
||||
ScriptThread *Create(Listener *listener) const;
|
||||
void Execute(Listener *listener = NULL) const;
|
||||
void Execute(Listener *listener, Event& ev) const;
|
||||
void Execute(Listener *listener, Event *ev) const;
|
||||
void Execute(Listener *pSelf, const SafePtr<Listener>& listener, const SafePtr<Listener>& param) const;
|
||||
|
||||
void Clear();
|
||||
void Set(const char *label);
|
||||
|
@ -188,10 +189,10 @@ public:
|
|||
bool TrySetScript(const_str label);
|
||||
bool TrySetScript(const char *label);
|
||||
|
||||
bool IsSet(void);
|
||||
bool IsFile(const_str filename);
|
||||
bool IsSet(void) const;
|
||||
bool IsFile(const_str filename) const;
|
||||
|
||||
void GetScriptValue(ScriptVariable *var);
|
||||
void GetScriptValue(ScriptVariable *var) const;
|
||||
|
||||
void Archive(Archiver& arc);
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ void Health::PickupHealth(Event *ev)
|
|||
|
||||
gi.SendServerCommand(
|
||||
player->edict - g_entities,
|
||||
"print \"" HUD_MESSAGE_YELLOW "%s \"",
|
||||
"print \"" HUD_MESSAGE_YELLOW "%s\n\"",
|
||||
gi.LV_ConvertString(va("Recovered %d Health", amount))
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1511,7 +1511,7 @@ void Level::ServerSpawned(void)
|
|||
|
||||
void Level::SetMap(const char *themapname)
|
||||
{
|
||||
char *spawnpos;
|
||||
const char *spawnpos;
|
||||
int i;
|
||||
str text;
|
||||
|
||||
|
@ -1522,8 +1522,8 @@ void Level::SetMap(const char *themapname)
|
|||
// set a specific spawnpoint if the map was started with a $
|
||||
spawnpos = strchr((char *)themapname, '$');
|
||||
if (spawnpos) {
|
||||
mapname = (const char *)(spawnpos - themapname);
|
||||
spawnpoint = mapname;
|
||||
mapname = str(themapname, 0, spawnpos - themapname);
|
||||
spawnpoint = spawnpos + 1;
|
||||
} else {
|
||||
mapname = themapname;
|
||||
spawnpoint = "";
|
||||
|
@ -1588,6 +1588,30 @@ void Level::Precache(void)
|
|||
|
||||
LoadAllScripts("global", ".scr");
|
||||
InitVoteOptions();
|
||||
|
||||
// Added in OPM
|
||||
// Cache all player models in multi-player
|
||||
// This avoids using precache scripts
|
||||
if (g_gametype->integer != GT_SINGLE_PLAYER) {
|
||||
char **fileList;
|
||||
int numFiles;
|
||||
int i;
|
||||
|
||||
fileList = gi.FS_ListFiles("models/player", ".tik", qfalse, &numFiles);
|
||||
|
||||
for (i = 0; i < numFiles; i++) {
|
||||
const char *filename = fileList[i];
|
||||
const size_t filelen = strlen(filename);
|
||||
|
||||
if (!Q_stricmpn(filename, "allied_", 7) || !Q_stricmpn(filename, "american_", 9)
|
||||
|| !Q_stricmpn(filename, "german_", 7) || !Q_stricmpn(filename, "IT_", 3)
|
||||
|| !Q_stricmpn(filename, "SC_", 3)) {
|
||||
CacheResource(va("models/player/%s", filename));
|
||||
}
|
||||
}
|
||||
|
||||
gi.FS_FreeFileList(fileList);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1730,6 +1754,10 @@ void Level::FreeEdict(gentity_t *ed)
|
|||
{
|
||||
gclient_t *client;
|
||||
|
||||
// clear the model so it decreases the user count
|
||||
// and free memory if the model is not used anywhere
|
||||
gi.clearmodel(ed);
|
||||
|
||||
// unlink from world
|
||||
gi.unlinkentity(ed);
|
||||
|
||||
|
@ -1916,6 +1944,8 @@ void Level::CheckVote(void)
|
|||
level.m_voteNo++;
|
||||
}
|
||||
}
|
||||
|
||||
numVoters++;
|
||||
}
|
||||
|
||||
level.m_numVoters = numVoters;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -146,8 +146,7 @@ If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenade
|
|||
|
||||
Event EV_ExplodingWall_StopRotating
|
||||
(
|
||||
"stoprotating",
|
||||
EV_DEFAULT,
|
||||
"stoprotating", EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Stop rotating the wall.",
|
||||
|
@ -155,17 +154,16 @@ Event EV_ExplodingWall_StopRotating
|
|||
);
|
||||
Event EV_ExplodingWall_OnGround
|
||||
(
|
||||
"checkonground",
|
||||
EV_DEFAULT,
|
||||
"checkonground", EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Check if exploding wall is on ground.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_ExplodingWall_AngleSpeed
|
||||
(
|
||||
"anglespeed",
|
||||
EV_DEFAULT,
|
||||
"anglespeed", EV_DEFAULT,
|
||||
"f",
|
||||
"speed",
|
||||
"Set the angle speed.",
|
||||
|
@ -173,8 +171,7 @@ Event EV_ExplodingWall_AngleSpeed
|
|||
);
|
||||
Event EV_ExplodingWall_LandRadius
|
||||
(
|
||||
"land_radius",
|
||||
EV_DEFAULT,
|
||||
"land_radius", EV_DEFAULT,
|
||||
"f",
|
||||
"radius",
|
||||
"Set the land radius.",
|
||||
|
@ -182,8 +179,7 @@ Event EV_ExplodingWall_LandRadius
|
|||
);
|
||||
Event EV_ExplodingWall_LandAngles
|
||||
(
|
||||
"land_angles",
|
||||
EV_DEFAULT,
|
||||
"land_angles", EV_DEFAULT,
|
||||
"v",
|
||||
"angles",
|
||||
"Set the land angles.",
|
||||
|
@ -191,15 +187,13 @@ Event EV_ExplodingWall_LandAngles
|
|||
);
|
||||
Event EV_ExplodingWall_BaseVelocity
|
||||
(
|
||||
"base_velocity",
|
||||
EV_DEFAULT,
|
||||
"base_velocity", EV_DEFAULT,
|
||||
"v",
|
||||
"velocity",
|
||||
"Set the base velocity.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ExplodingWall_RandomVelocity
|
||||
(
|
||||
Event EV_ExplodingWall_RandomVelocity(
|
||||
"random_velocity",
|
||||
EV_DEFAULT,
|
||||
"v",
|
||||
|
@ -209,8 +203,7 @@ Event EV_ExplodingWall_RandomVelocity
|
|||
);
|
||||
Event EV_ExplodingWall_SetDmg
|
||||
(
|
||||
"dmg",
|
||||
EV_DEFAULT,
|
||||
"dmg", EV_DEFAULT,
|
||||
"i",
|
||||
"dmg",
|
||||
"Set the damage from the exploding wall.",
|
||||
|
@ -218,17 +211,16 @@ Event EV_ExplodingWall_SetDmg
|
|||
);
|
||||
Event EV_ExplodingWall_SetExplosions
|
||||
(
|
||||
"explosions",
|
||||
EV_DEFAULT,
|
||||
"explosions", EV_DEFAULT,
|
||||
"i",
|
||||
"explosions",
|
||||
"Set the number of explosions.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_ExplodingWall_Setup
|
||||
(
|
||||
"setup",
|
||||
EV_CODEONLY,
|
||||
"setup", EV_CODEONLY,
|
||||
NULL,
|
||||
NULL,
|
||||
"Initializes the exploding wall.",
|
||||
|
@ -253,49 +245,41 @@ CLASS_DECLARATION(Trigger, ExplodingWall, "func_explodingwall") {
|
|||
};
|
||||
|
||||
void ExplodingWall::AngleSpeed(Event *ev)
|
||||
|
||||
{
|
||||
angle_speed = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::LandRadius(Event *ev)
|
||||
|
||||
{
|
||||
land_radius = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::LandAngles(Event *ev)
|
||||
|
||||
{
|
||||
land_angles = ev->GetVector(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::BaseVelocity(Event *ev)
|
||||
|
||||
{
|
||||
base_velocity = ev->GetVector(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::RandomVelocity(Event *ev)
|
||||
|
||||
{
|
||||
random_velocity = ev->GetVector(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::SetDmg(Event *ev)
|
||||
|
||||
{
|
||||
dmg = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::SetExplosions(Event *ev)
|
||||
|
||||
{
|
||||
explosions = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
void ExplodingWall::Explode(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
Vector pos;
|
||||
|
@ -390,7 +374,6 @@ void ExplodingWall::Explode(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::DamageEvent(Event *ev)
|
||||
|
||||
{
|
||||
Event *event;
|
||||
Entity *inflictor;
|
||||
|
@ -427,7 +410,6 @@ void ExplodingWall::DamageEvent(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::GroundDamage(Event *ev)
|
||||
|
||||
{
|
||||
Entity *inflictor;
|
||||
Entity *attacker;
|
||||
|
@ -467,14 +449,12 @@ void ExplodingWall::GroundDamage(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::SetupSecondStage(void)
|
||||
|
||||
{
|
||||
health = max_health;
|
||||
takedamage = DAMAGE_YES;
|
||||
}
|
||||
|
||||
void ExplodingWall::StopRotating(Event *ev)
|
||||
|
||||
{
|
||||
avelocity = vec_zero;
|
||||
setAngles(land_angles);
|
||||
|
@ -484,7 +464,6 @@ void ExplodingWall::StopRotating(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::CheckOnGround(Event *ev)
|
||||
|
||||
{
|
||||
if ((velocity == vec_zero) && groundentity) {
|
||||
Vector delta;
|
||||
|
@ -532,7 +511,6 @@ void ExplodingWall::CheckOnGround(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::TouchFunc(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
|
||||
|
@ -568,7 +546,6 @@ void ExplodingWall::TouchFunc(Event *ev)
|
|||
}
|
||||
|
||||
void ExplodingWall::Setup(Event *ev)
|
||||
|
||||
{
|
||||
if (spawnflags & INVISIBLE) {
|
||||
if (Targeted()) {
|
||||
|
@ -650,6 +627,7 @@ Event EV_Teleporter_StopTeleport
|
|||
"entity",
|
||||
"Releases the entity at the end of the teleport.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_Teleporter_SetThread
|
||||
(
|
||||
|
@ -759,7 +737,6 @@ void Teleporter::StartTeleport(Event *ev)
|
|||
}
|
||||
|
||||
void Teleporter::Teleport(Event *ev)
|
||||
|
||||
{
|
||||
Entity *dest;
|
||||
int i;
|
||||
|
@ -873,7 +850,6 @@ void Teleporter::Teleport(Event *ev)
|
|||
}
|
||||
|
||||
void Teleporter::StopTeleport(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
|
||||
|
@ -974,6 +950,7 @@ Event EV_UseAnim_Reset
|
|||
NULL,
|
||||
"Reset's the Use Anim after it has no longer been touched.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseAnim_Thread
|
||||
(
|
||||
|
@ -983,15 +960,16 @@ Event EV_UseAnim_Thread
|
|||
"label",
|
||||
"Sets which thread to use when this UseAnim is triggered.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseAnim_Count
|
||||
(
|
||||
"count",
|
||||
EV_DEFAULT,
|
||||
"count", EV_DEFAULT,
|
||||
"i",
|
||||
"newCount",
|
||||
"Sets how many times the UseAnim can be triggered.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseAnim_TriggerTarget
|
||||
(
|
||||
|
@ -1019,6 +997,7 @@ Event EV_UseAnim_SetKey
|
|||
"keyName",
|
||||
"set the key needed to make this UseAnim function.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseAnim_SetState
|
||||
(
|
||||
|
@ -1029,8 +1008,7 @@ Event EV_UseAnim_SetState
|
|||
"set the state to use for the player.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_UseAnim_SetCamera
|
||||
(
|
||||
Event EV_UseAnim_SetCamera(
|
||||
"camera",
|
||||
EV_DEFAULT,
|
||||
"s",
|
||||
|
@ -1047,9 +1025,9 @@ Event EV_UseAnim_SetNumLoops
|
|||
"loopCount",
|
||||
"set the number of times to loop an animation per use.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseAnim_SetDelay
|
||||
(
|
||||
Event EV_UseAnim_SetDelay(
|
||||
"delay",
|
||||
EV_DEFAULT,
|
||||
"f",
|
||||
|
@ -1120,7 +1098,6 @@ UseAnim::UseAnim()
|
|||
}
|
||||
|
||||
void UseAnim::Touched(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
|
||||
|
@ -1142,7 +1119,6 @@ void UseAnim::Touched(Event *ev)
|
|||
}
|
||||
|
||||
bool UseAnim::canBeUsed(Entity *activator)
|
||||
|
||||
{
|
||||
Entity *dest;
|
||||
|
||||
|
@ -1210,7 +1186,6 @@ bool UseAnim::canBeUsed(Entity *activator)
|
|||
bool UseAnim::GetInformation(
|
||||
Entity *activator, Vector *org, Vector *angles, str *animation, int *loopcount, str *state, str *camera
|
||||
)
|
||||
|
||||
{
|
||||
Entity *dest;
|
||||
UseAnimDestination *uadest;
|
||||
|
@ -1282,7 +1257,6 @@ bool UseAnim::GetInformation(
|
|||
}
|
||||
|
||||
void UseAnim::TriggerTargets(Entity *activator)
|
||||
|
||||
{
|
||||
//
|
||||
// fire off our trigger target if appropriate
|
||||
|
@ -1312,7 +1286,6 @@ void UseAnim::TriggerTargets(Entity *activator)
|
|||
}
|
||||
|
||||
void UseAnim::Reset(Event *ev)
|
||||
|
||||
{
|
||||
//
|
||||
// find out if our triggertarget is of type door and only reset if the door is closed
|
||||
|
@ -1363,25 +1336,21 @@ void UseAnim::Reset(Event *ev)
|
|||
}
|
||||
|
||||
void UseAnim::SetThread(Event *ev)
|
||||
|
||||
{
|
||||
thread.SetThread(ev->GetValue(1));
|
||||
}
|
||||
|
||||
void UseAnim::SetDelay(Event *ev)
|
||||
|
||||
{
|
||||
delay = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void UseAnim::SetTriggerTarget(Event *ev)
|
||||
|
||||
{
|
||||
triggertarget = ev->GetString(1);
|
||||
}
|
||||
|
||||
void UseAnim::SetCount(Event *ev)
|
||||
|
||||
{
|
||||
count = ev->GetInteger(1);
|
||||
}
|
||||
|
@ -1518,6 +1487,7 @@ Event EV_UseObject_StopThread
|
|||
"label",
|
||||
"Sets which stop thread to use when this UseObject is finished.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_ResetThread
|
||||
(
|
||||
|
@ -1527,6 +1497,7 @@ Event EV_UseObject_ResetThread
|
|||
"label",
|
||||
"Sets which thread to call when resetting.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_Count
|
||||
(
|
||||
|
@ -1536,6 +1507,7 @@ Event EV_UseObject_Count
|
|||
"newCount",
|
||||
"Sets how many times the UseObject can be triggered.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_Cone
|
||||
(
|
||||
|
@ -1545,6 +1517,7 @@ Event EV_UseObject_Cone
|
|||
"newCone",
|
||||
"Sets the cone in angles of where the Useobject can be used.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_Offset
|
||||
(
|
||||
|
@ -1554,6 +1527,7 @@ Event EV_UseObject_Offset
|
|||
"newOffset",
|
||||
"Sets the offset to use for this UseObject.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_YawOffset
|
||||
(
|
||||
|
@ -1563,6 +1537,7 @@ Event EV_UseObject_YawOffset
|
|||
"newYawOffset",
|
||||
"Sets the yaw offset to use for this UseObject.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_State
|
||||
(
|
||||
|
@ -1581,6 +1556,7 @@ Event EV_UseObject_StateBackwards
|
|||
"newState",
|
||||
"Sets the backward state to use for this UseObject.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_TriggerTarget
|
||||
(
|
||||
|
@ -1626,6 +1602,7 @@ Event EV_UseObject_Resetting
|
|||
NULL,
|
||||
"Intermediate function for useobject reset.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_DamageTriggered
|
||||
(
|
||||
|
@ -1662,6 +1639,7 @@ Event EV_UseObject_UseMaterial
|
|||
"nameOfUseMaterial",
|
||||
"the name of the material that glows when active.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_UseObject_SetActiveState
|
||||
(
|
||||
|
@ -1671,6 +1649,7 @@ Event EV_UseObject_SetActiveState
|
|||
NULL,
|
||||
"event that sets up the proper skin for the useobject.",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
|
||||
#define MULTI_STATE (1 << 0)
|
||||
|
@ -1821,87 +1800,73 @@ void UseObject::SetActiveState(Event *ev)
|
|||
}
|
||||
|
||||
void UseObject::SetMoveThread(Event *ev)
|
||||
|
||||
{
|
||||
move_thread.SetThread(ev->GetValue(1));
|
||||
}
|
||||
|
||||
void UseObject::SetStopThread(Event *ev)
|
||||
|
||||
{
|
||||
stop_thread.SetThread(ev->GetValue(1));
|
||||
}
|
||||
|
||||
void UseObject::SetResetThread(Event *ev)
|
||||
|
||||
{
|
||||
reset_thread.SetThread(ev->GetValue(1));
|
||||
}
|
||||
|
||||
void UseObject::ActivateEvent(Event *ev)
|
||||
|
||||
{
|
||||
active = qtrue;
|
||||
PostEvent(EV_UseObject_SetActiveState, 0);
|
||||
}
|
||||
|
||||
void UseObject::DeactivateEvent(Event *ev)
|
||||
|
||||
{
|
||||
active = qfalse;
|
||||
PostEvent(EV_UseObject_SetActiveState, 0);
|
||||
}
|
||||
|
||||
void UseObject::SetTriggerTarget(Event *ev)
|
||||
|
||||
{
|
||||
triggertarget = ev->GetString(1);
|
||||
}
|
||||
|
||||
void UseObject::SetOffset(Event *ev)
|
||||
|
||||
{
|
||||
offset = ev->GetVector(1);
|
||||
}
|
||||
|
||||
void UseObject::SetYawOffset(Event *ev)
|
||||
|
||||
{
|
||||
yaw_offset = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void UseObject::SetCount(Event *ev)
|
||||
|
||||
{
|
||||
count = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
void UseObject::SetCone(Event *ev)
|
||||
|
||||
{
|
||||
cone = cos(DEG2RAD(ev->GetFloat(1)));
|
||||
}
|
||||
|
||||
void UseObject::SetState(Event *ev)
|
||||
|
||||
{
|
||||
state = ev->GetString(1);
|
||||
}
|
||||
|
||||
void UseObject::SetBackwardsState(Event *ev)
|
||||
|
||||
{
|
||||
state_backwards = ev->GetString(1);
|
||||
}
|
||||
|
||||
void UseObject::UseMaterialEvent(Event *ev)
|
||||
|
||||
{
|
||||
useMaterial = ev->GetString(1);
|
||||
}
|
||||
|
||||
void UseObject::SetResetTime(Event *ev)
|
||||
|
||||
{
|
||||
reset_time = ev->GetFloat(1);
|
||||
}
|
||||
|
@ -1912,7 +1877,6 @@ void UseObject::Reset(Event *ev)
|
|||
}
|
||||
|
||||
void UseObject::Resetting(Event *ev)
|
||||
|
||||
{
|
||||
SetActiveState(NULL);
|
||||
NewAnim("start");
|
||||
|
@ -1948,7 +1912,6 @@ void UseObject::Resetting(Event *ev)
|
|||
}
|
||||
|
||||
bool UseObject::canBeUsed(Vector org, Vector dir)
|
||||
|
||||
{
|
||||
float dot;
|
||||
Vector forward;
|
||||
|
@ -1992,7 +1955,6 @@ bool UseObject::canBeUsed(Vector org, Vector dir)
|
|||
}
|
||||
|
||||
void UseObject::DamageFunc(Event *ev)
|
||||
|
||||
{
|
||||
Event *e;
|
||||
Entity *attacker;
|
||||
|
@ -2029,14 +1991,12 @@ void UseObject::DamageFunc(Event *ev)
|
|||
}
|
||||
|
||||
void UseObject::DamageTriggered(Event *ev)
|
||||
|
||||
{
|
||||
// grab the attacker from our event
|
||||
Stop(ev->GetEntity(1));
|
||||
}
|
||||
|
||||
void UseObject::Setup(Entity *activator, Vector *org, Vector *ang, str *newstate)
|
||||
|
||||
{
|
||||
if ((spawnflags & MULTI_STATE) && objectState) {
|
||||
*newstate = state_backwards;
|
||||
|
@ -2060,7 +2020,6 @@ void UseObject::Setup(Entity *activator, Vector *org, Vector *ang, str *newstate
|
|||
}
|
||||
|
||||
void UseObject::Start(Event *ev)
|
||||
|
||||
{
|
||||
//
|
||||
// fire off the move_thread
|
||||
|
@ -2079,7 +2038,6 @@ void UseObject::Start(Event *ev)
|
|||
}
|
||||
|
||||
bool UseObject::Loop(void)
|
||||
|
||||
{
|
||||
if (!count) {
|
||||
return qfalse;
|
||||
|
@ -2089,7 +2047,6 @@ bool UseObject::Loop(void)
|
|||
}
|
||||
|
||||
void UseObject::Stop(Entity *activator)
|
||||
|
||||
{
|
||||
if ((spawnflags & MULTI_STATE) && objectState) {
|
||||
NewAnim("start");
|
||||
|
@ -2222,7 +2179,6 @@ MonkeyBars::MonkeyBars()
|
|||
}
|
||||
|
||||
void MonkeyBars::SetAngleEvent(Event *ev)
|
||||
|
||||
{
|
||||
dir = ev->GetFloat(1);
|
||||
}
|
||||
|
@ -2252,7 +2208,6 @@ HorizontalPipe::HorizontalPipe()
|
|||
}
|
||||
|
||||
void HorizontalPipe::SetAngleEvent(Event *ev)
|
||||
|
||||
{
|
||||
dir = ev->GetFloat(1);
|
||||
}
|
||||
|
@ -2263,14 +2218,15 @@ void HorizontalPipe::SetAngleEvent(Event *ev)
|
|||
|
||||
Event EV_TossObject_SetBounceSound
|
||||
(
|
||||
"bouncesound", EV_DEFAULT,
|
||||
"bouncesound",
|
||||
EV_DEFAULT,
|
||||
"s",
|
||||
"sound",
|
||||
"When bouncing, what sound to play on impact",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
Event EV_TossObject_SetBounceSoundChance
|
||||
(
|
||||
Event EV_TossObject_SetBounceSoundChance(
|
||||
"bouncesoundchance",
|
||||
EV_DEFAULT,
|
||||
"f[0,1]",
|
||||
|
@ -2309,31 +2265,26 @@ TossObject::TossObject(str model)
|
|||
}
|
||||
|
||||
void TossObject::SetBounceSound(str bounce)
|
||||
|
||||
{
|
||||
bouncesound = bounce;
|
||||
}
|
||||
|
||||
void TossObject::SetBounceSound(Event *ev)
|
||||
|
||||
{
|
||||
bouncesound = ev->GetString(1);
|
||||
}
|
||||
|
||||
void TossObject::SetBounceSoundChance(float chance)
|
||||
|
||||
{
|
||||
bouncesoundchance = chance;
|
||||
}
|
||||
|
||||
void TossObject::SetBounceSoundChance(Event *ev)
|
||||
|
||||
{
|
||||
bouncesoundchance = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void TossObject::Stop(Event *ev)
|
||||
|
||||
{
|
||||
setMoveType(MOVETYPE_NONE);
|
||||
setSolidType(SOLID_NOT);
|
||||
|
@ -2345,7 +2296,6 @@ void TossObject::Stop(Event *ev)
|
|||
}
|
||||
|
||||
void TossObject::Touch(Event *ev)
|
||||
|
||||
{
|
||||
Entity *ent;
|
||||
|
||||
|
@ -2368,7 +2318,6 @@ void TossObject::Touch(Event *ev)
|
|||
}
|
||||
|
||||
void TossObject::SetVelocity(float severity)
|
||||
|
||||
{
|
||||
setSolidType(SOLID_BBOX);
|
||||
velocity[0] = 100.0 * crandom();
|
||||
|
@ -2413,8 +2362,7 @@ Pushable object
|
|||
|
||||
Event EV_PushObject_Start
|
||||
(
|
||||
"start",
|
||||
EV_DEFAULT,
|
||||
"start", EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Sets up the pushobject.",
|
||||
|
@ -2423,8 +2371,7 @@ Event EV_PushObject_Start
|
|||
|
||||
Event EV_PushObject_SetDamage
|
||||
(
|
||||
"dmg",
|
||||
EV_DEFAULT,
|
||||
"dmg", EV_DEFAULT,
|
||||
"i",
|
||||
"damage",
|
||||
"Set the damage.",
|
||||
|
@ -2433,8 +2380,7 @@ Event EV_PushObject_SetDamage
|
|||
|
||||
Event EV_PushObject_SetPushSound
|
||||
(
|
||||
"pushsound",
|
||||
EV_DEFAULT,
|
||||
"pushsound", EV_DEFAULT,
|
||||
"s",
|
||||
"sound",
|
||||
"Set the pushing sound",
|
||||
|
@ -2464,13 +2410,11 @@ PushObject::PushObject()
|
|||
}
|
||||
|
||||
void PushObject::SetPushSound(Event *ev)
|
||||
|
||||
{
|
||||
pushsound = ev->GetString(1);
|
||||
}
|
||||
|
||||
void PushObject::Start(Event *ev)
|
||||
|
||||
{
|
||||
// make sure that this touches triggers
|
||||
flags |= FL_TOUCH_TRIGGERS;
|
||||
|
@ -2483,7 +2427,6 @@ void PushObject::Start(Event *ev)
|
|||
}
|
||||
|
||||
qboolean PushObject::canPush(Vector dir)
|
||||
|
||||
{
|
||||
trace_t trace;
|
||||
|
||||
|
@ -2494,7 +2437,6 @@ qboolean PushObject::canPush(Vector dir)
|
|||
}
|
||||
|
||||
qboolean PushObject::Push(Entity *pusher, Vector move)
|
||||
|
||||
{
|
||||
trace_t trace;
|
||||
|
||||
|
@ -2524,13 +2466,11 @@ qboolean PushObject::Push(Entity *pusher, Vector move)
|
|||
}
|
||||
|
||||
Entity *PushObject::getOwner(void)
|
||||
|
||||
{
|
||||
return (Entity *)owner;
|
||||
}
|
||||
|
||||
void PushObject::BlockFunc(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
|
||||
|
@ -2544,7 +2484,6 @@ void PushObject::BlockFunc(Event *ev)
|
|||
}
|
||||
|
||||
void PushObject::SetDamage(Event *ev)
|
||||
|
||||
{
|
||||
dmg = ev->GetInteger(1);
|
||||
}
|
||||
|
@ -2632,6 +2571,7 @@ Event EV_FallingRock_SetBounceSound
|
|||
"sound",
|
||||
"Set the sound to play when the rock bounces",
|
||||
EV_NORMAL
|
||||
|
||||
);
|
||||
|
||||
CLASS_DECLARATION(Entity, FallingRock, "func_fallingrock") {
|
||||
|
@ -2666,7 +2606,6 @@ FallingRock::FallingRock()
|
|||
}
|
||||
|
||||
Entity *FallingRock::SetNextBounceDir(void)
|
||||
|
||||
{
|
||||
Entity *ent;
|
||||
|
||||
|
@ -2686,7 +2625,6 @@ Entity *FallingRock::SetNextBounceDir(void)
|
|||
}
|
||||
|
||||
void FallingRock::NextBounce(void)
|
||||
|
||||
{
|
||||
float time;
|
||||
float distance;
|
||||
|
@ -2729,7 +2667,6 @@ void FallingRock::NextBounce(void)
|
|||
}
|
||||
|
||||
void FallingRock::Rotate(Event *ev)
|
||||
|
||||
{
|
||||
float mat[3][3];
|
||||
float ang;
|
||||
|
@ -2747,19 +2684,16 @@ void FallingRock::Rotate(Event *ev)
|
|||
}
|
||||
|
||||
void FallingRock::SetWait(Event *ev)
|
||||
|
||||
{
|
||||
wait = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void FallingRock::SetSpeed(Event *ev)
|
||||
|
||||
{
|
||||
speed = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void FallingRock::SetDmg(Event *ev)
|
||||
|
||||
{
|
||||
dmg = ev->GetInteger(1);
|
||||
}
|
||||
|
@ -2772,13 +2706,11 @@ void FallingRock::SetBounceSound(str sound)
|
|||
}
|
||||
|
||||
void FallingRock::SetBounceSound(Event *ev)
|
||||
|
||||
{
|
||||
SetBounceSound(ev->GetString(1));
|
||||
}
|
||||
|
||||
void FallingRock::Activate(Event *ev)
|
||||
|
||||
{
|
||||
if (active == 1) {
|
||||
return;
|
||||
|
@ -2802,7 +2734,6 @@ void FallingRock::Activate(Event *ev)
|
|||
}
|
||||
|
||||
void FallingRock::StartFalling(Event *ev)
|
||||
|
||||
{
|
||||
if (current) {
|
||||
return;
|
||||
|
@ -2827,7 +2758,6 @@ void FallingRock::StartFalling(Event *ev)
|
|||
}
|
||||
|
||||
void FallingRock::Touch(Event *ev)
|
||||
|
||||
{
|
||||
Entity *other;
|
||||
|
||||
|
@ -2858,7 +2788,6 @@ void FallingRock::Touch(Event *ev)
|
|||
}
|
||||
|
||||
void FallingRock::Bounce(Event *ev)
|
||||
|
||||
{
|
||||
Vector delta;
|
||||
|
||||
|
@ -3155,10 +3084,19 @@ void FuncLadder::EnsureForwardOffLadder(Entity *pUser)
|
|||
pUser->setOrigin(trace.endpos);
|
||||
}
|
||||
|
||||
const Vector& FuncLadder::getFacingAngles() const
|
||||
{
|
||||
return m_vFacingAngles;
|
||||
}
|
||||
|
||||
const Vector& FuncLadder::getFacingDir() const
|
||||
{
|
||||
return m_vFacingDir;
|
||||
}
|
||||
|
||||
Event EV_InfoLandmark_Name
|
||||
(
|
||||
"landmark_name",
|
||||
EV_DEFAULT,
|
||||
"landmark_name", EV_DEFAULT,
|
||||
"s",
|
||||
"name",
|
||||
"Set the name of this landmark",
|
||||
|
@ -3166,8 +3104,7 @@ Event EV_InfoLandmark_Name
|
|||
);
|
||||
Event EV_InfoLandmark_SetOrigin
|
||||
(
|
||||
"origin",
|
||||
EV_DEFAULT,
|
||||
"origin", EV_DEFAULT,
|
||||
"v",
|
||||
"origin",
|
||||
"Set the origin of the landmark.",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -565,6 +565,9 @@ public:
|
|||
void EnsureOverLadder(Entity *pUser);
|
||||
void EnsureForwardOffLadder(Entity *pUser);
|
||||
|
||||
const Vector& getFacingAngles() const;
|
||||
const Vector& getFacingDir() const;
|
||||
|
||||
void Archive(Archiver& arc) override;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -250,3 +250,24 @@ void Mover::LinearInterpolate(Vector tdest, Vector angdest, float time, Event& e
|
|||
|
||||
PostEvent(EV_MoveDone, time);
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
Stop
|
||||
===============
|
||||
*/
|
||||
void Mover::Stop()
|
||||
{
|
||||
if (endevent) {
|
||||
delete endevent;
|
||||
endevent = NULL;
|
||||
}
|
||||
|
||||
CancelEventsOfType(EV_MoveDone);
|
||||
|
||||
moveflags = 0;
|
||||
avelocity = vec_zero;
|
||||
velocity = vec_zero;
|
||||
accel = vec_zero;
|
||||
aaccel = vec_zero;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -48,6 +48,7 @@ public:
|
|||
void MoveDone(Event *ev);
|
||||
void MoveTo(Vector tdest, Vector angdest, float tspeed, Event& event);
|
||||
void LinearInterpolate(Vector tdest, Vector angdest, float time, Event& event);
|
||||
void Stop();
|
||||
void Archive(Archiver& arc) override;
|
||||
};
|
||||
|
||||
|
|
|
@ -1001,7 +1001,7 @@ PathNode *PathSearch::FindCornerNodeForWall(
|
|||
|
||||
PathNode *PathSearch::FindCornerNodeForExactPath(Entity *pSelf, Sentient *enemy, float fMaxPath)
|
||||
{
|
||||
PathNode *pPathNode[4096];
|
||||
PathNode *pPathNode[MAX_PATHNODES];
|
||||
PathNode *pParentNode;
|
||||
size_t i, iDepth;
|
||||
Vector vEnd;
|
||||
|
@ -1554,7 +1554,7 @@ void DrawNode(int iNodeCount)
|
|||
Vector aStart;
|
||||
Vector aEnd;
|
||||
PathNode *node;
|
||||
PathNode *nodelist[4096];
|
||||
PathNode *nodelist[MAX_PATHNODES];
|
||||
Vector end;
|
||||
Vector start;
|
||||
Vector p;
|
||||
|
@ -1562,8 +1562,8 @@ void DrawNode(int iNodeCount)
|
|||
|
||||
playerorigin = g_entities[0].client->ps.origin;
|
||||
|
||||
if (iNodeCount > 4096) {
|
||||
iNodeCount = 4096;
|
||||
if (iNodeCount > MAX_PATHNODES) {
|
||||
iNodeCount = MAX_PATHNODES;
|
||||
}
|
||||
|
||||
if (ai_showallnode->integer) {
|
||||
|
@ -2500,7 +2500,10 @@ PathNode *PathSearch::FindNearestSniperNode(Entity*pEnt, Vector& vPos, Entity *p
|
|||
|
||||
PathNode *PathSearch::GetSpawnNode(ClassDef *cls)
|
||||
{
|
||||
if (m_bNodesloaded) {
|
||||
if (m_bNodesloaded
|
||||
// Fixed in OPM
|
||||
&& m_LoadIndex < nodecount
|
||||
) {
|
||||
return pathnodes[m_LoadIndex++];
|
||||
} else {
|
||||
// Otherwise create a new node
|
||||
|
|
|
@ -252,7 +252,7 @@ private:
|
|||
static int m_LoadIndex;
|
||||
|
||||
public:
|
||||
static PathNode *pathnodes[4096];
|
||||
static PathNode *pathnodes[MAX_PATHNODES];
|
||||
static int nodecount;
|
||||
static float total_dist;
|
||||
static const char *last_error;
|
||||
|
|
|
@ -58,6 +58,13 @@ const Vector power_color(0.0, 1.0, 0.0);
|
|||
const Vector acolor(1.0, 1.0, 1.0);
|
||||
const Vector bcolor(1.0, 0.0, 0.0);
|
||||
|
||||
ScriptDelegate Player::scriptDelegate_connected("player_connected", "Sent once when the player connected");
|
||||
ScriptDelegate Player::scriptDelegate_disconnecting("player_disconnecting", "The player is disconnecting");
|
||||
ScriptDelegate Player::scriptDelegate_spawned("player_spawned", "The player has spawned");
|
||||
ScriptDelegate Player::scriptDelegate_damage("player_damaged", "The player got hit");
|
||||
ScriptDelegate Player::scriptDelegate_kill("player_killed", "The player got killed");
|
||||
ScriptDelegate Player::scriptDelegate_textMessage("player_textMessage", "The player just sent a text message");
|
||||
|
||||
//
|
||||
// mohaas 2.0 and above
|
||||
//
|
||||
|
@ -1904,7 +1911,6 @@ CLASS_DECLARATION(Sentient, Player, "player") {
|
|||
{&EV_Player_AdminRights, &Player::AdminRights },
|
||||
{&EV_Player_BindWeap, &Player::BindWeap },
|
||||
{&EV_Player_Dive, &Player::Dive },
|
||||
{&EV_Player_DMMessage, &Player::EventDMMessage },
|
||||
{&EV_Player_FreezeControls, &Player::FreezeControls },
|
||||
{&EV_Player_SetTeam, &Player::EventSetTeam },
|
||||
{&EV_Player_GetConnState, &Player::GetConnState },
|
||||
|
@ -2209,6 +2215,12 @@ Player::~Player()
|
|||
// when the player is deleted
|
||||
RemoveFromVehiclesAndTurrets();
|
||||
|
||||
// Added in OPM
|
||||
// Remove the player at destructor
|
||||
if (g_gametype->integer != GT_SINGLE_PLAYER && dmManager.PlayerCount()) {
|
||||
dmManager.RemovePlayer(this);
|
||||
}
|
||||
|
||||
entflags &= ~ECF_PLAYER;
|
||||
}
|
||||
|
||||
|
@ -2258,6 +2270,8 @@ void Player::Init(void)
|
|||
|
||||
Event *ev = new Event;
|
||||
ev->AddEntity(this);
|
||||
|
||||
scriptDelegate_connected.Trigger(this, *ev);
|
||||
scriptedEvents[SE_CONNECTED].Trigger(ev);
|
||||
}
|
||||
|
||||
|
@ -2663,6 +2677,11 @@ void Player::ChooseSpawnPoint(void)
|
|||
|
||||
void Player::EndLevel(Event *ev)
|
||||
{
|
||||
if (IsDead()) {
|
||||
ScriptError("cannot do player.endlevel if the player is dead");
|
||||
return;
|
||||
}
|
||||
|
||||
InitPowerups();
|
||||
if (health > max_health) {
|
||||
health = max_health;
|
||||
|
@ -3206,6 +3225,7 @@ void Player::Killed(Event *ev)
|
|||
event->AddInteger(ev->GetInteger(10));
|
||||
event->AddEntity(this);
|
||||
|
||||
scriptDelegate_kill.Trigger(this, *event);
|
||||
scriptedEvents[SE_KILL].Trigger(event);
|
||||
|
||||
Unregister(STRING_DEATH);
|
||||
|
@ -5420,6 +5440,13 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
StopPartAnimating(torso);
|
||||
animdone_Torso = true;
|
||||
} else if (torsoAnim != "") {
|
||||
if (torsoAnim == partAnim[torso]) {
|
||||
// Fixed in OPM
|
||||
// Stop the part if it's the same animation
|
||||
// so the new animation can play and make some action
|
||||
// like activate the new weapon.
|
||||
StopPartAnimating(torso);
|
||||
}
|
||||
SetPartAnim(torsoAnim.c_str(), torso);
|
||||
}
|
||||
} else {
|
||||
|
@ -5427,6 +5454,11 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
StopPartAnimating(torso);
|
||||
animdone_Torso = true;
|
||||
} else if (torsoAnim != "") {
|
||||
if (torsoAnim == partAnim[torso]) {
|
||||
// Fixed in OPM
|
||||
// See above
|
||||
StopPartAnimating(torso);
|
||||
}
|
||||
SetPartAnim(torsoAnim.c_str(), torso);
|
||||
}
|
||||
|
||||
|
@ -5510,7 +5542,6 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
laststate_Legs = NULL;
|
||||
}
|
||||
|
||||
animdone_Legs = false;
|
||||
if (currentState_Legs) {
|
||||
if (laststate_Legs) {
|
||||
// Process exit commands of the last state
|
||||
|
@ -5531,7 +5562,26 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
StopPartAnimating(legs);
|
||||
animdone_Legs = true;
|
||||
} else if (legsAnim != "") {
|
||||
float oldTime;
|
||||
|
||||
if (currentState_Legs == laststate_Legs) {
|
||||
//
|
||||
// Added in OPM
|
||||
// This allows different animations in the same state
|
||||
// to be continued at the same moment.
|
||||
// This is used to avoid "ghost walking" where the player
|
||||
// would switch weapons indefinitely to avoid footstep sounds
|
||||
//
|
||||
|
||||
oldTime = GetTime(m_iPartSlot[legs]);
|
||||
SetPartAnim(legsAnim, legs);
|
||||
|
||||
if (animtimes[m_iPartSlot[legs]] > 0) {
|
||||
SetTime(m_iPartSlot[legs], fmod(oldTime, animtimes[m_iPartSlot[legs]]));
|
||||
}
|
||||
} else {
|
||||
SetPartAnim(legsAnim, legs);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
currentState_Legs = laststate_Legs;
|
||||
|
@ -5542,21 +5592,25 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
}
|
||||
|
||||
if (g_showplayeranim->integer) {
|
||||
if (last_leg_anim_name != AnimName(legs)) {
|
||||
gi.DPrintf("Legs change from %s to %s\n", last_leg_anim_name.c_str(), AnimName(legs));
|
||||
last_leg_anim_name = AnimName(legs);
|
||||
str sNewAnim;
|
||||
|
||||
sNewAnim = AnimName(m_iPartSlot[legs]);
|
||||
if (last_leg_anim_name != sNewAnim) {
|
||||
gi.DPrintf("Legs anim change from %s to %s\n", last_leg_anim_name.c_str(), sNewAnim.c_str());
|
||||
last_leg_anim_name = sNewAnim;
|
||||
}
|
||||
|
||||
if (last_torso_anim_name != AnimName(torso)) {
|
||||
gi.DPrintf("Torso change from %s to %s\n", last_torso_anim_name.c_str(), AnimName(torso));
|
||||
last_torso_anim_name = AnimName(torso);
|
||||
sNewAnim = AnimName(m_iPartSlot[torso]);
|
||||
if (last_torso_anim_name != sNewAnim) {
|
||||
gi.DPrintf("Torso anim change from %s to %s\n", last_torso_anim_name.c_str(), sNewAnim.c_str());
|
||||
last_torso_anim_name = sNewAnim;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_showplayerstate->integer) {
|
||||
if (startstate_Legs != currentState_Legs) {
|
||||
gi.DPrintf(
|
||||
"Legs change from %s to %s\n",
|
||||
"Legs state change from %s to %s\n",
|
||||
startstate_Legs ? startstate_Legs->getName() : "NULL",
|
||||
currentState_Legs ? currentState_Legs->getName() : "NULL"
|
||||
);
|
||||
|
@ -5564,7 +5618,7 @@ void Player::EvaluateState(State *forceTorso, State *forceLegs)
|
|||
|
||||
if (startstate_Torso != currentState_Torso) {
|
||||
gi.DPrintf(
|
||||
"Torso change from %s to %s\n",
|
||||
"Torso state change from %s to %s\n",
|
||||
startstate_Torso ? startstate_Torso->getName() : "NULL",
|
||||
currentState_Torso ? currentState_Torso->getName() : "NULL"
|
||||
);
|
||||
|
@ -5631,7 +5685,7 @@ void Player::SelectPreviousWeapon(Event *ev)
|
|||
// Fixed in OPM
|
||||
// Fixes the bug that cause infinite loop when the last weapon has no ammo
|
||||
// and the only weapon is an inventory item
|
||||
for (weapon = initialWeapon = PreviousWeapon(activeWeapon); weapon && weapon != activeWeapon; ) {
|
||||
for (weapon = initialWeapon = PreviousWeapon(activeWeapon); weapon && weapon != activeWeapon;) {
|
||||
if (g_gametype->integer == GT_SINGLE_PLAYER || !weapon->IsSubclassOfInventoryItem()) {
|
||||
break;
|
||||
}
|
||||
|
@ -5680,7 +5734,7 @@ void Player::SelectNextWeapon(Event *ev)
|
|||
// Fixed in OPM
|
||||
// Fixes the bug that cause infinite loop when the last weapon has no ammo
|
||||
// and the only weapon is an inventory item
|
||||
for (weapon = initialWeapon = NextWeapon(activeWeapon); weapon && weapon != activeWeapon; ) {
|
||||
for (weapon = initialWeapon = NextWeapon(activeWeapon); weapon && weapon != activeWeapon;) {
|
||||
if (g_gametype->integer == GT_SINGLE_PLAYER || !weapon->IsSubclassOfInventoryItem()) {
|
||||
break;
|
||||
}
|
||||
|
@ -6462,19 +6516,16 @@ void Player::DamageFeedback(void)
|
|||
//
|
||||
damage_blood = 0;
|
||||
|
||||
if (g_target_game >= target_game_e::TG_MOHTA) {
|
||||
//
|
||||
// Added in 2.0
|
||||
// No more damage angles since MOHTA
|
||||
// Don't show damage when in god mode
|
||||
//
|
||||
|
||||
if (IsSubclassOfPlayer()) {
|
||||
if (flags & FL_GODMODE) {
|
||||
damage_count = 0;
|
||||
damage_blood = 0;
|
||||
damage_alpha = 0;
|
||||
damage_angles = vec_zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::GetPlayerView(Vector *pos, Vector *angle)
|
||||
|
@ -8791,25 +8842,25 @@ void Player::EnsurePlayerHasAllowedWeapons()
|
|||
|
||||
Q_strncpyz(client->pers.dm_primary, "smg", sizeof(client->pers.dm_primary));
|
||||
} else if (!Q_stricmp(client->pers.dm_primary, "smg")) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_RIFLE)) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_SMG)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Q_strncpyz(client->pers.dm_primary, "mg", sizeof(client->pers.dm_primary));
|
||||
} else if (!Q_stricmp(client->pers.dm_primary, "mg")) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_RIFLE)) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_MG)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Q_strncpyz(client->pers.dm_primary, "shotgun", sizeof(client->pers.dm_primary));
|
||||
} else if (!Q_stricmp(client->pers.dm_primary, "shotgun")) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_RIFLE)) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_SHOTGUN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Q_strncpyz(client->pers.dm_primary, "heavy", sizeof(client->pers.dm_primary));
|
||||
} else if (!Q_stricmp(client->pers.dm_primary, "heavy")) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_RIFLE)) {
|
||||
if (!(dmflags->integer & DF_WEAPON_NO_ROCKET)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -8878,7 +8929,12 @@ void Player::EquipWeapons()
|
|||
}
|
||||
break;
|
||||
case NA_GERMAN:
|
||||
if (g_target_game < target_game_e::TG_MOHTA || dmflags->integer & DF_OLD_SNIPER) {
|
||||
if (g_target_game < target_game_e::TG_MOHTA
|
||||
|| dmflags->integer & DF_OLD_SNIPER
|
||||
// Added in OPM
|
||||
// This was also a feature of Daven's fixes
|
||||
// Use KAR98 for panzer skins
|
||||
|| !Q_stricmpn(client->pers.dm_playergermanmodel, "german_panzer", 13)) {
|
||||
// Old snipers are forced older versions of the game
|
||||
giveItem("weapons/kar98sniper.tik");
|
||||
event->AddString("KAR98 - Sniper");
|
||||
|
@ -9655,19 +9711,21 @@ void Player::ArmorDamage(Event *ev)
|
|||
event->AddInteger(ev->GetInteger(10));
|
||||
event->AddEntity(this);
|
||||
|
||||
scriptDelegate_damage.Trigger(this, *event);
|
||||
scriptedEvents[SE_DAMAGE].Trigger(event);
|
||||
}
|
||||
|
||||
void Player::Disconnect(void)
|
||||
{
|
||||
Event *ev = new Event;
|
||||
|
||||
ev->AddListener(this);
|
||||
|
||||
scriptDelegate_disconnecting.Trigger(this, *ev);
|
||||
scriptedEvents[SE_DISCONNECTED].Trigger(ev);
|
||||
|
||||
if (g_gametype->integer != GT_SINGLE_PLAYER) {
|
||||
dmManager.RemovePlayer(this);
|
||||
}
|
||||
// if (g_gametype->integer != GT_SINGLE_PLAYER) {
|
||||
// dmManager.RemovePlayer(this);
|
||||
// }
|
||||
}
|
||||
|
||||
void Player::CallVote(Event *ev)
|
||||
|
@ -10326,7 +10384,7 @@ void Player::Stats(Event *ev)
|
|||
m_iObjectivesCompleted,
|
||||
iNumShotsFired,
|
||||
iNumHits,
|
||||
(iNumHits / iNumShotsFired * 100.f),
|
||||
((float)iNumHits / (float)iNumShotsFired * 100.f),
|
||||
szPreferredWeapon.c_str(),
|
||||
m_iNumHitsTaken,
|
||||
m_iNumObjectsDestroyed,
|
||||
|
@ -10380,9 +10438,12 @@ void Player::EventStuffText(Event *ev)
|
|||
Event *event = new Event(EV_Player_StuffText);
|
||||
event->AddValue(ev->GetValue(1));
|
||||
PostEvent(event, level.frametime, 0);
|
||||
} else {
|
||||
gi.SendServerCommand(edict - g_entities, "stufftext \"%s\"", ev->GetString(1).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
gi.SendServerCommand(edict - g_entities, "stufftext \"%s\"", ev->GetString(1).c_str());
|
||||
|
||||
delegate_stufftext.Execute(ev->GetString(1));
|
||||
}
|
||||
|
||||
void Player::EventSetVoiceType(Event *ev)
|
||||
|
@ -10569,6 +10630,17 @@ void Player::EventDMMessage(Event *ev)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(client->pers.netname, "console")) {
|
||||
// Added in OPM
|
||||
// Reserved name
|
||||
gi.Printf(
|
||||
"Client %d trying to send a message using a reserved name ('%s')\n",
|
||||
edict - g_entities,
|
||||
client->pers.netname
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
sToken = ev->GetString(2);
|
||||
|
||||
// Check for taunts
|
||||
|
@ -10743,11 +10815,18 @@ void Player::EventDMMessage(Event *ev)
|
|||
Q_strcat(szPrintString, sizeof(szPrintString), ": ");
|
||||
Q_strcat(szPrintString, sizeof(szPrintString), gi.LV_ConvertString(pTmpInstantMsg));
|
||||
} else {
|
||||
bool met_comment;
|
||||
bool met_comment = false;
|
||||
|
||||
Q_strcat(szPrintString, sizeof(szPrintString), ":");
|
||||
iStringLength = strlen(szPrintString);
|
||||
|
||||
// Added in OPM.
|
||||
// Checks for comments in string (as COM_Parse will parse them)
|
||||
// This was fixed in 2.0 but make the fix compatible with older versions
|
||||
if (g_protocol < protocol_e::PROTOCOL_MOHTA_MIN && strstr(client->pers.netname, "/*")) {
|
||||
met_comment = true;
|
||||
}
|
||||
|
||||
for (i = 2; i <= ev->NumArgs(); i++) {
|
||||
sToken = ev->GetString(i);
|
||||
// Added in 2.40
|
||||
|
@ -10759,13 +10838,7 @@ void Player::EventDMMessage(Event *ev)
|
|||
break;
|
||||
}
|
||||
|
||||
// Added in OPM.
|
||||
// Checks for comments in string (as COM_Parse will parse them)
|
||||
if (strstr(sToken, "/*")) {
|
||||
met_comment = true;
|
||||
}
|
||||
|
||||
if (strstr(sToken, "*/") && met_comment) {
|
||||
if (met_comment && strstr(sToken, "*/")) {
|
||||
// ignore messages containing comments
|
||||
return;
|
||||
}
|
||||
|
@ -10778,10 +10851,12 @@ void Player::EventDMMessage(Event *ev)
|
|||
Q_strcat(szPrintString, sizeof(szPrintString), "\n");
|
||||
|
||||
// ignore names containing comments
|
||||
if (g_protocol < protocol_e::PROTOCOL_MOHTA_MIN) {
|
||||
if (strstr(client->pers.netname, "//")
|
||||
|| (strstr(client->pers.netname, "/*") && strstr(client->pers.netname, "*/"))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
|
@ -10804,7 +10879,15 @@ void Player::EventDMMessage(Event *ev)
|
|||
//
|
||||
|
||||
// Added in OPM
|
||||
gi.Printf("%s (%zu) says to everyone: %s\n", client->pers.netname, edict - g_entities, sToken.c_str());
|
||||
if (bInstaMessage) {
|
||||
gi.Printf(
|
||||
"%s (%zu) says (voice) to everyone: %s\n", client->pers.netname, edict - g_entities, pTmpInstantMsg
|
||||
);
|
||||
} else {
|
||||
gi.Printf(
|
||||
"%s (%zu) says (text) to everyone: %s\n", client->pers.netname, edict - g_entities, sToken.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
if (!IsSpectator() || g_spectate_allow_full_chat->integer) {
|
||||
for (i = 0; i < game.maxclients; i++) {
|
||||
|
@ -10846,13 +10929,26 @@ void Player::EventDMMessage(Event *ev)
|
|||
gi.SendServerCommand(i, "%s", szPrintString);
|
||||
}
|
||||
}
|
||||
|
||||
if (!bInstaMessage) {
|
||||
Event event;
|
||||
// sent to everyone (not a team)
|
||||
event.AddString(sToken);
|
||||
event.AddInteger(false);
|
||||
|
||||
scriptDelegate_textMessage.Trigger(this, event);
|
||||
}
|
||||
} else if (iMode < 0) {
|
||||
//
|
||||
// team message
|
||||
//
|
||||
|
||||
// Added in OPM
|
||||
gi.Printf("%s (%zu) says to team: %s\n", client->pers.netname, edict - g_entities, sToken.c_str());
|
||||
if (bInstaMessage) {
|
||||
gi.Printf("%s (%zu) says (voice) to team: %s\n", client->pers.netname, edict - g_entities, pTmpInstantMsg);
|
||||
} else {
|
||||
gi.Printf("%s (%zu) says (text) to team: %s\n", client->pers.netname, edict - g_entities, sToken.c_str());
|
||||
}
|
||||
|
||||
if (IsSpectator()) {
|
||||
for (i = 0; i < game.maxclients; i++) {
|
||||
|
@ -10878,7 +10974,7 @@ void Player::EventDMMessage(Event *ev)
|
|||
continue;
|
||||
}
|
||||
|
||||
bSameTeam = static_cast<Player*>(ent->entity)->GetTeam() == GetTeam();
|
||||
bSameTeam = static_cast<Player *>(ent->entity)->GetTeam() == GetTeam();
|
||||
if (bSameTeam) {
|
||||
gi.SendServerCommand(i, "%s", szPrintString);
|
||||
}
|
||||
|
@ -10896,6 +10992,15 @@ void Player::EventDMMessage(Event *ev)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!bInstaMessage) {
|
||||
Event event;
|
||||
// sent to team
|
||||
event.AddString(sToken);
|
||||
event.AddInteger(true);
|
||||
|
||||
scriptDelegate_textMessage.Trigger(this, event);
|
||||
}
|
||||
} else if (iMode <= game.maxclients) {
|
||||
ent = &g_entities[iMode - 1];
|
||||
|
||||
|
@ -10914,7 +11019,23 @@ void Player::EventDMMessage(Event *ev)
|
|||
}
|
||||
|
||||
// Added in OPM
|
||||
gi.Printf("%s (%zu) says to client #%d: %s\n", client->pers.netname, edict - g_entities, iMode - 1, sToken.c_str());
|
||||
if (bInstaMessage) {
|
||||
gi.Printf(
|
||||
"%s (%zu) says (voice) to client #%d: %s\n",
|
||||
client->pers.netname,
|
||||
edict - g_entities,
|
||||
iMode - 1,
|
||||
pTmpInstantMsg
|
||||
);
|
||||
} else {
|
||||
gi.Printf(
|
||||
"%s (%zu) says (text) to client #%d: %s\n",
|
||||
client->pers.netname,
|
||||
edict - g_entities,
|
||||
iMode - 1,
|
||||
sToken.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
gi.SendServerCommand(iMode - 1, "%s", szPrintString);
|
||||
|
||||
|
@ -11235,9 +11356,13 @@ void Player::EventIPrint(Event *ev)
|
|||
}
|
||||
|
||||
if (iBold) {
|
||||
gi.SendServerCommand(edict - g_entities, "print \"" HUD_MESSAGE_WHITE "%s\n\"", gi.LV_ConvertString(sString.c_str()));
|
||||
gi.SendServerCommand(
|
||||
edict - g_entities, "print \"" HUD_MESSAGE_WHITE "%s\n\"", gi.LV_ConvertString(sString.c_str())
|
||||
);
|
||||
} else {
|
||||
gi.SendServerCommand(edict - g_entities, "print \"" HUD_MESSAGE_YELLOW "%s\n\"", gi.LV_ConvertString(sString.c_str()));
|
||||
gi.SendServerCommand(
|
||||
edict - g_entities, "print \"" HUD_MESSAGE_YELLOW "%s\n\"", gi.LV_ConvertString(sString.c_str())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11531,13 +11656,15 @@ qboolean Player::CheckCanSwitchTeam(teamtype_t team)
|
|||
}
|
||||
|
||||
if (pNewTeam->m_players.NumObjects() > numTeamPlayers) {
|
||||
gi.SendServerCommand(
|
||||
edict - g_entities,
|
||||
"print \"" HUD_MESSAGE_WHITE "%s\n\"",
|
||||
gi.LV_ConvertString(
|
||||
const char *message = gi.LV_ConvertString(
|
||||
"That team has enough players. Choose the team that has the lowest number of players."
|
||||
)
|
||||
);
|
||||
|
||||
gi.SendServerCommand(
|
||||
edict - g_entities, "print \"" HUD_MESSAGE_WHITE "%s\n\"", gi.LV_ConvertString(message)
|
||||
);
|
||||
|
||||
gi.centerprintf(edict, message);
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
@ -12017,8 +12144,9 @@ bool Player::IsReady(void) const
|
|||
void Player::Spawned(void)
|
||||
{
|
||||
Event *ev = new Event;
|
||||
|
||||
ev->AddEntity(this);
|
||||
|
||||
scriptDelegate_spawned.Trigger(this, *ev);
|
||||
scriptedEvents[SE_SPAWN].Trigger(ev);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#include "actor.h"
|
||||
#include "vehicle.h"
|
||||
#include "dm_manager.h"
|
||||
#include "scriptdelegate.h"
|
||||
|
||||
extern Event EV_Player_EndLevel;
|
||||
extern Event EV_Player_GiveCheat;
|
||||
|
@ -310,6 +311,16 @@ private:
|
|||
bool m_bShowingHint;
|
||||
#endif
|
||||
|
||||
public:
|
||||
MulticastDelegate<void(const str& text)> delegate_stufftext;
|
||||
|
||||
static ScriptDelegate scriptDelegate_connected;
|
||||
static ScriptDelegate scriptDelegate_disconnecting;
|
||||
static ScriptDelegate scriptDelegate_spawned;
|
||||
static ScriptDelegate scriptDelegate_damage;
|
||||
static ScriptDelegate scriptDelegate_kill;
|
||||
static ScriptDelegate scriptDelegate_textMessage;
|
||||
|
||||
public:
|
||||
int m_iNumObjectives;
|
||||
int m_iObjectivesCompleted;
|
||||
|
|
|
@ -61,13 +61,17 @@ void Player::SetPartAnim(const char *anim, bodypart_t slot)
|
|||
{
|
||||
int animnum;
|
||||
|
||||
if (getMoveType() == MOVETYPE_NOCLIP && slot) {
|
||||
if (getMoveType() == MOVETYPE_NOCLIP) {
|
||||
if (slot) {
|
||||
StopPartAnimating(torso);
|
||||
return;
|
||||
}
|
||||
|
||||
anim = "idle";
|
||||
}
|
||||
|
||||
animnum = gi.Anim_NumForName(edict->tiki, anim);
|
||||
if (animnum == CurrentAnim() && partAnim[slot] == anim) {
|
||||
if (animnum == CurrentAnim(m_iPartSlot[slot]) && partAnim[slot] == anim) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -89,21 +93,19 @@ void Player::SetPartAnim(const char *anim, bodypart_t slot)
|
|||
if (m_fPartBlends[slot] < 0.5f) {
|
||||
SetAnimDoneEvent(NULL, m_iPartSlot[slot]);
|
||||
|
||||
float m_fCrossTime = gi.Anim_CrossTime(edict->tiki, animnum);
|
||||
|
||||
partBlendMult[slot] = m_fCrossTime;
|
||||
if (m_fCrossTime <= 0.0f) {
|
||||
partOldAnim[slot] = "";
|
||||
m_fPartBlends[slot] = 0.0f;
|
||||
} else {
|
||||
partBlendMult[slot] = gi.Anim_CrossTime(edict->tiki, animnum);
|
||||
if (partBlendMult[slot] > 0.0f) {
|
||||
m_iPartSlot[slot] ^= 1;
|
||||
partBlendMult[slot] = 1.0f / m_fCrossTime;
|
||||
partBlendMult[slot] = 1.0f / partBlendMult[slot];
|
||||
partOldAnim[slot] = partAnim[slot];
|
||||
m_fPartBlends[slot] = 1.0f;
|
||||
} else {
|
||||
partOldAnim[slot] = "";
|
||||
m_fPartBlends[slot] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (slot) {
|
||||
if (slot != legs) {
|
||||
animdone_Torso = false;
|
||||
} else {
|
||||
animdone_Legs = false;
|
||||
|
@ -113,7 +115,7 @@ void Player::SetPartAnim(const char *anim, bodypart_t slot)
|
|||
|
||||
partAnim[slot] = anim;
|
||||
|
||||
if (slot) {
|
||||
if (slot != legs) {
|
||||
NewAnim(animnum, EV_Player_AnimLoop_Torso, m_iPartSlot[slot]);
|
||||
} else {
|
||||
NewAnim(animnum, EV_Player_AnimLoop_Legs, m_iPartSlot[legs]);
|
||||
|
@ -143,7 +145,7 @@ void Player::StopPartAnimating(bodypart_t part)
|
|||
|
||||
StopAnimating(m_iPartSlot[part]);
|
||||
|
||||
if (part) {
|
||||
if (part != legs) {
|
||||
animdone_Torso = false;
|
||||
} else {
|
||||
animdone_Legs = false;
|
||||
|
@ -158,7 +160,7 @@ void Player::PausePartAnim(bodypart_t part)
|
|||
|
||||
int Player::CurrentPartAnim(bodypart_t part) const
|
||||
{
|
||||
if (!*partAnim[part]) {
|
||||
if (partAnim[part] == "") {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -400,8 +402,8 @@ void Player::AdjustAnimBlends(void)
|
|||
fWeightTotal += m_fPartBlends[torso];
|
||||
}
|
||||
if (partAnim[torso] != "") {
|
||||
SetWeight(iPartSlot, m_fPartBlends[torso]);
|
||||
fWeightTotal += 1.0f - m_fPartBlends[torso];
|
||||
SetWeight(iPartSlot, 1.0 - m_fPartBlends[torso]);
|
||||
fWeightTotal += 1.0 - m_fPartBlends[torso];
|
||||
}
|
||||
|
||||
edict->s.actionWeight = fWeightTotal;
|
||||
|
|
|
@ -76,6 +76,15 @@ BotController::BotController()
|
|||
m_RunLabel.TrySetScript("global/bot_run.scr");
|
||||
}
|
||||
|
||||
BotController::~BotController()
|
||||
{
|
||||
if (controlledEnt) {
|
||||
controlledEnt->delegate_gotKill.Remove(delegateHandle_gotKill);
|
||||
controlledEnt->delegate_killed.Remove(delegateHandle_killed);
|
||||
controlledEnt->delegate_stufftext.Remove(delegateHandle_stufftext);
|
||||
}
|
||||
}
|
||||
|
||||
BotMovement& BotController::GetMovement()
|
||||
{
|
||||
return movement;
|
||||
|
@ -1051,7 +1060,7 @@ void BotController::Think()
|
|||
G_ClientThink(controlledEnt->edict, &ucmd, &eyeinfo);
|
||||
}
|
||||
|
||||
void BotController::Killed(Event *ev)
|
||||
void BotController::Killed(const Event& ev)
|
||||
{
|
||||
Entity *attacker;
|
||||
|
||||
|
@ -1068,7 +1077,7 @@ void BotController::Killed(Event *ev)
|
|||
m_botEyes.angles[0] = 0;
|
||||
m_botEyes.angles[1] = 0;
|
||||
|
||||
attacker = ev->GetEntity(1);
|
||||
attacker = ev.GetEntity(1);
|
||||
|
||||
if (attacker && rand() % 5 == 0) {
|
||||
// 1/5 chance to go back to the attacker position
|
||||
|
@ -1093,7 +1102,7 @@ void BotController::Killed(Event *ev)
|
|||
G_ClientUserinfoChanged(controlledEnt->edict, controlledEnt->client->pers.userinfo);
|
||||
}
|
||||
|
||||
void BotController::GotKill(Event *ev)
|
||||
void BotController::GotKill(const Event& ev)
|
||||
{
|
||||
ClearEnemy();
|
||||
m_iCuriousTime = 0;
|
||||
|
@ -1118,9 +1127,9 @@ void BotController::GotKill(Event *ev)
|
|||
}
|
||||
}
|
||||
|
||||
void BotController::EventStuffText(Event *ev)
|
||||
void BotController::EventStuffText(const str& text)
|
||||
{
|
||||
SendCommand(ev->GetString(1));
|
||||
SendCommand(text);
|
||||
}
|
||||
|
||||
void BotController::setControlledEntity(Player *player)
|
||||
|
@ -1128,6 +1137,10 @@ void BotController::setControlledEntity(Player *player)
|
|||
controlledEnt = player;
|
||||
movement.SetControlledEntity(player);
|
||||
rotation.SetControlledEntity(player);
|
||||
|
||||
delegateHandle_gotKill = player->delegate_gotKill.Add(std::bind(&BotController::GotKill, this, std::placeholders::_1));
|
||||
delegateHandle_killed = player->delegate_killed.Add(std::bind(&BotController::Killed, this, std::placeholders::_1));
|
||||
delegateHandle_stufftext = player->delegate_stufftext.Add(std::bind(&BotController::EventStuffText, this, std::placeholders::_1));
|
||||
}
|
||||
|
||||
Player *BotController::getControlledEntity() const
|
||||
|
@ -1198,47 +1211,21 @@ void BotControllerManager::ThinkControllers()
|
|||
{
|
||||
int i;
|
||||
|
||||
// Delete controllers that don't have associated player entity
|
||||
// This cannot happen unless some mods remove them
|
||||
for (i = controllers.NumObjects(); i > 0; i--) {
|
||||
BotController* controller = controllers.ObjectAt(i);
|
||||
if (!controller->getControlledEntity()) {
|
||||
gi.DPrintf("Bot %d has no associated player entity. This shouldn't happen unless the entity has been removed by a script. The controller will be removed, please fix.\n", i);
|
||||
|
||||
// Remove the controller, it will be recreated later to match `sv_numbots`
|
||||
delete controller;
|
||||
controllers.RemoveObjectAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i <= controllers.NumObjects(); i++) {
|
||||
BotController *controller = controllers.ObjectAt(i);
|
||||
controller->Think();
|
||||
}
|
||||
}
|
||||
|
||||
CLASS_DECLARATION(Player, PlayerBot, NULL) {
|
||||
{&EV_Killed, &PlayerBot::Killed },
|
||||
{&EV_GotKill, &PlayerBot::GotKill },
|
||||
{&EV_Player_StuffText, &PlayerBot::EventStuffText},
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
PlayerBot::PlayerBot()
|
||||
{
|
||||
entflags |= ECF_BOT;
|
||||
controller = NULL;
|
||||
}
|
||||
|
||||
void PlayerBot::setController(BotController *controlledBy)
|
||||
{
|
||||
controller = controlledBy;
|
||||
}
|
||||
|
||||
void PlayerBot::Spawned(void)
|
||||
{
|
||||
controller->Spawned();
|
||||
|
||||
Player::Spawned();
|
||||
}
|
||||
|
||||
void PlayerBot::Killed(Event *ev)
|
||||
{
|
||||
Player::Killed(ev);
|
||||
|
||||
controller->Killed(ev);
|
||||
}
|
||||
|
||||
void PlayerBot::GotKill(Event *ev)
|
||||
{
|
||||
Player::GotKill(ev);
|
||||
|
||||
controller->GotKill(ev);
|
||||
}
|
||||
|
|
|
@ -160,6 +160,11 @@ private:
|
|||
// Taunts
|
||||
int m_iNextTauntTime;
|
||||
|
||||
private:
|
||||
DelegateHandle delegateHandle_gotKill;
|
||||
DelegateHandle delegateHandle_killed;
|
||||
DelegateHandle delegateHandle_stufftext;
|
||||
|
||||
private:
|
||||
Weapon* FindWeaponWithAmmo(void);
|
||||
Weapon* FindMeleeWeapon(void);
|
||||
|
@ -209,6 +214,7 @@ public:
|
|||
CLASS_PROTOTYPE(BotController);
|
||||
|
||||
BotController();
|
||||
~BotController();
|
||||
|
||||
static void Init(void);
|
||||
|
||||
|
@ -229,9 +235,9 @@ public:
|
|||
|
||||
void Spawned(void);
|
||||
|
||||
void Killed(Event *ev);
|
||||
void GotKill(Event *ev);
|
||||
void EventStuffText(Event *ev);
|
||||
void Killed(const Event& ev);
|
||||
void GotKill(const Event& ev);
|
||||
void EventStuffText(const str& text);
|
||||
|
||||
BotMovement& GetMovement();
|
||||
|
||||
|
@ -282,22 +288,3 @@ private:
|
|||
};
|
||||
|
||||
extern BotManager botManager;
|
||||
|
||||
class PlayerBot : public Player
|
||||
{
|
||||
public:
|
||||
CLASS_PROTOTYPE(PlayerBot);
|
||||
|
||||
public:
|
||||
PlayerBot();
|
||||
|
||||
void setController(BotController *controlledBy);
|
||||
|
||||
void Spawned(void) override;
|
||||
|
||||
void Killed(Event *ev) override;
|
||||
void GotKill(Event *ev);
|
||||
|
||||
private:
|
||||
BotController *controller;
|
||||
};
|
||||
|
|
28
code/fgame/playerbot_strategy.cpp
Normal file
28
code/fgame/playerbot_strategy.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "g_local.h"
|
||||
#include "playerbot_strategy.h"
|
||||
|
||||
CLASS_DECLARATION(SimpleEntity, NavigationPoint, NULL) {
|
||||
{NULL, NULL}
|
||||
};
|
37
code/fgame/playerbot_strategy.h
Normal file
37
code/fgame/playerbot_strategy.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
// playerbot_strategy.h: Bot strategy & navigation points
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "simpleentity.h"
|
||||
|
||||
//
|
||||
// Abstract class for navigation points
|
||||
//
|
||||
class NavigationPoint : public SimpleEntity
|
||||
{
|
||||
public:
|
||||
CLASS_PROTOTYPE(NavigationPoint);
|
||||
|
||||
// TODO
|
||||
};
|
190
code/fgame/scriptdelegate.cpp
Normal file
190
code/fgame/scriptdelegate.cpp
Normal file
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "scriptdelegate.h"
|
||||
#include "../script/scriptexception.h"
|
||||
|
||||
ScriptDelegate *ScriptDelegate::root = NULL;
|
||||
|
||||
ScriptRegisteredDelegate_Script::ScriptRegisteredDelegate_Script(const ScriptThreadLabel& inLabel)
|
||||
: label(inLabel)
|
||||
{}
|
||||
|
||||
void ScriptRegisteredDelegate_Script::Execute(Listener *object, const Event& ev)
|
||||
{
|
||||
Event newev = ev;
|
||||
|
||||
label.Execute(object, newev);
|
||||
}
|
||||
|
||||
bool ScriptRegisteredDelegate_Script::operator==(const ScriptRegisteredDelegate_Script& registeredDelegate) const
|
||||
{
|
||||
return label == registeredDelegate.label;
|
||||
}
|
||||
|
||||
ScriptRegisteredDelegate_CodeMember::ScriptRegisteredDelegate_CodeMember(
|
||||
Class *inObject, DelegateClassResponse inResponse
|
||||
)
|
||||
: object(inObject)
|
||||
, response(inResponse)
|
||||
{}
|
||||
|
||||
void ScriptRegisteredDelegate_CodeMember::Execute(Listener *object, const Event& ev)
|
||||
{
|
||||
if (!object) {
|
||||
return;
|
||||
}
|
||||
|
||||
(object->*response)(object, ev);
|
||||
}
|
||||
|
||||
bool ScriptRegisteredDelegate_CodeMember::operator==(const ScriptRegisteredDelegate_CodeMember& registeredDelegate
|
||||
) const
|
||||
{
|
||||
return object == registeredDelegate.object && response == registeredDelegate.response;
|
||||
}
|
||||
|
||||
ScriptRegisteredDelegate_Code::ScriptRegisteredDelegate_Code(DelegateResponse inResponse)
|
||||
: response(inResponse)
|
||||
{}
|
||||
|
||||
void ScriptRegisteredDelegate_Code::Execute(Listener *object, const Event& ev)
|
||||
{
|
||||
(*response)(object, ev);
|
||||
}
|
||||
|
||||
bool ScriptRegisteredDelegate_Code::operator==(const ScriptRegisteredDelegate_Code& registeredDelegate) const
|
||||
{
|
||||
return response == registeredDelegate.response;
|
||||
}
|
||||
|
||||
ScriptDelegate::ScriptDelegate(const char *inName, const char *inDescription)
|
||||
: name(inName)
|
||||
, description(inDescription)
|
||||
{
|
||||
LL_SafeAddFirst(root, this, next, prev);
|
||||
}
|
||||
|
||||
ScriptDelegate::~ScriptDelegate()
|
||||
{
|
||||
LL_SafeRemoveRoot(root, this, next, prev);
|
||||
}
|
||||
|
||||
const ScriptDelegate *ScriptDelegate::GetRoot()
|
||||
{
|
||||
return root;
|
||||
}
|
||||
|
||||
const ScriptDelegate *ScriptDelegate::GetNext() const
|
||||
{
|
||||
return next;
|
||||
}
|
||||
|
||||
void ScriptDelegate::Register(const ScriptThreadLabel& label)
|
||||
{
|
||||
if (!label.IsSet()) {
|
||||
ScriptError("Invalid label specified for the script delegate");
|
||||
}
|
||||
|
||||
list_script.AddUniqueObject(label);
|
||||
}
|
||||
|
||||
void ScriptDelegate::Unregister(const ScriptThreadLabel& label)
|
||||
{
|
||||
list_script.RemoveObject(label);
|
||||
}
|
||||
|
||||
void ScriptDelegate::Register(ScriptRegisteredDelegate_Code::DelegateResponse response)
|
||||
{
|
||||
list_code.AddUniqueObject(ScriptRegisteredDelegate_Code(response));
|
||||
}
|
||||
|
||||
void ScriptDelegate::Unregister(ScriptRegisteredDelegate_Code::DelegateResponse response)
|
||||
{
|
||||
list_code.RemoveObject(response);
|
||||
}
|
||||
|
||||
void ScriptDelegate::Register(Class *object, ScriptRegisteredDelegate_CodeMember::DelegateClassResponse response)
|
||||
{
|
||||
list_codeMember.AddUniqueObject(ScriptRegisteredDelegate_CodeMember(object, response));
|
||||
}
|
||||
|
||||
void ScriptDelegate::Unregister(Class *object, ScriptRegisteredDelegate_CodeMember::DelegateClassResponse response)
|
||||
{
|
||||
list_codeMember.RemoveObject(ScriptRegisteredDelegate_CodeMember(object, response));
|
||||
}
|
||||
|
||||
void ScriptDelegate::Trigger(const Event& ev) const
|
||||
{
|
||||
Trigger(NULL, ev);
|
||||
}
|
||||
|
||||
void ScriptDelegate::Trigger(Listener *object, const Event& ev) const
|
||||
{
|
||||
size_t i;
|
||||
|
||||
{
|
||||
const Container<ScriptRegisteredDelegate_Script> tmpList = list_script;
|
||||
for (i = 1; i <= tmpList.NumObjects(); i++) {
|
||||
tmpList.ObjectAt(i).Execute(object, ev);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const Container<ScriptRegisteredDelegate_Code> tmpList = list_code;
|
||||
for (i = 1; i <= tmpList.NumObjects(); i++) {
|
||||
tmpList.ObjectAt(i).Execute(object, ev);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const Container<ScriptRegisteredDelegate_CodeMember> tmpList = list_codeMember;
|
||||
for (i = 1; i <= tmpList.NumObjects(); i++) {
|
||||
tmpList.ObjectAt(i).Execute(object, ev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ScriptDelegate *ScriptDelegate::GetScriptDelegate(const char *name)
|
||||
{
|
||||
for (ScriptDelegate *delegate = root; delegate; delegate = delegate->next) {
|
||||
if (!Q_stricmp(delegate->name, name)) {
|
||||
return delegate;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ScriptDelegate::Reset()
|
||||
{
|
||||
list_script.FreeObjectList();
|
||||
list_code.FreeObjectList();
|
||||
list_codeMember.FreeObjectList();
|
||||
}
|
||||
|
||||
void ScriptDelegate::ResetAllDelegates()
|
||||
{
|
||||
for (ScriptDelegate *delegate = root; delegate; delegate = delegate->next) {
|
||||
delegate->Reset();
|
||||
}
|
||||
}
|
196
code/fgame/scriptdelegate.h
Normal file
196
code/fgame/scriptdelegate.h
Normal file
|
@ -0,0 +1,196 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// scriptdelegate -- manages function delegate
|
||||
|
||||
#include "../qcommon/listener.h"
|
||||
#include "../qcommon/delegate.h"
|
||||
#include "gamescript.h"
|
||||
|
||||
class ScriptRegisteredDelegate
|
||||
{
|
||||
public:
|
||||
void Execute(Listener *object, const Event& ev);
|
||||
};
|
||||
|
||||
/**
|
||||
* Registered delegate, for scripts.
|
||||
* It contains a ScriptThreadLabel with the game script and the label to execute.
|
||||
*/
|
||||
class ScriptRegisteredDelegate_Script : public ScriptRegisteredDelegate
|
||||
{
|
||||
public:
|
||||
ScriptRegisteredDelegate_Script(const ScriptThreadLabel& inLabel);
|
||||
|
||||
void Execute(Listener *object, const Event& ev);
|
||||
|
||||
bool operator==(const ScriptRegisteredDelegate_Script& registeredDelegate) const;
|
||||
|
||||
private:
|
||||
ScriptThreadLabel label;
|
||||
};
|
||||
|
||||
/**
|
||||
* Registered delegate, for code use.
|
||||
* It contains the function to execute.
|
||||
*/
|
||||
class ScriptRegisteredDelegate_Code : public ScriptRegisteredDelegate
|
||||
{
|
||||
public:
|
||||
using DelegateResponse = void (*)(Listener *object, const Event& ev);
|
||||
|
||||
public:
|
||||
ScriptRegisteredDelegate_Code(DelegateResponse inResponse);
|
||||
|
||||
void Execute(Listener *object, const Event& ev);
|
||||
|
||||
bool operator==(const ScriptRegisteredDelegate_Code& registeredDelegate) const;
|
||||
|
||||
private:
|
||||
DelegateResponse response;
|
||||
};
|
||||
|
||||
/**
|
||||
* Registered delegate, for code use.
|
||||
* It contains the object along the member function to execute.
|
||||
* The function will not be executed if the object is NULL.
|
||||
*/
|
||||
class ScriptRegisteredDelegate_CodeMember : public ScriptRegisteredDelegate
|
||||
{
|
||||
public:
|
||||
using DelegateClassResponse = void (Class::*)(Listener *object, const Event& ev);
|
||||
|
||||
public:
|
||||
ScriptRegisteredDelegate_CodeMember(Class *inObject, DelegateClassResponse inResponse);
|
||||
|
||||
void Execute(Listener *object, const Event& ev);
|
||||
|
||||
bool operator==(const ScriptRegisteredDelegate_CodeMember& registeredDelegate) const;
|
||||
|
||||
private:
|
||||
SafePtr<Class> object;
|
||||
DelegateClassResponse response;
|
||||
};
|
||||
|
||||
/**
|
||||
* A script delegate provides a way for code to subscribe for events.
|
||||
* Scripts and code can register for a delegate and have their function executed
|
||||
* when the delegate gets triggered.
|
||||
*/
|
||||
class ScriptDelegate
|
||||
{
|
||||
public:
|
||||
ScriptDelegate(const char *name, const char *description);
|
||||
~ScriptDelegate();
|
||||
|
||||
static const ScriptDelegate *GetRoot();
|
||||
const ScriptDelegate *GetNext() const;
|
||||
|
||||
/**
|
||||
* Register a script label.
|
||||
*
|
||||
* @param label The label to be executed
|
||||
*/
|
||||
void Register(const ScriptThreadLabel& label);
|
||||
|
||||
/**
|
||||
* Unregistered the label.
|
||||
*
|
||||
* @param label The label to unregister
|
||||
*/
|
||||
void Unregister(const ScriptThreadLabel& label);
|
||||
|
||||
/**
|
||||
* Register a function.
|
||||
*
|
||||
* @param response The function to be executed
|
||||
*/
|
||||
void Register(ScriptRegisteredDelegate_Code::DelegateResponse response);
|
||||
|
||||
/**
|
||||
* Unregistered the function.
|
||||
*
|
||||
* @param response the function to unregister
|
||||
*/
|
||||
void Unregister(ScriptRegisteredDelegate_Code::DelegateResponse response);
|
||||
|
||||
/**
|
||||
* Register with an object and a member function.
|
||||
*
|
||||
* @param object The object to notify
|
||||
* @param response The member function of the object to be executed
|
||||
*/
|
||||
void Register(Class *object, ScriptRegisteredDelegate_CodeMember::DelegateClassResponse response);
|
||||
|
||||
/**
|
||||
* Unregistered the member function.
|
||||
*
|
||||
* @param object The object where the member function is
|
||||
* @param response The member function to unregister
|
||||
*/
|
||||
void Unregister(Class *object, ScriptRegisteredDelegate_CodeMember::DelegateClassResponse response);
|
||||
|
||||
/**
|
||||
* Executes all registered delegates with the specified event.
|
||||
*
|
||||
* @param ev Parameter list
|
||||
*/
|
||||
void Trigger(const Event& ev = Event()) const;
|
||||
|
||||
/**
|
||||
* Executes all registered delegates with the specified event.
|
||||
*
|
||||
* @param ev Parameter list
|
||||
*/
|
||||
void Trigger(Listener *object, const Event& ev = Event()) const;
|
||||
|
||||
/**
|
||||
* Reset the delegate, unregister callbacks.
|
||||
*/
|
||||
void Reset();
|
||||
|
||||
/**
|
||||
* Search and return the specified script delegate by name.
|
||||
*
|
||||
* @param name The name to search for
|
||||
*/
|
||||
static ScriptDelegate *GetScriptDelegate(const char *name);
|
||||
static void ResetAllDelegates();
|
||||
|
||||
// non-movable and non-copyable
|
||||
ScriptDelegate(ScriptDelegate&& other) = delete;
|
||||
ScriptDelegate& operator=(ScriptDelegate&& other) = delete;
|
||||
ScriptDelegate(const ScriptDelegate& other) = delete;
|
||||
ScriptDelegate& operator=(const ScriptDelegate& other) = delete;
|
||||
|
||||
private:
|
||||
// Linked-list
|
||||
ScriptDelegate *next;
|
||||
ScriptDelegate *prev;
|
||||
static ScriptDelegate *root;
|
||||
const char *name;
|
||||
const char *description;
|
||||
|
||||
Container<ScriptRegisteredDelegate_Script> list_script;
|
||||
Container<ScriptRegisteredDelegate_Code> list_code;
|
||||
Container<ScriptRegisteredDelegate_CodeMember> list_codeMember;
|
||||
};
|
|
@ -766,6 +766,8 @@ void ScriptMaster::Reset(qboolean samemap)
|
|||
StringDict.clear();
|
||||
InitConstStrings();
|
||||
}
|
||||
|
||||
ScriptDelegate::ResetAllDelegates();
|
||||
}
|
||||
|
||||
void ScriptMaster::ExecuteRunning(void)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -69,6 +69,22 @@ Event EV_ScriptSlave_WaitMove
|
|||
"Move the script slave and wait until finished.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptSlave_Stop
|
||||
(
|
||||
"stop",
|
||||
EV_DEFAULT,
|
||||
NULL,
|
||||
NULL,
|
||||
"Stop the script slave."
|
||||
);
|
||||
Event EV_ScriptSlave_ThreadMove
|
||||
(
|
||||
"threadmove",
|
||||
EV_DEFAULT,
|
||||
"s",
|
||||
"label",
|
||||
"Move the script slave and create thread which waits until finished."
|
||||
);
|
||||
Event EV_ScriptSlave_Angles
|
||||
(
|
||||
"angles",
|
||||
|
@ -222,6 +238,15 @@ Event EV_ScriptSlave_MoveRight
|
|||
"Move the position right.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptSlave_MoveOffset
|
||||
(
|
||||
"moveOffset",
|
||||
EV_DEFAULT,
|
||||
"v",
|
||||
"dist",
|
||||
"Move the position by the offset vector.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptSlave_RotateXDownTo
|
||||
(
|
||||
"rotateXdownto",
|
||||
|
@ -609,6 +634,8 @@ CLASS_DECLARATION(Mover, ScriptSlave, "script_object") {
|
|||
{&EV_Unbind, &ScriptSlave::EventUnbind },
|
||||
{&EV_ScriptSlave_DoMove, &ScriptSlave::DoMove },
|
||||
{&EV_ScriptSlave_WaitMove, &ScriptSlave::WaitMove },
|
||||
{&EV_ScriptSlave_Stop, &ScriptSlave::Stop },
|
||||
{&EV_ScriptSlave_ThreadMove, &ScriptSlave::ThreadMove },
|
||||
{&EV_ScriptSlave_Angles, &ScriptSlave::SetAnglesEvent },
|
||||
{&EV_SetAngle, &ScriptSlave::SetAngleEvent },
|
||||
{&EV_Model, &ScriptSlave::SetModelEvent },
|
||||
|
@ -628,6 +655,7 @@ CLASS_DECLARATION(Mover, ScriptSlave, "script_object") {
|
|||
{&EV_ScriptSlave_MoveBackward, &ScriptSlave::MoveBackward },
|
||||
{&EV_ScriptSlave_MoveLeft, &ScriptSlave::MoveLeft },
|
||||
{&EV_ScriptSlave_MoveRight, &ScriptSlave::MoveRight },
|
||||
{&EV_ScriptSlave_MoveOffset, &ScriptSlave::MoveOffset },
|
||||
{&EV_ScriptSlave_RotateXDownTo, &ScriptSlave::RotateXdownto },
|
||||
{&EV_ScriptSlave_RotateYDownTo, &ScriptSlave::RotateYdownto },
|
||||
{&EV_ScriptSlave_RotateZDownTo, &ScriptSlave::RotateZdownto },
|
||||
|
@ -818,6 +846,24 @@ void ScriptSlave::WaitMove(Event *ev)
|
|||
Register(0, Director.CurrentScriptThread());
|
||||
}
|
||||
|
||||
void ScriptSlave::Stop(Event *ev)
|
||||
{
|
||||
commandswaiting = false;
|
||||
if (RegisterSize(0)) {
|
||||
Event newev(EV_DelayThrow);
|
||||
newev.AddConstString(STRING_FAIL);
|
||||
BroadcastEvent(0, newev);
|
||||
}
|
||||
|
||||
Mover::Stop();
|
||||
}
|
||||
|
||||
void ScriptSlave::ThreadMove(Event *ev)
|
||||
{
|
||||
NewMove();
|
||||
Register(0, CreateThreadInternal(ev->GetValue(1)));
|
||||
}
|
||||
|
||||
void ScriptSlave::MoveEnd(Event *ev)
|
||||
{
|
||||
Unregister(0);
|
||||
|
@ -1082,6 +1128,12 @@ void ScriptSlave::MoveRight(Event *ev)
|
|||
NewPos -= v * ev->GetFloat(1);
|
||||
}
|
||||
|
||||
void ScriptSlave::MoveOffset(Event *ev)
|
||||
{
|
||||
CheckNewOrders();
|
||||
NewPos += ev->GetVector(1);
|
||||
}
|
||||
|
||||
// exact rotate commands
|
||||
|
||||
void ScriptSlave::RotateXdownto(Event *ev)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -93,6 +93,8 @@ protected:
|
|||
void EventUnbind(Event *ev);
|
||||
void DoMove(Event *ev);
|
||||
void WaitMove(Event *ev);
|
||||
void Stop(Event *ev);
|
||||
void ThreadMove(Event *ev);
|
||||
void MoveEnd(Event *ev);
|
||||
void SetAnglesEvent(Event *ev);
|
||||
void SetAngleEvent(Event *ev);
|
||||
|
@ -113,6 +115,7 @@ protected:
|
|||
void MoveBackward(Event *ev);
|
||||
void MoveLeft(Event *ev);
|
||||
void MoveRight(Event *ev);
|
||||
void MoveOffset(Event *ev);
|
||||
void RotateXdownto(Event *ev);
|
||||
void RotateYdownto(Event *ev);
|
||||
void RotateZdownto(Event *ev);
|
||||
|
|
|
@ -1676,6 +1676,24 @@ Event EV_ScriptThread_UnregisterEv
|
|||
"Unregisters script callback handler for specified event",
|
||||
EV_RETURN
|
||||
);
|
||||
Event EV_ScriptThread_Event_Subscribe
|
||||
(
|
||||
"event_subscribe",
|
||||
EV_DEFAULT,
|
||||
"ss",
|
||||
"eventname script",
|
||||
"Subscribe to the specified event. The specified script will be executed when the event gets triggered.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptThread_Event_Unsubscribe
|
||||
(
|
||||
"event_unsubscribe",
|
||||
EV_DEFAULT,
|
||||
"ss",
|
||||
"eventname script",
|
||||
"Unsubscribe the script from the specified event.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptThread_Conprintf
|
||||
(
|
||||
"conprintf",
|
||||
|
@ -1981,6 +1999,15 @@ Event EV_ScriptThread_Md5String
|
|||
"generates MD5 hash of given text",
|
||||
EV_RETURN
|
||||
);
|
||||
Event EV_ScriptThread_GetEntity
|
||||
(
|
||||
"getentity",
|
||||
EV_CHEAT,
|
||||
"i",
|
||||
"ent_num",
|
||||
"Gets the specified entity",
|
||||
EV_RETURN
|
||||
);
|
||||
Event EV_ScriptThread_SetTimer
|
||||
(
|
||||
"settimer",
|
||||
|
@ -2027,6 +2054,15 @@ Event EV_ScriptThread_VisionSetNaked
|
|||
"empty string, it will be set to the current map's name.",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_ScriptThread_IsBot
|
||||
(
|
||||
"isBot",
|
||||
EV_DEFAULT,
|
||||
"e",
|
||||
"entity",
|
||||
"Returns 1 if the client is a bot, 0 otherwise. Will return 0 if the entity is not a client.",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
CLASS_DECLARATION(Listener, ScriptThread, NULL) {
|
||||
{&EV_ScriptThread_GetCvar, &ScriptThread::Getcvar },
|
||||
|
@ -2180,9 +2216,12 @@ CLASS_DECLARATION(Listener, ScriptThread, NULL) {
|
|||
{&EV_ScriptThread_GetTanH, &ScriptThread::EventTanH },
|
||||
{&EV_ScriptThread_strncpy, &ScriptThread::StringBytesCopy },
|
||||
{&EV_ScriptThread_Md5String, &ScriptThread::Md5String },
|
||||
{&EV_ScriptThread_GetEntity, &ScriptThread::GetEntByEntnum },
|
||||
{&EV_ScriptThread_TypeOf, &ScriptThread::TypeOfVariable },
|
||||
{&EV_ScriptThread_RegisterEv, &ScriptThread::RegisterEvent },
|
||||
{&EV_ScriptThread_UnregisterEv, &ScriptThread::UnregisterEvent },
|
||||
{&EV_ScriptThread_Event_Subscribe, &ScriptThread::SubscribeEvent },
|
||||
{&EV_ScriptThread_Event_Unsubscribe, &ScriptThread::UnsubscribeEvent },
|
||||
{&EV_ScriptThread_CancelWaiting, &ScriptThread::CancelWaiting },
|
||||
{&EV_ScriptThread_GetTime, &ScriptThread::GetTime },
|
||||
{&EV_ScriptThread_GetTimeZone, &ScriptThread::GetTimeZone },
|
||||
|
@ -2253,6 +2292,7 @@ CLASS_DECLARATION(Listener, ScriptThread, NULL) {
|
|||
{&EV_ScriptThread_TraceDetails, &ScriptThread::TraceDetails },
|
||||
{&EV_ScriptThread_VisionGetNaked, &ScriptThread::VisionGetNaked },
|
||||
{&EV_ScriptThread_VisionSetNaked, &ScriptThread::VisionSetNaked },
|
||||
{&EV_ScriptThread_IsBot, &ScriptThread::IsPlayerBot },
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -3042,6 +3082,16 @@ Listener *ScriptThread::SpawnInternal(Event *ev)
|
|||
throw ScriptException("Usage: spawn entityname [keyname] [value]...");
|
||||
}
|
||||
|
||||
// Fixed in OPM
|
||||
// The original game uses a raw char* pointer to get the classname rather than storing it in an str.
|
||||
// This causes an issue when the argument is none (NIL), stringValue() will allocate and return a new str() with "NIL".
|
||||
// As the returned str() is not stored anywhere, it gets destroyed immediately, meaning that the char* pointer gets empty.
|
||||
// This has the effect of using empty class ID, which is "Explosion" in original game.
|
||||
//
|
||||
// For example, t2l2 has an incorrect "mg42_spawner_gunner" of class PathNode, but PathNode has no model variable.
|
||||
// global/spawner.scr::spawner_activate:
|
||||
// - In OG, it will successfully spawn an instance of "Explosion" due to the NIL argument behavior stated above.
|
||||
// - In OPM, it will not spawn anything and will cause script errors, it's the expected behavior by design
|
||||
classname = ev->GetString(1);
|
||||
|
||||
if (getClassForID(classname) || getClass(classname)) {
|
||||
|
@ -5725,7 +5775,7 @@ void ScriptThread::FileExists(Event *ev)
|
|||
|
||||
filename = ev->GetString(1);
|
||||
|
||||
if (filename == NULL) {
|
||||
if (!filename.length()) {
|
||||
throw ScriptException("Empty file name passed to fexists!\n");
|
||||
}
|
||||
|
||||
|
@ -5804,7 +5854,7 @@ void ScriptThread::FileSaveAll(Event *ev)
|
|||
|
||||
text = ev->GetString(2);
|
||||
|
||||
if (text == NULL) {
|
||||
if (text.length()) {
|
||||
ev->AddInteger(-1);
|
||||
throw ScriptException("Text to be written is NULL - fsaveall!\n");
|
||||
}
|
||||
|
@ -5828,7 +5878,7 @@ void ScriptThread::FileRemove(Event *ev)
|
|||
|
||||
filename = ev->GetString(1);
|
||||
|
||||
if (filename == NULL) {
|
||||
if (!filename.length()) {
|
||||
throw ScriptException("Empty file name passed to fremove!\n");
|
||||
}
|
||||
|
||||
|
@ -5938,7 +5988,7 @@ void ScriptThread::FileReadPak(Event *ev)
|
|||
|
||||
filename = ev->GetString(1);
|
||||
|
||||
if (filename == NULL) {
|
||||
if (!filename.length()) {
|
||||
throw ScriptException("Filename is NULL - freadpak!\n");
|
||||
}
|
||||
|
||||
|
@ -6013,7 +6063,7 @@ void ScriptThread::FileNewDirectory(Event *ev)
|
|||
|
||||
path = ev->GetString(1);
|
||||
|
||||
if (path == NULL) {
|
||||
if (!path.length()) {
|
||||
throw ScriptException("Path is NULL - fnewdir!\n");
|
||||
}
|
||||
|
||||
|
@ -6041,7 +6091,7 @@ void ScriptThread::FileRemoveDirectory(Event *ev)
|
|||
|
||||
path = ev->GetString(1);
|
||||
|
||||
if (path == NULL) {
|
||||
if (!path.length()) {
|
||||
throw ScriptException("Path is NULL - fremovedir!\n");
|
||||
}
|
||||
|
||||
|
@ -6835,6 +6885,8 @@ void ScriptThread::RegisterEvent(Event *ev)
|
|||
char eventname_full[64];
|
||||
scriptedEvType_t evType;
|
||||
|
||||
ScriptDeprecatedAltMethod("event_subscribe");
|
||||
|
||||
eventname = ev->GetString(1);
|
||||
|
||||
evType = EventNameToType(eventname, eventname_full);
|
||||
|
@ -6866,6 +6918,8 @@ void ScriptThread::UnregisterEvent(Event *ev)
|
|||
int numArgs = 0;
|
||||
scriptedEvType_t evType;
|
||||
|
||||
ScriptDeprecatedAltMethod("event_unsubscribe");
|
||||
|
||||
eventname = ev->GetString(1);
|
||||
|
||||
evType = EventNameToType(eventname, NULL);
|
||||
|
@ -6899,6 +6953,42 @@ void ScriptThread::UnregisterEvent(Event *ev)
|
|||
ev->AddInteger(0);
|
||||
}
|
||||
|
||||
void ScriptThread::SubscribeEvent(Event *ev)
|
||||
{
|
||||
str eventName;
|
||||
ScriptDelegate *delegate;
|
||||
ScriptThreadLabel label;
|
||||
|
||||
eventName = ev->GetString(1);
|
||||
|
||||
delegate = ScriptDelegate::GetScriptDelegate(eventName);
|
||||
if (!delegate) {
|
||||
throw ScriptException("Invalid event '%s'", eventName.c_str());
|
||||
}
|
||||
|
||||
label.SetThread(ev->GetValue(2));
|
||||
|
||||
delegate->Register(label);
|
||||
}
|
||||
|
||||
void ScriptThread::UnsubscribeEvent(Event *ev)
|
||||
{
|
||||
str eventName;
|
||||
ScriptDelegate *delegate;
|
||||
ScriptThreadLabel label;
|
||||
|
||||
eventName = ev->GetString(1);
|
||||
|
||||
delegate = ScriptDelegate::GetScriptDelegate(eventName);
|
||||
if (!delegate) {
|
||||
throw ScriptException("Invalid event '%s'", eventName.c_str());
|
||||
}
|
||||
|
||||
label.SetThread(ev->GetValue(2));
|
||||
|
||||
delegate->Unregister(label);
|
||||
}
|
||||
|
||||
void ScriptThread::TypeOfVariable(Event *ev)
|
||||
{
|
||||
int numArgs = 0;
|
||||
|
@ -7067,6 +7157,25 @@ void ScriptThread::TraceDetails(Event *ev)
|
|||
ev->AddValue(array);
|
||||
}
|
||||
|
||||
void ScriptThread::IsPlayerBot(Event *ev)
|
||||
{
|
||||
Entity *e = ev->GetEntity(1);
|
||||
|
||||
if (!e || !e->client) {
|
||||
// Invalid entity or not a client
|
||||
ev->AddInteger(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(e->edict->r.svFlags & SVF_BOT)) {
|
||||
ev->AddInteger(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// has SVF_BOT server flag
|
||||
ev->AddInteger(1);
|
||||
}
|
||||
|
||||
CLASS_DECLARATION(Listener, OSFile, NULL) {
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
|
|
@ -345,6 +345,10 @@ public:
|
|||
void UnregisterEvent(Event *ev);
|
||||
void VisionGetNaked(Event *ev);
|
||||
void VisionSetNaked(Event *ev);
|
||||
void IsPlayerBot(Event *ev);
|
||||
|
||||
void SubscribeEvent(Event *ev);
|
||||
void UnsubscribeEvent(Event *ev);
|
||||
};
|
||||
|
||||
class OSFile : public Listener
|
||||
|
|
|
@ -1222,13 +1222,13 @@ Item *Sentient::giveItem(str itemname, int amount)
|
|||
|
||||
AddItem(item);
|
||||
|
||||
if (item->isSubclassOf(Weapon)) {
|
||||
if (item->IsSubclassOfWeapon()) {
|
||||
// Post an event to give the ammo to the sentient
|
||||
Event *ev1;
|
||||
|
||||
ev1 = new Event(EV_Weapon_GiveStartingAmmo);
|
||||
ev1->AddEntity(this);
|
||||
item->PostEvent(ev1, 0);
|
||||
item->PostEvent(ev1, level.frametime);
|
||||
}
|
||||
|
||||
return item;
|
||||
|
@ -1368,7 +1368,7 @@ void Sentient::ArmorDamage(Event *ev)
|
|||
Vector position;
|
||||
Vector normal;
|
||||
Vector direction;
|
||||
Event *event;
|
||||
Event event;
|
||||
int dflags;
|
||||
int meansofdeath;
|
||||
int knockback;
|
||||
|
@ -1582,50 +1582,56 @@ void Sentient::ArmorDamage(Event *ev)
|
|||
health = 0;
|
||||
|
||||
if (attacker) {
|
||||
// Added in OPM
|
||||
event = new Event(EV_GotKill);
|
||||
event->AddEntity(this);
|
||||
event->AddInteger(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(0);
|
||||
const EntityPtr attackerPtr = attacker;
|
||||
|
||||
attacker->ProcessEvent(event);
|
||||
// Added in OPM
|
||||
event = Event(EV_GotKill);
|
||||
event.AddEntity(this);
|
||||
event.AddInteger(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(0);
|
||||
|
||||
attackerPtr->ProcessEvent(event);
|
||||
if (attackerPtr) {
|
||||
attackerPtr->delegate_gotKill.Execute(event);
|
||||
}
|
||||
}
|
||||
|
||||
event = new Event(EV_Killed, 10);
|
||||
event->AddEntity(attacker);
|
||||
event->AddFloat(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddVector(position);
|
||||
event->AddVector(direction);
|
||||
event->AddVector(normal);
|
||||
event->AddInteger(knockback);
|
||||
event->AddInteger(dflags);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(location);
|
||||
event = Event(EV_Killed, 10);
|
||||
event.AddEntity(attacker);
|
||||
event.AddFloat(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddVector(position);
|
||||
event.AddVector(direction);
|
||||
event.AddVector(normal);
|
||||
event.AddInteger(knockback);
|
||||
event.AddInteger(dflags);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(location);
|
||||
|
||||
ProcessEvent(event);
|
||||
delegate_killed.Execute(event);
|
||||
}
|
||||
|
||||
if (health > 0) {
|
||||
// Send pain event
|
||||
event = new Event(EV_Pain, 10);
|
||||
event->AddEntity(attacker);
|
||||
event->AddFloat(damage);
|
||||
event->AddEntity(inflictor);
|
||||
event->AddVector(position);
|
||||
event->AddVector(direction);
|
||||
event->AddVector(normal);
|
||||
event->AddInteger(knockback);
|
||||
event->AddInteger(dflags);
|
||||
event->AddInteger(meansofdeath);
|
||||
event->AddInteger(location);
|
||||
event = Event(EV_Pain, 10);
|
||||
event.AddEntity(attacker);
|
||||
event.AddFloat(damage);
|
||||
event.AddEntity(inflictor);
|
||||
event.AddVector(position);
|
||||
event.AddVector(direction);
|
||||
event.AddVector(normal);
|
||||
event.AddInteger(knockback);
|
||||
event.AddInteger(dflags);
|
||||
event.AddInteger(meansofdeath);
|
||||
event.AddInteger(location);
|
||||
|
||||
ProcessEvent(event);
|
||||
}
|
||||
|
||||
return;
|
||||
delegate_damage.Execute(*ev);
|
||||
}
|
||||
|
||||
qboolean Sentient::CanBlock(int meansofdeath, qboolean full_block)
|
||||
|
|
|
@ -356,11 +356,6 @@ int SimpleEntity::IsSubclassOfCrateObject(void) const
|
|||
return (entflags & ECF_CRATEOBJECT);
|
||||
}
|
||||
|
||||
int SimpleEntity::IsSubclassOfBot(void) const
|
||||
{
|
||||
return (entflags & ECF_BOT);
|
||||
}
|
||||
|
||||
void SimpleEntity::SetTargetName(str targetname)
|
||||
{
|
||||
if (!world) {
|
||||
|
|
|
@ -91,7 +91,6 @@ public:
|
|||
int IsSubclassOfVehiclePoint(void) const;
|
||||
int IsSubclassOfSplinePath(void) const;
|
||||
int IsSubclassOfCrateObject(void) const;
|
||||
int IsSubclassOfBot(void) const;
|
||||
|
||||
void GetOrigin(Event *ev);
|
||||
void SetOrigin(Event *ev);
|
||||
|
|
|
@ -48,7 +48,7 @@ public:
|
|||
|
||||
void Think() override;
|
||||
|
||||
void Archive(Archiver& arc);
|
||||
void Archive(Archiver& arc) override;
|
||||
|
||||
void setOwner(Sentient *other);
|
||||
Sentient *getOwner() const;
|
||||
|
|
|
@ -77,7 +77,7 @@ Event EV_Trigger_SetCount
|
|||
EV_DEFAULT,
|
||||
"i",
|
||||
"count",
|
||||
"Set the amount of times this trigger can be triggered",
|
||||
"Set the number of times this trigger can be triggered",
|
||||
EV_NORMAL
|
||||
);
|
||||
Event EV_Trigger_SetMessage
|
||||
|
@ -440,6 +440,12 @@ void Trigger::TriggerStuff(Event *ev)
|
|||
ScriptError("trigger '%s' triggered by self", TargetName().c_str());
|
||||
}
|
||||
|
||||
// Fixed in OPM
|
||||
// Safety check
|
||||
if (other == NULL) {
|
||||
ScriptError("trigger '%s' triggered by NULL entity", TargetName().c_str());
|
||||
}
|
||||
|
||||
// Always respond to activate messages from the world since they're probably from
|
||||
// the "trigger" command
|
||||
if (!respondTo(other) && (other != world || *ev != EV_Activate)
|
||||
|
@ -894,6 +900,12 @@ void TriggerAll::TriggerStuff(Event *ev)
|
|||
ScriptError("trigger '%s' triggered by self", TargetName().c_str());
|
||||
}
|
||||
|
||||
// Fixed in OPM
|
||||
// Safety check
|
||||
if (other == NULL) {
|
||||
ScriptError("trigger '%s' triggered by NULL entity", TargetName().c_str());
|
||||
}
|
||||
|
||||
// Always respond to activate messages from the world since they're probably from
|
||||
// the "trigger" command
|
||||
if (!respondTo(other) && !((other == world) && (*ev == EV_Activate))
|
||||
|
|
|
@ -3465,15 +3465,13 @@ void Vehicle::SetupPath(cVehicleSpline *pPath, SimpleEntity *se)
|
|||
|
||||
vLastOrigin = se->origin;
|
||||
|
||||
for (ent = se; ent != NULL; ent = ent->Next(), i++) {
|
||||
for (ent = se; ent; ent = ent->Next(), i++) {
|
||||
Vector vDelta = vLastOrigin - ent->origin;
|
||||
float vTmp[4];
|
||||
|
||||
if (vDelta.length() == 0 && i > 1) {
|
||||
Com_Printf("^~^~^Warning: Vehicle Driving with a Path that contains 2 equal points\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
} else {
|
||||
fCurLength += vDelta.length();
|
||||
|
||||
vTmp[0] = fCurLength;
|
||||
|
@ -3486,6 +3484,7 @@ void Vehicle::SetupPath(cVehicleSpline *pPath, SimpleEntity *se)
|
|||
}
|
||||
|
||||
vLastOrigin = ent->origin;
|
||||
}
|
||||
|
||||
if (ent == se && i > 1) {
|
||||
break;
|
||||
|
|
|
@ -370,6 +370,11 @@ void VehicleTurretGun::P_UserAim(usercmd_t *ucmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!m_pVehicleOwner) {
|
||||
// Added in OPM
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_pVehicleOwner->IsSubclassOfVehicle()) {
|
||||
return;
|
||||
}
|
||||
|
@ -1152,6 +1157,14 @@ void VehicleTurretGun::ApplyFireKickback(const Vector& org, float kickback)
|
|||
return;
|
||||
}
|
||||
|
||||
if (g_target_game <= target_game_e::TG_MOH) {
|
||||
// Don't apply fire kickback in older version
|
||||
// this could cause issues as models weren't made for this feature
|
||||
return;
|
||||
}
|
||||
|
||||
// Added in 2.0
|
||||
|
||||
pVehicle = static_cast<Vehicle *>(m_pVehicleOwner.Pointer());
|
||||
pVehicle->m_fForwardForce += org.x * kickback;
|
||||
pVehicle->m_fLeftForce += org.y * kickback;
|
||||
|
|
|
@ -1855,7 +1855,7 @@ void Weapon::Shoot(Event *ev)
|
|||
|
||||
switch (firetype[mode]) {
|
||||
case FT_PROJECTILE:
|
||||
ProjectileAttack(pos, forward, owner, projectileModel[mode], charge_fraction);
|
||||
ProjectileAttack(pos, forward, owner, projectileModel[mode], charge_fraction, 0, this);
|
||||
break;
|
||||
case FT_LANDMINE:
|
||||
PlaceLandmine(pos, owner, projectileModel[mode], this);
|
||||
|
|
|
@ -633,6 +633,7 @@ Projectile::Projectile()
|
|||
takedamage = DAMAGE_NO;
|
||||
owner = ENTITYNUM_NONE;
|
||||
edict->r.ownerNum = ENTITYNUM_NONE;
|
||||
|
||||
// Added in 2.0
|
||||
m_bArcToTarget = false;
|
||||
// Added in 2.30
|
||||
|
@ -939,6 +940,13 @@ void Projectile::SetSmashThroughGlass(Event *ev)
|
|||
}
|
||||
|
||||
void Projectile::SmashThroughGlassThink(Event *ev)
|
||||
{
|
||||
SmashThroughGlassThink();
|
||||
|
||||
PostEvent(EV_Projectile_SmashThroughGlass, level.frametime);
|
||||
}
|
||||
|
||||
void Projectile::SmashThroughGlassThink()
|
||||
{
|
||||
if (velocity.length() > m_iSmashThroughGlass) {
|
||||
Vector vEnd;
|
||||
|
@ -960,8 +968,6 @@ void Projectile::SmashThroughGlassThink(Event *ev)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
PostEvent(EV_Projectile_SmashThroughGlass, level.frametime);
|
||||
}
|
||||
|
||||
void Projectile::BeamCommand(Event *ev)
|
||||
|
@ -1253,17 +1259,16 @@ void Projectile::Touch(Event *ev)
|
|||
other->Damage(
|
||||
this, owner, damage, origin, velocity, level.impact_trace.plane.normal, knockback, 0, meansofdeath
|
||||
);
|
||||
}
|
||||
|
||||
if (g_gametype->integer == GT_SINGLE_PLAYER && weap) {
|
||||
if (other->IsSubclassOfPlayer() || other->IsSubclassOfVehicle() || other->IsSubclassOfVehicleTank()
|
||||
if (other->IsSubclassOfSentient() || other->IsSubclassOfVehicle() || other->IsSubclassOfVehicleTank()
|
||||
|| other->isSubclassOf(VehicleCollisionEntity)) {
|
||||
weap->m_iNumHits++;
|
||||
weap->m_iNumTorsoShots++;
|
||||
|
||||
if (weap->IsSubclassOfVehicleTurretGun()) {
|
||||
VehicleTurretGun* t = (VehicleTurretGun*)weap.Pointer();
|
||||
Player* p = (Player*)t->GetRemoteOwner().Pointer();
|
||||
VehicleTurretGun *t = (VehicleTurretGun *)weap.Pointer();
|
||||
Player *p = (Player *)t->GetRemoteOwner().Pointer();
|
||||
|
||||
if (p && p->IsSubclassOfPlayer()) {
|
||||
p->m_iNumHits++;
|
||||
|
@ -1272,6 +1277,7 @@ void Projectile::Touch(Event *ev)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_bExplodeOnTouch) {
|
||||
return;
|
||||
|
@ -1291,7 +1297,7 @@ void Projectile::Touch(Event *ev)
|
|||
PostEvent(EV_Remove, 0);
|
||||
|
||||
// Call the explosion event
|
||||
Event* explEv;
|
||||
Event *explEv;
|
||||
explEv = new Event(EV_Projectile_Explode);
|
||||
explEv->AddEntity(other);
|
||||
ProcessEvent(explEv);
|
||||
|
@ -1301,21 +1307,21 @@ void Projectile::Touch(Event *ev)
|
|||
// Check for projectile vulnerability
|
||||
//
|
||||
|
||||
Vehicle* pVehicle = NULL;
|
||||
Vehicle *pVehicle = NULL;
|
||||
|
||||
if (other->IsSubclassOfVehicle()) {
|
||||
pVehicle = static_cast<Vehicle*>(other);
|
||||
pVehicle = static_cast<Vehicle *>(other);
|
||||
} else if (other->IsSubclassOfVehicleTurretGun()) {
|
||||
VehicleTurretGun* pTurret = static_cast<VehicleTurretGun*>(other);
|
||||
Entity* pEnt = pTurret->GetVehicle();
|
||||
VehicleTurretGun *pTurret = static_cast<VehicleTurretGun *>(other);
|
||||
Entity *pEnt = pTurret->GetVehicle();
|
||||
if (pEnt && pEnt->IsSubclassOfVehicle()) {
|
||||
pVehicle = static_cast<Vehicle*>(pEnt);
|
||||
pVehicle = static_cast<Vehicle *>(pEnt);
|
||||
}
|
||||
} else if (other->isSubclassOf(VehicleCollisionEntity)) {
|
||||
VehicleCollisionEntity* pCollision = static_cast<VehicleCollisionEntity*>(other);
|
||||
VehicleCollisionEntity *pCollision = static_cast<VehicleCollisionEntity *>(other);
|
||||
|
||||
if (pCollision && pCollision->GetOwner()->IsSubclassOfVehicle()) {
|
||||
pVehicle = static_cast<Vehicle*>(pCollision->GetOwner());
|
||||
pVehicle = static_cast<Vehicle *>(pCollision->GetOwner());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1917,9 +1923,9 @@ Projectile *ProjectileAttack(
|
|||
proj->setMoveType(MOVETYPE_BOUNCE);
|
||||
proj->ProcessInitCommands();
|
||||
proj->SetOwner(owner);
|
||||
proj->edict->r.ownerNum = owner->entnum;
|
||||
proj->angles = dir.toAngles();
|
||||
proj->charge_fraction = fraction;
|
||||
proj->weap = weap;
|
||||
|
||||
if (!real_speed) {
|
||||
if (proj->projFlags & P_CHARGE_SPEED) {
|
||||
|
@ -2391,10 +2397,12 @@ float BulletAttack(
|
|||
if (trace.surfaceFlags & (SURF_FOLIAGE | SURF_GLASS | SURF_PUDDLE | SURF_PAPER)
|
||||
|| trace.contents & (CONTENTS_CLAYPIDGEON | CONTENTS_WATER)
|
||||
|| (g_protocol < protocol_e::PROTOCOL_MOHTA && trace.startsolid)
|
||||
|| (bulletlarge && trace.ent && (g_protocol < protocol_e::PROTOCOL_MOHTA || (trace.ent->r.contents & CONTENTS_BBOX)) && !trace.ent->r.bmodel
|
||||
&& trace.ent->entity->takedamage)
|
||||
|| (bulletlarge && trace.ent
|
||||
&& (g_protocol < protocol_e::PROTOCOL_MOHTA || (trace.ent->r.contents & CONTENTS_BBOX))
|
||||
&& !trace.ent->r.bmodel && trace.ent->entity->takedamage)
|
||||
|| ((trace.surfaceFlags & SURF_WOOD) && bulletthroughwood)
|
||||
|| ((trace.surfaceFlags & (SURF_GRILL | SURF_METAL)) && bulletthroughmetal && iContinueCount < 5)) {
|
||||
|| ((trace.surfaceFlags & (SURF_GRILL | SURF_METAL)) && bulletthroughmetal && iContinueCount < 5
|
||||
)) {
|
||||
if (((trace.surfaceFlags & SURF_WOOD) && bulletthroughwood)
|
||||
|| ((trace.surfaceFlags & (SURF_GRILL | SURF_METAL)) && bulletthroughmetal)) {
|
||||
if (trace.contents & CONTENTS_FENCE) {
|
||||
|
|
|
@ -87,6 +87,10 @@ public:
|
|||
bool m_bDieInWater;
|
||||
// Added in 2.0
|
||||
int m_iTeam;
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
//
|
||||
bool m_bHadPlayerOwner;
|
||||
SafePtr<Entity> m_pOwnerPtr;
|
||||
|
||||
|
@ -127,6 +131,7 @@ public:
|
|||
void HeatSeek( Event *ev );
|
||||
void Drunk( Event *ev );
|
||||
void SmashThroughGlassThink( Event *ev );
|
||||
void SmashThroughGlassThink(); // Added in OPM
|
||||
void AddOwnerVelocity( Event *ev );
|
||||
void Prethink( Event *ev );
|
||||
float ResolveMinimumDistance( Entity *potential_target, float currmin );
|
||||
|
@ -146,7 +151,7 @@ public:
|
|||
//
|
||||
// Added in OPM
|
||||
//
|
||||
bool CheckTeams( void );
|
||||
bool CheckTeams(void);
|
||||
};
|
||||
|
||||
inline void Projectile::SetMartyr(int entnum)
|
||||
|
|
|
@ -11,6 +11,7 @@ file(GLOB SRCS_common
|
|||
"./hashtable.c"
|
||||
"./md5c.c"
|
||||
"./gutil.c"
|
||||
"./gcrypt.c"
|
||||
)
|
||||
|
||||
file(GLOB SRCS_gcdkey
|
||||
|
@ -101,4 +102,5 @@ foreach(LIB ${DEPENDENT_LIBS})
|
|||
target_link_libraries(${LIB} PUBLIC gcd_common)
|
||||
endforeach()
|
||||
|
||||
target_link_libraries(gcd_key PRIVATE gcd_qr2)
|
||||
target_link_libraries(gcd_qr2 PRIVATE gcd_natneg)
|
||||
|
|
49
code/gamespy/cl_gamespy.c
Normal file
49
code/gamespy/cl_gamespy.c
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cl_gamespy.h"
|
||||
#include "q_gamespy.h"
|
||||
|
||||
unsigned int ServerListGetNumMasters()
|
||||
{
|
||||
return Com_GetNumMasterEntries();
|
||||
}
|
||||
|
||||
const char *ServerListGetHost(int index)
|
||||
{
|
||||
master_entry_t entry;
|
||||
Com_GetMasterEntry(index, &entry);
|
||||
|
||||
return entry.host;
|
||||
}
|
||||
|
||||
int ServerListGetMsPort(int index)
|
||||
{
|
||||
master_entry_t entry;
|
||||
Com_GetMasterEntry(index, &entry);
|
||||
|
||||
return entry.queryport;
|
||||
}
|
||||
|
||||
void CL_RestartGamespy_f() {}
|
27
code/gamespy/cl_gamespy.h
Normal file
27
code/gamespy/cl_gamespy.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
// cl_gamespy.h -- Game-specific client GameSpy code
|
||||
|
||||
#pragma once
|
||||
|
||||
void CL_RestartGamespy_f();
|
|
@ -23,7 +23,9 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Set the platform define
|
||||
#ifdef __mips64
|
||||
#if defined (__linux__) || defined(_LINUX) || defined(_MACOSX) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
#define _UNIX
|
||||
#elif __mips64
|
||||
#ifndef _PS2
|
||||
#define _PS2
|
||||
#endif
|
||||
|
@ -34,10 +36,6 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_LINUX) || defined(_MACOSX) || defined(__APPLE__)
|
||||
#define _UNIX
|
||||
#endif
|
||||
|
||||
#if defined(_XBOX) || defined (_X360)
|
||||
#if _XBOX_VER >= 200
|
||||
#define _X360
|
||||
|
|
|
@ -89,7 +89,11 @@ extern "C" {
|
|||
} GSICriticalSection;
|
||||
typedef void (*GSThreadFunc)(void *arg);
|
||||
|
||||
#elif defined(_UNIX) //_LINUX || _MACOSX
|
||||
#elif defined(_UNIX) // Linux, Mac OS X, openbsd, etc.
|
||||
#if defined(__OpenBSD__)
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
typedef pthread_mutex_t GSICriticalSection;
|
||||
typedef struct
|
||||
{
|
||||
|
|
|
@ -439,7 +439,7 @@ void SocketStartUp()
|
|||
void SocketShutDown()
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
// WSACleanup();
|
||||
WSACleanup();
|
||||
#if defined(_X360)
|
||||
XNetCleanup();
|
||||
#endif
|
||||
|
|
223
code/gamespy/gcrypt.c
Normal file
223
code/gamespy/gcrypt.c
Normal file
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "gcrypt.h"
|
||||
#include "../qcommon/q_platform.h"
|
||||
#include "../qcommon/q_shared.h"
|
||||
|
||||
static unsigned int rotl32(unsigned int value, unsigned int count)
|
||||
{
|
||||
return (value << count) | (value >> (-count & 31));
|
||||
}
|
||||
|
||||
static unsigned int crypt_seek(GCryptInfo *info, unsigned int n1, unsigned int n2)
|
||||
{
|
||||
int part;
|
||||
int i;
|
||||
int keyIndex;
|
||||
int xorKey;
|
||||
int current;
|
||||
|
||||
current = 0x8000;
|
||||
xorKey = n1;
|
||||
keyIndex = 0;
|
||||
i = 1;
|
||||
|
||||
info->offset = 0;
|
||||
|
||||
while (current > 0) {
|
||||
xorKey += i;
|
||||
keyIndex += xorKey;
|
||||
xorKey += keyIndex;
|
||||
|
||||
if (n2 & current) {
|
||||
part = rotl32(~xorKey, 24);
|
||||
xorKey = rotl32(info->key[part & 0xff] ^ part, 24);
|
||||
part = rotl32(info->key[keyIndex & 0xff] ^ keyIndex, 8);
|
||||
xorKey ^= info->key[xorKey & 0xff];
|
||||
keyIndex = rotl32(info->key[part & 0xff] ^ part, 8);
|
||||
|
||||
i += 1 + i;
|
||||
} else {
|
||||
info->msg[info->offset] = xorKey;
|
||||
info->msg[info->offset + 16] = keyIndex;
|
||||
info->msg[info->offset + 32] = i;
|
||||
info->offset++;
|
||||
|
||||
part = rotl32(keyIndex, 24);
|
||||
keyIndex = rotl32(info->key[part & 0xff] ^ part, 24);
|
||||
part = rotl32(info->key[xorKey & 0xff] ^ xorKey, 8);
|
||||
keyIndex ^= info->key[keyIndex & 0xff];
|
||||
xorKey = rotl32(info->key[part & 0xff] ^ part, 8);
|
||||
|
||||
i *= 2;
|
||||
}
|
||||
|
||||
current >>= 1;
|
||||
}
|
||||
|
||||
info->xorKey = xorKey;
|
||||
info->keyIndex = keyIndex;
|
||||
info->i = i;
|
||||
info->start = n1;
|
||||
|
||||
return keyIndex ^ xorKey;
|
||||
}
|
||||
|
||||
static void crypt_encrypt(GCryptInfo *info, unsigned int *words, int len)
|
||||
{
|
||||
int part;
|
||||
unsigned int i;
|
||||
unsigned int w;
|
||||
int keyIndex;
|
||||
int xorKey;
|
||||
int offset;
|
||||
|
||||
offset = info->offset;
|
||||
xorKey = info->xorKey;
|
||||
keyIndex = info->keyIndex;
|
||||
i = info->i;
|
||||
|
||||
for (w = 0; w < len; w++) {
|
||||
while (i < 0x10000) {
|
||||
xorKey += i;
|
||||
keyIndex += xorKey;
|
||||
xorKey += keyIndex;
|
||||
|
||||
info->msg[offset] = xorKey;
|
||||
info->msg[offset + 16] = keyIndex;
|
||||
info->msg[offset + 32] = i;
|
||||
offset++;
|
||||
|
||||
part = rotl32(keyIndex, 24);
|
||||
keyIndex = rotl32(info->key[part & 0xff] ^ part, 24);
|
||||
part = rotl32(info->key[xorKey & 0xff] ^ xorKey, 8);
|
||||
keyIndex ^= info->key[keyIndex & 0xff];
|
||||
xorKey = rotl32(info->key[part & 0xff] ^ part, 8);
|
||||
|
||||
i *= 2;
|
||||
}
|
||||
|
||||
words[w] = LittleLong(keyIndex ^ xorKey);
|
||||
offset--;
|
||||
if (offset < 0) {
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
part = rotl32(~info->msg[offset], 24);
|
||||
xorKey = rotl32(info->key[part & 0xff] ^ part, 24);
|
||||
part = rotl32(info->key[info->msg[offset + 16] & 0xff] ^ info->msg[offset + 16], 8);
|
||||
xorKey ^= info->key[xorKey & 0xff];
|
||||
keyIndex = rotl32(info->key[part & 0xff] ^ part, 8);
|
||||
|
||||
i = info->msg[offset + 32] + 1 + info->msg[offset + 32];
|
||||
}
|
||||
|
||||
info->offset = offset;
|
||||
info->xorKey = xorKey;
|
||||
info->keyIndex = keyIndex;
|
||||
info->i = i;
|
||||
}
|
||||
|
||||
void init_crypt_key(unsigned char *src, unsigned int len, GCryptInfo *info)
|
||||
{
|
||||
int index;
|
||||
int i, j, k;
|
||||
int tmp;
|
||||
|
||||
info->wordPtr = NULL;
|
||||
for (k = 0; k < 256; k++) {
|
||||
info->key[k] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (k = 0; k < 256; k++) {
|
||||
info->key[k] = (info->key[k] << 8) + k;
|
||||
}
|
||||
|
||||
index = i;
|
||||
|
||||
for (j = 0; j < 2; j++) {
|
||||
for (k = 0; k < 256; k++) {
|
||||
index = ((info->key[k] & 0xff) + src[k % len] + index) & 0xff;
|
||||
|
||||
tmp = info->key[k];
|
||||
info->key[k] = info->key[index];
|
||||
info->key[index] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (k = 0; k < 256; k++) {
|
||||
info->key[k] ^= k;
|
||||
}
|
||||
|
||||
crypt_seek(info, 0, 0);
|
||||
}
|
||||
|
||||
void crypt_docrypt(GCryptInfo *info, unsigned char *out, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (!info->wordPtr || ((char *)info->wordPtr - (char *)info->words) >= (sizeof(info->words) - 1)) {
|
||||
info->wordPtr = (unsigned char *)info->words;
|
||||
crypt_encrypt(info, info->words, ARRAY_LEN(info->words));
|
||||
}
|
||||
|
||||
out[i] ^= *info->wordPtr;
|
||||
info->wordPtr++;
|
||||
}
|
||||
}
|
||||
|
||||
int enctype2_encoder(unsigned char *secKey, unsigned char *data, int size)
|
||||
{
|
||||
GCryptInfo info = {0};
|
||||
int i;
|
||||
int header_size = 8;
|
||||
|
||||
// move the data and put it after the header
|
||||
for (i = size - 1; i >= 0; i--) {
|
||||
data[1 + header_size + i] = data[i];
|
||||
}
|
||||
|
||||
// initialize the header
|
||||
for (i = 0; i < header_size; i++) {
|
||||
data[i + 1] = 0;
|
||||
}
|
||||
|
||||
// initialize the crypt key
|
||||
init_crypt_key(data + 1, header_size, &info);
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
data[1 + header_size + size + i] = 0;
|
||||
}
|
||||
crypt_docrypt(&info, data + 1 + header_size, size + 6);
|
||||
|
||||
for (i = 0; secKey[i]; i++) {
|
||||
data[i + 1] ^= secKey[i];
|
||||
}
|
||||
|
||||
size += 1 + header_size + 6;
|
||||
*data = header_size ^ 0xec;
|
||||
return size;
|
||||
}
|
40
code/gamespy/gcrypt.h
Normal file
40
code/gamespy/gcrypt.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef struct {
|
||||
int key[256];
|
||||
int msg[48];
|
||||
|
||||
int offset;
|
||||
int xorKey;
|
||||
int keyIndex;
|
||||
int i;
|
||||
int start;
|
||||
|
||||
unsigned int words[16];
|
||||
unsigned char *wordPtr;
|
||||
} GCryptInfo;
|
||||
|
||||
void init_crypt_key(unsigned char *src, unsigned int len, GCryptInfo *info);
|
||||
void crypt_docrypt(GCryptInfo *info, unsigned char *out, int len);
|
|
@ -74,7 +74,9 @@ idle - no processing or querying underway, ready to being updates
|
|||
listreq - a server list request has been or is being sent
|
||||
listxfer - we are transfering the server list
|
||||
lanlist - we are waiting for replies from servers on the LAN
|
||||
querying - the servers on the list are being queried */
|
||||
querying - the servers on the list are being queried
|
||||
connecting (added in OPM) - socket is currently connecting to the master server
|
||||
*/
|
||||
typedef enum {sl_idle, sl_listxfer, sl_lanlist, sl_querying} GServerListState;
|
||||
|
||||
/* Comparision types for the ServerListSort function
|
||||
|
@ -85,7 +87,7 @@ stricase - assume the values are strings and do a case insensitive compare */
|
|||
typedef enum {cm_int, cm_float, cm_strcase, cm_stricase} GCompareMode;
|
||||
|
||||
|
||||
typedef enum {qt_basic, qt_info, qt_rules, qt_players, qt_info_rules, qt_status} GQueryType;
|
||||
typedef enum {qt_basic, qt_info, qt_rules, qt_players, qt_info_rules, qt_status, qt_grouprooms, qt_masterinfo} GQueryType;
|
||||
|
||||
/* Messages that are passed to the ListCallBackFn */
|
||||
#define LIST_STATECHANGED 1 // ServerListState changed, no parameters
|
||||
|
|
|
@ -36,6 +36,8 @@ Updated 6-17-99 (DDW)
|
|||
|
||||
static int KeyValHashKeyP(const void *elem, int numbuckets);
|
||||
static int KeyValCompareKeyP(const void *entry1, const void *entry2);
|
||||
static char *mytok(char *instr, char delim);
|
||||
static char *LookupKey(GServer server, char *k);
|
||||
|
||||
|
||||
|
||||
|
@ -48,6 +50,60 @@ void ServerFree(void *elem)
|
|||
free(server);
|
||||
}
|
||||
|
||||
static void ServerSetAddressFromString (GServer server, char *address)
|
||||
{
|
||||
char *cpos;
|
||||
|
||||
cpos = strchr(address, ':');
|
||||
if (!cpos) {
|
||||
return;
|
||||
}
|
||||
|
||||
*cpos = 0;
|
||||
server->ip = inet_addr(address);
|
||||
server->port = atoi(cpos + 1);
|
||||
}
|
||||
|
||||
GServer ServerNewData(char **fieldlist, int fieldcount, char *serverdata, GQueryType qtype, HashTable keylist)
|
||||
{
|
||||
GServer server;
|
||||
char *k;
|
||||
char *v;
|
||||
int curfield;
|
||||
GKeyValuePair kvpair;
|
||||
|
||||
curfield = 0;
|
||||
server = (GServer)ServerNew(0, 0, qtype, keylist);
|
||||
v = mytok(serverdata + 1, '\\');
|
||||
|
||||
while (curfield < fieldcount) {
|
||||
k = fieldlist[curfield];
|
||||
if (!v) {
|
||||
v = "";
|
||||
}
|
||||
|
||||
if (!strcmp(k, "ip")) {
|
||||
ServerSetAddressFromString(server, v);
|
||||
} else if (qtype == qt_grouprooms && !strcmp(k, "other")) {
|
||||
for (char *p = v; *p; ++p) {
|
||||
if (*p == 1) {
|
||||
*p = '\\';
|
||||
}
|
||||
}
|
||||
ServerParseKeyVals(server, v);
|
||||
} else {
|
||||
kvpair.key = (char *)LookupKey(server, k);
|
||||
kvpair.value = (char *)LookupKey(server, v);
|
||||
TableEnter(server->keyvals, &kvpair);
|
||||
}
|
||||
if (++curfield < fieldcount) {
|
||||
v = mytok(0, '\\');
|
||||
}
|
||||
}
|
||||
|
||||
return server;
|
||||
}
|
||||
|
||||
GServer ServerNew(unsigned long ip, unsigned short port, GQueryType qtype, HashTable keylist)
|
||||
{
|
||||
GServer server;
|
||||
|
|
|
@ -62,6 +62,7 @@ typedef struct
|
|||
} GEnumData;
|
||||
|
||||
void ServerFree(void *elem);
|
||||
GServer ServerNewData(char **fieldlist, int fieldcount, char *serverdata, GQueryType qtype, HashTable keylist);
|
||||
GServer ServerNew(unsigned long ip, unsigned short port, GQueryType qtype, HashTable keylist);
|
||||
void ServerParseKeyVals(GServer server, char *keyvals);
|
||||
int GStringHash(const void *elem, int numbuckets);
|
||||
|
|
|
@ -19,6 +19,24 @@ Fax(714)549-0757
|
|||
for this SDK. It also has a change history for the SDK.
|
||||
|
||||
******/
|
||||
|
||||
/**
|
||||
* The following modifications were made:
|
||||
*
|
||||
* 1) Non-blocking server list sockets. List requests are asynchronous and won't block the game. The only blocking request could be due to DNS resolution.
|
||||
* 2) Server list sockets will timeout after 10 seconds of no reply.
|
||||
* 3) Parallel server list requests.
|
||||
* 3.1) A pool of sockets is initially created
|
||||
* 3.2) The server list connects idling sockets to available masters, afterwards the server list state is set to `sl_listxfer`.
|
||||
* 3.3) The server list sends the list request to connected masters, and receives the data for each.
|
||||
* 3.4) When finished fetching 1 master (got `\final`), the server list state transitions to `sl_querying`.
|
||||
* 3.5) The server list queries all fetched servers. It can still continue fetching list from currently connected masters
|
||||
* but it will not connect to other masters while servers are being queried. It won't be sending more queries if remaining masters replied in under 500 ms.
|
||||
* 3.6) When finished querying all fetched servers, the server list restarts from 3.2 and queries next masters.
|
||||
*
|
||||
* The idea here is to ensure the redundancy of the server list between multiple masters even if the results are combined.
|
||||
* Optionally for best results, the game should return a list of masters from the same community.
|
||||
*/
|
||||
#include "goaceng.h"
|
||||
#include "gserver.h"
|
||||
#if defined(applec) || defined(THINK_C) || defined(__MWERKS__) && !defined(__KATANA__)
|
||||
|
@ -45,10 +63,24 @@ Fax(714)549-0757
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define MSHOST MASTER_SERVER_HOST
|
||||
#define MSPORT 28900
|
||||
// Added in 2.0
|
||||
#include "gcrypt.h"
|
||||
|
||||
/**
|
||||
* @brief Custom function used to return the master host, based on game settings
|
||||
*
|
||||
* @return const char* The master host
|
||||
*/
|
||||
extern unsigned int ServerListGetNumMasters();
|
||||
extern const char *ServerListGetHost(int index);
|
||||
extern int ServerListGetMsPort(int index);
|
||||
|
||||
//#define MSHOST ServerListGetHost(0)
|
||||
//#define MSPORT ServerListGetMsPort(0)
|
||||
#define SERVER_GROWBY 64
|
||||
#define LAN_SEARCH_TIME 3000 //3 sec
|
||||
#define SERVER_QUERY_MAX_PAUSE 500
|
||||
#define INTERNET_SEARCH_TIME 10000 //10 sec
|
||||
#define LIST_NUMKEYBUCKETS 500
|
||||
#define LIST_NUMKEYCHAINS 4
|
||||
|
||||
|
@ -66,7 +98,18 @@ typedef struct
|
|||
struct sockaddr_in saddr;
|
||||
} UpdateInfo;
|
||||
|
||||
typedef enum { pi_fieldcount, pi_fields, pi_servers } GParseInfoState;
|
||||
typedef enum { ls_none, ls_connecting, ls_connected } GListSocketState;
|
||||
|
||||
typedef struct GServerListSocketImplementation
|
||||
{
|
||||
SOCKET s;
|
||||
GListSocketState socketstate;
|
||||
char data[2048];
|
||||
int oldlen;
|
||||
gsi_time lastreplytime;
|
||||
GCryptInfo cryptinfo;
|
||||
} *GServerListSocket;
|
||||
|
||||
struct GServerListImplementation
|
||||
{
|
||||
|
@ -76,6 +119,7 @@ struct GServerListImplementation
|
|||
char gamename[32];
|
||||
char seckey[32];
|
||||
char enginename[32];
|
||||
char filter[256];
|
||||
int maxupdates;
|
||||
int nextupdate;
|
||||
int abortupdate;
|
||||
|
@ -83,10 +127,23 @@ struct GServerListImplementation
|
|||
void *instance;
|
||||
char *sortkey;
|
||||
gbool sortascending;
|
||||
SOCKET slsocket;
|
||||
GServerListSocket slsockets;
|
||||
int numslsockets;
|
||||
int startslindex;
|
||||
gsi_time lastsltime;
|
||||
unsigned long lanstarttime;
|
||||
GQueryType querytype;
|
||||
HashTable keylist;
|
||||
|
||||
// Added in 2.0
|
||||
int numservers;
|
||||
// Added in 2.0
|
||||
//GCryptInfo cryptinfo;
|
||||
// Added in OPM
|
||||
int encryptdata;
|
||||
gbool async;
|
||||
|
||||
GParseInfoState pistate;
|
||||
};
|
||||
|
||||
GServerList g_sortserverlist; //global serverlist for sorting info!!
|
||||
|
@ -100,7 +157,7 @@ const int querylengths[NUM_QUERYTYPES] = {7,6,7,9,13,8};
|
|||
static void KeyValFree(void *elem);
|
||||
static int KeyValCompareKeyA(const void *entry1, const void *entry2);
|
||||
static int KeyValHashKeyA(const void *elem, int numbuckets);
|
||||
|
||||
static gbool ServerListHasFinishedFetchingList(GServerList serverlist);
|
||||
|
||||
/* ServerListNew
|
||||
----------------
|
||||
|
@ -125,6 +182,24 @@ GServerList ServerListNew(const char *gamename, const char *enginename, const ch
|
|||
assert(CallBackFn != NULL);
|
||||
list->instance = instance;
|
||||
list->sortkey = "";
|
||||
// Added in 2.0
|
||||
list->numservers = 0;
|
||||
// Added in OPM
|
||||
list->encryptdata = 1;
|
||||
list->async = 0;
|
||||
|
||||
list->numslsockets = maxconcupdates / 4;
|
||||
if (list->numslsockets < 1) {
|
||||
list->numslsockets = 1;
|
||||
} else if (list->numslsockets > 4) {
|
||||
// Above 4 seems too much
|
||||
list->numslsockets = 4;
|
||||
}
|
||||
list->slsockets = (GServerListSocket)malloc(sizeof(struct GServerListSocketImplementation) * list->numslsockets);
|
||||
memset(list->slsockets, 0, sizeof(struct GServerListSocketImplementation) * list->numslsockets);
|
||||
list->startslindex = 0;
|
||||
list->lastsltime = current_time();
|
||||
|
||||
SocketStartUp();
|
||||
return list;
|
||||
}
|
||||
|
@ -137,6 +212,7 @@ void ServerListFree(GServerList serverlist)
|
|||
ArrayFree(serverlist->servers);
|
||||
TableFree(serverlist->keylist);
|
||||
free(serverlist->updatelist);
|
||||
free(serverlist->slsockets);
|
||||
|
||||
free(serverlist);
|
||||
SocketShutDown();
|
||||
|
@ -179,46 +255,90 @@ static GError FreeUpdateList(GServerList serverlist)
|
|||
}
|
||||
|
||||
//create and connect a server list socket
|
||||
static GError CreateServerListSocket(GServerList serverlist)
|
||||
static GError CreateServerListSocket(GServerList serverlist, GServerListSocket slsocket, gbool async)
|
||||
{
|
||||
struct sockaddr_in saddr;
|
||||
struct hostent *hent;
|
||||
int lasterr;
|
||||
int i;
|
||||
int port;
|
||||
const char *host;
|
||||
|
||||
if (serverlist->startslindex >= ServerListGetNumMasters()) {
|
||||
return GE_NODNS;
|
||||
}
|
||||
|
||||
if (slsocket->socketstate != ls_none) {
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
port = ServerListGetMsPort(serverlist->startslindex);
|
||||
host = ServerListGetHost(serverlist->startslindex);
|
||||
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = htons(MSPORT);
|
||||
saddr.sin_addr.s_addr = inet_addr(MSHOST);
|
||||
saddr.sin_port = htons(port);
|
||||
saddr.sin_addr.s_addr = inet_addr(host);
|
||||
if (saddr.sin_addr.s_addr == INADDR_NONE)
|
||||
{
|
||||
hent = gethostbyname(MSHOST);
|
||||
hent = gethostbyname(host);
|
||||
if (!hent)
|
||||
return GE_NODNS;
|
||||
saddr.sin_addr.s_addr = *(u_long *)hent->h_addr_list[0];
|
||||
}
|
||||
serverlist->slsocket = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
|
||||
if (serverlist->slsocket == INVALID_SOCKET)
|
||||
slsocket->s = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
|
||||
if (slsocket->s == INVALID_SOCKET)
|
||||
return GE_NOSOCKET;
|
||||
if (connect ( serverlist->slsocket, (struct sockaddr *) &saddr, sizeof saddr ) != 0)
|
||||
|
||||
if (async) {
|
||||
SetSockBlocking(slsocket->s, 0);
|
||||
}
|
||||
|
||||
if (connect ( slsocket->s, (struct sockaddr *) &saddr, sizeof saddr ) != 0
|
||||
&& (lasterr = GOAGetLastError(slsocket->slsocket), lasterr != WSAEWOULDBLOCK && lasterr != WSAEINPROGRESS))
|
||||
{
|
||||
closesocket(serverlist->slsocket);
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
return GE_NOCONNECT;
|
||||
}
|
||||
|
||||
slsocket->socketstate = ls_connecting;
|
||||
slsocket->oldlen = 0;
|
||||
slsocket->cryptinfo.offset = -1;
|
||||
slsocket->lastreplytime = current_time();
|
||||
serverlist->startslindex++;
|
||||
|
||||
//else we are connected
|
||||
return 0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
//create and connect a server list sockets
|
||||
static GError CreateServerListForAvailableSockets(GServerList serverlist, gbool async)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < serverlist->numslsockets; i++) {
|
||||
if (serverlist->slsockets[i].socketstate == ls_none) {
|
||||
CreateServerListSocket(serverlist, &serverlist->slsockets[i], async);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//create and connect a server list socket
|
||||
static GError CreateServerListLANSocket(GServerList serverlist)
|
||||
{
|
||||
int optval = 1;
|
||||
GServerListSocket slsocket = &serverlist->slsockets[0];
|
||||
|
||||
serverlist->slsocket = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
|
||||
if (serverlist->slsocket == INVALID_SOCKET)
|
||||
slsocket->s = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
|
||||
if (slsocket->s == INVALID_SOCKET)
|
||||
return GE_NOSOCKET;
|
||||
if (setsockopt(serverlist->slsocket, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(optval)) != 0)
|
||||
if (setsockopt(slsocket->s, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(optval)) != 0)
|
||||
return GE_NOSOCKET;
|
||||
|
||||
//else we are ready to broadcast
|
||||
|
@ -238,15 +358,17 @@ static void ServerListModeChange(GServerList serverlist, GServerListState newsta
|
|||
|
||||
// validate us to the master and send a list request
|
||||
#define SECURE "\\secure\\"
|
||||
static GError SendListRequest(GServerList serverlist, char *filter)
|
||||
static GError SendListRequest(GServerList serverlist, GServerListSocket slsocket, char *filter)
|
||||
{
|
||||
char data[256], *ptr, result[64];
|
||||
int len;
|
||||
int i;
|
||||
char *modifier;
|
||||
|
||||
|
||||
len = recv(serverlist->slsocket, data, sizeof(data) - 1, 0);
|
||||
if (gsiSocketIsError(len))
|
||||
len = recv(slsocket->s, data, sizeof(data) - 1, 0);
|
||||
if (gsiSocketIsError(len)) {
|
||||
return GE_NOCONNECT;
|
||||
}
|
||||
data[len] = '\0'; //null terminate it
|
||||
|
||||
ptr = strstr ( data, SECURE );
|
||||
|
@ -254,26 +376,54 @@ static GError SendListRequest(GServerList serverlist, char *filter)
|
|||
return GE_DATAERROR;
|
||||
ptr = ptr + strlen(SECURE);
|
||||
gs_encrypt ( (uchar *) serverlist->seckey, 6, (uchar *)ptr, 6 );
|
||||
if (serverlist->encryptdata) {
|
||||
// Added in 2.0
|
||||
for(i = 0; i < 6; i++) {
|
||||
ptr[i] ^= serverlist->seckey[i];
|
||||
}
|
||||
}
|
||||
gs_encode ( (uchar *)ptr, 6, (uchar *) result );
|
||||
|
||||
if (serverlist->encryptdata) {
|
||||
// Added in 2.0
|
||||
// Encrypt data
|
||||
//validate to the master
|
||||
sprintf(data, "\\gamename\\%s\\gamever\\%s\\location\\0\\validate\\%s\\enctype\\2\\final\\\\queryid\\1.1\\",
|
||||
serverlist->enginename, "2", result); //validate us
|
||||
} else {
|
||||
//validate to the master
|
||||
sprintf(data, "\\gamename\\%s\\gamever\\%s\\location\\0\\validate\\%s\\final\\\\queryid\\1.1\\",
|
||||
serverlist->enginename, ENGINE_VERSION, result); //validate us
|
||||
}
|
||||
|
||||
len = send ( serverlist->slsocket, data, strlen(data), 0 );
|
||||
len = send ( slsocket->s, data, strlen(data), 0 );
|
||||
if (gsiSocketIsError(len) || len == 0)
|
||||
return GE_NOCONNECT;
|
||||
|
||||
if (serverlist->querytype == qt_grouprooms) {
|
||||
modifier = "groups";
|
||||
|
||||
serverlist->pistate = pi_fieldcount;
|
||||
} else if (serverlist->querytype == qt_masterinfo) {
|
||||
modifier = "info2";
|
||||
|
||||
serverlist->pistate = pi_fieldcount;
|
||||
} else {
|
||||
modifier = "cmp";
|
||||
}
|
||||
|
||||
//send the list request
|
||||
if (filter)
|
||||
sprintf(data, "\\list\\cmp\\gamename\\%s\\where\\%s\\final\\", serverlist->gamename, filter);
|
||||
sprintf(data, "\\list\\%s\\gamename\\%s\\where\\%s\\final\\", modifier, serverlist->gamename, filter);
|
||||
else
|
||||
sprintf(data, "\\list\\cmp\\gamename\\%s\\final\\", serverlist->gamename);
|
||||
len = send ( serverlist->slsocket, data, strlen(data), 0 );
|
||||
sprintf(data, "\\list\\%s\\gamename\\%s\\final\\", modifier, serverlist->gamename);
|
||||
len = send ( slsocket->s, data, strlen(data), 0 );
|
||||
if (gsiSocketIsError(len) || len == 0)
|
||||
return GE_NOCONNECT;
|
||||
|
||||
if (serverlist->state == sl_idle) {
|
||||
ServerListModeChange(serverlist, sl_listxfer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -288,7 +438,7 @@ static GError SendBroadcastRequest(GServerList serverlist, int startport, int en
|
|||
for (i = startport ; i <= endport ; i += delta)
|
||||
{
|
||||
saddr.sin_port = htons(i);
|
||||
sendto(serverlist->slsocket, "\\status\\",8,0,(struct sockaddr *)&saddr,sizeof(saddr));
|
||||
sendto(serverlist->slsockets[0].s, "\\status\\",8,0,(struct sockaddr *)&saddr,sizeof(saddr));
|
||||
}
|
||||
ServerListModeChange(serverlist, sl_lanlist);
|
||||
serverlist->lanstarttime = current_time();
|
||||
|
@ -318,27 +468,108 @@ GError ServerListUpdate(GServerList serverlist, gbool async)
|
|||
return ServerListUpdate2(serverlist, async, NULL, qt_status);
|
||||
}
|
||||
|
||||
/* ServerListCheckSocketError
|
||||
-------------------------
|
||||
Verify if the server list socket has an error or has timed out, and abort. */
|
||||
GError ServerListCheckSocketError(GServerList serverlist, GServerListSocket slsocket)
|
||||
{
|
||||
int so_error;
|
||||
int len = sizeof(so_error);
|
||||
getsockopt(slsocket->s, SOL_SOCKET, SO_ERROR, &so_error, &len);
|
||||
|
||||
// Abort if the socket has an error or if it connect/recv has timed out
|
||||
if (so_error || current_time() >= slsocket->lastreplytime + INTERNET_SEARCH_TIME) {
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
slsocket->socketstate = ls_none;
|
||||
return GE_NOCONNECT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ServerListStartQuery
|
||||
-------------------------
|
||||
Start querying a GServerList. */
|
||||
GError ServerListStartQuery(GServerList serverlist, GServerListSocket slsocket, gbool async)
|
||||
{
|
||||
GError error;
|
||||
int i;
|
||||
|
||||
if (slsocket->socketstate != ls_connecting) {
|
||||
return GE_BUSY;
|
||||
}
|
||||
|
||||
if (serverlist->abortupdate) {
|
||||
for(i = 0; i < serverlist->numslsockets; i++) {
|
||||
closesocket(serverlist->slsockets[i].s);
|
||||
serverlist->slsockets[i].s = INVALID_SOCKET;
|
||||
}
|
||||
ServerListModeChange(serverlist, sl_idle);
|
||||
return GE_NOCONNECT;
|
||||
}
|
||||
|
||||
if (async) {
|
||||
// Check for pending data
|
||||
char buf;
|
||||
if (recv(slsocket->s, &buf, 1, MSG_PEEK) == -1) {
|
||||
return GE_BUSY;
|
||||
}
|
||||
}
|
||||
|
||||
slsocket->socketstate = ls_connected;
|
||||
|
||||
error = SendListRequest(serverlist, slsocket, serverlist->filter);
|
||||
if (error) return error;
|
||||
if (serverlist->querytype != qt_grouprooms && serverlist->querytype != qt_masterinfo) {
|
||||
error = InitUpdateList(serverlist);
|
||||
if (error) return error;
|
||||
}
|
||||
|
||||
if (!async)
|
||||
DoSyncLoop(serverlist);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ServerListUpdate2
|
||||
-------------------------
|
||||
Start updating a GServerList. */
|
||||
GError ServerListUpdate2(GServerList serverlist, gbool async, char *filter, GQueryType querytype)
|
||||
{
|
||||
GError error;
|
||||
int i;
|
||||
|
||||
if (serverlist->state != sl_idle)
|
||||
return GE_BUSY;
|
||||
|
||||
serverlist->querytype = querytype;
|
||||
error = CreateServerListSocket(serverlist);
|
||||
if (error) return error;
|
||||
error = SendListRequest(serverlist, filter);
|
||||
if (error) return error;
|
||||
error = InitUpdateList(serverlist);
|
||||
if (error) return error;
|
||||
error = CreateServerListForAvailableSockets(serverlist, async);
|
||||
//if (error) return error;
|
||||
|
||||
serverlist->nextupdate = 0;
|
||||
serverlist->abortupdate = 0;
|
||||
if (!async)
|
||||
DoSyncLoop(serverlist);
|
||||
// Added in 2.0
|
||||
serverlist->numservers = ServerListCount(serverlist);
|
||||
// Added in 2.0
|
||||
//serverlist->cryptinfo.offset = -1;
|
||||
if (filter) {
|
||||
strncpy(serverlist->filter, filter, sizeof(serverlist->filter));
|
||||
} else {
|
||||
serverlist->filter[0] = 0;
|
||||
}
|
||||
|
||||
serverlist->async = async;
|
||||
|
||||
if (async) {
|
||||
// As it's asynchronous, set the state to transfering
|
||||
ServerListModeChange(serverlist, sl_listxfer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i = 0; i < serverlist->numslsockets; i++) {
|
||||
ServerListStartQuery(serverlist, &serverlist->slsockets[i], async);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -369,6 +600,15 @@ GError ServerListLANUpdate(GServerList serverlist, gbool async, int startsearchp
|
|||
return 0;
|
||||
}
|
||||
|
||||
//add a new server based on the data
|
||||
static GServer ServerListAddServerData(GServerList serverlist, char **fieldlist, int fieldcount, char *serverdata, GQueryType qtype)
|
||||
{
|
||||
GServer server;
|
||||
|
||||
server = ServerNewData(fieldlist, fieldcount, serverdata, qtype, serverlist->keylist);
|
||||
ArrayAppend(serverlist->servers, &server);
|
||||
return server;
|
||||
}
|
||||
|
||||
//add the server to the list with the given ip, port
|
||||
static void ServerListAddServer(GServerList serverlist, unsigned long ip, unsigned short port, GQueryType qtype)
|
||||
|
@ -389,12 +629,12 @@ static void ServerListInsertServer(GServerList serverlist, unsigned long ip, uns
|
|||
}
|
||||
|
||||
//find the server in the list, returns -1 if it does not exist
|
||||
static int ServerListFindServer(GServerList serverlist, unsigned int ip, int port)
|
||||
static int ServerListFindServerMax(GServerList serverlist, unsigned int ip, int port, int count)
|
||||
{
|
||||
int i;
|
||||
GServer server;
|
||||
|
||||
for (i = 0; i < ArrayLength(serverlist->servers) ; i++)
|
||||
for (i = 0; i < count ; i++)
|
||||
{
|
||||
server = *(GServer *)ArrayNth(serverlist->servers,i);
|
||||
if (port == ServerGetQueryPort(server) && ServerGetInetAddress(server)==ip)
|
||||
|
@ -405,6 +645,12 @@ static int ServerListFindServer(GServerList serverlist, unsigned int ip, int por
|
|||
return -1;
|
||||
}
|
||||
|
||||
//find the server in the list, returns -1 if it does not exist
|
||||
static int ServerListFindServer(GServerList serverlist, unsigned int ip, int port)
|
||||
{
|
||||
return ServerListFindServerMax(serverlist, ip, port, ArrayLength(serverlist->servers));
|
||||
}
|
||||
|
||||
//finds the server in the list of servers currently being queried
|
||||
// returns -1 if it does not exist
|
||||
static int ServerListFindServerInUpdateList(GServerList serverlist, GServer server)
|
||||
|
@ -512,7 +758,7 @@ GError ServerListAuxUpdate(GServerList serverlist, const char *ip, int port, gbo
|
|||
return 0;
|
||||
}
|
||||
|
||||
static GError ServerListLANList(GServerList serverlist)
|
||||
static GError ServerListLANList(GServerList serverlist, GServerListSocket slsocket)
|
||||
{
|
||||
struct timeval timeout = {0,0};
|
||||
fd_set set;
|
||||
|
@ -524,11 +770,11 @@ static GError ServerListLANList(GServerList serverlist)
|
|||
while (1) //we break if the select fails
|
||||
{
|
||||
FD_ZERO(&set);
|
||||
FD_SET( serverlist->slsocket, &set);
|
||||
FD_SET( slsocket->s, &set);
|
||||
error = select(FD_SETSIZE, &set, NULL, NULL, &timeout);
|
||||
if (gsiSocketIsError(error) || 0 == error) //no data
|
||||
break;
|
||||
error = recvfrom(serverlist->slsocket, indata, sizeof(indata) - 1, 0, (struct sockaddr *)&saddr, &saddrlen );
|
||||
error = recvfrom(slsocket->s, indata, sizeof(indata) - 1, 0, (struct sockaddr *)&saddr, &saddrlen );
|
||||
if (gsiSocketIsError(error))
|
||||
continue;
|
||||
//we got data, add the server to the list to update
|
||||
|
@ -537,19 +783,107 @@ static GError ServerListLANList(GServerList serverlist)
|
|||
}
|
||||
if (current_time() - serverlist->lanstarttime > LAN_SEARCH_TIME) //done waiting for replies
|
||||
{
|
||||
closesocket(serverlist->slsocket);
|
||||
serverlist->slsocket = INVALID_SOCKET;
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
ServerListModeChange(serverlist, sl_querying);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int CountSlashOffset(char *data, int len, int slashcount)
|
||||
{
|
||||
char *p;
|
||||
|
||||
for (p = data; slashcount && p != data + len; ++p) {
|
||||
if (*p == '\\') {
|
||||
slashcount--;
|
||||
}
|
||||
}
|
||||
|
||||
if (slashcount) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return p - data;
|
||||
}
|
||||
|
||||
//parses and retrieve servers based on fields
|
||||
static int ServerListParseInfoList(GServerList serverlist, char *data, int len)
|
||||
{
|
||||
char *fieldlist[20];
|
||||
char tempfield[64];
|
||||
char *tempptr;
|
||||
static int fieldcount;
|
||||
int offset;
|
||||
int i;
|
||||
GServer server;
|
||||
|
||||
switch (serverlist->pistate) {
|
||||
case pi_fieldcount:
|
||||
offset = CountSlashOffset(data, len, 3);
|
||||
if (offset == -1) {
|
||||
return 0;
|
||||
}
|
||||
if (offset < 12) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
strncpy(tempfield, data + 12, offset - 12);
|
||||
tempfield[offset - 13] = 0;
|
||||
|
||||
fieldcount = atoi(tempfield);
|
||||
if (fieldcount > 20) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
serverlist->pistate = pi_fields;
|
||||
|
||||
for (i = 0; i < fieldcount; ++i) {
|
||||
fieldlist[i] = 0;
|
||||
}
|
||||
|
||||
return offset - 1;
|
||||
case pi_fields:
|
||||
offset = CountSlashOffset(data, len, 2);
|
||||
if (offset == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
strncpy(tempfield, data + 1, offset - 2);
|
||||
tempfield[offset - 2] = 0;
|
||||
tempptr = goastrdup(tempfield);
|
||||
|
||||
for (i = 0; i < fieldcount; ++i) {
|
||||
if (!fieldlist[i]) {
|
||||
fieldlist[i] = tempptr;
|
||||
if (i == fieldcount - 1) {
|
||||
serverlist->pistate = pi_servers;
|
||||
}
|
||||
return offset - 1;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
case pi_servers:
|
||||
offset = CountSlashOffset(data, len, fieldcount + 1);
|
||||
if (offset == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
server = ServerListAddServerData(serverlist, (char **)fieldlist, fieldcount, data, serverlist->querytype);
|
||||
data[offset - 1] = '\\';
|
||||
serverlist->CallBackFn(serverlist, 2, serverlist->instance, server, 0);
|
||||
return offset - 1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
//reads the server list from the socket and parses it
|
||||
static GError ServerListReadList(GServerList serverlist)
|
||||
static GError ServerListReadList(GServerList serverlist, GServerListSocket slsocket)
|
||||
{
|
||||
static char data[2048]; //static input buffer
|
||||
static int oldlen = 0;
|
||||
//static char data[2048]; //static input buffer
|
||||
//static int oldlen = 0;
|
||||
fd_set set;
|
||||
struct timeval timeout = {0,0};
|
||||
int len, i;
|
||||
|
@ -558,7 +892,7 @@ static GError ServerListReadList(GServerList serverlist)
|
|||
unsigned short port;
|
||||
|
||||
FD_ZERO(&set);
|
||||
FD_SET(serverlist->slsocket, &set);
|
||||
FD_SET(slsocket->s, &set);
|
||||
#ifndef KGTRN_ACCESS
|
||||
i = select( FD_SETSIZE, &set, NULL, NULL, &timeout );
|
||||
if (i <= 0)
|
||||
|
@ -566,40 +900,90 @@ static GError ServerListReadList(GServerList serverlist)
|
|||
#endif
|
||||
|
||||
//append to data
|
||||
len = recv(serverlist->slsocket, data + oldlen, sizeof(data) - oldlen - 1, 0);
|
||||
len = recv(slsocket->s, slsocket->data + slsocket->oldlen, sizeof(slsocket->data) - slsocket->oldlen - 1, 0);
|
||||
if (gsiSocketIsError(len) || len == 0)
|
||||
{
|
||||
closesocket(serverlist->slsocket);
|
||||
serverlist->slsocket = INVALID_SOCKET;
|
||||
oldlen = 0; //clear data so it can be used again
|
||||
ServerListHalt(serverlist);
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
slsocket->socketstate = ls_none;
|
||||
slsocket->oldlen = 0; //clear data so it can be used again
|
||||
//ServerListHalt(serverlist);
|
||||
ServerListModeChange(serverlist, sl_querying);
|
||||
return GE_NOCONNECT;
|
||||
|
||||
}
|
||||
oldlen += len;
|
||||
|
||||
p = data;
|
||||
while (p - data <= oldlen - 6)
|
||||
slsocket->lastreplytime = current_time();
|
||||
serverlist->lastsltime = slsocket->lastreplytime;
|
||||
|
||||
if (serverlist->encryptdata && slsocket->cryptinfo.offset != -1) {
|
||||
// Added in 2.0
|
||||
crypt_docrypt(&slsocket->cryptinfo, slsocket->data + slsocket->oldlen, len);
|
||||
}
|
||||
|
||||
slsocket->oldlen += len;
|
||||
|
||||
p = slsocket->data;
|
||||
|
||||
if (!serverlist->encryptdata) {
|
||||
slsocket->cryptinfo.offset = 0;
|
||||
} else if (slsocket->cryptinfo.offset == -1) {
|
||||
// Added in 2.0
|
||||
if (slsocket->oldlen > (*p ^ 0xEC)) {
|
||||
*p ^= 0xEC;
|
||||
len = strlen(serverlist->seckey);
|
||||
for (i = 0; i < len; i++) {
|
||||
p[i + 1] ^= serverlist->seckey[i];
|
||||
}
|
||||
init_crypt_key((unsigned char *)p + 1, *p, &slsocket->cryptinfo);
|
||||
p += *p + 1;
|
||||
crypt_docrypt(&slsocket->cryptinfo, (unsigned char *)p, slsocket->oldlen - (p - slsocket->data));
|
||||
}
|
||||
}
|
||||
|
||||
if (slsocket->cryptinfo.offset != -1)
|
||||
{
|
||||
while (p - slsocket->data <= slsocket->oldlen - 6)
|
||||
{
|
||||
if (strncmp(p,"\\final\\",7) == 0 || serverlist->abortupdate)
|
||||
{
|
||||
closesocket(serverlist->slsocket);
|
||||
serverlist->slsocket = INVALID_SOCKET;
|
||||
oldlen = 0; //clear data so it can be used again
|
||||
closesocket(slsocket->s);
|
||||
slsocket->s = INVALID_SOCKET;
|
||||
slsocket->socketstate = ls_none;
|
||||
slsocket->oldlen = 0; //clear data so it can be used again
|
||||
if (serverlist->querytype == qt_grouprooms || serverlist->querytype == qt_masterinfo) {
|
||||
ServerListModeChange(serverlist, sl_idle);
|
||||
} else {
|
||||
ServerListModeChange(serverlist, sl_querying);
|
||||
}
|
||||
return 0; //get out!!
|
||||
}
|
||||
if (oldlen < 6) //no way it could be a full IP, quit
|
||||
if (slsocket->oldlen < 6) //no way it could be a full IP, quit
|
||||
break;
|
||||
|
||||
if (serverlist->querytype == qt_grouprooms || serverlist->querytype == qt_masterinfo) {
|
||||
i = ServerListParseInfoList(serverlist, p, slsocket->oldlen - (p - slsocket->data));
|
||||
if (i < 0) {
|
||||
serverlist->abortupdate = 1;
|
||||
} else if (!i) {
|
||||
// finished
|
||||
break;
|
||||
memcpy(&ip,p,4);
|
||||
p += 4;
|
||||
memcpy(&port,p,2);
|
||||
p += 2;
|
||||
ServerListAddServer(serverlist,ip, ntohs(port), serverlist->querytype );
|
||||
}
|
||||
oldlen = oldlen - (p - data);
|
||||
memmove(data,p,oldlen); //shift it over
|
||||
} else {
|
||||
memcpy(&ip, p, 4);
|
||||
p += 4;
|
||||
memcpy(&port, p, 2);
|
||||
p += 2;
|
||||
// Added in 2.0
|
||||
// Skip adding the server if already exists
|
||||
if (ServerListFindServer(serverlist, ip, ntohs(port)) == -1) {
|
||||
ServerListAddServer(serverlist, ip, ntohs(port), serverlist->querytype);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
slsocket->oldlen = slsocket->oldlen - (p - slsocket->data);
|
||||
memmove(slsocket->data,p,slsocket->oldlen); //shift it over
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
@ -678,10 +1062,26 @@ static GError ServerListQueryLoop(GServerList serverlist)
|
|||
if (serverlist->abortupdate || (serverlist->nextupdate >= ArrayLength(serverlist->servers) && scount == 0))
|
||||
{ //we are done!!
|
||||
FreeUpdateList(serverlist);
|
||||
if (serverlist->abortupdate) {
|
||||
ServerListModeChange(serverlist, sl_idle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (serverlist->startslindex < ServerListGetNumMasters() || !ServerListHasFinishedFetchingList(serverlist)) {
|
||||
ServerListModeChange(serverlist, sl_listxfer);
|
||||
} else {
|
||||
// No more masters
|
||||
ServerListModeChange(serverlist, sl_idle);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ServerListHasFinishedFetchingList(serverlist) && current_time() < serverlist->lastsltime + SERVER_QUERY_MAX_PAUSE) {
|
||||
// Make sure to not send out other queries if currently fetching from other lists
|
||||
// to avoid overloading the network
|
||||
return GE_BUSY;
|
||||
}
|
||||
|
||||
//now, send out queries on available sockets
|
||||
for (i = 0 ; i < serverlist->maxupdates && serverlist->nextupdate < ArrayLength(serverlist->servers) ; i++)
|
||||
if (serverlist->updatelist[i].currentserver == NULL) //it's availalbe
|
||||
|
@ -700,29 +1100,97 @@ static GError ServerListQueryLoop(GServerList serverlist)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* ServerListThink
|
||||
/* ServerListThinkSocket
|
||||
------------------
|
||||
For use with Async Updates. This needs to be called every ~10ms for list processing and
|
||||
updating to occur during async server list updates */
|
||||
GError ServerListThink(GServerList serverlist)
|
||||
GError ServerListThinkSocket(GServerList serverlist, GServerListSocket slsocket)
|
||||
{
|
||||
GError socketerror;
|
||||
|
||||
if (slsocket->s == INVALID_SOCKET) {
|
||||
return GE_NOSOCKET;
|
||||
}
|
||||
|
||||
socketerror = ServerListCheckSocketError(serverlist, slsocket);
|
||||
if (socketerror) {
|
||||
return socketerror;
|
||||
}
|
||||
|
||||
switch(slsocket->socketstate)
|
||||
{
|
||||
case ls_connecting:
|
||||
ServerListStartQuery(serverlist, slsocket, 1);
|
||||
break;
|
||||
case ls_connected:
|
||||
//read the data
|
||||
return ServerListReadList(serverlist, slsocket);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (serverlist->state)
|
||||
{
|
||||
case sl_idle: return 0;
|
||||
case sl_listxfer:
|
||||
//read the data
|
||||
return ServerListReadList(serverlist);
|
||||
//return ServerListReadList(serverlist, slsocket);
|
||||
break;
|
||||
case sl_lanlist:
|
||||
return ServerListLANList(serverlist);
|
||||
return ServerListLANList(serverlist, slsocket);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ServerListHasFinishedFetchingList
|
||||
------------------
|
||||
Whether or not the list has finished fetching */
|
||||
static gbool ServerListHasFinishedFetchingList(GServerList serverlist)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < serverlist->numslsockets; i++) {
|
||||
if (serverlist->slsockets[i].s != INVALID_SOCKET) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ServerListThink
|
||||
------------------
|
||||
For use with Async Updates. This needs to be called every ~10ms for list processing and
|
||||
updating to occur during async server list updates */
|
||||
GError ServerListThink(GServerList serverlist)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < serverlist->numslsockets; i++) {
|
||||
ServerListThinkSocket(serverlist, &serverlist->slsockets[i]);
|
||||
}
|
||||
|
||||
switch(serverlist->state)
|
||||
{
|
||||
case sl_idle:
|
||||
case sl_listxfer:
|
||||
if (!serverlist->abortupdate) {
|
||||
if (serverlist->startslindex < ServerListGetNumMasters()) {
|
||||
CreateServerListForAvailableSockets(serverlist, serverlist->async);
|
||||
} else if (serverlist->state == sl_listxfer && ServerListHasFinishedFetchingList(serverlist)) {
|
||||
ServerListModeChange(serverlist, sl_idle);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case sl_querying:
|
||||
//do some queries
|
||||
return ServerListQueryLoop(serverlist);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue