mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
Compare commits
528 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 | ||
![]() |
efeda23627 | ||
![]() |
465d462756 | ||
![]() |
df22895b94 | ||
![]() |
6b2160c876 | ||
![]() |
088b44e2cc | ||
![]() |
3f299610fc | ||
![]() |
713e361d85 | ||
![]() |
869075f47b | ||
![]() |
a067c58b3d | ||
![]() |
b16aaa5adc | ||
![]() |
f4a412cc24 | ||
![]() |
d83ad43b0b | ||
![]() |
aa9847cf90 | ||
![]() |
18a3658935 | ||
![]() |
716a574abe | ||
![]() |
e0dee12578 | ||
![]() |
04b1e88077 | ||
![]() |
51a2f7d479 | ||
![]() |
2656000ce4 | ||
![]() |
4ec10af1fd | ||
![]() |
78cd0cf28b | ||
![]() |
3e9d2bf89a | ||
![]() |
ebe9795bba | ||
![]() |
3f2c2f7aa4 | ||
![]() |
583c2720e2 | ||
![]() |
47d6843b70 | ||
![]() |
25fd01c46b | ||
![]() |
963b2a2bbd | ||
![]() |
7274ceb0ff | ||
![]() |
cb1c3c0b1c | ||
![]() |
da5c35ec2b | ||
![]() |
515beeafa7 | ||
![]() |
37f5f64ef3 | ||
![]() |
85c401496a | ||
![]() |
07f7c557ce | ||
![]() |
31278fba92 | ||
![]() |
a32a9e8ae8 | ||
![]() |
70dc1820db | ||
![]() |
a760cb75a3 | ||
![]() |
1d0b912f75 | ||
![]() |
439e0718ce | ||
![]() |
4c57ba6ef3 | ||
![]() |
b4bae40da8 | ||
![]() |
e04cbd57ea | ||
![]() |
66664b7b46 | ||
![]() |
546b90d75f | ||
![]() |
14e83a52a4 | ||
![]() |
dc9fec9d03 | ||
![]() |
6d21d52d3e | ||
![]() |
3afb87486b | ||
![]() |
d0c0a55e6d | ||
![]() |
1919b0efcb | ||
![]() |
954d096261 | ||
![]() |
7e150c7a8a | ||
![]() |
77646bda78 | ||
![]() |
e6848a3ab0 | ||
![]() |
011f49616b | ||
![]() |
e1be3c0fd1 | ||
![]() |
3d950764a2 | ||
![]() |
fe16f999d8 | ||
![]() |
390c1d3f3d | ||
![]() |
49b5c29c11 | ||
![]() |
f86b495cc6 | ||
![]() |
a4d0a96ce5 | ||
![]() |
9d4ea75a18 | ||
![]() |
38427fa3c5 | ||
![]() |
7d369dec74 | ||
![]() |
58bef33bc7 | ||
![]() |
bd021b109c | ||
![]() |
7e15c2ac1b | ||
![]() |
3b1b994152 | ||
![]() |
4e69d7a78a | ||
![]() |
16166a36b5 | ||
![]() |
bcbe7cd870 | ||
![]() |
8dba91fbcc | ||
![]() |
29fe5780e9 | ||
![]() |
12686c0ab1 | ||
![]() |
a21d712f54 | ||
![]() |
2c7d18b331 | ||
![]() |
e353673005 | ||
![]() |
6b36bec8e9 | ||
![]() |
1be50cdddf | ||
![]() |
869b257bf8 | ||
![]() |
f165ebf9a3 | ||
![]() |
a6c168c289 | ||
![]() |
0057a8273c | ||
![]() |
876829a742 | ||
![]() |
f4519325ce | ||
![]() |
932367d061 | ||
![]() |
79643d963e | ||
![]() |
872b3f5d70 | ||
![]() |
ac4138a763 | ||
![]() |
0765537d29 | ||
![]() |
f2f9ba9f83 | ||
![]() |
20c1fab815 | ||
![]() |
d3fb1331f8 | ||
![]() |
13eafb9bf1 | ||
![]() |
1ef61a6e3d | ||
![]() |
0fb80a4ab5 | ||
![]() |
981b12b63d | ||
![]() |
508ee871b9 | ||
![]() |
c293a52f7a | ||
![]() |
acf2dd0ad1 | ||
![]() |
32bee2602c | ||
![]() |
d5ec17ec26 | ||
![]() |
e53c6b55bf | ||
![]() |
85da9fabdd | ||
![]() |
e15440af5e | ||
![]() |
26c2225a24 | ||
![]() |
cd06dc0535 | ||
![]() |
1b8ef411ee | ||
![]() |
95466b810f | ||
![]() |
0a41f3bb76 | ||
![]() |
9b247a746c | ||
![]() |
fcdde53774 | ||
![]() |
279cfb364b | ||
![]() |
3dcb2cad64 | ||
![]() |
a199188ede | ||
![]() |
8a84436d1b | ||
![]() |
231553f574 | ||
![]() |
37466cdffb | ||
![]() |
3cc417151d | ||
![]() |
d26718a711 | ||
![]() |
0644bc2967 | ||
![]() |
a2e4f1dc25 | ||
![]() |
9c952ab49d | ||
![]() |
aa52fe73a5 | ||
![]() |
fee6390281 | ||
![]() |
835ddb1de3 | ||
![]() |
b58f031bcc | ||
![]() |
3897a44ce6 | ||
![]() |
1ec88142b9 | ||
![]() |
70a5dde726 | ||
![]() |
f684349c18 | ||
![]() |
a08a9a4f10 | ||
![]() |
f719b87e69 | ||
![]() |
af1cbea966 | ||
![]() |
f3f53947bc | ||
![]() |
f0cc34cccf | ||
![]() |
c4a1175ad0 | ||
![]() |
333c452f44 | ||
![]() |
5801af34bb | ||
![]() |
da0c36cc88 | ||
![]() |
d8d98ade6a | ||
![]() |
c3157ad4d7 | ||
![]() |
6f686cb7fa | ||
![]() |
39981643a8 | ||
![]() |
28bdd1b2b3 | ||
![]() |
35f40e949b | ||
![]() |
115b7b82aa | ||
![]() |
d7c0ee47fe | ||
![]() |
0559d643b7 | ||
![]() |
8446a655bb | ||
![]() |
01d098dab5 | ||
![]() |
b6dd3914be | ||
![]() |
c2e45710ad | ||
![]() |
5da24a8ab5 | ||
![]() |
ac6b274a4f | ||
![]() |
f703ee2f26 | ||
![]() |
70b8f9868e | ||
![]() |
c69bafeb3f | ||
![]() |
f7c8c745c4 | ||
![]() |
861338b0fc | ||
![]() |
499fe44bde | ||
![]() |
ba74943844 | ||
![]() |
21f631e733 | ||
![]() |
b5c32a41de | ||
![]() |
c9373cbc97 | ||
![]() |
b5a73384d3 | ||
![]() |
4f699f3b58 | ||
![]() |
4ea598d76b | ||
![]() |
7e6b0a1c2b | ||
![]() |
d884512a76 | ||
![]() |
71450fb36e | ||
![]() |
4775f29194 | ||
![]() |
d5d5c7a55d | ||
![]() |
aa74934ae0 | ||
![]() |
0534482c22 | ||
![]() |
6fe1e86b31 | ||
![]() |
47983481c9 | ||
![]() |
383bc60ddb | ||
![]() |
d834f08cad | ||
![]() |
387ccd5cc3 | ||
![]() |
0fb775cd60 | ||
![]() |
f31ea39331 | ||
![]() |
56cc3fff53 | ||
![]() |
5f33a617ab | ||
![]() |
b3da62f77e | ||
![]() |
f1e5d02169 | ||
![]() |
7cad7a4bd0 | ||
![]() |
83a874e4fd | ||
![]() |
6eab2ddd57 | ||
![]() |
d944b4a21e | ||
![]() |
58f0245e83 | ||
![]() |
2f8382f100 | ||
![]() |
167bd45a6a | ||
![]() |
1e9decf193 | ||
![]() |
459e13dc76 | ||
![]() |
94e3d95d6c | ||
![]() |
eeb9139024 | ||
![]() |
486b6f40e5 | ||
![]() |
d3fdaa060a | ||
![]() |
766258e84b | ||
![]() |
8213bf41a8 | ||
![]() |
8843a8ee15 | ||
![]() |
6bb09256c5 | ||
![]() |
b2e6e1b56f | ||
![]() |
6b402e5215 | ||
![]() |
04baf673dc | ||
![]() |
10b7651eff | ||
![]() |
4f76d7291f | ||
![]() |
1c2be68253 | ||
![]() |
6c9d6940cc | ||
![]() |
b719455b78 | ||
![]() |
db16c8bea4 | ||
![]() |
abdaecb28d |
430 changed files with 77253 additions and 55125 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
|
465
.github/workflows/shared-build.yml
vendored
465
.github/workflows/shared-build.yml
vendored
|
@ -7,471 +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"
|
||||
uses: ./.github/workflows/shared-build-linux.yml
|
||||
with:
|
||||
environment: ${{inputs.environment}}
|
||||
|
||||
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: "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
|
||||
# Temporary workaround for PowerPC as the 1.24.0 version doesn't check for altivec
|
||||
# Will use older versions until a new tag is created with this issue resolved
|
||||
if [ ${{ matrix.architecture.name }} != 'powerpc' ] && [ ${{ matrix.architecture.name }} != 'ppc64' ] && [ ${{ matrix.architecture.name }} != 'ppc64el' ]; then
|
||||
echo "OPENAL_REF=1.24.0" >> $GITHUB_ENV
|
||||
else
|
||||
echo "OPENAL_REF=1.23.1" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
###
|
||||
# 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: ${{ env.OPENAL_REF }}
|
||||
|
||||
- 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"
|
||||
uses: ./.github/workflows/shared-build-windows.yml
|
||||
with:
|
||||
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.0'
|
||||
|
||||
# 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: "Building for platform macos-${{matrix.architecture.name}}"
|
||||
runs-on: "macos-14"
|
||||
uses: ./.github/workflows/shared-build-macos.yml
|
||||
with:
|
||||
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
|
||||
with:
|
||||
version: 2-latest
|
||||
build-type: Release
|
||||
cmake-arguments: "-DCMAKE_OSX_ARCHITECTURES=${{ matrix.architecture.name }}
|
||||
-DCMAKE_VERBOSE_MAKEFILE=on"
|
||||
###
|
||||
# OpenAL
|
||||
###
|
||||
|
||||
# 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
|
||||
with:
|
||||
repository: 'kcat/openal-soft'
|
||||
path: 'thirdparties/soft-oal'
|
||||
ref: '1.24.0'
|
||||
|
||||
- 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.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.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
|
||||
|
|
9
.github/workflows/tags-publish-release.yml
vendored
9
.github/workflows/tags-publish-release.yml
vendored
|
@ -38,8 +38,9 @@ jobs:
|
|||
'windows-x86-pdb',
|
||||
'windows-arm64',
|
||||
'windows-arm64-pdb',
|
||||
'macos-x86_64',
|
||||
'macos-arm64'
|
||||
#'macos-x86_64',
|
||||
#'macos-arm64',
|
||||
'macos-multiarch(arm64-x86_64)',
|
||||
]
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
@ -56,8 +57,8 @@ jobs:
|
|||
path: ${{github.workspace}}/${{matrix.target_os}}
|
||||
|
||||
- name: Zip
|
||||
working-directory: ${{github.workspace}}/${{matrix.target_os}}
|
||||
run: zip -r ../${{ env.RELEASE_NAME }}.zip ./
|
||||
working-directory: '${{github.workspace}}/${{matrix.target_os}}'
|
||||
run: zip -r "../${{ env.RELEASE_NAME }}.zip" ./
|
||||
|
||||
- name: Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(openmohaa)
|
||||
|
||||
include(TargetArch.cmake)
|
||||
include(misc/cmake/TargetArch.cmake)
|
||||
|
||||
target_architecture(TARGET_ARCH)
|
||||
list(LENGTH TARGET_ARCH TARGET_ARCH_COUNT)
|
||||
|
||||
set(USE_INTERNAL_LIBS ON)
|
||||
if(USE_SYSTEM_LIBS)
|
||||
|
@ -13,12 +14,13 @@ endif()
|
|||
option(USE_INTERNAL_JPEG "If set, use bundled libjpeg." ${USE_INTERNAL_LIBS})
|
||||
option(USE_INTERNAL_MAD "If set, use bundled libmad." ${USE_INTERNAL_LIBS})
|
||||
option(USE_INTERNAL_ZLIB "If set, use bundled zlib." ${USE_INTERNAL_LIBS})
|
||||
option(USE_RENDERER_DLOPEN "Whether to compile the renderer as separate pluggable modules" OFF)
|
||||
option(TARGET_LOCAL_SYSTEM "Indicate that the project will be compiled and installed for the local system" OFF)
|
||||
|
||||
if(TARGET_GAME_TYPE)
|
||||
message(SEND_ERROR "TARGET_GAME_TYPE is now unsupported, it is now done at runtime.")
|
||||
endif()
|
||||
|
||||
|
||||
set(TARGET_BASE_GAME "./")
|
||||
set(CMAKE_DEBUG_POSTFIX "-dbg")
|
||||
|
||||
|
@ -62,27 +64,39 @@ if(DEBUG_MEMORY)
|
|||
add_definitions(-D_DEBUG_MEM)
|
||||
endif()
|
||||
|
||||
IF("${TARGET_ARCH}" STREQUAL "i386")
|
||||
if("${TARGET_ARCH}" STREQUAL "i386")
|
||||
set(TARGET_ARCH_SUFFIX "x86")
|
||||
ELSE()
|
||||
else()
|
||||
set(TARGET_ARCH_SUFFIX ${TARGET_ARCH})
|
||||
ENDIF()
|
||||
endif()
|
||||
|
||||
message(STATUS "Architecture detected: ${TARGET_ARCH}")
|
||||
|
||||
if(TARGET_LOCAL_SYSTEM)
|
||||
add_definitions(-DTARGET_LOCAL_SYSTEM)
|
||||
# As it targets the local system, no need to know about the architecture used
|
||||
set(TARGET_BIN_SUFFIX "")
|
||||
message(STATUS "Binary suffix will not be used as the local system is the target")
|
||||
elseif(${TARGET_ARCH_COUNT} GREATER 1)
|
||||
add_definitions(-DTARGET_MULTIPLE_ARCHITECTURES)
|
||||
set(TARGET_BIN_SUFFIX ".multiarch")
|
||||
message(STATUS "Multiple architectures were specified, suffix set to 'multiarch'.")
|
||||
else()
|
||||
set(TARGET_BIN_SUFFIX ".${TARGET_ARCH}")
|
||||
message(STATUS "Binary suffix set to '${TARGET_ARCH_SUFFIX}'.")
|
||||
endif()
|
||||
|
||||
message(STATUS "Architecture detected: ${TARGET_ARCH}, suffix set to ${TARGET_ARCH_SUFFIX}.")
|
||||
|
||||
IF(WIN32)
|
||||
if(WIN32)
|
||||
set(TARGET_PLATFORM_PREFIX "")
|
||||
message(STATUS "Using Win32 naming convention")
|
||||
ELSEIF(UNIX)
|
||||
elseif(UNIX)
|
||||
set(TARGET_PLATFORM_PREFIX "")
|
||||
message(STATUS "Using Unix naming convention")
|
||||
ELSE()
|
||||
else()
|
||||
set(TARGET_PLATFORM_PREFIX "")
|
||||
ENDIF()
|
||||
endif()
|
||||
|
||||
IF(CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
if(CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_compile_definitions(_DEBUG)
|
||||
|
||||
# NOTE: The following may mess up function importation
|
||||
|
@ -91,10 +105,10 @@ IF(CMAKE_BUILD_TYPE MATCHES Debug)
|
|||
# set(CMAKE_ENABLE_EXPORTS ON)
|
||||
# message(STATUS "Enabling exports on Unix for backtrace")
|
||||
#endif()
|
||||
ELSE()
|
||||
else()
|
||||
# Non-debug builds
|
||||
add_compile_definitions(NDEBUG)
|
||||
ENDIF()
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
# macOS doesn't search the executable path by default
|
||||
|
@ -120,7 +134,7 @@ if(WIN32)
|
|||
set(LIB_INSTALL_SUBDIR ".")
|
||||
else()
|
||||
# Unix
|
||||
set(CMAKE_DEFAULT_INSTALL_RUNTIME_DIR lib)
|
||||
set(CMAKE_DEFAULT_INSTALL_RUNTIME_DIR lib${CMAKE_LIB_SUFFIX})
|
||||
set(BIN_INSTALL_SUBDIR ${CMAKE_PROJECT_NAME})
|
||||
set(LIB_INSTALL_SUBDIR ${CMAKE_PROJECT_NAME})
|
||||
endif()
|
||||
|
@ -171,21 +185,17 @@ if (NOT BUILD_NO_CLIENT)
|
|||
##
|
||||
## Client app
|
||||
##
|
||||
option(NO_MODERN_DMA "Use older sound-system" FALSE)
|
||||
|
||||
add_subdirectory("code/client")
|
||||
add_subdirectory("code/renderer")
|
||||
add_subdirectory("code/renderercommon")
|
||||
add_subdirectory("code/sdl")
|
||||
|
||||
#include("code/renderergl2/glsl/shaders.cmake")
|
||||
#file(GLOB_RECURSE SOURCES_RENDERER "code/sdl/*.c" "code/renderercommon/*.c" "code/renderergl2/*.c" "code/renderergl2/*.cpp")
|
||||
#list(FILTER SOURCES_RENDERER EXCLUDE REGEX "code/renderergl2/tr_subs.c")
|
||||
#list(FILTER SOURCES_RENDERER EXCLUDE REGEX "code/renderergl2/tr_model.c")
|
||||
|
||||
add_executable(openmohaa "misc/dummy.c")
|
||||
target_link_libraries(openmohaa PRIVATE syslib)
|
||||
target_link_libraries(openmohaa PRIVATE omohserver)
|
||||
target_link_libraries(openmohaa PRIVATE omohclient)
|
||||
target_link_libraries(openmohaa PRIVATE omohrenderer omohsdl)
|
||||
target_link_libraries(openmohaa PRIVATE omohrenderer)
|
||||
target_link_libraries(openmohaa PRIVATE qcommon qcommon_standalone)
|
||||
|
||||
# Add the gamespy dependency
|
||||
|
@ -260,4 +270,3 @@ if(NOT TARGET uninstall)
|
|||
add_custom_target(uninstall
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
|
||||
endif()
|
||||
|
||||
|
|
20
README.md
20
README.md
|
@ -10,13 +10,15 @@
|
|||
|
||||
## Intro
|
||||
|
||||
The main goal of OpenMoHAA is to ensure the future and continuity of **Medal of Honor: Allied Assault** on all platforms/architectures by providing new patches/features. Thanks to the ioquake3 project and the F.A.K.K SDK, OpenMoHAA has already reached more than half of its goal: an open-source version of MoH:AA (based on version 2.40) that is fully compatible with the original game (in terms of protocol, assets, and scripts).
|
||||
The main goal of OpenMoHAA is to ensure the future and continuity of **Medal of Honor: Allied Assault** (including Spearhead and Breakthrough expansions) on all platforms/architectures by providing new patches/features. Thanks to the ioquake3 project and the F.A.K.K SDK, OpenMoHAA has already reached more than half of its goal: an open-source version of MoH:AA (based on version 2.40) that is fully compatible with both the original game and expansions, in terms of network protocol, assets, and scripts. OpenMoHAA is compatible with both MOH:AA servers and clients (Spearhead and Breakthrough included).
|
||||
|
||||
## Getting started
|
||||
|
||||
- [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
|
||||
|
||||
|
@ -26,16 +28,22 @@ The entire single-player campaign should work (Allied Assault, Spearhead and Bre
|
|||
|
||||
### Multiplayer
|
||||
|
||||
The Multiplayer part is almost fully stable.
|
||||
The Multiplayer part is almost fully stable, all game modes including `Tug-of-War` from Medal of Honor: Spearhead, and `Liberation` from Medal of Honor: Breakthrough are implemented and are working as intended. Mods like `Freeze-Tag` are working as well.
|
||||
|
||||
Server admins can use OpenMoHAA to [host](docs/getting_started_installation.md#server) a mohaa/mohaas/mohaab server. Bugs must be reported by creating a new [issue](https://github.com/openmoh/openmohaa/issues) on the OpenMoHAA GitHub project. Players can use OpenMoHAA to [play](docs/getting_started_installation.md#client) on a mohaa/mohaas/mohaab server.
|
||||
OpenMoHAA can be used to [host](docs/getting_started_installation.md#server) a mohaa/mohaas/mohaab server and players can use OpenMoHAA to [play](docs/getting_started_installation.md#client) on any server. If some bugs/strange behavior occurs, the best way to report them is by [creating a new issue](https://github.com/openmoh/openmohaa/issues) on the [OpenMoHAA GitHub](https://github.com/openmoh/openmohaa) project with the steps to reproduce (with eventually the problematic mods).
|
||||
|
||||
All game modes including `Tug-of-War` from Medal of Honor: Spearhead, and `Liberation` from Medal of Honor: Breakthrough are implemented and are working as intended. Mods like `Freeze-Tag` are working as well.
|
||||
One of the big multiplayer features are bots. They were introduced for testing and for entertainment purposes so players can have fun alone. See [Configuring bots](docs/configuration/server.md#bots) in the dedicated server configuration documentation to set them up.
|
||||
|
||||
## 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,3 +1,5 @@
|
|||
cmake_minimum_required(VERSION 3.12)
|
||||
|
||||
project(Launcher)
|
||||
|
||||
set(LAUNCHER_SOURCES "${CMAKE_SOURCE_DIR}/code/Launcher/launch_main.cpp")
|
||||
|
|
|
@ -38,9 +38,9 @@ const char* targetGameList[] =
|
|||
int main(int argc, const char* argv[]) {
|
||||
std::vector<std::string> argumentList;
|
||||
#if !defined(DEDICATED) || !DEDICATED
|
||||
const char* programName = "openmohaa" "." ARCH_STRING DLL_SUFFIX EXE_EXT;
|
||||
const char* programName = "openmohaa" ARCH_SUFFIX DLL_SUFFIX EXE_EXT;
|
||||
#else
|
||||
const char* programName = "omohaaded" "." ARCH_STRING DLL_SUFFIX EXE_EXT;
|
||||
const char* programName = "omohaaded" ARCH_SUFFIX DLL_SUFFIX EXE_EXT;
|
||||
#endif
|
||||
|
||||
argumentList.push_back("+set");
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(cgame)
|
||||
|
||||
# Shared source files for modules
|
||||
|
|
|
@ -3866,7 +3866,7 @@ void ClientGameCommandManager::PlaySound(
|
|||
}
|
||||
|
||||
if (!name || !soundAlias) {
|
||||
Com_Printf(
|
||||
cgi.DPrintf(
|
||||
"\nERROR PlaySound: %s needs an alias in ubersound.scr or uberdialog.scr - Please fix.\n",
|
||||
sound_name.c_str()
|
||||
);
|
||||
|
@ -4066,7 +4066,7 @@ void ClientGameCommandManager::StopAliasChannel(Event *ev)
|
|||
}
|
||||
|
||||
if (!name || !soundAlias) {
|
||||
Com_Printf("\nERROR stopaliaschannel: couldn't find alias %s\n", sound_name.c_str());
|
||||
cgi.DPrintf("\nERROR stopaliaschannel: couldn't find alias %s\n", sound_name.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4145,8 +4145,8 @@ void ClientGameCommandManager::StopLoopSound(Event* ev)
|
|||
return;
|
||||
}
|
||||
|
||||
Com_Printf("\n\nClientGameCommandManager::StopLoopSound\n\n");
|
||||
current_centity->tikiLoopSound = NULL;
|
||||
cgi.DPrintf("\n\nClientGameCommandManager::StopLoopSound\n\n");
|
||||
current_centity->tikiLoopSound = (sfxHandle_t)0;
|
||||
}
|
||||
|
||||
//===============
|
||||
|
@ -4265,7 +4265,7 @@ qboolean bLoadForMap(const char *psMapsBuffer, const char *name)
|
|||
}
|
||||
|
||||
if (!token || !token[0]) {
|
||||
Com_Printf("ERROR bLoadForMap: %s alias with empty maps specification.\n", name);
|
||||
cgi.DPrintf("ERROR bLoadForMap: %s alias with empty maps specification.\n", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -5179,7 +5179,7 @@ void CG_ProcessInitCommands(dtiki_t *tiki, refEntity_t *ent)
|
|||
}
|
||||
|
||||
if (!commandManager.SelectProcessEvent(ev)) {
|
||||
Com_Printf(
|
||||
cgi.DPrintf(
|
||||
"^~^~^ CG_ProcessInitCommands: Bad init client command '%s' in '%s'\n", pcmd->args[0], tiki->name
|
||||
);
|
||||
}
|
||||
|
@ -5225,7 +5225,7 @@ void CG_ProcessCacheInitCommands(dtiki_t *tiki)
|
|||
}
|
||||
|
||||
if (!commandManager.SelectProcessEvent(ev)) {
|
||||
Com_Printf(
|
||||
cgi.DPrintf(
|
||||
"^~^~^ CG_ProcessInitCommands: Bad init client command '%s' in '%s'\n", pcmd->args[0], tiki->name
|
||||
);
|
||||
}
|
||||
|
@ -5298,7 +5298,7 @@ qboolean CG_ProcessEntityCommands(int frame, int anim, int entnum, refEntity_t *
|
|||
current_centity = cent;
|
||||
current_entity_number = entnum;
|
||||
current_tiki = ent->tiki;
|
||||
CG_AnimationDebugMessage(entnum, "Processing Ent Commands: Entity: %3d Anim:#(%i) Frame:#(%i)\n", anim, frame);
|
||||
CG_AnimationDebugMessage(entnum, "Processing Ent Commands: Entity: %3d Anim:#(%i) Frame:#(%i)\n", entnum, anim, frame);
|
||||
|
||||
for (i = 0; i < tikicmds.num_cmds; i++) {
|
||||
Event *ev;
|
||||
|
@ -5840,7 +5840,7 @@ void ClientGameCommandManager::SetCurrentTiki(Event *ev)
|
|||
str tikiName;
|
||||
|
||||
if (ev->NumArgs() != 1) {
|
||||
Com_Printf("ERROR: settiki command takes 1 parameter.\n");
|
||||
cgi.DPrintf("ERROR: settiki command takes 1 parameter.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -705,5 +705,5 @@ int CG_WeaponCommandButtonBits(void)
|
|||
cg.iWeaponCommand = 0;
|
||||
}
|
||||
|
||||
return iShiftedWeaponCommand & WEAPON_COMMAND_MASK;
|
||||
return iShiftedWeaponCommand & GetWeaponCommandMask(cg_protocol >= PROTOCOL_MOHTA_MIN ? WEAPON_COMMAND_MAX_VER17 : WEAPON_COMMAND_MAX_VER6);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -191,8 +191,8 @@ void CG_DrawDisconnect(void)
|
|||
}
|
||||
|
||||
handle = cgi.R_RegisterShader("gfx/2d/net.tga");
|
||||
w = cgi.R_GetShaderWidth(handle);
|
||||
h = cgi.R_GetShaderHeight(handle);
|
||||
w = cgi.R_GetShaderWidth(handle) * cgs.uiHiResScale[0];
|
||||
h = cgi.R_GetShaderHeight(handle) * cgs.uiHiResScale[1];
|
||||
x = ((float)cgs.glconfig.vidWidth - w) * 0.5;
|
||||
y = (float)cgs.glconfig.vidHeight - h;
|
||||
|
||||
|
@ -331,7 +331,7 @@ static void CG_DrawPauseIcon()
|
|||
x = (cgs.glconfig.vidWidth - w) / 2.f;
|
||||
|
||||
cgi.R_SetColor(colorWhite);
|
||||
cgi.R_DrawStretchPic(x, y, w, h, 0, 0, 1, 1, handle);
|
||||
cgi.R_DrawStretchPic(x, y, w * cgs.uiHiResScale[0], h * cgs.uiHiResScale[1], 0, 0, 1, 1, handle);
|
||||
}
|
||||
|
||||
static void CG_DrawServerLag()
|
||||
|
@ -362,8 +362,8 @@ static void CG_DrawServerLag()
|
|||
}
|
||||
|
||||
handle = cgi.R_RegisterShader("gfx/2d/slowserver");
|
||||
w = (float)cgi.R_GetShaderWidth(handle) / 4;
|
||||
h = (float)cgi.R_GetShaderHeight(handle) / 4;
|
||||
w = (float)cgi.R_GetShaderWidth(handle) * cgs.uiHiResScale[0] / 4;
|
||||
h = (float)cgi.R_GetShaderHeight(handle) * cgs.uiHiResScale[1] / 4;
|
||||
x = ((float)cgs.glconfig.vidWidth - w) / 2;
|
||||
y = (float)cgs.glconfig.vidHeight - h;
|
||||
cgi.R_DrawStretchPic(x, y, w, h, 0.0, 0.0, 1.0, 1.0, handle);
|
||||
|
@ -580,11 +580,15 @@ void CG_HudDrawElements()
|
|||
int i;
|
||||
float fX, fY;
|
||||
float fWidth, fHeight;
|
||||
vec2_t virtualScale;
|
||||
|
||||
if (!cg_huddraw_force->integer && !cg_hud->integer) {
|
||||
return;
|
||||
}
|
||||
|
||||
virtualScale[0] = cgs.glconfig.vidWidth / 640.0;
|
||||
virtualScale[1] = cgs.glconfig.vidHeight / 480.0;
|
||||
|
||||
for (i = 0; i < MAX_HUDDRAW_ELEMENTS; i++) {
|
||||
if ((!cgi.HudDrawElements[i].hShader && !cgi.HudDrawElements[i].string[0])
|
||||
|| !cgi.HudDrawElements[i].vColor[3]) {
|
||||
|
@ -597,6 +601,13 @@ void CG_HudDrawElements()
|
|||
fWidth = cgi.HudDrawElements[i].iWidth;
|
||||
fHeight = cgi.HudDrawElements[i].iHeight;
|
||||
|
||||
if (!cgi.HudDrawElements[i].bVirtualScreen) {
|
||||
fWidth *= cgs.uiHiResScale[0];
|
||||
fHeight *= cgs.uiHiResScale[1];
|
||||
fX *= cgs.uiHiResScale[0];
|
||||
fY *= cgs.uiHiResScale[1];
|
||||
}
|
||||
|
||||
if (cgi.HudDrawElements[i].iHorizontalAlign == HUD_ALIGN_X_CENTER) {
|
||||
if (cgi.HudDrawElements[i].bVirtualScreen) {
|
||||
fX += 320.0 - fWidth * 0.5;
|
||||
|
@ -627,23 +638,21 @@ void CG_HudDrawElements()
|
|||
|
||||
cgi.R_SetColor(cgi.HudDrawElements[i].vColor);
|
||||
if (cgi.HudDrawElements[i].string[0]) {
|
||||
if (cgi.HudDrawElements[i].pFont) {
|
||||
cgi.R_DrawString(
|
||||
cgi.HudDrawElements[i].pFont,
|
||||
cgi.LV_ConvertString(cgi.HudDrawElements[i].string),
|
||||
fX,
|
||||
fY,
|
||||
-1,
|
||||
cgi.HudDrawElements[i].bVirtualScreen
|
||||
);
|
||||
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);
|
||||
} else {
|
||||
cgi.R_DrawString(
|
||||
cgs.media.hudDrawFont,
|
||||
pFont,
|
||||
cgi.LV_ConvertString(cgi.HudDrawElements[i].string),
|
||||
fX,
|
||||
fY,
|
||||
fX / cgs.uiHiResScale[0],
|
||||
fY / cgs.uiHiResScale[1],
|
||||
-1,
|
||||
cgi.HudDrawElements[i].bVirtualScreen
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -734,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, fWidth, 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;
|
||||
|
@ -743,11 +762,25 @@ 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, -1, 0);
|
||||
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, -1, 0);
|
||||
fHeight = fObjectivesTop + 35;
|
||||
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) {
|
||||
qhandle_t hBoxShader;
|
||||
|
@ -785,7 +818,14 @@ void CG_DrawObjectives()
|
|||
cgi.R_SetColor(vColor);
|
||||
fX = 55.0;
|
||||
fY = fHeight;
|
||||
cgi.R_DrawString(cgs.media.objectiveFont, cgi.LV_ConvertString(cg.Objectives[i].text), 55.0, fHeight, -1, 0);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.objectiveFont,
|
||||
cgi.LV_ConvertString(cg.Objectives[i].text),
|
||||
55.0,
|
||||
fY / cgs.uiHiResScale[1],
|
||||
-1,
|
||||
cgs.uiHiResScale
|
||||
);
|
||||
|
||||
fX = 30.0;
|
||||
fY = fHeight;
|
||||
|
@ -794,9 +834,19 @@ void CG_DrawObjectives()
|
|||
vColor[2] = 1.0;
|
||||
vColor[3] = cg.ObjectivesCurrentAlpha;
|
||||
cgi.R_SetColor(vColor);
|
||||
cgi.R_DrawStretchPic(fX, fY, 16.0, 16.0, 0.0, 0.0, 1.0, 1.0, hBoxShader);
|
||||
cgi.R_DrawStretchPic(
|
||||
fX * cgs.uiHiResScale[0],
|
||||
fY,
|
||||
16.0 * cgs.uiHiResScale[0],
|
||||
16.0 * cgs.uiHiResScale[1],
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
hBoxShader
|
||||
);
|
||||
|
||||
fHeight += iNumLines[i] * 12 + 25;
|
||||
fHeight += iNumLines[i] * 12 + 25 * cgs.uiHiResScale[1];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -820,7 +870,17 @@ void CG_DrawPlayerTeam()
|
|||
|
||||
if (handle) {
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawStretchPic(96.0, cgs.glconfig.vidHeight - 46, 24.0, 24.0, 0.0, 0.0, 1.0, 1.0, handle);
|
||||
cgi.R_DrawStretchPic(
|
||||
96.0 * cgs.uiHiResScale[0],
|
||||
cgs.glconfig.vidHeight - 46 * cgs.uiHiResScale[1],
|
||||
24.0 * cgs.uiHiResScale[0],
|
||||
24.0 * cgs.uiHiResScale[1],
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
handle
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -862,13 +922,28 @@ void CG_DrawPlayerEntInfo()
|
|||
|
||||
if (handle) {
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawStretchPic(56.0, fY, 16.0, 16.0, 0.0, 0.0, 1.0, 1.0, handle);
|
||||
fX = 56.0 + 24.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_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.hudDrawFont, (char *)pszName, fX, fY, -1, 0);
|
||||
cgi.R_DrawString(cgs.media.hudDrawFont, va("%i", cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]), fX, fY + 20.0, -1, 0);
|
||||
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()
|
||||
|
@ -907,7 +982,17 @@ void CG_UpdateAttackerDisplay()
|
|||
|
||||
if (handle) {
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawStretchPic(56.0, fY, 24.0, 24.0, 0.0, 0.0, 1.0, 1.0, handle);
|
||||
cgi.R_DrawStretchPic(
|
||||
56.0 * cgs.uiHiResScale[0],
|
||||
fY,
|
||||
24.0 * cgs.uiHiResScale[0],
|
||||
24.0 * cgs.uiHiResScale[1],
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
handle
|
||||
);
|
||||
}
|
||||
|
||||
if ((cg.snap->ps.stats[STAT_TEAM] == TEAM_ALLIES || cg.snap->ps.stats[STAT_TEAM] == TEAM_AXIS)
|
||||
|
@ -921,7 +1006,7 @@ void CG_UpdateAttackerDisplay()
|
|||
color[2] = 0.5;
|
||||
}
|
||||
|
||||
fX = 56.0 + 32.0;
|
||||
fX = 56.0;
|
||||
} else {
|
||||
color[0] = 1.0;
|
||||
color[1] = 0.5;
|
||||
|
@ -929,7 +1014,9 @@ void CG_UpdateAttackerDisplay()
|
|||
}
|
||||
|
||||
cgi.R_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszName, fX, fY, -1, 0);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszName, fX / cgs.uiHiResScale[0] + 32.0, fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
|
||||
void CG_UpdateCountdown()
|
||||
|
@ -960,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");
|
||||
|
@ -1043,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, y, w, h, 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()
|
||||
|
@ -1066,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, fY, -1, qfalse);
|
||||
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) {
|
||||
|
@ -1082,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, fY, -1, 0);
|
||||
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)) {
|
||||
|
@ -1093,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, fY, -1, 0);
|
||||
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)) {
|
||||
|
@ -1106,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, fY, -1, 0);
|
||||
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 & 0x80) != 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;
|
||||
|
@ -1127,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, fY, -1, 0);
|
||||
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");
|
||||
|
@ -1139,9 +1252,18 @@ void CG_DrawSpectatorView_ver_15()
|
|||
}
|
||||
|
||||
if (hShader) {
|
||||
fX -= 20.0;
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawStretchPic(fX, fY, 16.0, 16.0, 0.0, 0.0, 1.0, 1.0, hShader);
|
||||
cgi.R_DrawStretchPic(
|
||||
fX - 20.0 * cgs.uiHiResScale[0],
|
||||
fY,
|
||||
16.0 * cgs.uiHiResScale[0],
|
||||
16.0 * cgs.uiHiResScale[1],
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
hShader
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1173,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, fY, -1, 0);
|
||||
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);
|
||||
|
@ -1187,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, fY, -1, 0);
|
||||
cgi.R_DrawString(
|
||||
cgs.media.attackerFont, pszString, fX / cgs.uiHiResScale[0], fY / cgs.uiHiResScale[1], -1, cgs.uiHiResScale
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1233,6 +1363,9 @@ void CG_DrawCrosshair()
|
|||
return;
|
||||
}
|
||||
|
||||
// Fixed in OPM: R_RegisterShaderNoMip
|
||||
// Use R_RegisterShaderNoMip, as it's UI stuff
|
||||
|
||||
if (cgs.gametype != GT_FFA) {
|
||||
AngleVectorsLeft(cg.refdefViewAngles, forward, NULL, NULL);
|
||||
|
||||
|
@ -1260,23 +1393,23 @@ void CG_DrawCrosshair()
|
|||
|| ((myFlags & EF_AXIS) && (friendEnt->currentState.eFlags & EF_AXIS))) {
|
||||
// friend
|
||||
if (cg.snap->ps.stats[STAT_CROSSHAIR]) {
|
||||
shader = cgi.R_RegisterShader(cg_crosshair_friend->string);
|
||||
shader = cgi.R_RegisterShaderNoMip(cg_crosshair_friend->string);
|
||||
}
|
||||
} else {
|
||||
// enemy
|
||||
if (cg.snap->ps.stats[STAT_CROSSHAIR]) {
|
||||
shader = cgi.R_RegisterShader(cg_crosshair->string);
|
||||
shader = cgi.R_RegisterShaderNoMip(cg_crosshair->string);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (cg.snap->ps.stats[STAT_CROSSHAIR]) {
|
||||
shader = cgi.R_RegisterShader(cg_crosshair->string);
|
||||
shader = cgi.R_RegisterShaderNoMip(cg_crosshair->string);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// FFA
|
||||
if (cg.snap->ps.stats[STAT_CROSSHAIR]) {
|
||||
shader = cgi.R_RegisterShader(cg_crosshair->string);
|
||||
shader = cgi.R_RegisterShaderNoMip(cg_crosshair->string);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1287,7 +1420,7 @@ void CG_DrawCrosshair()
|
|||
y = (cgs.glconfig.vidHeight - height) * 0.5f;
|
||||
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawStretchPic(x, y, width, height, 0, 0, 1, 1, shader);
|
||||
cgi.R_DrawStretchPic(x, y, width * cgs.uiHiResScale[0], height * cgs.uiHiResScale[1], 0, 0, 1, 1, shader);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1318,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, qfalse);
|
||||
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%%",
|
||||
|
@ -1338,7 +1473,9 @@ void CG_DrawVote()
|
|||
percentNo,
|
||||
cgi.LV_ConvertString("Undecided"),
|
||||
percentUndecided);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, text, x, y, -1, qfalse);
|
||||
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;
|
||||
|
@ -1347,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, qfalse);
|
||||
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, qfalse);
|
||||
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;
|
||||
|
@ -380,6 +382,7 @@ extern "C" {
|
|||
float screenXScale; // derived from glconfig
|
||||
float screenYScale;
|
||||
float screenXBias;
|
||||
vec2_t uiHiResScale;
|
||||
|
||||
int serverCommandSequence; // reliable command stream counter
|
||||
int processedSnapshotNum; // the number of snapshots cgame has requested
|
||||
|
@ -505,9 +508,16 @@ extern "C" {
|
|||
extern cvar_t *cg_shadowdebug;
|
||||
extern cvar_t *ui_timemessage;
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
//
|
||||
extern cvar_t *cg_fov;
|
||||
extern cvar_t *cg_cheats;
|
||||
|
||||
//
|
||||
// cg_main.c
|
||||
//
|
||||
qboolean CG_UseLargeLightmaps(const char* mapName);
|
||||
void CG_ProcessConfigString(int num, qboolean modelOnly);
|
||||
const char *CG_ConfigString(int index);
|
||||
void CG_AddToTeamChat(const char *str);
|
||||
|
@ -523,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
|
||||
|
|
|
@ -112,6 +112,12 @@ cvar_t *cg_shadowscount;
|
|||
cvar_t *cg_shadowdebug;
|
||||
cvar_t *ui_timemessage;
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
//
|
||||
cvar_t *cg_fov;
|
||||
cvar_t *cg_cheats;
|
||||
|
||||
/*
|
||||
=================
|
||||
CG_RegisterCvars
|
||||
|
@ -203,6 +209,32 @@ void CG_RegisterCvars(void)
|
|||
// see if we are also running the server on this machine
|
||||
temp = cgi.Cvar_Get("sv_running", "0", 0);
|
||||
cgs.localServer = temp->integer;
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
//
|
||||
|
||||
cg_fov = cgi.Cvar_Get("cg_fov", "80", CVAR_ARCHIVE);
|
||||
cg_cheats = cgi.Cvar_Get("cheats", "0", CVAR_USERINFO | CVAR_SERVERINFO | CVAR_LATCH);
|
||||
}
|
||||
/*
|
||||
===============
|
||||
CG_UseLargeLightmaps
|
||||
|
||||
Added in 2.0
|
||||
Returns true if the standard BSP file should be used, false if the smaller lightmap BSP file should be used
|
||||
===============
|
||||
*/
|
||||
qboolean CG_UseLargeLightmaps(const char* mapName) {
|
||||
char buffer[MAX_QPATH];
|
||||
|
||||
Com_sprintf(buffer, sizeof(buffer), "maps/%s_sml.bsp", mapName);
|
||||
|
||||
if (cgi.FS_ReadFile(buffer, NULL, qtrue) == -1) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
return cgi.Cvar_Get("r_largemap", "0", 0)->integer;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -335,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)) {
|
||||
|
@ -342,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -570,6 +608,7 @@ void CG_GetRendererConfig(void)
|
|||
cgi.GetGlconfig(&cgs.glconfig);
|
||||
cgs.screenXScale = cgs.glconfig.vidWidth / 640.0;
|
||||
cgs.screenYScale = cgs.glconfig.vidHeight / 480.0;
|
||||
cgi.UI_GetHighResolutionScale(cgs.uiHiResScale);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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,6 +786,123 @@ 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;
|
||||
|
@ -757,8 +910,22 @@ void CG_UpdateForceModels()
|
|||
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];
|
||||
|
@ -1200,7 +1399,9 @@ void CG_ModelAnim(centity_t *cent, qboolean bDoShaderTime)
|
|||
if (!cg.pLastPlayerWorldModel || cg.pLastPlayerWorldModel != model.tiki) {
|
||||
qhandle_t hModel;
|
||||
char fpsname[128];
|
||||
|
||||
COM_StripExtension(model.tiki->a->name, fpsname, sizeof(fpsname));
|
||||
Q_strcat(fpsname, sizeof(fpsname), "_fps.tik");
|
||||
|
||||
hModel = cgi.R_RegisterModel(fpsname);
|
||||
if (hModel) {
|
||||
|
@ -1211,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);
|
||||
|
|
|
@ -330,7 +330,17 @@ static void CG_InterpolatePlayerStateCamera(void)
|
|||
//
|
||||
VectorCopy(cg.predicted_player_state.camera_angles, cg.camera_angles);
|
||||
VectorCopy(cg.predicted_player_state.camera_origin, cg.camera_origin);
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
// Use the specified fov specified by the server
|
||||
// when zooming
|
||||
//
|
||||
if (cg.predicted_player_state.stats[STAT_INZOOM]) {
|
||||
cg.camera_fov = cg.predicted_player_state.fov;
|
||||
} else {
|
||||
cg.camera_fov = cg_fov->value;
|
||||
}
|
||||
|
||||
// if the next frame is a teleport, we can't lerp to it
|
||||
if (cg.nextFrameCameraCut) {
|
||||
|
@ -343,8 +353,12 @@ static void CG_InterpolatePlayerStateCamera(void)
|
|||
|
||||
f = (float)(cg.time - prev->serverTime) / (next->serverTime - prev->serverTime);
|
||||
|
||||
if (cg.predicted_player_state.stats[STAT_INZOOM]) {
|
||||
// interpolate fov
|
||||
cg.camera_fov = prev->ps.fov + f * (next->ps.fov - prev->ps.fov);
|
||||
} else {
|
||||
cg.camera_fov = cg_fov->value;
|
||||
}
|
||||
|
||||
if (!(cg.snap->ps.pm_flags & PMF_CAMERA_VIEW)) {
|
||||
return;
|
||||
|
|
|
@ -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);
|
||||
|
@ -312,12 +313,12 @@ functions exported to the main executable
|
|||
); // 0 = white
|
||||
fontheader_t *(*R_LoadFont)(const char *name);
|
||||
void (*R_DrawString)(
|
||||
fontheader_t *font, const char *text, float x, float y, int maxLen, qboolean virtualScreen
|
||||
fontheader_t *font, const char *text, float x, float y, int maxLen, const float *pvVirtualScreen
|
||||
);
|
||||
refEntity_t *(*R_GetRenderEntity)(int entityNumber);
|
||||
void (*R_ModelBounds)(clipHandle_t model, vec3_t mins, vec3_t maxs);
|
||||
float (*R_ModelRadius)(clipHandle_t model);
|
||||
float (*R_Noise)(float x, float y, float z, float t);
|
||||
float (*R_Noise)(float x, float y, float z, double t);
|
||||
void (*R_DebugLine)(const vec3_t start, const vec3_t end, float r, float g, float b, float alpha);
|
||||
baseshader_t *(*GetShader)(int shaderNum);
|
||||
// =========== Swipes =============
|
||||
|
@ -363,6 +364,7 @@ functions exported to the main executable
|
|||
int (*UI_FontStringWidth)(fontheader_t *font, const char *string, int maxLen);
|
||||
// Added in 2.0
|
||||
float (*UI_GetObjectivesTop)(void);
|
||||
void (*UI_GetHighResolutionScale)(vec2_t scale);
|
||||
|
||||
int (*Key_StringToKeynum)(const char *str);
|
||||
const char *(*Key_KeynumToBindString)(int keyNum);
|
||||
|
|
|
@ -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"
|
||||
|
||||
/*
|
||||
================
|
||||
|
@ -190,7 +189,11 @@ void CG_ParseServerinfo(void)
|
|||
Q_strncpyz(map, mapname, sizeof(map));
|
||||
}
|
||||
|
||||
if (CG_UseLargeLightmaps(mapname)) {
|
||||
Com_sprintf(cgs.mapname, sizeof(cgs.mapname), "maps/%s.bsp", map);
|
||||
} else {
|
||||
Com_sprintf(cgs.mapname, sizeof(cgs.mapname), "maps/%s_sml.bsp", map);
|
||||
}
|
||||
|
||||
// hide/show huds
|
||||
if (cgs.gametype) {
|
||||
|
@ -454,233 +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",
|
||||
};
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2023 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -20,15 +20,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "../tr_local.h"
|
||||
// DESCRIPTION:
|
||||
// cg_servercmds_filter.h -- filtered server commands
|
||||
|
||||
int RE_MapVersion(void)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return 0;
|
||||
}
|
||||
#pragma once
|
||||
|
||||
void RE_PrintBSPFileSizes(void)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
#include "cg_local.h"
|
||||
|
||||
qboolean CG_IsStatementFiltered(char *cmd);
|
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
|
|
@ -298,7 +298,7 @@ void CG_OffsetFirstPersonView(refEntity_t *pREnt, qboolean bUseWorldPosition)
|
|||
|
||||
VectorCopy(origin, vOldOrigin);
|
||||
|
||||
if (!cg.predicted_player_state.walking || !(cg.predicted_player_state.pm_flags & PMF_FROZEN)) {
|
||||
if (!cg.predicted_player_state.walking || (!(cg.predicted_player_state.pm_flags & PMF_FROZEN) && !(cg.predicted_player_state.pm_flags & PMF_NO_MOVE))) {
|
||||
VectorCopy(cg.predicted_player_state.velocity, vVelocity);
|
||||
} else {
|
||||
//
|
||||
|
@ -485,8 +485,15 @@ static int CG_CalcFov(void)
|
|||
int contents;
|
||||
float fov_x, fov_y;
|
||||
int inwater;
|
||||
float fov_ratio;
|
||||
|
||||
fov_ratio = (float)cg.refdef.width / (float)cg.refdef.height * (3.0 / 4.0);
|
||||
if (fov_ratio == 1) {
|
||||
fov_x = cg.camera_fov;
|
||||
} else {
|
||||
fov_x = RAD2DEG(atan(tan(DEG2RAD(cg.camera_fov / 2.0)) * fov_ratio)) * 2.0;
|
||||
}
|
||||
|
||||
x = cg.refdef.width / tan(fov_x / 360 * M_PI);
|
||||
fov_y = atan2(cg.refdef.height, x);
|
||||
fov_y = fov_y * 360 / M_PI;
|
||||
|
@ -840,6 +847,15 @@ void CG_DrawActiveFrame(int serverTime, int frameTime, stereoFrame_t stereoView,
|
|||
// no entities should be marked as interpolating
|
||||
}
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
// Clamp the fov to avoid artifacts
|
||||
if (cg_fov->value < 65) {
|
||||
cgi.Cvar_Set("cg_fov", "65");
|
||||
} else if (cg_fov->value > 120) {
|
||||
cgi.Cvar_Set("cg_fov", "120");
|
||||
}
|
||||
|
||||
// update cg.predicted_player_state
|
||||
CG_PredictPlayerState();
|
||||
|
||||
|
@ -947,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
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
project(omohclient)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
|
||||
option(NO_OPENAL "Use older sound-system" FALSE)
|
||||
project(omohclient)
|
||||
|
||||
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)
|
||||
target_compile_definitions(omohclient INTERFACE USE_OPENAL_DLOPEN=1)
|
||||
target_compile_features(omohclient INTERFACE cxx_nullptr)
|
||||
target_compile_features(omohclient INTERFACE c_variadic_macros)
|
||||
target_link_libraries(omohclient INTERFACE omohsdl)
|
||||
target_link_libraries(omohclient INTERFACE omohsdl_client)
|
||||
target_link_libraries(omohclient INTERFACE gcd)
|
||||
|
||||
# Sound stuff
|
||||
target_compile_definitions(omohclient INTERFACE USE_CODEC_MP3)
|
||||
|
||||
if (NOT NO_OPENAL)
|
||||
if (NOT NO_MODERN_DMA)
|
||||
# Use OpenAL
|
||||
find_package(OpenAL REQUIRED)
|
||||
|
||||
|
@ -31,7 +34,13 @@ if (NOT NO_OPENAL)
|
|||
else()
|
||||
target_include_directories(omohclient INTERFACE ${OPENAL_INCLUDE_DIR})
|
||||
endif()
|
||||
target_link_libraries(omohclient INTERFACE ${OPENAL_LIBRARY})
|
||||
|
||||
if(NOT USE_SYSTEM_LIBS)
|
||||
target_compile_definitions(omohclient INTERFACE USE_OPENAL_DLOPEN=1)
|
||||
else()
|
||||
# Link against system OpenAL
|
||||
target_link_libraries(omohclient INTERFACE OpenAL::OpenAL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list(FILTER SOURCES_CLIENT EXCLUDE REGEX "./snd_([a-zA-Z0-9_]+)\.c$")
|
||||
|
|
|
@ -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;
|
||||
|
@ -774,6 +775,7 @@ void CL_InitCGameDLL( clientGameImport_t *cgi, clientGameExport_t **cge ) {
|
|||
cgi->UI_HideMenu = UI_HideMenu;
|
||||
cgi->UI_FontStringWidth = CL_FontStringWidth;
|
||||
cgi->UI_GetObjectivesTop = UI_GetObjectivesTop;
|
||||
cgi->UI_GetHighResolutionScale = UI_GetHighResolutionScale;
|
||||
cgi->Key_StringToKeynum = Key_StringToKeynum;
|
||||
cgi->Key_KeynumToBindString = Key_KeynumToBindString;
|
||||
cgi->Key_GetKeysForCommand = Key_GetKeysForCommand;
|
||||
|
@ -922,7 +924,13 @@ void CL_InitCGame( void ) {
|
|||
// find the current mapname
|
||||
info = cl.gameState.stringData + cl.gameState.stringOffsets[ CS_SERVERINFO ];
|
||||
mapname = Info_ValueForKey( info, "mapname" );
|
||||
|
||||
if (CL_UseLargeLightmap(mapname)) {
|
||||
Com_sprintf(cl.mapname, sizeof(cl.mapname), "maps/%s.bsp", mapname);
|
||||
} else {
|
||||
// Added in 2.0
|
||||
Com_sprintf(cl.mapname, sizeof(cl.mapname), "maps/%s_sml.bsp", mapname);
|
||||
}
|
||||
|
||||
S_BeginRegistration();
|
||||
CL_ShutdownCGame();
|
||||
|
@ -937,10 +945,17 @@ void CL_InitCGame( void ) {
|
|||
CL_InitClientSavedData();
|
||||
}
|
||||
|
||||
if (cl.snap.valid) {
|
||||
// init for this gamestate
|
||||
// use the lastExecutedServerCommand instead of the serverCommandSequence
|
||||
// otherwise server commands sent just before a gamestate are dropped
|
||||
cge->CG_Init(&cgi, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum);
|
||||
} else {
|
||||
// executing client commands from previous map/server might be an issue, some commands might be cs commands,
|
||||
// like old CS_SYSTEMINFO configstrings which still contain the sv_serverId from previous map.
|
||||
// It would cause the client to lose the game state number
|
||||
cge->CG_Init(&cgi, clc.serverMessageSequence, clc.serverCommandSequence, clc.clientNum);
|
||||
}
|
||||
|
||||
ClearNewConfigFlag();
|
||||
TIKI_FinishLoad();
|
||||
|
|
|
@ -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;
|
||||
};
|
|
@ -295,7 +295,7 @@ void UI_DoInventory(qboolean activate_mouse)
|
|||
if (client_inv.align == INV_ALIGN_RIGHT) {
|
||||
s_main_inv->InitFrame(
|
||||
NULL,
|
||||
client_inv.horizoffset + cls.glconfig.vidWidth - client_inv.typewidth,
|
||||
client_inv.horizoffset + uid.vidWidth - client_inv.typewidth,
|
||||
client_inv.vertoffset,
|
||||
client_inv.typewidth,
|
||||
client_inv.typeheight * client_inv.types.NumObjects(),
|
||||
|
|
|
@ -29,14 +29,21 @@ 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"
|
||||
#ifdef USE_RENDERER_DLL
|
||||
#include "../sys/sys_update_checker.h"
|
||||
#include "../uilib/uimessage.h"
|
||||
|
||||
extern "C" {
|
||||
#include "../sys/sys_loadlib.h"
|
||||
#endif
|
||||
}
|
||||
|
||||
#include "../gamespy/gcdkey/gcdkeyc.h"
|
||||
|
||||
#include <climits>
|
||||
|
||||
#ifdef USE_RENDERER_DLOPEN
|
||||
cvar_t* cl_renderer;
|
||||
#endif
|
||||
|
||||
cvar_t *cl_nodelta;
|
||||
cvar_t *cl_debugMove;
|
||||
|
||||
|
@ -130,19 +137,14 @@ clientGameExport_t *cge;
|
|||
|
||||
// Structure containing functions exported from refresh DLL
|
||||
refexport_t re;
|
||||
#ifdef USE_RENDERER_DLOPEN
|
||||
static void *rendererLib = NULL;
|
||||
#endif
|
||||
|
||||
qboolean camera_reset;
|
||||
qboolean camera_active;
|
||||
vec3_t camera_offset;
|
||||
|
||||
#ifdef USE_RENDERER_DLL
|
||||
// su44: for plugable renderer system
|
||||
refexport_t* (*DGetRefAPI)(int apiVersion, refimport_t * rimp) = NULL;
|
||||
static cvar_t *cl_renderer = NULL;
|
||||
static void *rendererLib = NULL;
|
||||
#endif // USE_RENDERER_DLL
|
||||
|
||||
|
||||
ping_t cl_pinglist[MAX_PINGREQUESTS];
|
||||
|
||||
typedef struct serverStatus_s
|
||||
|
@ -171,6 +173,27 @@ void CL_ServerStatus_f(void);
|
|||
void CL_ServerStatusResponse( netadr_t from, msg_t *msg );
|
||||
|
||||
static qboolean cl_bCLSystemStarted = qfalse;
|
||||
static qboolean cl_updateNotified = qfalse;
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_UseLargeLightmap
|
||||
|
||||
Added in 2.0
|
||||
Returns true if the standard BSP file should be used, false if the smaller lightmap BSP file should be used
|
||||
===============
|
||||
*/
|
||||
qboolean CL_UseLargeLightmap(const char* mapName) {
|
||||
char buffer[MAX_QPATH];
|
||||
|
||||
Com_sprintf(buffer, sizeof(buffer), "maps/%s_sml.bsp", mapName);
|
||||
|
||||
if (FS_ReadFileEx(buffer, NULL, qtrue) == -1) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
return Cvar_Get("r_largemap", "0", 0)->integer;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
|
@ -782,9 +805,10 @@ void CL_ShutdownAll(qboolean shutdownRef) {
|
|||
TIKI_FreeAll();
|
||||
|
||||
// shutdown the renderer
|
||||
if ( re.Shutdown ) {
|
||||
if(shutdownRef)
|
||||
CL_ShutdownRef();
|
||||
else if(re.Shutdown)
|
||||
re.Shutdown(qfalse); // don't destroy window or context
|
||||
}
|
||||
|
||||
cls.uiStarted = qfalse;
|
||||
cls.cgameStarted = qfalse;
|
||||
|
@ -1560,19 +1584,24 @@ void CL_Vid_Restart_f( void ) {
|
|||
|
||||
S_BeginRegistration();
|
||||
|
||||
// shutdown the UI
|
||||
//CL_ShutdownUI();
|
||||
// shutdown the renderer and clear the renderer interface
|
||||
CL_ShutdownRef();
|
||||
|
||||
cls.rendererRegistered = qfalse;
|
||||
|
||||
// shutdown the CGame
|
||||
CL_ShutdownCGame();
|
||||
// initialize the renderer interface
|
||||
CL_InitRef();
|
||||
// initialize the UI
|
||||
//CL_InitializeUI();
|
||||
// initialize the ui library
|
||||
UI_ResolutionChange();
|
||||
// clear aliases
|
||||
Alias_Clear();
|
||||
|
||||
cls.rendererRegistered = qfalse;
|
||||
|
||||
// unpause so the cgame definately gets a snapshot and renders a frame
|
||||
Com_Unpause();
|
||||
|
||||
|
@ -2554,7 +2583,7 @@ void CL_CheckUserinfo( void ) {
|
|||
// send a reliable userinfo update if needed
|
||||
if(cvar_modifiedFlags & CVAR_USERINFO)
|
||||
{
|
||||
if (Com_SanitizeName(name->string, szSanitizedName)) {
|
||||
if (Com_SanitizeName(name->string, szSanitizedName, sizeof(szSanitizedName))) {
|
||||
Cvar_Set("name", szSanitizedName);
|
||||
}
|
||||
|
||||
|
@ -2564,9 +2593,43 @@ void CL_CheckUserinfo( void ) {
|
|||
}
|
||||
|
||||
void CL_SetFrameNumber(int frameNumber) {
|
||||
if (!re.SetFrameNumber) {
|
||||
return;
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -2605,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);
|
||||
}
|
||||
|
@ -2789,13 +2854,13 @@ CL_ShutdownRef
|
|||
============
|
||||
*/
|
||||
void CL_ShutdownRef( void ) {
|
||||
if ( !re.Shutdown ) {
|
||||
return;
|
||||
}
|
||||
if ( re.Shutdown ) {
|
||||
re.Shutdown( qtrue );
|
||||
}
|
||||
|
||||
Com_Memset( &re, 0, sizeof( re ) );
|
||||
#ifdef USE_RENDERER_DLL
|
||||
// su44: remember to unload renderer library
|
||||
|
||||
#ifdef USE_RENDERER_DLOPEN
|
||||
if ( rendererLib ) {
|
||||
Sys_UnloadLibrary( rendererLib );
|
||||
rendererLib = NULL;
|
||||
|
@ -2974,22 +3039,105 @@ void CL_CG_EndTiki( dtiki_t *tiki ) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_CG_EndTiki
|
||||
============
|
||||
*/
|
||||
extern "C"
|
||||
int CL_ScaledMilliseconds(void) {
|
||||
return Sys_Milliseconds()*com_timescale->value;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefFS_WriteFile
|
||||
============
|
||||
*/
|
||||
void CL_RefFS_WriteFile(const char* qpath, const void* buffer, int size) {
|
||||
FS_WriteFile(qpath, buffer, size);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefFS_ListFiles
|
||||
============
|
||||
*/
|
||||
char** CL_RefFS_ListFiles(const char* name, const char* extension, int* numfilesfound) {
|
||||
return FS_ListFiles(name, extension, qtrue, numfilesfound);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefCIN_UploadCinematic
|
||||
============
|
||||
*/
|
||||
void CL_RefCIN_UploadCinematic(int handle) {
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefTIKI_GetNumChannels
|
||||
============
|
||||
*/
|
||||
int CL_RefTIKI_GetNumChannels(dtiki_t* tiki) {
|
||||
return tiki->m_boneList.NumChannels();
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefTIKI_GetLocalChannel
|
||||
============
|
||||
*/
|
||||
int CL_RefTIKI_GetLocalChannel(dtiki_t* tiki, int channel) {
|
||||
return tiki->m_boneList.LocalChannel(channel);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefTIKI_GetLocalFromGlobal
|
||||
============
|
||||
*/
|
||||
int CL_RefTIKI_GetLocalFromGlobal(dtiki_t* tiki, int channel) {
|
||||
return tiki->m_boneList.GetLocalFromGlobal(channel);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefSKEL_GetMorphWeightFrame
|
||||
============
|
||||
*/
|
||||
int CL_RefSKEL_GetMorphWeightFrame(void* skeletor, int index, float time, int* data) {
|
||||
return ((skeletor_c*)skeletor)->GetMorphWeightFrame(index, time, data);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_RefSKEL_GetBoneParent
|
||||
============
|
||||
*/
|
||||
int CL_RefSKEL_GetBoneParent(void* skeletor, int boneIndex) {
|
||||
return ((skeletor_c*)skeletor)->GetBoneParent(boneIndex);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_GetRefSequence
|
||||
============
|
||||
*/
|
||||
int CL_GetRefSequence(void) {
|
||||
return cls.refSequence;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_IsRendererLoaded
|
||||
============
|
||||
*/
|
||||
qboolean CL_IsRendererLoaded(void) {
|
||||
return re.Shutdown != NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
CL_InitRef
|
||||
|
@ -2998,12 +3146,40 @@ CL_InitRef
|
|||
void CL_InitRef( void ) {
|
||||
refimport_t ri;
|
||||
refexport_t *ret;
|
||||
#ifdef USE_RENDERER_DLL
|
||||
char dllName[256];
|
||||
#ifdef USE_RENDERER_DLOPEN
|
||||
GetRefAPI_t GetRefAPI;
|
||||
char dllName[MAX_OSPATH];
|
||||
#endif
|
||||
|
||||
Com_Printf( "----- Initializing Renderer ----\n" );
|
||||
|
||||
#ifdef USE_RENDERER_DLOPEN
|
||||
cl_renderer = Cvar_Get("cl_renderer", "opengl1", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
|
||||
Com_sprintf(dllName, sizeof(dllName), "renderer_%s" ARCH_SUFFIX DLL_SUFFIX DLL_EXT, cl_renderer->string);
|
||||
|
||||
if(!(rendererLib = Sys_LoadDll(dllName, qfalse)) && strcmp(cl_renderer->string, cl_renderer->resetString))
|
||||
{
|
||||
Com_Printf("failed:\n\"%s\"\n", Sys_LibraryError());
|
||||
Cvar_ForceReset("cl_renderer");
|
||||
|
||||
Com_sprintf(dllName, sizeof(dllName), "renderer_opengl1" ARCH_SUFFIX DLL_SUFFIX DLL_EXT);
|
||||
rendererLib = Sys_LoadDll(dllName, qfalse);
|
||||
}
|
||||
|
||||
if(!rendererLib)
|
||||
{
|
||||
Com_Printf("failed:\n\"%s\"\n", Sys_LibraryError());
|
||||
Com_Error(ERR_FATAL, "Failed to load renderer");
|
||||
}
|
||||
|
||||
GetRefAPI = (GetRefAPI_t)Sys_LoadFunction(rendererLib, "GetRefAPI");
|
||||
if(!GetRefAPI)
|
||||
{
|
||||
Com_Error(ERR_FATAL, "Can't load symbol GetRefAPI: '%s'", Sys_LibraryError());
|
||||
}
|
||||
#endif
|
||||
|
||||
ri.Cmd_AddCommand = Cmd_AddCommand;
|
||||
ri.Cmd_RemoveCommand = Cmd_RemoveCommand;
|
||||
ri.Cmd_Argc = Cmd_Argc;
|
||||
|
@ -3027,8 +3203,10 @@ void CL_InitRef( void ) {
|
|||
ri.CM_DrawDebugSurface = CM_DrawDebugSurface;
|
||||
|
||||
ri.FS_OpenFile = FS_FOpenFileRead;
|
||||
ri.FS_OpenFileWrite = FS_FOpenFileWrite;
|
||||
ri.FS_CloseFile = FS_FCloseFile;
|
||||
ri.FS_Read = FS_Read;
|
||||
ri.FS_Write = FS_Write;
|
||||
ri.FS_Seek = FS_Seek;
|
||||
ri.FS_ReadFile = FS_ReadFile;
|
||||
ri.FS_ReadFileEx = FS_ReadFileEx;
|
||||
|
@ -3038,8 +3216,10 @@ void CL_InitRef( void ) {
|
|||
ri.FS_ListFiles = CL_RefFS_ListFiles;
|
||||
ri.FS_FileIsInPAK = FS_FileIsInPAK;
|
||||
ri.FS_FileExists = FS_FileExists;
|
||||
ri.FS_CanonicalFilename = FS_CanonicalFilename;
|
||||
ri.Cvar_Get = Cvar_Get;
|
||||
ri.Cvar_Set = Cvar_Set;
|
||||
ri.Cvar_SetValue = Cvar_SetValue;
|
||||
ri.Cvar_SetDefault = Cvar_SetDefault;
|
||||
|
||||
ri.CM_EntityString = CM_EntityString;
|
||||
|
@ -3088,40 +3268,30 @@ void CL_InitRef( void ) {
|
|||
ri.Sys_GLimpInit = Sys_GLimpInit;
|
||||
ri.Sys_LowPhysicalMemory = Sys_LowPhysicalMemory;
|
||||
|
||||
#ifdef USE_RENDERER_DLL
|
||||
// su44: load renderer dll
|
||||
cl_renderer = Cvar_Get("cl_renderer", "glom", CVAR_ARCHIVE);
|
||||
Q_snprintf(dllName, sizeof(dllName), "renderer_%s" ARCH_STRING DLL_EXT, cl_renderer->string);
|
||||
Com_Printf("Loading \"%s\"...", dllName);
|
||||
if((rendererLib = Sys_LoadLibrary(dllName)) == 0) {
|
||||
#ifdef _WIN32
|
||||
Com_Error(ERR_FATAL, "failed:\n\"%s\"\n", Sys_LibraryError());
|
||||
#else
|
||||
char fn[1024];
|
||||
//
|
||||
// Added in OPM
|
||||
//
|
||||
ri.UI_LoadResource = UI_LoadResource;
|
||||
ri.CM_PointLeafnum = CM_PointLeafnum;
|
||||
ri.CM_LeafCluster = CM_LeafCluster;
|
||||
|
||||
Q_strncpyz(fn, Sys_Cwd(), sizeof(fn));
|
||||
strncat(fn, "/", sizeof(fn) - strlen(fn) - 1);
|
||||
strncat(fn, dllName, sizeof(fn) - strlen(fn) - 1);
|
||||
ri.TIKI_CalcLodConsts = TIKI_CalcLodConsts;
|
||||
ri.TIKI_CalculateBounds = TIKI_CalculateBounds;
|
||||
ri.TIKI_FindTiki = TIKI_FindTiki;
|
||||
ri.TIKI_RegisterTikiFlags = TIKI_RegisterTikiFlags;
|
||||
ri.TIKI_GetSkeletor = TIKI_GetSkeletor;
|
||||
ri.TIKI_GetSkel = TIKI_GetSkel;
|
||||
ri.TIKI_GetSkelAnimFrame = TIKI_GetSkelAnimFrame;
|
||||
ri.TIKI_GlobalRadius = TIKI_GlobalRadius;
|
||||
ri.TIKI_FindSkelByHeader = TIKI_FindSkelByHeader;
|
||||
ri.TIKI_GetNumChannels = CL_RefTIKI_GetNumChannels;
|
||||
ri.TIKI_GetLocalChannel = CL_RefTIKI_GetLocalChannel;
|
||||
ri.TIKI_GetLocalFromGlobal = CL_RefTIKI_GetLocalFromGlobal;
|
||||
|
||||
Com_Printf("Loading \"%s\"...", fn);
|
||||
if((rendererLib = Sys_LoadLibrary(fn)) == 0)
|
||||
{
|
||||
Com_Error(ERR_FATAL, "failed:\n\"%s\"", Sys_LibraryError());
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
}
|
||||
ri.SKEL_GetBoneParent = CL_RefSKEL_GetBoneParent;
|
||||
ri.SKEL_GetMorphWeightFrame = CL_RefSKEL_GetMorphWeightFrame;
|
||||
|
||||
Com_Printf("done\n");
|
||||
|
||||
DGetRefAPI = Sys_LoadFunction(rendererLib, "GetRefAPI");
|
||||
if(!DGetRefAPI)
|
||||
{
|
||||
Com_Error(ERR_FATAL, "Can't load symbol GetRefAPI: '%s'", Sys_LibraryError());
|
||||
}
|
||||
ret = DGetRefAPI( REF_API_VERSION, &ri );
|
||||
#else
|
||||
ret = GetRefAPI( REF_API_VERSION, &ri );
|
||||
#endif
|
||||
|
||||
#if defined __USEA3D && defined __A3D_GEOM
|
||||
hA3Dg_ExportRenderGeom (ret);
|
||||
|
@ -3137,6 +3307,8 @@ void CL_InitRef( void ) {
|
|||
|
||||
// unpause so the cgame definately gets a snapshot and renders a frame
|
||||
Cvar_Set( "cl_paused", "0" );
|
||||
|
||||
cls.refSequence++;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3481,21 +3653,13 @@ 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 );
|
||||
Cvar_Get ("dm_playergermanmodel", "german_wehrmacht_soldier", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
|
||||
Cvar_Get ("cg_predictItems", "1", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
|
||||
|
||||
// cgame might not be initialized before menu is used
|
||||
Cvar_Get ("cg_viewsize", "100", CVAR_ARCHIVE );
|
||||
|
||||
Cvar_Get ("cg_running", "0", CVAR_ROM );
|
||||
|
||||
//
|
||||
// register our commands
|
||||
//
|
||||
|
@ -3556,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 );
|
||||
}
|
||||
|
||||
|
@ -3925,7 +4095,7 @@ CL_ServerStatusResponse
|
|||
void CL_ServerStatusResponse( netadr_t from, msg_t *msg ) {
|
||||
const char *s;
|
||||
char info[MAX_INFO_STRING];
|
||||
int i, l, score, ping;
|
||||
int i, l, ping;
|
||||
int len;
|
||||
serverStatus_t *serverStatus;
|
||||
|
||||
|
@ -3979,7 +4149,7 @@ void CL_ServerStatusResponse( netadr_t from, msg_t *msg ) {
|
|||
|
||||
if (serverStatus->print) {
|
||||
Com_Printf("\nPlayers:\n");
|
||||
Com_Printf("num: score: ping: name:\n");
|
||||
Com_Printf("num: ping: name:\n");
|
||||
}
|
||||
for (i = 0, s = MSG_ReadStringLine( msg ); *s; s = MSG_ReadStringLine( msg ), i++) {
|
||||
|
||||
|
@ -3987,16 +4157,14 @@ void CL_ServerStatusResponse( netadr_t from, msg_t *msg ) {
|
|||
Com_sprintf(&serverStatus->string[len], sizeof(serverStatus->string)-len, "\\%s", s);
|
||||
|
||||
if (serverStatus->print) {
|
||||
score = ping = 0;
|
||||
sscanf(s, "%d %d", &score, &ping);
|
||||
ping = 0;
|
||||
sscanf(s, "%d", &ping);
|
||||
s = strchr(s, ' ');
|
||||
if (s)
|
||||
s = strchr(s+1, ' ');
|
||||
if (s)
|
||||
s++;
|
||||
else
|
||||
s = "unknown";
|
||||
Com_Printf("%-2d %-3d %-3d %s\n", i, score, ping, s );
|
||||
Com_Printf("%-2d %-3d %s\n", i, ping, s );
|
||||
}
|
||||
}
|
||||
len = strlen(serverStatus->string);
|
||||
|
@ -4734,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);
|
||||
}
|
||||
|
|
|
@ -568,6 +568,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
|||
csNum = CPT_NormalizeConfigstring(i);
|
||||
if (csNum < 0 || csNum >= MAX_CONFIGSTRINGS) {
|
||||
Com_Error(ERR_DROP, "configstring > MAX_CONFIGSTRINGS");
|
||||
return;
|
||||
}
|
||||
s = MSG_ReadScrambledBigString(msg);
|
||||
len = strlen(s);
|
||||
|
@ -588,8 +589,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
|||
//Com_Memset (&nullstate, 0, sizeof(nullstate));
|
||||
MSG_GetNullEntityState(&nullstate);
|
||||
es = &cl.entityBaselines[ newnum ];
|
||||
// FIXME: frametime
|
||||
MSG_ReadDeltaEntity( msg, &nullstate, es, newnum, 0.0);
|
||||
MSG_ReadDeltaEntity( msg, &nullstate, es, newnum, cls.serverFrameTime);
|
||||
} else {
|
||||
Com_Error( ERR_DROP, "CL_ParseGamestate: bad command byte %i", cmd );
|
||||
}
|
||||
|
@ -607,15 +607,24 @@ void CL_ParseGamestate( msg_t *msg ) {
|
|||
if(cl_autoRecordDemo->integer && clc.demorecording)
|
||||
CL_StopRecord_f();
|
||||
|
||||
if (clc.state == CA_CONNECTED && !Cvar_Get("sv_paks", "", 0)->string[0]) {
|
||||
// Added in 2.30
|
||||
FS_Restart(clc.checksumFeed);
|
||||
} else {
|
||||
// reinitialize the filesystem if the game directory has changed
|
||||
FS_ConditionalRestart(clc.checksumFeed, qfalse);
|
||||
}
|
||||
|
||||
clc.state = CA_LOADING;
|
||||
if (!com_sv_running->integer)
|
||||
{
|
||||
const char *info = cl.gameState.stringData + cl.gameState.stringOffsets[CS_SERVERINFO];
|
||||
const char *mapname = Info_ValueForKey(info, "mapname");
|
||||
// Added in 2.0
|
||||
Cvar_Set("mapname", mapname);
|
||||
|
||||
UI_ClearState();
|
||||
UI_BeginLoad(Info_ValueForKey(info, "mapname"));
|
||||
UI_BeginLoad(mapname);
|
||||
}
|
||||
|
||||
// This used to call CL_StartHunkUsers, but now we enter the download state before loading the
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
@ -143,12 +144,19 @@ static unsigned int totalLoadTime;
|
|||
static unsigned int currentLoadTime;
|
||||
unsigned char UIListCtrlItem[8];
|
||||
|
||||
static const float maxWidthRes = 1920;
|
||||
static const float maxHeightRes = 1080;
|
||||
|
||||
inventory_t client_inv;
|
||||
bind_t client_bind;
|
||||
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);
|
||||
|
@ -212,15 +220,15 @@ static UIRect2D getDefaultConsoleRectangle(void)
|
|||
f[i] = floor(f[i]);
|
||||
}
|
||||
|
||||
rect.pos.x = f[0] - cls.glconfig.vidWidth;
|
||||
rect.pos.y = f[1] - cls.glconfig.vidHeight;
|
||||
rect.pos.x = f[0] - uid.vidWidth;
|
||||
rect.pos.y = f[1] - uid.vidHeight;
|
||||
rect.size.width = f[2] + 50.0;
|
||||
rect.size.height = f[3] + 50.0;
|
||||
} else {
|
||||
rect.pos.x = 25.0;
|
||||
rect.pos.y = 25.0;
|
||||
rect.size.width = (cls.glconfig.vidWidth - 50);
|
||||
rect.size.height = (cls.glconfig.vidHeight / 2);
|
||||
rect.size.width = (uid.vidWidth - 50);
|
||||
rect.size.height = (uid.vidHeight / 2);
|
||||
}
|
||||
|
||||
return rect;
|
||||
|
@ -967,15 +975,15 @@ static UIRect2D getDefaultDMConsoleRectangle(void)
|
|||
f[i] = floor(f[i]);
|
||||
}
|
||||
|
||||
rect.pos.x = f[0] - cls.glconfig.vidWidth;
|
||||
rect.pos.y = f[1] - cls.glconfig.vidHeight;
|
||||
rect.pos.x = f[0] - uid.vidWidth;
|
||||
rect.pos.y = f[1] - uid.vidHeight;
|
||||
rect.size.width = f[2] + 50.0;
|
||||
rect.size.height = f[3] + 50.0;
|
||||
} else {
|
||||
rect.pos.x = 0;
|
||||
rect.pos.y = cls.glconfig.vidHeight * 0.58;
|
||||
rect.size.width = cls.glconfig.vidWidth;
|
||||
rect.size.height = cls.glconfig.vidHeight * 0.415;
|
||||
rect.pos.y = uid.vidHeight * 0.58;
|
||||
rect.size.width = uid.vidWidth;
|
||||
rect.size.height = uid.vidHeight * 0.415;
|
||||
}
|
||||
|
||||
return rect;
|
||||
|
@ -997,19 +1005,19 @@ static UIRect2D getQuickMessageDMConsoleRectangle(void)
|
|||
f[i] = floor(f[i]);
|
||||
}
|
||||
|
||||
rect.pos.x = f[0] - cls.glconfig.vidWidth;
|
||||
rect.pos.y = f[1] - cls.glconfig.vidHeight;
|
||||
rect.pos.x = f[0] - uid.vidWidth;
|
||||
rect.pos.y = f[1] - uid.vidHeight;
|
||||
rect.size.width = f[2] + 50.0;
|
||||
rect.size.height = f[3] + 50.0;
|
||||
} else {
|
||||
rect.pos.x = 0;
|
||||
rect.pos.y = cls.glconfig.vidHeight * 0.66;
|
||||
rect.size.width = cls.glconfig.vidWidth;
|
||||
rect.pos.y = uid.vidHeight * 0.66;
|
||||
rect.size.width = uid.vidWidth;
|
||||
// Fixed in 2.0
|
||||
// Was 38.0 in 1.11 and below
|
||||
// This prevents characters to be seen from the DM console
|
||||
// in the quick message console
|
||||
rect.size.height = 36.0;
|
||||
rect.size.height = 36.0 * uid.scaleRes[1];
|
||||
}
|
||||
|
||||
return rect;
|
||||
|
@ -1128,6 +1136,20 @@ static void DMConsoleCommandHandler(const char *txt)
|
|||
CL_AddReliableCommand(szStringOut, qfalse);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
getScreenWidth
|
||||
====================
|
||||
*/
|
||||
static float getScreenWidth()
|
||||
{
|
||||
if (uid.bHighResScaling) {
|
||||
return maxWidthRes;
|
||||
} else {
|
||||
return uid.vidWidth;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
getNewConsole
|
||||
|
@ -1189,14 +1211,14 @@ getDefaultGMBoxRectangle
|
|||
static UIRect2D getDefaultGMBoxRectangle(void)
|
||||
{
|
||||
UIRect2D dmRect = getDefaultDMBoxRectangle();
|
||||
float height = cls.glconfig.vidHeight * ui_compass_scale->value * 0.25f;
|
||||
float height = uid.vidHeight * ui_compass_scale->value * 0.25f;
|
||||
float y = dmRect.size.height + dmRect.pos.y;
|
||||
|
||||
if (height < y) {
|
||||
height = y;
|
||||
}
|
||||
|
||||
return UIRect2D(20.0f, height, cls.glconfig.vidWidth - 20, 128.0f);
|
||||
return UIRect2D(20.0f, height, (getScreenWidth() - 20) * uid.scaleRes[0], 128.0f * uid.scaleRes[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1206,9 +1228,12 @@ getDefaultDMBoxRectangle
|
|||
*/
|
||||
static UIRect2D getDefaultDMBoxRectangle(void)
|
||||
{
|
||||
float width = cls.glconfig.vidWidth * ui_compass_scale->value * 0.2f;
|
||||
float width;
|
||||
float screenWidth = getScreenWidth();
|
||||
|
||||
return UIRect2D(width, 0, cls.glconfig.vidWidth - (width + 192.0f), 120.0f);
|
||||
width = screenWidth * uid.scaleRes[0] * ui_compass_scale->value * 0.2f;
|
||||
|
||||
return UIRect2D(width, 0, (screenWidth - (width + 192.0f)) * uid.scaleRes[0], 120.0f * uid.scaleRes[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1221,6 +1246,21 @@ float UI_GetObjectivesTop(void)
|
|||
return getDefaultGMBoxRectangle().pos.y;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
UI_GetObjectivesTop
|
||||
====================
|
||||
*/
|
||||
void UI_GetHighResolutionScale(vec2_t scale)
|
||||
{
|
||||
if (uid.bHighResScaling) {
|
||||
scale[0] = uid.scaleRes[0];
|
||||
scale[1] = uid.scaleRes[1];
|
||||
} else {
|
||||
scale[0] = scale[1] = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
UI_ShowHudList
|
||||
|
@ -1268,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];
|
||||
|
@ -1290,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;
|
||||
|
@ -1298,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;
|
||||
}
|
||||
|
||||
|
@ -1681,11 +1721,11 @@ UI_ClearBackground
|
|||
void UI_ClearBackground(void)
|
||||
{
|
||||
re.Set2DWindow(
|
||||
0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, -1, 1
|
||||
0, 0, uid.vidWidth, uid.vidHeight, 0, uid.vidWidth, uid.vidHeight, 0, -1, 1
|
||||
);
|
||||
re.Scissor(0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight);
|
||||
re.Scissor(0, 0, uid.vidWidth, uid.vidHeight);
|
||||
re.SetColor(g_color_table[0]);
|
||||
re.DrawBox(0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight);
|
||||
re.DrawBox(0, 0, uid.vidWidth, uid.vidHeight);
|
||||
re.SetColor(NULL);
|
||||
}
|
||||
|
||||
|
@ -3098,7 +3138,7 @@ void UI_MapList_f(void)
|
|||
MapRunnerClass *map = new MapRunnerClass;
|
||||
map->Setup("maps", mappath, ".bsp", "_sml");
|
||||
|
||||
CL_SetMousePos(cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2);
|
||||
CL_SetMousePos(uid.vidWidth / 2, uid.vidHeight / 2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3138,7 +3178,7 @@ void UI_DMMapSelect_f(void)
|
|||
MpMapPickerClass *map = new MpMapPickerClass;
|
||||
map->Setup(basepath, mappath, gametype);
|
||||
|
||||
CL_SetMousePos(cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2);
|
||||
CL_SetMousePos(uid.vidWidth / 2, uid.vidHeight / 2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3322,7 +3362,7 @@ void UI_PlayerModel_f(void)
|
|||
PlayerModelPickerClass *picker = new PlayerModelPickerClass;
|
||||
picker->Setup("models/player", modelpath, bGermanModel);
|
||||
|
||||
CL_SetMousePos(cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2);
|
||||
CL_SetMousePos(uid.vidWidth / 2, uid.vidHeight / 2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3712,6 +3752,7 @@ void CL_FillUIImports(void)
|
|||
uii.Rend_Scissor = re.Scissor;
|
||||
uii.Rend_Set2D = re.Set2DWindow;
|
||||
uii.Rend_SetColor = re.SetColor;
|
||||
uii.Rend_ImageExists = re.ImageExists;
|
||||
|
||||
uii.Cmd_Stuff = Cbuf_AddText;
|
||||
uii.Cvar_GetString = CvarGetForUI;
|
||||
|
@ -3750,6 +3791,9 @@ void CL_FillUIImports(void)
|
|||
|
||||
uii.GetConfigstring = CL_ConfigString;
|
||||
uii.UI_CloseDMConsole = UI_CloseDMConsole;
|
||||
|
||||
uii.GetRefSequence = CL_GetRefSequence;
|
||||
uii.IsRendererLoaded = CL_IsRendererLoaded;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3806,7 +3850,7 @@ void UI_CreateDialog(
|
|||
{
|
||||
UIDialog *dlg = new UIDialog;
|
||||
UIRect2D rect =
|
||||
UIRect2D((cls.glconfig.vidWidth - width) >> 1, (cls.glconfig.vidHeight - height) >> 1, width, height);
|
||||
UIRect2D((uid.vidWidth - width) / 2, (uid.vidHeight - height) / 2, width, height);
|
||||
UColor bgColor = UWindowColor;
|
||||
|
||||
dlg->Create(NULL, rect, title, bgColor, UHudColor);
|
||||
|
@ -3836,12 +3880,28 @@ void UI_ResolutionChange(void)
|
|||
ui_compass_scale = Cvar_Get("ui_compass_scale", "0.75", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
} else {
|
||||
// Older version doesn't have an adjustable compass, so assume 0.5 by default
|
||||
ui_compass_scale = Cvar_Get("ui_compass_scale", "0.5", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
ui_compass_scale = Cvar_Get("ui_compass_scale", "0.55", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
}
|
||||
|
||||
CL_FillUIImports();
|
||||
CL_FillUIDef();
|
||||
|
||||
// Added in OPM
|
||||
// Scaling for high resolutions
|
||||
if (uid.vidWidth > maxWidthRes && uid.vidHeight > maxHeightRes) {
|
||||
const float vidRatio = (float)uid.vidWidth / (float)uid.vidHeight;
|
||||
|
||||
uid.scaleRes[0] = (float)uid.vidWidth / (maxHeightRes * vidRatio);
|
||||
uid.scaleRes[1] = (float)uid.vidHeight / maxHeightRes;
|
||||
//uid.scaleRes[0] = (float)uid.vidWidth / maxWidthRes;
|
||||
//uid.scaleRes[1] = (float)uid.vidHeight / maxHeightRes;
|
||||
uid.bHighResScaling = qtrue;
|
||||
} else {
|
||||
uid.scaleRes[0] = 1;
|
||||
uid.scaleRes[1] = 1;
|
||||
uid.bHighResScaling = qfalse;
|
||||
}
|
||||
|
||||
if (!uie.ResolutionChange) {
|
||||
return;
|
||||
}
|
||||
|
@ -3876,7 +3936,7 @@ void UI_ResolutionChange(void)
|
|||
menuManager.RealignMenus();
|
||||
|
||||
if (view3d) {
|
||||
frame = UIRect2D(0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight);
|
||||
frame = UIRect2D(0, 0, uid.vidWidth, uid.vidHeight);
|
||||
view3d->setFrame(frame);
|
||||
}
|
||||
|
||||
|
@ -4312,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;
|
||||
}
|
||||
|
@ -4364,9 +4422,12 @@ 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
|
||||
{
|
||||
|
@ -4409,7 +4470,7 @@ void ScoreboardListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, boo
|
|||
{
|
||||
DrawBox(drawRect, backColor, 1.0);
|
||||
pFont->setColor(textColor);
|
||||
pFont->Print(drawRect.pos.x + 1, drawRect.pos.y, Sys_LV_CL_ConvertString(getListItemString(iColumn)), -1, qfalse);
|
||||
pFont->Print((drawRect.pos.x + 1) / uid.scaleRes[0], drawRect.pos.y / uid.scaleRes[1], Sys_LV_CL_ConvertString(getListItemString(iColumn)), -1, uid.scaleRes);
|
||||
|
||||
if (bTitleItem) {
|
||||
UIRect2D lineRect;
|
||||
|
@ -4462,7 +4523,7 @@ void UI_CreateScoreboard(void)
|
|||
scoreboard_h = h;
|
||||
|
||||
SCR_AdjustFrom640(&x, &y, &w, &h);
|
||||
fColumnScale = cls.glconfig.vidWidth / 640.0;
|
||||
fColumnScale = uid.vidWidth / 640.0;
|
||||
cge->CG_GetScoreBoardColor(&fR, &fG, &fB, &fA);
|
||||
cge->CG_GetScoreBoardFontColor(&fFontR, &fFontG, &fFontB, &fFontA);
|
||||
|
||||
|
@ -5287,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;
|
||||
|
@ -5308,7 +5370,7 @@ void CL_InitializeUI(void)
|
|||
// Create the 3D view
|
||||
view3d = new View3D;
|
||||
view3d->setAlwaysOnBottom(true);
|
||||
view3d->InitFrame(NULL, 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, -1, "facfont-20");
|
||||
view3d->InitFrame(NULL, 0, 0, uid.vidWidth, uid.vidHeight, -1, "facfont-20");
|
||||
view3d->setName("view3d");
|
||||
view3d->InitSubtitle();
|
||||
|
||||
|
@ -5504,7 +5566,7 @@ qboolean UI_IsResourceLoaded(const char *name)
|
|||
case 107:
|
||||
return S_IsSoundRegistered(name + 1);
|
||||
case 110:
|
||||
return R_ImageExists(name + 1);
|
||||
return uii.Rend_ImageExists(name + 1);
|
||||
default:
|
||||
return qfalse;
|
||||
}
|
||||
|
@ -5765,8 +5827,15 @@ void UI_BeginLoad(const char *pszMapName)
|
|||
|
||||
loadName = "maps/";
|
||||
loadName += pszMapName;
|
||||
mapfile = loadName;
|
||||
loadName += ".min";
|
||||
mapfile = loadName + ".bsp";
|
||||
|
||||
if (CL_UseLargeLightmap(pszMapName)) {
|
||||
mapfile += ".bsp";
|
||||
} else {
|
||||
// Added in 2.0
|
||||
mapfile += "_sml.bsp";
|
||||
}
|
||||
|
||||
if (UI_ArchiveLoadMapinfo(mapfile)) {
|
||||
cls.loading = SS_LOADING2;
|
||||
|
|
|
@ -51,12 +51,16 @@ 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);
|
||||
void CL_BeginRegistration(void);
|
||||
void CL_EndRegistration(void);
|
||||
float UI_GetObjectivesTop(void);
|
||||
void UI_GetHighResolutionScale(vec2_t scale);
|
||||
|
||||
//
|
||||
// menu
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2015 the OpenMoHAA team
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -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
|
||||
(
|
||||
|
@ -44,8 +45,7 @@ static float s_dmboxWidth = 384.0;
|
|||
static float s_dmboxOffsetX = 3.0f;
|
||||
static float s_dmboxOffsetY = 8.0f;
|
||||
|
||||
CLASS_DECLARATION( UIWidget, UIDMBox, NULL )
|
||||
{
|
||||
CLASS_DECLARATION(UIWidget, UIDMBox, NULL) {
|
||||
{&W_SizeChanged, &UIDMBox::OnSizeChanged},
|
||||
{&EV_DMBox_Goin, &UIDMBox::MoveInEvent },
|
||||
{&EV_DMBox_Decay, &UIDMBox::DecayEvent },
|
||||
|
@ -67,8 +67,7 @@ UIDMBox::UIDMBox()
|
|||
void UIDMBox::VerifyBoxOut(void)
|
||||
{
|
||||
PostMoveinEvent();
|
||||
if (m_boxstate != boxstate_t::box_moving_out && m_boxstate != boxstate_t::box_out)
|
||||
{
|
||||
if (m_boxstate != boxstate_t::box_moving_out && m_boxstate != boxstate_t::box_out) {
|
||||
ChangeBoxState(boxstate_t::box_moving_out);
|
||||
}
|
||||
}
|
||||
|
@ -95,33 +94,27 @@ void UIDMBox::HandleBoxMoving( void )
|
|||
|
||||
delta = m_movespeed * (uid.time - m_boxtime) / 1000;
|
||||
m_boxtime = 1000 * delta / m_movespeed + m_boxtime;
|
||||
if (m_boxstate == boxstate_t::box_moving_out)
|
||||
{
|
||||
if (m_boxstate == boxstate_t::box_moving_out) {
|
||||
newRect.size.width = m_frame.size.width;
|
||||
newRect.size.height = m_frame.size.height;
|
||||
newRect.pos.x = m_frame.pos.x;
|
||||
newRect.pos.y = delta + m_frame.pos.y;
|
||||
|
||||
if (newRect.pos.y <= 0.0)
|
||||
{
|
||||
if (newRect.pos.y <= 0.0) {
|
||||
newRect.pos.y = 0.0;
|
||||
ChangeBoxState(boxstate_t::box_out);
|
||||
}
|
||||
}
|
||||
else if (m_boxstate == boxstate_t::box_moving_in)
|
||||
{
|
||||
} else if (m_boxstate == boxstate_t::box_moving_in) {
|
||||
newRect.size.width = m_frame.size.width;
|
||||
newRect.size.height = m_frame.size.height;
|
||||
newRect.pos.x = m_frame.pos.x;
|
||||
newRect.pos.y = delta - m_frame.pos.y;
|
||||
|
||||
if (newRect.pos.y <= -newRect.size.height)
|
||||
{
|
||||
if (newRect.pos.y <= -newRect.size.height) {
|
||||
newRect.pos.y = -newRect.size.height;
|
||||
ChangeBoxState(boxstate_t::box_in);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
newRect = m_frame;
|
||||
}
|
||||
|
||||
|
@ -136,16 +129,14 @@ void UIDMBox::PostMoveinEvent( void )
|
|||
|
||||
if (!EventPending(EV_DMBox_Goin)) {
|
||||
PostEvent(EV_DMBox_Goin, 10.0);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
PostponeEvent(EV_DMBox_Goin, 10.0);
|
||||
}
|
||||
}
|
||||
|
||||
void UIDMBox::PostDecayEvent(void)
|
||||
{
|
||||
if (!EventPending(EV_DMBox_Decay))
|
||||
{
|
||||
if (!EventPending(EV_DMBox_Decay)) {
|
||||
float fDelayTime;
|
||||
int iNumLines;
|
||||
int i;
|
||||
|
@ -155,8 +146,7 @@ void UIDMBox::PostDecayEvent( void )
|
|||
// Calculate the number of lines
|
||||
//
|
||||
iNumLines = 1;
|
||||
for (i = 0; pszString[i]; i++)
|
||||
{
|
||||
for (i = 0; pszString[i]; i++) {
|
||||
if (pszString[i] == '\n') {
|
||||
iNumLines++;
|
||||
}
|
||||
|
@ -170,8 +160,7 @@ void UIDMBox::PostDecayEvent( void )
|
|||
//
|
||||
else if (m_items[0].flags & DMBOX_ITEM_FLAG_DEATH) {
|
||||
fDelayTime = iNumLines * 6.0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
fDelayTime = iNumLines * 5.0;
|
||||
}
|
||||
|
||||
|
@ -206,39 +195,27 @@ void UIDMBox::RemoveTopItem( void )
|
|||
|
||||
str UIDMBox::CalculateBreaks(UIFont *font, str text, float max_width)
|
||||
{
|
||||
str newText, sTmp;
|
||||
int i;
|
||||
str newText;
|
||||
float fX;
|
||||
float fwX, fsX;
|
||||
float fwX;
|
||||
const char *current;
|
||||
int count;
|
||||
|
||||
Cmd_TokenizeString(text.c_str());
|
||||
if (Cmd_Argc())
|
||||
{
|
||||
current = text;
|
||||
fX = 0.0;
|
||||
fsX = font->getCharWidth(' ');
|
||||
|
||||
for (i = 0; i < Cmd_Argc(); i++)
|
||||
{
|
||||
sTmp = Cmd_Argv(i);
|
||||
for (count = font->DBCSGetWordBlockCount(current, -1); count;
|
||||
current += count, count = font->DBCSGetWordBlockCount(current, -1)) {
|
||||
fwX = font->getWidth(current, count);
|
||||
|
||||
fwX = font->getWidth(sTmp.c_str(), -1);
|
||||
if (fwX + i <= max_width)
|
||||
{
|
||||
if (fwX + i + fX <= max_width)
|
||||
{
|
||||
newText += sTmp + " ";
|
||||
if (fX + fwX > max_width) {
|
||||
newText += "\n" + str(current, 0, count);
|
||||
fX = 0;
|
||||
} else {
|
||||
newText += "\n" + sTmp + " ";
|
||||
newText += str(current, 0, count);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sTmp += "\n";
|
||||
fX = 0.0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
newText = "";
|
||||
|
||||
fX += fwX;
|
||||
}
|
||||
|
||||
return newText;
|
||||
|
@ -254,8 +231,7 @@ float UIDMBox::PrintWrap( UIFont *font, float x, float y, str text )
|
|||
p1 = text.c_str();
|
||||
l = text.length();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
p2 = strchr(p1, '\n');
|
||||
if (!p2) {
|
||||
break;
|
||||
|
@ -266,15 +242,18 @@ float UIDMBox::PrintWrap( UIFont *font, float x, float y, str text )
|
|||
break;
|
||||
}
|
||||
|
||||
font->Print(x, fY, p1, p2 - p1, qfalse);
|
||||
font->Print(x, fY, p1, p2 - p1, getHighResScale());
|
||||
p1 = p2 + 1;
|
||||
l -= n;
|
||||
fY += font->getHeight(qfalse);
|
||||
fY += font->getHeight();
|
||||
}
|
||||
|
||||
font->Print(x, fY, p1, l, qfalse);
|
||||
if (*p1) {
|
||||
font->Print(x, fY, p1, l, getHighResScale());
|
||||
fY += font->getHeight();
|
||||
}
|
||||
|
||||
return font->getHeight(qfalse) + (fY - y);
|
||||
return fY - y;
|
||||
}
|
||||
|
||||
float UIDMBox::DrawItem(item_t *in, float x, float y, float alpha)
|
||||
|
@ -311,8 +290,7 @@ void UIDMBox::Print( const char *text )
|
|||
{
|
||||
const char *text1 = text;
|
||||
|
||||
if (m_numitems > 5)
|
||||
{
|
||||
if (m_numitems > 5) {
|
||||
//
|
||||
// Overwrite an item
|
||||
//
|
||||
|
@ -321,41 +299,30 @@ void UIDMBox::Print( const char *text )
|
|||
|
||||
m_items[m_numitems].flags = 0;
|
||||
|
||||
if (*text == MESSAGE_CHAT_WHITE)
|
||||
{
|
||||
m_items[m_numitems].color = UGrey;
|
||||
if (*text == MESSAGE_CHAT_WHITE) {
|
||||
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;
|
||||
} else if (*text == MESSAGE_CHAT_RED) {
|
||||
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) {
|
||||
m_items[m_numitems].color = UGreenChatMessageColor;
|
||||
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].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_DEATH;
|
||||
|
||||
text1 = text + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_items[m_numitems].color = m_foreground_color;
|
||||
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();
|
||||
|
@ -388,9 +355,7 @@ void UIDMBox::Create( const UIRect2D& rect, const UColor& fore, const UColor& ba
|
|||
setShowState();
|
||||
}
|
||||
|
||||
void UIDMBox::MoveInEvent( Event *ev )
|
||||
{
|
||||
}
|
||||
void UIDMBox::MoveInEvent(Event *ev) {}
|
||||
|
||||
void UIDMBox::DecayEvent(Event *ev)
|
||||
{
|
||||
|
@ -419,10 +384,14 @@ void UIDMBox::Draw( void )
|
|||
|
||||
m_font->setColor(m_foreground_color);
|
||||
alpha = (float)(cls.realtime - m_iBeginDecay) / (float)m_iEndDecay;
|
||||
if (alpha > 1.0) alpha = 1.0;
|
||||
if (alpha > 1.0) {
|
||||
alpha = 1.0;
|
||||
}
|
||||
|
||||
alpha = (1.0 - alpha) * 4.0;
|
||||
if (alpha > 1.0) alpha = 1.0;
|
||||
if (alpha > 1.0) {
|
||||
alpha = 1.0;
|
||||
}
|
||||
|
||||
if (cge) {
|
||||
alphaScale = 1.0 - cge->CG_GetObjectiveAlpha();
|
||||
|
@ -431,11 +400,9 @@ void UIDMBox::Draw( void )
|
|||
fsY = DrawItem(m_items, s_dmboxOffsetX, s_dmboxOffsetY, alpha * alphaScale);
|
||||
fsY = alpha <= 0.2 ? s_dmboxOffsetY : fsY + s_dmboxOffsetY;
|
||||
|
||||
for (i = 1; i < m_numitems; i++)
|
||||
{
|
||||
for (i = 1; i < m_numitems; i++) {
|
||||
fsY += DrawItem(&m_items[i], s_dmboxOffsetX, fsY, alphaScale);
|
||||
if (fsY > m_frame.size.height)
|
||||
{
|
||||
if (fsY > m_frame.size.height) {
|
||||
if (EventPending(EV_DMBox_Decay)) {
|
||||
CancelEventsOfType(EV_DMBox_Decay);
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ FilePickerClass::FilePickerClass()
|
|||
window = new UIFloatingWindow();
|
||||
window->Create(
|
||||
NULL,
|
||||
UIRect2D((cls.glconfig.vidWidth - 400) / 2, (cls.glconfig.vidHeight - 300) / 2, 400, 300),
|
||||
UIRect2D((uid.vidWidth - 400) / 2, (uid.vidHeight - 300) / 2, 400, 300),
|
||||
"File Picker",
|
||||
UColor(0.15f, 0.195f, 0.278f),
|
||||
UHudColor
|
||||
|
|
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
|
||||
(
|
||||
|
@ -44,8 +45,7 @@ static float s_gmboxWidth = 640.0;
|
|||
static float s_gmboxOffsetX = 3.0f;
|
||||
static float s_gmboxOffsetY = 0.0f;
|
||||
|
||||
CLASS_DECLARATION( UIWidget, UIGMBox, NULL )
|
||||
{
|
||||
CLASS_DECLARATION(UIWidget, UIGMBox, NULL) {
|
||||
{&W_SizeChanged, &UIGMBox::OnSizeChanged},
|
||||
{&EV_GMBox_Goin, &UIGMBox::MoveInEvent },
|
||||
{&EV_GMBox_Decay, &UIGMBox::DecayEvent },
|
||||
|
@ -67,8 +67,7 @@ UIGMBox::UIGMBox()
|
|||
void UIGMBox::VerifyBoxOut(void)
|
||||
{
|
||||
PostMoveinEvent();
|
||||
if (m_boxstate != boxstate_t::box_moving_out && m_boxstate != boxstate_t::box_out)
|
||||
{
|
||||
if (m_boxstate != boxstate_t::box_moving_out && m_boxstate != boxstate_t::box_out) {
|
||||
ChangeBoxState(boxstate_t::box_moving_out);
|
||||
}
|
||||
}
|
||||
|
@ -95,28 +94,23 @@ void UIGMBox::HandleBoxMoving( void )
|
|||
|
||||
delta = m_movespeed * (uid.time - m_boxtime) / 1000;
|
||||
m_boxtime = 1000 * delta / m_movespeed + m_boxtime;
|
||||
if (m_boxstate == boxstate_t::box_moving_out)
|
||||
{
|
||||
if (m_boxstate == boxstate_t::box_moving_out) {
|
||||
newRect.size.width = m_frame.size.width;
|
||||
newRect.size.height = m_frame.size.height;
|
||||
newRect.pos.x = m_frame.pos.x;
|
||||
newRect.pos.y = delta + m_frame.pos.y;
|
||||
|
||||
if (newRect.pos.y <= 0.0)
|
||||
{
|
||||
if (newRect.pos.y <= 0.0) {
|
||||
newRect.pos.y = 0.0;
|
||||
ChangeBoxState(boxstate_t::box_out);
|
||||
}
|
||||
}
|
||||
else if (m_boxstate == boxstate_t::box_moving_in)
|
||||
{
|
||||
} else if (m_boxstate == boxstate_t::box_moving_in) {
|
||||
newRect.size.width = m_frame.size.width;
|
||||
newRect.size.height = m_frame.size.height;
|
||||
newRect.pos.x = m_frame.pos.x;
|
||||
newRect.pos.y = delta - m_frame.pos.y;
|
||||
|
||||
if (newRect.pos.y <= -newRect.size.height)
|
||||
{
|
||||
if (newRect.pos.y <= -newRect.size.height) {
|
||||
newRect.pos.y = -newRect.size.height;
|
||||
ChangeBoxState(boxstate_t::box_in);
|
||||
}
|
||||
|
@ -142,8 +136,7 @@ void UIGMBox::PostMoveinEvent( void )
|
|||
|
||||
void UIGMBox::PostDecayEvent(void)
|
||||
{
|
||||
if (!EventPending(EV_GMBox_Decay))
|
||||
{
|
||||
if (!EventPending(EV_GMBox_Decay)) {
|
||||
float fDelayTime;
|
||||
int iNumLines;
|
||||
int i;
|
||||
|
@ -153,8 +146,7 @@ void UIGMBox::PostDecayEvent( void )
|
|||
// Calculate the number of lines
|
||||
//
|
||||
iNumLines = 1;
|
||||
for (i = 0; pszString[i]; i++)
|
||||
{
|
||||
for (i = 0; pszString[i]; i++) {
|
||||
if (pszString[i] == '\n') {
|
||||
iNumLines++;
|
||||
}
|
||||
|
@ -200,39 +192,27 @@ void UIGMBox::RemoveTopItem( void )
|
|||
|
||||
str UIGMBox::CalculateBreaks(UIFont *font, str text, float max_width)
|
||||
{
|
||||
str newText, sTmp;
|
||||
int i;
|
||||
str newText;
|
||||
float fX;
|
||||
float fwX, fsX;
|
||||
float fwX;
|
||||
const char *current;
|
||||
int count;
|
||||
|
||||
Cmd_TokenizeString(text.c_str());
|
||||
if (Cmd_Argc())
|
||||
{
|
||||
current = text;
|
||||
fX = 0.0;
|
||||
fsX = font->getCharWidth(' ');
|
||||
|
||||
for (i = 0; i < Cmd_Argc(); i++)
|
||||
{
|
||||
sTmp = Cmd_Argv(i);
|
||||
for (count = font->DBCSGetWordBlockCount(current, -1); count;
|
||||
current += count, count = font->DBCSGetWordBlockCount(current, -1)) {
|
||||
fwX = font->getWidth(current, count);
|
||||
|
||||
fwX = font->getWidth(sTmp.c_str(), -1);
|
||||
if (fwX + i <= max_width)
|
||||
{
|
||||
if (fwX + i + fX <= max_width)
|
||||
{
|
||||
newText += sTmp + " ";
|
||||
if (fX + fwX > max_width) {
|
||||
newText += "\n" + str(current, 0, count);
|
||||
fX = 0;
|
||||
} else {
|
||||
newText += "\n" + sTmp + " ";
|
||||
newText += str(current, 0, count);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sTmp += "\n";
|
||||
fX = 0.0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
newText = "";
|
||||
|
||||
fX += fwX;
|
||||
}
|
||||
|
||||
return newText;
|
||||
|
@ -248,8 +228,7 @@ float UIGMBox::PrintWrap( UIFont *font, float x, float y, str text )
|
|||
p1 = text.c_str();
|
||||
l = text.length();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
for (;;) {
|
||||
p2 = strchr(p1, '\n');
|
||||
if (!p2) {
|
||||
break;
|
||||
|
@ -260,15 +239,18 @@ float UIGMBox::PrintWrap( UIFont *font, float x, float y, str text )
|
|||
break;
|
||||
}
|
||||
|
||||
font->Print(x, fY, p1, p2 - p1, qfalse);
|
||||
font->Print(x, fY, p1, p2 - p1, getHighResScale());
|
||||
p1 = p2 + 1;
|
||||
l -= n;
|
||||
fY += font->getHeight(qfalse);
|
||||
fY += font->getHeight();
|
||||
}
|
||||
|
||||
font->Print(x, fY, p1, l, qfalse);
|
||||
if (*p1) {
|
||||
font->Print(x, fY, p1, l, getHighResScale());
|
||||
fY += font->getHeight();
|
||||
}
|
||||
|
||||
return font->getHeight(qfalse) + (fY - y);
|
||||
return fY - y;
|
||||
}
|
||||
|
||||
float UIGMBox::DrawItem(item_t *in, float x, float y, float alpha)
|
||||
|
@ -305,8 +287,7 @@ void UIGMBox::Print( const char *text )
|
|||
{
|
||||
const char *text1 = text;
|
||||
|
||||
if (m_numitems > 4)
|
||||
{
|
||||
if (m_numitems > 4) {
|
||||
//
|
||||
// Overwrite an item
|
||||
//
|
||||
|
@ -315,21 +296,18 @@ 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;
|
||||
|
||||
text1 = text + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_items[m_numitems].color = m_foreground_color;
|
||||
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();
|
||||
|
@ -362,9 +340,7 @@ void UIGMBox::Create( const UIRect2D& rect, const UColor& fore, const UColor& ba
|
|||
setShowState();
|
||||
}
|
||||
|
||||
void UIGMBox::MoveInEvent( Event *ev )
|
||||
{
|
||||
}
|
||||
void UIGMBox::MoveInEvent(Event *ev) {}
|
||||
|
||||
void UIGMBox::DecayEvent(Event *ev)
|
||||
{
|
||||
|
@ -393,10 +369,14 @@ void UIGMBox::Draw( void )
|
|||
|
||||
m_font->setColor(m_foreground_color);
|
||||
alpha = (float)(cls.realtime - m_iBeginDecay) / (float)m_iEndDecay;
|
||||
if (alpha > 1.0) alpha = 1.0;
|
||||
if (alpha > 1.0) {
|
||||
alpha = 1.0;
|
||||
}
|
||||
|
||||
alpha = (1.0 - alpha) * 4.0;
|
||||
if (alpha > 1.0) alpha = 1.0;
|
||||
if (alpha > 1.0) {
|
||||
alpha = 1.0;
|
||||
}
|
||||
|
||||
if (cge) {
|
||||
alphaScale = 1.0 - cge->CG_GetObjectiveAlpha();
|
||||
|
@ -405,11 +385,9 @@ void UIGMBox::Draw( void )
|
|||
fsY = DrawItem(m_items, s_gmboxOffsetX, s_gmboxOffsetY, alpha * alphaScale);
|
||||
fsY = alpha <= 0.2 ? s_gmboxOffsetY : fsY + s_gmboxOffsetY;
|
||||
|
||||
for (i = 1; i < m_numitems; i++)
|
||||
{
|
||||
for (i = 1; i < m_numitems; i++) {
|
||||
fsY += DrawItem(&m_items[i], s_gmboxOffsetX, fsY, alphaScale);
|
||||
if (fsY > m_frame.size.height)
|
||||
{
|
||||
if (fsY > m_frame.size.height) {
|
||||
if (EventPending(EV_GMBox_Decay)) {
|
||||
CancelEventsOfType(EV_GMBox_Decay);
|
||||
}
|
||||
|
@ -430,4 +408,3 @@ void UIGMBox::Clear( void )
|
|||
{
|
||||
m_numitems = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -112,7 +112,7 @@ void FakkMiniconsole::PostMoveinEvent(void)
|
|||
|
||||
void FakkMiniconsole::OnSizeChanged(Event *ev)
|
||||
{
|
||||
m_maxlines = m_frame.size.height / m_font->getHeight(false);
|
||||
m_maxlines = m_frame.size.height / m_font->getHeight(getHighResScale());
|
||||
}
|
||||
|
||||
void FakkMiniconsole::MoveInEvent(Event *ev)
|
||||
|
@ -163,14 +163,14 @@ void FakkMiniconsole::Draw(void)
|
|||
HandleBoxMoving();
|
||||
|
||||
m_font->setColor(m_foreground_color);
|
||||
aty = m_frame.size.height - m_font->getHeight(false);
|
||||
aty = m_frame.size.height - m_font->getHeight(getHighResScale());
|
||||
for (i = m_lines.NumObjects(); i > 0; i--) {
|
||||
if (-m_font->getHeight(false) >= aty) {
|
||||
if (-m_font->getHeight(getHighResScale()) >= aty) {
|
||||
break;
|
||||
}
|
||||
|
||||
m_font->Print(0, aty, m_lines.ObjectAt(i), -1, false);
|
||||
aty -= m_font->getHeight(false);
|
||||
m_font->Print(0, aty / getHighResScale()[1], m_lines.ObjectAt(i), -1, getHighResScale());
|
||||
aty -= m_font->getHeight(getHighResScale());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ MpMapPickerClass::MpMapPickerClass()
|
|||
window = new UIFloatingWindow();
|
||||
window->Create(
|
||||
NULL,
|
||||
UIRect2D((cls.glconfig.vidWidth - 300) / 2, (cls.glconfig.vidHeight - 200) / 2, 300, 200),
|
||||
UIRect2D((uid.vidWidth - 300) / 2, (uid.vidHeight - 200) / 2, 300, 200),
|
||||
"Select a Map",
|
||||
UColor(0.15f, 0.195f, 0.278f),
|
||||
UHudColor
|
||||
|
|
|
@ -155,7 +155,7 @@ PlayerModelPickerClass::PlayerModelPickerClass()
|
|||
window = new UIFloatingWindow();
|
||||
window->Create(
|
||||
NULL,
|
||||
UIRect2D((cls.glconfig.vidWidth - 400) / 2, (cls.glconfig.vidHeight - 300) / 2, 400, 300),
|
||||
UIRect2D((uid.vidWidth - 400) / 2, (uid.vidHeight - 300) / 2, 400, 300),
|
||||
"Player Model Select...",
|
||||
UColor(0.15f, 0.195f, 0.278f),
|
||||
UHudColor
|
||||
|
|
|
@ -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,
|
||||
|
@ -78,7 +84,8 @@ struct ServerListInstance {
|
|||
UIFAKKServerList *serverList;
|
||||
};
|
||||
|
||||
class FAKKServerListItem : public UIListCtrlItem {
|
||||
class FAKKServerListItem : public UIListCtrlItem
|
||||
{
|
||||
UIFAKKServerList *m_parent; // Added in OPM
|
||||
str m_strings[6];
|
||||
str m_sVersion;
|
||||
|
@ -95,7 +102,9 @@ 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;
|
||||
|
@ -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);
|
||||
// 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;
|
||||
|
||||
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)
|
||||
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;
|
||||
|
@ -178,6 +194,9 @@ void FAKKServerListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, boo
|
|||
}
|
||||
*/
|
||||
|
||||
virtualScale[0] = m_parent->getHighResScale()[0];
|
||||
virtualScale[1] = m_parent->getHighResScale()[1];
|
||||
|
||||
if (!pColoringType->integer) {
|
||||
if (IfQueryFailed() || (IsDifferentVersion() && IsQueried())) {
|
||||
if (bSelected) {
|
||||
|
@ -210,7 +229,7 @@ void FAKKServerListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, boo
|
|||
newRect.pos.y / virtualScale[1],
|
||||
getListItemString(iColumn).c_str(),
|
||||
-1,
|
||||
false //m_parent->isVirtual()
|
||||
virtualScale
|
||||
);
|
||||
} else {
|
||||
if (IsDifferentVersion()) {
|
||||
|
@ -266,7 +285,7 @@ void FAKKServerListItem::DrawListItem(int iColumn, const UIRect2D& drawRect, boo
|
|||
newRect.pos.y / virtualScale[1],
|
||||
getListItemString(iColumn).c_str(),
|
||||
-1,
|
||||
false //m_parent->isVirtual()
|
||||
virtualScale
|
||||
);
|
||||
|
||||
if (IsDifferentVersion()) {
|
||||
|
@ -356,8 +375,7 @@ bool FAKKServerListItem::IsDifferentVersion() const
|
|||
return m_bDifferentVersion;
|
||||
}
|
||||
|
||||
CLASS_DECLARATION( UIListCtrl, UIFAKKServerList, NULL )
|
||||
{
|
||||
CLASS_DECLARATION(UIListCtrl, UIFAKKServerList, NULL) {
|
||||
{&EV_UIListBase_ItemSelected, &UIFAKKServerList::SelectServer },
|
||||
{&EV_UIListBase_ItemDoubleClicked, &UIFAKKServerList::ConnectServer },
|
||||
{&EV_FAKKServerList_RefreshServerList, &UIFAKKServerList::RefreshServerList },
|
||||
|
@ -387,9 +405,7 @@ UIFAKKServerList::UIFAKKServerList()
|
|||
m_iLastSortColumn = 2;
|
||||
}
|
||||
|
||||
void UIFAKKServerList::SelectServer( Event *ev )
|
||||
{
|
||||
}
|
||||
void UIFAKKServerList::SelectServer(Event *ev) {}
|
||||
|
||||
void UIFAKKServerList::ConnectServer(Event *ev)
|
||||
{
|
||||
|
@ -409,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);
|
||||
}
|
||||
|
@ -431,8 +453,7 @@ void UIFAKKServerList::ConnectServer( Event *ev )
|
|||
|
||||
qboolean UIFAKKServerList::KeyEvent(int key, unsigned int time)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
switch (key) {
|
||||
case K_ENTER:
|
||||
case K_KP_ENTER:
|
||||
ConnectServer(NULL);
|
||||
|
@ -453,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)
|
||||
{
|
||||
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);
|
||||
ServerListAuxUpdate(
|
||||
m_serverList[0], pItem->m_sIP.c_str(), pItem->m_iGameSpyPort, true, GQueryType::qt_status
|
||||
);
|
||||
}
|
||||
return UIListCtrl::KeyEvent(key, time);
|
||||
case 'c':
|
||||
|
@ -486,12 +507,20 @@ qboolean UIFAKKServerList::KeyEvent( int key, unsigned int time )
|
|||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
@ -529,6 +558,17 @@ void UIFAKKServerList::RefreshServerList( Event *ev )
|
|||
int i;
|
||||
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->SetQueried(false);
|
||||
|
@ -538,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;
|
||||
}
|
||||
|
@ -548,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();
|
||||
}
|
||||
|
||||
|
@ -616,13 +658,15 @@ void UIFAKKServerList::RefreshLANServerList( Event *ev )
|
|||
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();
|
||||
}
|
||||
|
||||
|
@ -640,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 {
|
||||
|
@ -673,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();
|
||||
|
@ -751,7 +799,9 @@ void UIFAKKServerList::UpdateServer( Event *ev )
|
|||
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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -763,15 +813,16 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
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;
|
||||
|
@ -779,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;
|
||||
|
@ -796,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);
|
||||
|
@ -812,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);
|
||||
|
@ -846,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;
|
||||
}
|
||||
}
|
||||
|
@ -868,7 +921,9 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
}
|
||||
}
|
||||
|
||||
if (g_bReverseSort) iCompResult = -iCompResult;
|
||||
if (g_bReverseSort) {
|
||||
iCompResult = -iCompResult;
|
||||
}
|
||||
}
|
||||
|
||||
return iCompResult;
|
||||
|
@ -876,8 +931,7 @@ int UIFAKKServerList::ServerCompareFunction( const UIListCtrlItem *i1, const UIL
|
|||
|
||||
void UIFAKKServerList::Draw(void)
|
||||
{
|
||||
if (m_serverList[0])
|
||||
{
|
||||
if (m_serverList[0]) {
|
||||
GServerListState listState[2];
|
||||
|
||||
ServerListThink(m_serverList[0]);
|
||||
|
@ -887,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);
|
||||
}
|
||||
|
||||
|
@ -980,7 +1029,7 @@ 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;
|
||||
|
@ -988,8 +1037,6 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
str sAddress;
|
||||
GServer server;
|
||||
FAKKServerListItem *pNewServerItem;
|
||||
static int iServerQueryCount = 0;
|
||||
static int iServerTotalCount = 0;
|
||||
UIFAKKServerList *uiServerList;
|
||||
int iServerType;
|
||||
// filters
|
||||
|
@ -1012,8 +1059,7 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
pNewServerItem = NULL;
|
||||
server = (GServer)param1;
|
||||
|
||||
if (param2)
|
||||
{
|
||||
if (param2) {
|
||||
if (msg == LIST_PROGRESS && param2 == (void *)-1) {
|
||||
iRealIP = inet_addr(ServerGetAddress(server));
|
||||
ServerGetIntValue(server, "hostport", PORT_SERVER);
|
||||
|
@ -1033,11 +1079,13 @@ 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)
|
||||
{
|
||||
if (msg == LIST_PROGRESS) {
|
||||
const char *pszHostName;
|
||||
bool bDiffVersion;
|
||||
bool bIsDemo;
|
||||
|
@ -1045,6 +1093,7 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
str sPlayers;
|
||||
const char *pszGameVer;
|
||||
const char *pszGameVerNumber;
|
||||
float fGameVer;
|
||||
|
||||
pszHostName = ServerGetStringValue(server, "hostname", "(NONE)");
|
||||
bDiffVersion = false;
|
||||
|
@ -1058,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;
|
||||
}
|
||||
}
|
||||
|
@ -1121,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) {
|
||||
|
@ -1153,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.");
|
||||
|
@ -1169,18 +1220,27 @@ 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;
|
||||
//}
|
||||
|
||||
// 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]);
|
||||
}
|
||||
}
|
||||
|
||||
iServerTotalCount += ServerListCount(serverlist);
|
||||
// Removed in 2.0
|
||||
// Only add entries for servers that are queried successfully
|
||||
// it avoids unnecessary entries
|
||||
#if 0
|
||||
for (j = 0; j < ServerListCount(serverlist); j++) {
|
||||
GServer arrayServer = ServerListGetServer(serverlist, j);
|
||||
|
||||
|
@ -1208,6 +1268,7 @@ void UpdateServerListCallBack(GServerList serverlist, int msg, void* instance, v
|
|||
|
||||
uiServerList->AddItem(pNewServerItem);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
for (i = 1; i <= uiServerList->getNumItems(); i++)
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -443,6 +443,7 @@ void UIFakkLabel::DrawStatbar(float frac)
|
|||
float alpha;
|
||||
qhandle_t hMat;
|
||||
float w, h;
|
||||
float fvWidth, fvHeight;
|
||||
|
||||
col[0] = col[1] = col[2] = col[3] = 1.0;
|
||||
|
||||
|
@ -488,11 +489,20 @@ void UIFakkLabel::DrawStatbar(float frac)
|
|||
{
|
||||
float width = frac * m_frame.size.width;
|
||||
|
||||
re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material->GetMaterial());
|
||||
fvWidth = m_frame.size.width / m_vVirtualScale[0] / uii.Rend_GetShaderWidth(m_statbar_material->GetMaterial());
|
||||
fvHeight = m_frame.size.height / m_vVirtualScale[1] / uii.Rend_GetShaderHeight(m_statbar_material->GetMaterial());
|
||||
|
||||
re.DrawStretchPic(0.0, 0.0, width, m_frame.size.height, 0, 0, fvWidth, fvHeight, m_statbar_material->GetMaterial());
|
||||
//re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material->GetMaterial());
|
||||
|
||||
if (alpha != 0.0 && m_statbar_material_flash) {
|
||||
re.SetColor(col);
|
||||
re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material_flash->GetMaterial());
|
||||
|
||||
fvWidth = m_frame.size.width / m_vVirtualScale[0] / uii.Rend_GetShaderWidth(m_statbar_material_flash->GetMaterial());
|
||||
fvHeight = m_frame.size.height / m_vVirtualScale[1] / uii.Rend_GetShaderHeight(m_statbar_material_flash->GetMaterial());
|
||||
|
||||
re.DrawStretchPic(0.0, 0.0, width, m_frame.size.height, 0, 0, fvWidth, fvHeight, m_statbar_material_flash->GetMaterial());
|
||||
//re.DrawTilePic(0.0, 0.0, width, m_frame.size.height, m_statbar_material_flash->GetMaterial());
|
||||
}
|
||||
|
||||
if (m_statbar_material_marker) {
|
||||
|
@ -521,13 +531,22 @@ void UIFakkLabel::DrawStatbar(float frac)
|
|||
{
|
||||
float y = m_frame.size.height * (1.0 - frac);
|
||||
|
||||
re.DrawTilePic(0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material->GetMaterial());
|
||||
fvWidth = m_frame.size.width / m_vVirtualScale[0] / uii.Rend_GetShaderWidth(m_statbar_material->GetMaterial());
|
||||
fvHeight = m_frame.size.height / m_vVirtualScale[1] / uii.Rend_GetShaderHeight(m_statbar_material->GetMaterial());
|
||||
|
||||
re.DrawStretchPic(0.0, y, m_frame.size.width, m_frame.size.height, 0, 0, fvWidth, fvHeight, m_statbar_material->GetMaterial());
|
||||
//re.DrawTilePic(0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material->GetMaterial());
|
||||
|
||||
if (alpha != 0.0 && m_statbar_material_flash) {
|
||||
re.SetColor(col);
|
||||
re.DrawTilePic(
|
||||
0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material_flash->GetMaterial()
|
||||
);
|
||||
|
||||
fvWidth = m_frame.size.width / m_vVirtualScale[0] / uii.Rend_GetShaderWidth(m_statbar_material_flash->GetMaterial());
|
||||
fvHeight = m_frame.size.height / m_vVirtualScale[1] / uii.Rend_GetShaderHeight(m_statbar_material_flash->GetMaterial());
|
||||
|
||||
re.DrawStretchPic(0.0, y, m_frame.size.width, m_frame.size.height, 0, 0, fvWidth, fvHeight, m_statbar_material_flash->GetMaterial());
|
||||
//re.DrawTilePic(
|
||||
// 0.0, y, m_frame.size.width, m_frame.size.height, m_statbar_material_flash->GetMaterial()
|
||||
//);
|
||||
}
|
||||
|
||||
if (m_statbar_material_marker) {
|
||||
|
@ -961,8 +980,8 @@ void UIFakkLabel::DrawStatRotator(float frac)
|
|||
vNeedleDir[0] = fSinVal;
|
||||
vNeedleDir[1] = -fCosVal;
|
||||
|
||||
vSize[0] = (m_frame.size.width + m_frame.size.height) / m_frame.size.width * m_angles[2] * m_vVirtualScale[0];
|
||||
vSize[1] = (m_frame.size.width + m_frame.size.height) / m_frame.size.height * m_scale * m_vVirtualScale[1];
|
||||
vSize[0] = (m_frame.size.width + m_frame.size.height) / m_frame.size.width * m_angles[2] * getVirtualScale()[0];
|
||||
vSize[1] = (m_frame.size.width + m_frame.size.height) / m_frame.size.height * m_scale * getVirtualScale()[1];
|
||||
|
||||
vCenter[0] = (m_frame.size.width * 0.5f - vSize[0]) * vNeedleDir[0] + m_frame.size.width * 0.5f;
|
||||
vCenter[1] = (m_frame.size.height * 0.5f - vSize[1]) * vNeedleDir[1] + m_frame.size.height * 0.5f;
|
||||
|
@ -1357,7 +1376,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(va("%s", CL_ConfigString(cl.snap.ps.stats[m_stat_configstring]))),
|
||||
UBlack,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
} else {
|
||||
m_font->PrintJustified(
|
||||
|
@ -1365,7 +1384,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(va("%s", CL_ConfigString(cl.snap.ps.stats[m_stat_configstring]))),
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
}
|
||||
return;
|
||||
|
@ -1384,7 +1403,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentVertical,
|
||||
va("%d", delta),
|
||||
UBlack,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
} else {
|
||||
m_font->PrintJustified(
|
||||
|
@ -1392,7 +1411,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
va("%d", delta),
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
}
|
||||
return;
|
||||
|
@ -1478,7 +1497,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(va("%s", CL_ConfigString(CS_WEAPONS + cl.snap.ps.activeItems[m_itemindex]))),
|
||||
UBlack,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
} else {
|
||||
m_font->PrintJustified(
|
||||
|
@ -1486,7 +1505,7 @@ void UIFakkLabel::Draw(void)
|
|||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(va("%s", CL_ConfigString(CS_WEAPONS + cl.snap.ps.activeItems[m_itemindex]))),
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -124,9 +124,9 @@ void View3D::DrawFPS(void)
|
|||
re.SetColor(UBlack);
|
||||
re.DrawBox(
|
||||
0.0,
|
||||
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 4.0,
|
||||
m_frame.pos.y + m_frame.size.height - m_font->getHeight() * 4.0,
|
||||
m_frame.pos.x + m_frame.size.width,
|
||||
m_font->getHeight(qfalse) * 4.0
|
||||
m_font->getHeight() * 4.0
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -145,11 +145,11 @@ void View3D::DrawFPS(void)
|
|||
}
|
||||
|
||||
m_font->Print(
|
||||
m_font->getHeight(qfalse) * 10.0,
|
||||
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 3.0,
|
||||
m_font->getHeight(getHighResScale()) * 10.0 / getHighResScale()[0],
|
||||
(m_frame.pos.y + m_frame.size.height - m_font->getHeight(getHighResScale()) * 3.0) / getHighResScale()[1],
|
||||
string,
|
||||
-1,
|
||||
qfalse
|
||||
getHighResScale()
|
||||
);
|
||||
|
||||
// Draw elements count
|
||||
|
@ -162,11 +162,11 @@ void View3D::DrawFPS(void)
|
|||
Com_sprintf(string, sizeof(string), "wt%5d wv%5d cl%d", cls.world_tris, cls.world_verts, cls.character_lights);
|
||||
|
||||
m_font->Print(
|
||||
m_font->getHeight(qfalse) * 10.0,
|
||||
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse) * 2.0,
|
||||
(m_font->getHeight(getHighResScale()) * 10.0) / getHighResScale()[0],
|
||||
(m_frame.pos.y + m_frame.size.height - m_font->getHeight(getHighResScale()) * 2.0) / getHighResScale()[1],
|
||||
string,
|
||||
-1,
|
||||
qfalse
|
||||
getHighResScale()
|
||||
);
|
||||
|
||||
Com_sprintf(
|
||||
|
@ -179,11 +179,11 @@ void View3D::DrawFPS(void)
|
|||
);
|
||||
|
||||
m_font->Print(
|
||||
m_font->getHeight(qfalse) * 10.0,
|
||||
m_frame.pos.y + m_frame.size.height - m_font->getHeight(qfalse),
|
||||
(m_font->getHeight(getHighResScale()) * 10.0) / getHighResScale()[0],
|
||||
(m_frame.pos.y + m_frame.size.height - m_font->getHeight(getHighResScale())) / getHighResScale()[1],
|
||||
string,
|
||||
-1,
|
||||
qfalse
|
||||
getHighResScale()
|
||||
);
|
||||
|
||||
m_font->setColor(UBlack);
|
||||
|
@ -208,32 +208,32 @@ void View3D::PrintSound(int channel, const char *name, float vol, int rvol, floa
|
|||
float xStep;
|
||||
float height;
|
||||
|
||||
height = m_font->getHeight(false);
|
||||
height = m_font->getHeight(getHighResScale());
|
||||
xStep = height;
|
||||
|
||||
x = 0;
|
||||
Com_sprintf(buf, sizeof(buf), "%d", channel);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
x += xStep + xStep;
|
||||
Com_sprintf(buf, sizeof(buf), "%s", name);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
x += xStep * 30.0;
|
||||
Com_sprintf(buf, sizeof(buf), "vol:%.2f", vol);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
x += xStep * 8;
|
||||
Com_sprintf(buf, sizeof(buf), "rvol:%.2f", (float)(rvol / 128.f));
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
x += xStep * 5;
|
||||
Com_sprintf(buf, sizeof(buf), "pit:%.2f", pitch);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
x += xStep * 5;
|
||||
Com_sprintf(buf, sizeof(buf), "base:%d", (int)base);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, false);
|
||||
m_font->Print(x, height * line + m_frame.pos.y, buf, -1, getHighResScale());
|
||||
|
||||
line++;
|
||||
}
|
||||
|
@ -264,8 +264,7 @@ void DisplayServerNetProfileInfo(UIFont *font, float y, netprofclient_t *netprof
|
|||
(unsigned int)((float)(netprofile->outPackets.numFragmented + netprofile->inPackets.numFragmented)
|
||||
/ (float)(netprofile->inPackets.totalProcessed + netprofile->outPackets.totalProcessed)
|
||||
)),
|
||||
-1,
|
||||
qfalse
|
||||
-1
|
||||
);
|
||||
font->Print(334, y, va("%i", netprofile->inPackets.percentDropped));
|
||||
font->Print(364, y, va("%i", netprofile->outPackets.percentDropped));
|
||||
|
@ -276,8 +275,7 @@ void DisplayServerNetProfileInfo(UIFont *font, float y, netprofclient_t *netprof
|
|||
(unsigned int)((float)(netprofile->outPackets.numDropped + netprofile->inPackets.numDropped)
|
||||
/ (float)(netprofile->inPackets.totalProcessed + netprofile->outPackets.totalProcessed)
|
||||
)),
|
||||
-1,
|
||||
qfalse
|
||||
-1
|
||||
);
|
||||
font->Print(434, y, va("%i", netprofile->inPackets.percentDropped));
|
||||
font->Print(464, y, va("%i", netprofile->outPackets.percentDropped));
|
||||
|
@ -288,8 +286,7 @@ void DisplayServerNetProfileInfo(UIFont *font, float y, netprofclient_t *netprof
|
|||
(unsigned int)((float)(netprofile->outPackets.totalLengthConnectionLess
|
||||
+ netprofile->inPackets.totalLengthConnectionLess)
|
||||
/ (float)(netprofile->outPackets.totalSize + netprofile->inPackets.totalSize))),
|
||||
-1,
|
||||
qfalse
|
||||
-1
|
||||
);
|
||||
font->Print(534, y, va("%i", netprofile->inPackets.bytesPerSec));
|
||||
font->Print(594, y, va("%i", netprofile->outPackets.bytesPerSec));
|
||||
|
@ -303,7 +300,7 @@ void DisplayClientNetProfile(UIFont *font, float x, float y, netprofclient_t *ne
|
|||
float fontHeight;
|
||||
float columnHeight;
|
||||
|
||||
fontHeight = font->getHeight(qfalse);
|
||||
fontHeight = font->getHeight();
|
||||
columns[0] = x + 120;
|
||||
columns[1] = x + 230;
|
||||
columns[2] = x + 330;
|
||||
|
@ -402,13 +399,13 @@ void View3D::DrawNetProfile(void)
|
|||
setFont("verdana-14");
|
||||
m_font->setColor(UWhite);
|
||||
|
||||
fontHeight = m_font->getHeight(qfalse);
|
||||
fontHeight = m_font->getHeight();
|
||||
yOffset = sv_netprofileoverlay->integer + 8;
|
||||
|
||||
if (svs.netprofile.rate) {
|
||||
m_font->Print(8, yOffset, va("Server Net Profile Max Rate: %i", svs.netprofile.rate), -1, qfalse);
|
||||
m_font->Print(8, yOffset, va("Server Net Profile Max Rate: %i", svs.netprofile.rate), -1);
|
||||
} else {
|
||||
m_font->Print(8, yOffset, "Server Net Profile Max Rate: none", -1, qfalse);
|
||||
m_font->Print(8, yOffset, "Server Net Profile Max Rate: none", -1);
|
||||
}
|
||||
|
||||
columnHeight = fontHeight + fontHeight + yOffset;
|
||||
|
@ -487,10 +484,10 @@ void View3D::DrawNetProfile(void)
|
|||
setFont("verdana-14");
|
||||
m_font->setColor(UWhite);
|
||||
|
||||
fontHeight = m_font->getHeight(qfalse);
|
||||
fontHeight = m_font->getHeight();
|
||||
yOffset = cl_netprofileoverlay->integer + 16;
|
||||
|
||||
m_font->Print(16, yOffset, "Client Net Profile", -1, qfalse);
|
||||
m_font->Print(16, yOffset, "Client Net Profile", -1);
|
||||
|
||||
NetProfileCalcStats(&cls.netprofile.outPackets, 500);
|
||||
NetProfileCalcStats(&cls.netprofile.inPackets, 500);
|
||||
|
@ -567,7 +564,7 @@ void View3D::CenterPrint(void)
|
|||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
p,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
|
||||
m_font->setColor(UColor(1, 1, 1, alpha));
|
||||
|
@ -575,7 +572,7 @@ void View3D::CenterPrint(void)
|
|||
frame = getClientFrame();
|
||||
|
||||
m_font->PrintJustified(
|
||||
frame, m_iFontAlignmentHorizontal, m_iFontAlignmentVertical, p, m_bVirtual ? m_vVirtualScale : NULL
|
||||
frame, m_iFontAlignmentHorizontal, m_iFontAlignmentVertical, p, getVirtualScale()
|
||||
);
|
||||
|
||||
m_font->setColor(UBlack);
|
||||
|
@ -628,7 +625,7 @@ void View3D::LocationPrint(void)
|
|||
alpha = Q_clamp_float(alpha, 0, 1);
|
||||
|
||||
x = m_x_coord / 640.f * m_screenframe.size.width;
|
||||
y = (480 - m_font->getHeight(false) - m_y_coord) / 480.f * m_screenframe.size.height;
|
||||
y = (480 - m_font->getHeight(getHighResScale()) - m_y_coord) / 480.f * m_screenframe.size.height;
|
||||
|
||||
if (m_x_coord == -1) {
|
||||
horiz = FONT_JUSTHORZ_CENTER;
|
||||
|
@ -647,7 +644,7 @@ void View3D::LocationPrint(void)
|
|||
horiz,
|
||||
vert,
|
||||
p,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
|
||||
m_font->setColor(UColor(1, 1, 1, alpha));
|
||||
|
@ -658,7 +655,7 @@ void View3D::LocationPrint(void)
|
|||
horiz,
|
||||
vert,
|
||||
p,
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
getVirtualScale()
|
||||
);
|
||||
|
||||
m_font->setColor(UBlack);
|
||||
|
@ -746,7 +743,7 @@ void View3D::DrawSubtitleOverlay(void)
|
|||
{
|
||||
cvar_t *subAlpha;
|
||||
int i;
|
||||
float minX, maxY;
|
||||
float minX, maxX;
|
||||
int line;
|
||||
|
||||
subAlpha = Cvar_Get("subAlpha", "0.5", 0);
|
||||
|
@ -781,8 +778,8 @@ void View3D::DrawSubtitleOverlay(void)
|
|||
}
|
||||
}
|
||||
|
||||
minX = m_screenframe.size.height - m_font->getHeight(false) * 10;
|
||||
maxY = (m_frame.pos.x + m_frame.size.width) - (m_frame.pos.x + m_frame.size.width) * 0.2f;
|
||||
minX = m_screenframe.size.height - m_font->getHeight(getHighResScale()) * 10;
|
||||
maxX = ((m_frame.pos.x + m_frame.size.width) - (m_frame.pos.x + m_frame.size.width) * 0.2f) / getHighResScale()[0];
|
||||
line = 0;
|
||||
|
||||
for (i = 0; i < MAX_SUBTITLES; i++) {
|
||||
|
@ -790,7 +787,7 @@ void View3D::DrawSubtitleOverlay(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (m_font->getWidth(subs[i]->string, sizeof(oldStrings[i])) > maxY) {
|
||||
if (m_font->getWidth(subs[i]->string, sizeof(oldStrings[i])) > maxX) {
|
||||
char buf[2048];
|
||||
char *c;
|
||||
char *end;
|
||||
|
@ -813,12 +810,12 @@ void View3D::DrawSubtitleOverlay(void)
|
|||
|
||||
width = m_font->getWidth(c, blockcount);
|
||||
|
||||
if (total + width > maxY) {
|
||||
if (total + width > maxX) {
|
||||
m_font->setColor(UColor(0, 0, 0, alpha[i] * subAlpha->value));
|
||||
m_font->Print(18, m_font->getHeight(false) * line + minX + 1.f, buf, -1, false);
|
||||
m_font->Print(18, (m_font->getHeight(getHighResScale()) * line + minX + 1.f) / getHighResScale()[1], buf, -1, getHighResScale());
|
||||
|
||||
m_font->setColor(UColor(1, 1, 1, alpha[i] * subAlpha->value));
|
||||
m_font->Print(20, m_font->getHeight(false) * line + minX, buf, -1, false);
|
||||
m_font->Print(20, (m_font->getHeight(getHighResScale()) * line + minX) / getHighResScale()[1], buf, -1, getHighResScale());
|
||||
|
||||
line++;
|
||||
|
||||
|
@ -841,17 +838,17 @@ void View3D::DrawSubtitleOverlay(void)
|
|||
}
|
||||
|
||||
m_font->setColor(UColor(0, 0, 0, alpha[i] * subAlpha->value));
|
||||
m_font->Print(18, m_font->getHeight(false) * line + minX + 1.f, buf, -1, qfalse);
|
||||
m_font->Print(18, (m_font->getHeight(getHighResScale()) * line + minX + 1.f) / getHighResScale()[1], buf, -1, getHighResScale());
|
||||
|
||||
m_font->setColor(UColor(1, 1, 1, alpha[i] * subAlpha->value));
|
||||
m_font->Print(20, m_font->getHeight(false) * line + minX, buf, -1, qfalse);
|
||||
m_font->Print(20, (m_font->getHeight(getHighResScale()) * line + minX) / getHighResScale()[1], buf, -1, getHighResScale());
|
||||
line++;
|
||||
} else {
|
||||
m_font->setColor(UColor(0, 0, 0, alpha[i] * subAlpha->value));
|
||||
m_font->Print(18, m_font->getHeight(false) * line + minX + 1.f, subs[i]->string, -1, qfalse);
|
||||
m_font->Print(18, (m_font->getHeight(getHighResScale()) * line + minX + 1.f) / getHighResScale()[1], subs[i]->string, -1, getHighResScale());
|
||||
|
||||
m_font->setColor(UColor(1, 1, 1, alpha[i] * subAlpha->value));
|
||||
m_font->Print(20, m_font->getHeight(false) * line + minX, subs[i]->string, -1, qfalse);
|
||||
m_font->Print(20, (m_font->getHeight(getHighResScale()) * line + minX) / getHighResScale()[1], subs[i]->string, -1, getHighResScale());
|
||||
|
||||
line++;
|
||||
}
|
||||
|
|
|
@ -389,6 +389,8 @@ typedef struct {
|
|||
qhandle_t whiteShader;
|
||||
qhandle_t consoleShader;
|
||||
fontInfo_t consoleFont;
|
||||
|
||||
int refSequence;
|
||||
} clientStatic_t;
|
||||
|
||||
extern clientStatic_t cls;
|
||||
|
@ -557,6 +559,10 @@ void UI_LoadResource( const char *name );
|
|||
|
||||
qboolean CL_CheckPaused(void);
|
||||
|
||||
int CL_GetRefSequence(void);
|
||||
qboolean CL_IsRendererLoaded(void);
|
||||
void CL_ApplyOriginalConfigTweaks();
|
||||
|
||||
//
|
||||
// cl_input
|
||||
//
|
||||
|
|
|
@ -81,6 +81,7 @@ LPALGENBUFFERS qalGenBuffers;
|
|||
LPALDELETEBUFFERS qalDeleteBuffers;
|
||||
LPALISBUFFER qalIsBuffer;
|
||||
LPALBUFFERDATA qalBufferData;
|
||||
LPALBUFFERI qalBufferi;
|
||||
LPALGETBUFFERF qalGetBufferf;
|
||||
LPALGETBUFFERFV qalGetBufferfv;
|
||||
LPALGETBUFFERI qalGetBufferi;
|
||||
|
@ -201,6 +202,7 @@ qboolean QAL_Init(const char *libname)
|
|||
qalDeleteBuffers = GPA("alDeleteBuffers");
|
||||
qalIsBuffer = GPA("alIsBuffer");
|
||||
qalBufferData = GPA("alBufferData");
|
||||
qalBufferi = GPA("alBufferi");
|
||||
qalGetBufferf = GPA("alGetBufferf");
|
||||
qalGetBufferfv = GPA("alGetBufferfv");
|
||||
qalGetBufferi = GPA("alGetBufferi");
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -120,7 +123,7 @@ extern LPALBUFFERDATA qalBufferData;
|
|||
extern LPALBUFFERF qalBufferf;
|
||||
extern LPALBUFFER3F qalBuffer3f;
|
||||
extern LPALBUFFERFV qalBufferfv;
|
||||
extern LPALBUFFERF qalBufferi;
|
||||
extern LPALBUFFERI qalBufferi;
|
||||
extern LPALBUFFER3F qalBuffer3i;
|
||||
extern LPALBUFFERFV qalBufferiv;
|
||||
extern LPALGETBUFFERF qalGetBufferf;
|
||||
|
|
|
@ -34,11 +34,12 @@ extern "C" {
|
|||
typedef struct snd_info_s
|
||||
{
|
||||
int rate;
|
||||
int width;
|
||||
float width;
|
||||
int channels;
|
||||
int samples;
|
||||
int size;
|
||||
int dataofs;
|
||||
int dataalign;
|
||||
} snd_info_t;
|
||||
|
||||
typedef struct snd_codec_s snd_codec_t;
|
||||
|
|
|
@ -622,7 +622,7 @@ int S_MP3_CodecReadStream(snd_stream_t* stream, int bytes, void* buffer)
|
|||
mp3info = stream->ptr;
|
||||
|
||||
// Make sure we get complete frames all the way through.
|
||||
bytes -= bytes % (stream->info.channels * stream->info.width);
|
||||
bytes -= fmod(bytes, (stream->info.channels * stream->info.width));
|
||||
|
||||
if (mp3info->buflen)
|
||||
{
|
||||
|
|
|
@ -133,6 +133,7 @@ static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info)
|
|||
char dump[16];
|
||||
int bits;
|
||||
int fmtlen = 0;
|
||||
int bytealign;
|
||||
|
||||
// skip the riff wav header
|
||||
FS_Read(dump, 12, file);
|
||||
|
@ -149,17 +150,22 @@ static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info)
|
|||
info->channels = FGetLittleShort(file);
|
||||
info->rate = FGetLittleLong(file);
|
||||
FGetLittleLong(file);
|
||||
FGetLittleShort(file);
|
||||
bytealign = FGetLittleShort(file);
|
||||
bits = FGetLittleShort(file);
|
||||
|
||||
if( bits < 8 )
|
||||
{
|
||||
Com_Printf( S_COLOR_RED "ERROR: Less than 8 bit sound is not supported\n");
|
||||
return qfalse;
|
||||
}
|
||||
//if( bits < 8 )
|
||||
//{
|
||||
// Com_Printf( S_COLOR_RED "ERROR: Less than 8 bit sound is not supported\n");
|
||||
// return qfalse;
|
||||
//}
|
||||
|
||||
info->width = bits / 8;
|
||||
info->width = bits / 8.0;
|
||||
info->dataofs = 0;
|
||||
if (bits == 16) {
|
||||
info->dataalign = 1;
|
||||
} else {
|
||||
info->dataalign = (bytealign / info->channels - 4) / 4 * 8 + 1;
|
||||
}
|
||||
|
||||
// Skip the rest of the format chunk if required
|
||||
if(fmtlen > 16)
|
||||
|
|
|
@ -104,7 +104,7 @@ void S_Init(qboolean full_startup)
|
|||
s_musicVolume = Cvar_Get("s_musicvolume", "0.9", CVAR_ARCHIVE);
|
||||
s_ambientVolume = Cvar_Get("s_ambientvolume", "1.00", CVAR_ARCHIVE);
|
||||
s_separation = Cvar_Get("s_separation", "0.5", CVAR_ARCHIVE);
|
||||
s_khz = Cvar_Get("s_khz", "11", CVAR_ARCHIVE | CVAR_SOUND_LATCH);
|
||||
s_khz = Cvar_Get("s_khz", "44", CVAR_ARCHIVE | CVAR_SOUND_LATCH);
|
||||
s_loadas8bit = Cvar_Get("s_loadas8bit", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
s_mixPreStep = Cvar_Get("s_mixPreStep", "0.05", CVAR_ARCHIVE);
|
||||
s_show = Cvar_Get("s_show", "0", CVAR_CHEAT);
|
||||
|
@ -552,7 +552,7 @@ void S_StartLocalSound(const char *sound_name, qboolean force_load)
|
|||
}
|
||||
|
||||
S_StartSound(
|
||||
0,
|
||||
NULL,
|
||||
s_iListenerNumber,
|
||||
CHAN_MENU,
|
||||
sfxHandle,
|
||||
|
@ -749,6 +749,10 @@ void S_Play()
|
|||
int i;
|
||||
char name[MAX_QPATH];
|
||||
|
||||
if (Cmd_Argc() < 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < Cmd_Argc(); i++) {
|
||||
if (strrchr(Cmd_Argv(i), '.')) {
|
||||
Q_strncpyz(name, Cmd_Argv(i), sizeof(name));
|
||||
|
|
|
@ -62,6 +62,7 @@ typedef struct {
|
|||
|
||||
int dataofs;
|
||||
int datasize;
|
||||
int dataalign;
|
||||
} wavinfo_t;
|
||||
|
||||
typedef struct sfx_s {
|
||||
|
|
|
@ -218,6 +218,7 @@ wavinfo_t GetWavinfo(const char *name, byte *wav, int wavlength)
|
|||
{
|
||||
wavinfo_t info;
|
||||
int samples;
|
||||
short bytealign;
|
||||
|
||||
memset(&info, 0, sizeof(wavinfo_t));
|
||||
|
||||
|
@ -247,7 +248,9 @@ wavinfo_t GetWavinfo(const char *name, byte *wav, int wavlength)
|
|||
if (info.format == 17) {
|
||||
info.channels = GetLittleShort();
|
||||
info.rate = (float)GetLittleLong();
|
||||
data_p += 6;
|
||||
data_p += 4;
|
||||
|
||||
bytealign = GetLittleShort();
|
||||
info.width = (float)GetLittleShort() / 8.f;
|
||||
data_p += 2;
|
||||
|
||||
|
@ -270,12 +273,16 @@ wavinfo_t GetWavinfo(const char *name, byte *wav, int wavlength)
|
|||
Com_Error(ERR_DROP, "Sound %s has a bad loop length", name);
|
||||
}
|
||||
|
||||
info.dataofs = 0;
|
||||
info.dataofs = data_p - wav;
|
||||
info.datasize = iff_chunk_len - bytealign + info.dataofs;
|
||||
info.dataalign = (bytealign / info.channels - 4) / 4 * 8 + 1;
|
||||
} else if (info.format == 1) {
|
||||
info.channels = GetLittleShort();
|
||||
info.rate = (float)GetLittleLong();
|
||||
data_p += 6;
|
||||
info.width = (float)(GetLittleShort() / 8);
|
||||
data_p += 4;
|
||||
|
||||
bytealign = GetLittleShort();
|
||||
info.width = (float)GetLittleShort() / 8.f;
|
||||
|
||||
FindChunk("data");
|
||||
if (!data_p) {
|
||||
|
@ -293,13 +300,15 @@ wavinfo_t GetWavinfo(const char *name, byte *wav, int wavlength)
|
|||
}
|
||||
|
||||
info.dataofs = data_p - wav;
|
||||
info.datasize = iff_chunk_len;
|
||||
info.dataalign = (bytealign / info.channels - 4) / 4 * 8 + 1;
|
||||
// dataalign should always be 1
|
||||
assert(info.dataalign == 1);
|
||||
} else {
|
||||
Com_Printf("Microsoft PCM format only\n");
|
||||
return info;
|
||||
}
|
||||
|
||||
info.datasize = iff_chunk_len;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
|
@ -322,14 +331,12 @@ qboolean DownSampleWav(wavinfo_t *info, byte *wav, int wavlength, int newkhz, by
|
|||
newdatasize = 0;
|
||||
datap = &wav[info->dataofs];
|
||||
|
||||
if (info->channels > 1)
|
||||
{
|
||||
if (info->channels > 1) {
|
||||
Com_DPrintf("Could not downsample WAV file. Stereo WAVs not supported!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (info->format != 1 || !info->dataofs)
|
||||
{
|
||||
if (info->format != 1 || !info->dataofs) {
|
||||
Com_DPrintf("Could not downsample WAV file. Not PCM format!\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -361,16 +368,14 @@ qboolean DownSampleWav(wavinfo_t *info, byte *wav, int wavlength, int newkhz, by
|
|||
iff_end = *newdata + newdatasize;
|
||||
FindChunk("RIFF");
|
||||
|
||||
if (!data_p || strncmp((const char*)data_p + 8, "WAVE", 4u))
|
||||
{
|
||||
if (!data_p || strncmp((const char *)data_p + 8, "WAVE", 4u)) {
|
||||
Com_DPrintf("Missing RIFF/WAVE chunks\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
iff_data = data_p + 12;
|
||||
FindChunk("fmt ");
|
||||
if (!data_p)
|
||||
{
|
||||
if (!data_p) {
|
||||
Com_DPrintf("Missing fmt chunk\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -380,8 +385,7 @@ qboolean DownSampleWav(wavinfo_t *info, byte *wav, int wavlength, int newkhz, by
|
|||
data_p += 8;
|
||||
|
||||
FindChunk("data");
|
||||
if (!data_p)
|
||||
{
|
||||
if (!data_p) {
|
||||
Com_DPrintf("Missing data chunk\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -456,8 +460,7 @@ qboolean S_LoadSound(const char *fileName, sfx_t *sfx, int streamed, qboolean fo
|
|||
}
|
||||
|
||||
size = FS_FOpenFileRead(fileName, &file_handle, qfalse, qtrue);
|
||||
if (size <= 0)
|
||||
{
|
||||
if (size <= 0) {
|
||||
if (file_handle) {
|
||||
FS_FCloseFile(file_handle);
|
||||
}
|
||||
|
@ -470,8 +473,7 @@ qboolean S_LoadSound(const char *fileName, sfx_t *sfx, int streamed, qboolean fo
|
|||
FS_FCloseFile(file_handle);
|
||||
sfx->info = GetWavinfo(fileName, sfx->data, size);
|
||||
|
||||
if (sfx->info.channels != 1 && !streamed)
|
||||
{
|
||||
if (sfx->info.channels != 1 && !streamed) {
|
||||
Com_Printf("%s is a stereo wav file\n", fileName);
|
||||
Z_Free(sfx->data);
|
||||
sfx->data = NULL;
|
||||
|
|
|
@ -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)();
|
||||
|
@ -100,6 +96,9 @@ int music_currentsong = 0;
|
|||
static qboolean enumeration_ext = qfalse;
|
||||
static qboolean enumeration_all_ext = qfalse;
|
||||
|
||||
static qboolean ima4_ext = qfalse;
|
||||
static qboolean soft_block_align = qfalse;
|
||||
|
||||
song_t music_songs[MAX_MUSIC_SONGS];
|
||||
openal_internal_t openal;
|
||||
static float s_fFadeStartTime;
|
||||
|
@ -113,7 +112,7 @@ static int
|
|||
S_OPENAL_SpatializeStereoSound(const vec3_t listener_origin, const vec3_t listener_left, const vec3_t origin);
|
||||
static void S_OPENAL_reverb(int iChannel, int iReverbType, float fReverbLevel);
|
||||
static bool S_OPENAL_LoadMP3_Codec(const char *_path, sfx_t *pSfx);
|
||||
static ALuint S_OPENAL_Format(int width, int channels);
|
||||
static ALuint S_OPENAL_Format(float width, int channels);
|
||||
|
||||
#define alDieIfError() __alDieIfError(__FILE__, __LINE__)
|
||||
|
||||
|
@ -129,6 +128,13 @@ static ALuint S_OPENAL_Format(int width, int channels);
|
|||
# define ALDRIVER_DEFAULT "libopenal.so.1"
|
||||
#endif
|
||||
|
||||
//
|
||||
// alext
|
||||
//
|
||||
#ifdef AL_SOFT_source_resampler
|
||||
LPALGETSTRINGISOFT qalGetStringiSOFT;
|
||||
#endif
|
||||
|
||||
/*
|
||||
==============
|
||||
__alDieIfError
|
||||
|
@ -268,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");
|
||||
|
||||
|
@ -375,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
|
||||
|
@ -385,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:
|
||||
|
@ -405,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);
|
||||
|
@ -449,9 +467,7 @@ S_OPENAL_InitExtensions
|
|||
*/
|
||||
static bool S_OPENAL_InitExtensions()
|
||||
{
|
||||
Com_Printf("AL extensions ignored\n");
|
||||
return true;
|
||||
|
||||
/*
|
||||
extensions_table_t extensions_table[4] = {
|
||||
"alutLoadMP3_LOKI",
|
||||
(void **)&_alutLoadMP3_LOKI,
|
||||
|
@ -463,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) {
|
||||
|
@ -485,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;
|
||||
}
|
||||
|
@ -524,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;
|
||||
}
|
||||
|
||||
|
@ -594,11 +629,34 @@ qboolean S_OPENAL_Init()
|
|||
Com_Printf("OpenAL: No reverb support. Reverb is disabled.\n");
|
||||
}
|
||||
}
|
||||
s_reverb->modified = false;
|
||||
|
||||
al_current_volume = Square(s_volume->value);
|
||||
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;
|
||||
|
@ -612,7 +670,9 @@ qboolean S_OPENAL_Init()
|
|||
}
|
||||
|
||||
for (i = 0; i < MAX_SOUNDSYSTEM_CHANNELS_2D_STREAM; i++) {
|
||||
if (!S_OPENAL_InitChannel(i + MAX_SOUNDSYSTEM_CHANNELS_3D + MAX_SOUNDSYSTEM_CHANNELS_2D, &openal.chan_2D_stream[i])) {
|
||||
if (!S_OPENAL_InitChannel(
|
||||
i + MAX_SOUNDSYSTEM_CHANNELS_3D + MAX_SOUNDSYSTEM_CHANNELS_2D, &openal.chan_2D_stream[i]
|
||||
)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -638,6 +698,17 @@ qboolean S_OPENAL_Init()
|
|||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Disable sound virtualization on special channels
|
||||
// (triggered music, ambient sounds...)
|
||||
//
|
||||
for (i = 0; i < MAX_SOUNDSYSTEM_SONGS; i++) {
|
||||
openal.chan_song[i].set_no_virtualization();
|
||||
}
|
||||
openal.chan_mp3.set_no_virtualization();
|
||||
openal.chan_trig_music.set_no_virtualization();
|
||||
openal.chan_movie.set_no_virtualization();
|
||||
|
||||
Cmd_AddCommand("playmp3", S_OPENAL_PlayMP3);
|
||||
Cmd_AddCommand("stopmp3", S_OPENAL_StopMP3);
|
||||
Cmd_AddCommand("loadsoundtrack", S_loadsoundtrack);
|
||||
|
@ -689,6 +760,8 @@ void S_OPENAL_Shutdown()
|
|||
|
||||
s_bProvidersEmunerated = false;
|
||||
al_initialized = false;
|
||||
|
||||
QAL_Shutdown();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -827,7 +900,8 @@ void S_DumpInfo()
|
|||
S_DumpStatus(
|
||||
"Misc",
|
||||
i,
|
||||
openal.channel[MAX_SOUNDSYSTEM_CHANNELS_3D + MAX_SOUNDSYSTEM_CHANNELS_2D + MAX_SOUNDSYSTEM_CHANNELS_2D_STREAM + i]
|
||||
openal.channel
|
||||
[MAX_SOUNDSYSTEM_CHANNELS_3D + MAX_SOUNDSYSTEM_CHANNELS_2D + MAX_SOUNDSYSTEM_CHANNELS_2D_STREAM + i]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1357,15 +1431,14 @@ static void S_OPENAL_Start2DSound(
|
|||
pChannel->iBaseRate = pChannel->sample_playback_rate();
|
||||
pChannel->set_no_3d();
|
||||
fRealVolume = fRealVolume * s_fVolumeGain;
|
||||
pChannel->set_gain(fRealVolume);
|
||||
pChannel->play();
|
||||
} else {
|
||||
pChannel->stop();
|
||||
pChannel->set_no_3d();
|
||||
pChannel->set_sfx(pSfx);
|
||||
}
|
||||
|
||||
pChannel->set_gain(fRealVolume);
|
||||
pChannel->play();
|
||||
}
|
||||
|
||||
if (s_show_sounds->integer > 0) {
|
||||
Com_DPrintf(
|
||||
|
@ -1818,7 +1891,9 @@ static int S_OPENAL_Start2DLoopSound(
|
|||
pChannel->set_gain(fVolumeToPlay);
|
||||
pChannel->start_sample();
|
||||
if (s_show_sounds->integer > 0) {
|
||||
Com_DPrintf("OpenAL: %d (#%i) - %s (vol %f)\n", cl.serverTime, pLoopSound->iChannel, pLoopSound->pSfx->name, fVolume);
|
||||
Com_DPrintf(
|
||||
"OpenAL: %d (#%i) - %s (vol %f)\n", cl.serverTime, pLoopSound->iChannel, pLoopSound->pSfx->name, fVolume
|
||||
);
|
||||
}
|
||||
|
||||
return iChannel;
|
||||
|
@ -2138,7 +2213,9 @@ void S_OPENAL_AddLoopSounds(const vec3_t vTempAxis)
|
|||
}
|
||||
|
||||
if (s_show_sounds->integer > 0) {
|
||||
Com_DPrintf("OpenAL: %d (#%i) - started loop - %s\n", cl.serverTime, pLoopSound->iChannel, pLoopSound->pSfx->name);
|
||||
Com_DPrintf(
|
||||
"OpenAL: %d (#%i) - started loop - %s\n", cl.serverTime, pLoopSound->iChannel, pLoopSound->pSfx->name
|
||||
);
|
||||
}
|
||||
|
||||
if (pLoopSound->pSfx->iFlags & (SFX_FLAG_NO_OFFSET)
|
||||
|
@ -2389,7 +2466,10 @@ S_OPENAL_reverb
|
|||
*/
|
||||
static void S_OPENAL_reverb(int iChannel, int iReverbType, float fReverbLevel)
|
||||
{
|
||||
// No reverb.
|
||||
// FIXME: Connect source to effect slot
|
||||
// see https://github.com/kcat/openal-soft/blob/master/examples/alreverb.c
|
||||
|
||||
// No reverb currently.
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2404,6 +2484,10 @@ void S_OPENAL_SetReverb(int iType, float fLevel)
|
|||
if (al_use_reverb) {
|
||||
s_bReverbChanged = true;
|
||||
}
|
||||
|
||||
// FIXME: generate effect and auxiliary effect slot
|
||||
// or destroy them
|
||||
// see https://github.com/kcat/openal-soft/blob/master/examples/alreverb.c
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2475,7 +2559,16 @@ void S_OPENAL_Update()
|
|||
|
||||
if (s_reverb->modified) {
|
||||
s_reverb->modified = false;
|
||||
Com_Printf("FIXME: Allow reverb toggle at runtime in OpenAL code.\n");
|
||||
|
||||
if (s_reverb->integer) {
|
||||
if (al_use_reverb) {
|
||||
S_OPENAL_SetReverb(s_iReverbType, s_fReverbLevel);
|
||||
} else {
|
||||
Com_Printf("OpenAL: No reverb support. Reverb is disabled.\n");
|
||||
}
|
||||
} else if (al_use_reverb) {
|
||||
S_OPENAL_SetReverb(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (s_show_num_active_sounds->integer == 1) {
|
||||
|
@ -2883,6 +2976,35 @@ void openal_channel::play()
|
|||
alDieIfError();
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
openal_channel::set_no_virtualization
|
||||
==============
|
||||
*/
|
||||
void openal_channel::set_no_virtualization()
|
||||
{
|
||||
#if AL_SOFT_direct_channels_remix
|
||||
qalSourcei(source, AL_DIRECT_CHANNELS_SOFT, AL_REMIX_UNMATCHED_SOFT);
|
||||
alDieIfError();
|
||||
#elif AL_SOFT_direct_channels
|
||||
qalSourcei(source, AL_DIRECT_CHANNELS_SOFT, AL_TRUE);
|
||||
alDieIfError();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
openal_channel::set_virtualization
|
||||
==============
|
||||
*/
|
||||
void openal_channel::set_virtualization()
|
||||
{
|
||||
#if AL_SOFT_direct_channels_remix || AL_SOFT_direct_channels
|
||||
qalSourcei(source, AL_DIRECT_CHANNELS_SOFT, AL_FALSE);
|
||||
alDieIfError();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
openal_channel::pause
|
||||
|
@ -2991,9 +3113,23 @@ bool openal_channel::set_sfx(sfx_t *pSfx)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (pSfx->info.dataalign > 1 && !soft_block_align) {
|
||||
Com_DPrintf(
|
||||
"OpenAL: Alignment specified but AL doesn't support block alignment (%d).", pSfx->info.dataalign
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
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,
|
||||
fmt,
|
||||
|
@ -4216,7 +4352,7 @@ int S_CurrentMoviePosition()
|
|||
S_AL_Format
|
||||
=================
|
||||
*/
|
||||
static ALuint S_OPENAL_Format(int width, int channels)
|
||||
static ALuint S_OPENAL_Format(float width, int channels)
|
||||
{
|
||||
ALuint format = AL_FORMAT_MONO16;
|
||||
|
||||
|
@ -4233,6 +4369,17 @@ static ALuint S_OPENAL_Format(int width, int channels)
|
|||
} else if (channels == 2) {
|
||||
format = AL_FORMAT_STEREO16;
|
||||
}
|
||||
} else if (width == 0.5) {
|
||||
if (ima4_ext && soft_block_align) {
|
||||
if (channels == 1) {
|
||||
format = AL_FORMAT_MONO_IMA4;
|
||||
} else if (channels == 2) {
|
||||
format = AL_FORMAT_STEREO_IMA4;
|
||||
}
|
||||
} else {
|
||||
// unsupported
|
||||
format = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return format;
|
||||
|
@ -4360,6 +4507,13 @@ 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();
|
||||
|
||||
|
@ -4499,6 +4653,13 @@ 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();
|
||||
|
||||
|
@ -4527,7 +4688,7 @@ U32 openal_channel_two_d_stream::sample_offset()
|
|||
ALint numProcessedBuffers = 0;
|
||||
ALint numQueuedBuffers = 0;
|
||||
unsigned int totalQueueLength = 0;
|
||||
unsigned int bytesPerSample = 0;
|
||||
unsigned int bitsPerSample = 0;
|
||||
unsigned int offset = 0;
|
||||
ALint bits = 0, channels = 0;
|
||||
|
||||
|
@ -4541,7 +4702,7 @@ U32 openal_channel_two_d_stream::sample_offset()
|
|||
alDieIfError();
|
||||
|
||||
totalQueueLength = getQueueLength();
|
||||
bytesPerSample = getBytesPerSample();
|
||||
bitsPerSample = getBitsPerSample();
|
||||
|
||||
assert(playerByteOffset < totalQueueLength);
|
||||
assert(streamNextOffset >= totalQueueLength || stream);
|
||||
|
@ -4569,7 +4730,7 @@ U32 openal_channel_two_d_stream::sample_offset()
|
|||
offset = totalQueueLength - streamNextOffset + playerByteOffset;
|
||||
}
|
||||
|
||||
return offset / bytesPerSample;
|
||||
return offset * 8 / bitsPerSample;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -4599,7 +4760,7 @@ void openal_channel_two_d_stream::set_sample_offset(U32 offset)
|
|||
snd_stream_t *stream;
|
||||
unsigned int bytesToRead, bytesRead;
|
||||
unsigned int byteOffset;
|
||||
unsigned int bytesPerSample;
|
||||
unsigned int bitsPerSample;
|
||||
unsigned int streamPosition;
|
||||
ALuint format;
|
||||
ALint numQueuedBuffers;
|
||||
|
@ -4612,8 +4773,8 @@ void openal_channel_two_d_stream::set_sample_offset(U32 offset)
|
|||
|
||||
stream = (snd_stream_t *)streamHandle;
|
||||
streamPosition = getCurrentStreamPosition();
|
||||
bytesPerSample = getBytesPerSample();
|
||||
byteOffset = offset * bytesPerSample;
|
||||
bitsPerSample = getBitsPerSample();
|
||||
byteOffset = offset * bitsPerSample / 8;
|
||||
|
||||
if (byteOffset >= streamPosition && byteOffset < streamNextOffset) {
|
||||
//
|
||||
|
@ -4863,13 +5024,13 @@ unsigned int openal_channel_two_d_stream::getCurrentStreamPosition() const
|
|||
|
||||
/*
|
||||
==============
|
||||
openal_channel_two_d_stream::getBytesPerSample
|
||||
openal_channel_two_d_stream::getBitsPerSample
|
||||
|
||||
Return the number of bytes per sample.
|
||||
It assumes that all pending buffers have the same channels and bits.
|
||||
==============
|
||||
*/
|
||||
unsigned int openal_channel_two_d_stream::getBytesPerSample() const
|
||||
unsigned int openal_channel_two_d_stream::getBitsPerSample() const
|
||||
{
|
||||
unsigned int bufferId;
|
||||
ALint bits = 0, channels = 0;
|
||||
|
@ -4880,5 +5041,5 @@ unsigned int openal_channel_two_d_stream::getBytesPerSample() const
|
|||
qalGetBufferi(buffers[bufferId], AL_CHANNELS, &channels);
|
||||
alDieIfError();
|
||||
|
||||
return bits * channels / 8;
|
||||
return bits * channels;
|
||||
}
|
||||
|
|
|
@ -95,6 +95,8 @@ public:
|
|||
|
||||
void set_no_3d();
|
||||
void set_3d();
|
||||
void set_no_virtualization();
|
||||
void set_virtualization();
|
||||
|
||||
void set_gain(float gain);
|
||||
void set_velocity(float v0, float v1, float v2);
|
||||
|
@ -165,7 +167,7 @@ private:
|
|||
|
||||
unsigned int getQueueLength() const;
|
||||
unsigned int getCurrentStreamPosition() const;
|
||||
unsigned int getBytesPerSample() const;
|
||||
unsigned int getBitsPerSample() const;
|
||||
};
|
||||
|
||||
struct openal_movie_channel : public openal_channel {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(fgame)
|
||||
|
||||
# Shared source files for modules
|
||||
|
|
|
@ -71,10 +71,15 @@ void cVehicleSlot::NotSolid(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (!ent->IsSubclassOfPlayer()) {
|
||||
// Added in 2.0
|
||||
// Commented in OPM
|
||||
// Not sure why since 2.0, players aren't made non-solid in slots
|
||||
//if (!ent->IsSubclassOfPlayer()) {
|
||||
// ent->setSolidType(SOLID_NOT);
|
||||
//}
|
||||
|
||||
ent->setSolidType(SOLID_NOT);
|
||||
}
|
||||
}
|
||||
|
||||
void cVehicleSlot::Solid(void)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
@ -2993,6 +2993,7 @@ Actor::Actor()
|
|||
// The variable isn't set in original
|
||||
//
|
||||
m_bSilent = false;
|
||||
m_bMumble = true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -8389,7 +8390,7 @@ bool Actor::AttackEntryAnimation(void)
|
|||
m_bNewEnemy = true;
|
||||
return true;
|
||||
}
|
||||
} else if (fDistSquared > Square(1024)) {
|
||||
} else if (fDistSquared > Square(1024) && (rand() % 4) == 0) {
|
||||
Sentient *pSquadMate;
|
||||
|
||||
for (pSquadMate = m_pNextSquadMate; pSquadMate != this; pSquadMate = pSquadMate->m_pNextSquadMate) {
|
||||
|
@ -8701,7 +8702,7 @@ void Actor::FaceEnemyOrMotion(int iTimeIntoMove)
|
|||
{
|
||||
vec2_t vDelta;
|
||||
|
||||
VectorCopy2D(origin, vDelta);
|
||||
VectorSub2D(origin, m_vLastEnemyPos, vDelta);
|
||||
|
||||
if (iTimeIntoMove <= 999) {
|
||||
m_bFaceEnemy = true;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2024 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -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 *));
|
||||
}
|
||||
|
||||
|
|
|
@ -717,6 +717,16 @@ static void PM_NoclipMove(void)
|
|||
|
||||
// move
|
||||
VectorMA(pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin);
|
||||
|
||||
// Added in 2.0
|
||||
// If the player is out of bounds in noclip mode,
|
||||
// teleport it back to the (0,0,0) coordinates
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (fabs(pm->ps->origin[i]) >= MAX_MAP_BOUNDS - 512) {
|
||||
VectorClear(pm->ps->origin);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -652,7 +652,7 @@ movement on the server game.
|
|||
#define MASK_CAMERASOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_BODY | MASK_WATER)
|
||||
#define MASK_BEAM (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_BODY | CONTENTS_FENCE)
|
||||
#define MASK_LADDER \
|
||||
(CONTENTS_SOLID | CONTENTS_LADDER | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_BODY | CONTENTS_FENCE)
|
||||
(CONTENTS_SOLID | CONTENTS_LADDER | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_BODY | CONTENTS_FENCE | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX)
|
||||
#define MASK_AUTOCALCLIFE (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_FENCE)
|
||||
#define MASK_EXPLOSION (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_WEAPONCLIP)
|
||||
#define MASK_SOUND (CONTENTS_SOLID | CONTENTS_TRANSLUCENT)
|
||||
|
@ -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,31 +112,29 @@ 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 float *origin, DM_Team *dmTeam, const Player *player)
|
||||
float SpawnpointMetric_Ffa(const vec3_t origin, DM_Team *dmTeam, const Player *player)
|
||||
{
|
||||
float fMinEnemyDistSquared = 23170.0f * 23170.0f;
|
||||
float fMinEnemyDistSquared = Square(23170.f);
|
||||
int i;
|
||||
int nPlayers = dmManager.PlayerCount();
|
||||
float fDist;
|
||||
|
||||
for (i = 1; i < nPlayers; i++) {
|
||||
for (i = 1; i <= nPlayers; i++) {
|
||||
Player *teammate = dmManager.GetPlayer(i);
|
||||
if (teammate == player || teammate->IsDead() || teammate->IsSpectator()) {
|
||||
continue;
|
||||
|
@ -150,12 +147,12 @@ float SpawnpointMetric_Ffa(const float *origin, DM_Team *dmTeam, const Player *p
|
|||
}
|
||||
}
|
||||
|
||||
return fMinEnemyDistSquared - (G_Random(0.25f) + 1.0f) * (1024.0f * 1024.0f);
|
||||
return fMinEnemyDistSquared - Square(1024) * (G_Random(0.25) + 1.0);
|
||||
}
|
||||
|
||||
float SpawnpointMetric_Team(const float *origin, DM_Team *dmTeam, const Player *player)
|
||||
float SpawnpointMetric_Team(const vec3_t origin, DM_Team *dmTeam, const Player *player)
|
||||
{
|
||||
float fMinEnemyDistSquared = 23170.0f * 23170.0f;
|
||||
float fMinEnemyDistSquared = Square(23170.f);
|
||||
float fSumFriendDistSquared = 0.0f;
|
||||
float fDistSquared;
|
||||
float fMetric;
|
||||
|
@ -163,7 +160,7 @@ float SpawnpointMetric_Team(const float *origin, DM_Team *dmTeam, const Player *
|
|||
int nPlayers = dmManager.PlayerCount();
|
||||
int nFriends = 0;
|
||||
|
||||
for (i = 1; i < nPlayers; i++) {
|
||||
for (i = 1; i <= nPlayers; i++) {
|
||||
Player *teammate = dmManager.GetPlayer(i);
|
||||
if (teammate == player || teammate->IsDead() || teammate->IsSpectator()) {
|
||||
continue;
|
||||
|
@ -174,25 +171,23 @@ float SpawnpointMetric_Team(const float *origin, DM_Team *dmTeam, const Player *
|
|||
if (teammate->GetDM_Team() == dmTeam) {
|
||||
nFriends++;
|
||||
fSumFriendDistSquared += fDistSquared;
|
||||
} else {
|
||||
if (fMinEnemyDistSquared > fDistSquared) {
|
||||
} else if (fMinEnemyDistSquared > fDistSquared) {
|
||||
fMinEnemyDistSquared = fDistSquared;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fMetric = fMinEnemyDistSquared - (G_Random(0.25f) + 1.0f) * (1024.0f * 1024.0f);
|
||||
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;
|
||||
}
|
||||
|
||||
float SpawnpointMetric_Objective(const float *origin, DM_Team *dmTeam, const Player *player)
|
||||
float SpawnpointMetric_Objective(const vec3_t origin, DM_Team *dmTeam, const Player *player)
|
||||
{
|
||||
return rand() * 0.0000000005f;
|
||||
return rand() / (float)RAND_MAX;
|
||||
}
|
||||
|
||||
CLASS_DECLARATION(Listener, DM_Team, NULL) {
|
||||
|
@ -459,12 +454,12 @@ PlayerStart *DM_Team::GetRandomSpawnpointWithMetric(
|
|||
vNewSpawn, player->mins, player->maxs, vEnd, player, MASK_PLAYERSOLID, qfalse, "TempSpawnPoint"
|
||||
);
|
||||
|
||||
if (!trace.allsolid && !trace.startsolid && trace.fraction != 1.0f && trace.fraction != 1.0f
|
||||
&& trace.plane.dist >= 0.8f) {
|
||||
if (!trace.allsolid && !trace.startsolid && trace.fraction != 1.0f && trace.plane.dist >= 0.8f) {
|
||||
points[numSpots].spawnpoint = new PlayerStart;
|
||||
points[numSpots].spawnpoint->setOrigin(trace.endpos);
|
||||
points[numSpots].spawnpoint->setAngles(spot->angles);
|
||||
points[numSpots].fMetric = MetricFunction(vNewSpawn, this, player);
|
||||
numSpots++;
|
||||
|
||||
if (numSpots >= (sizeof(points) / sizeof(points[0]))) {
|
||||
break;
|
||||
|
@ -477,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -497,6 +492,7 @@ PlayerStart *DM_Team::GetRandomSpawnpointWithMetric(
|
|||
if (!SpotWouldTelefrag(spot->origin)) {
|
||||
points[numSpots].spawnpoint = spot;
|
||||
points[numSpots].fMetric = MetricFunction(spot->origin, this, player);
|
||||
numSpots++;
|
||||
|
||||
if (numSpots >= (sizeof(points) / sizeof(points[0]))) {
|
||||
break;
|
||||
|
@ -677,6 +673,7 @@ DM_Manager::DM_Manager()
|
|||
m_bAllowAxisRespawn = true;
|
||||
m_bAllowAlliedRespawn = true;
|
||||
m_bRoundActive = false;
|
||||
m_iTotalMapTime = 0;
|
||||
}
|
||||
|
||||
DM_Manager::~DM_Manager() {}
|
||||
|
@ -1245,7 +1242,7 @@ bool DM_Manager::CheckEndMatch()
|
|||
if (AllowRespawn() || (!m_team_axis.IsDead() && !m_team_allies.IsDead())) {
|
||||
int roundLimit = GetRoundLimit();
|
||||
|
||||
if (roundLimit > 0 && level.time >= m_iDefaultRoundLimit * 60 + m_fRoundTime) {
|
||||
if (roundLimit > 0 && level.time >= roundLimit * 60 + m_fRoundTime) {
|
||||
if (m_csTeamBombPlantSide != STRING_DRAW) {
|
||||
if (m_bIgnoringClockForBomb) {
|
||||
if (m_iNumBombsPlanted > 0) {
|
||||
|
@ -1254,7 +1251,7 @@ bool DM_Manager::CheckEndMatch()
|
|||
|
||||
m_bIgnoringClockForBomb = false;
|
||||
} else if (m_iNumBombsPlanted > 0) {
|
||||
G_PrintToAllClients("A bomb is still set!");
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("A Bomb is Still Set!")));
|
||||
m_bIgnoringClockForBomb = true;
|
||||
return false;
|
||||
}
|
||||
|
@ -1328,7 +1325,7 @@ bool DM_Manager::CheckEndMatch()
|
|||
return true;
|
||||
} else if (m_iNumBombsPlanted >= m_iNumTargetsToDestroy - m_iNumTargetsDestroyed) {
|
||||
if (!m_bIgnoringClockForBomb) {
|
||||
G_PrintToAllClients("A bomb is still set!");
|
||||
G_PrintToAllClients(va("%s\n", gi.LV_ConvertString("A Bomb is Still Set!")));
|
||||
m_bIgnoringClockForBomb = true;
|
||||
}
|
||||
} else {
|
||||
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -847,7 +847,20 @@ void Door::DoorBlocked(Event *ev)
|
|||
|
||||
if (state == STATE_OPENING || state == STATE_OPEN) {
|
||||
spawnflags &= ~DOOR_START_OPEN;
|
||||
|
||||
const bool bIsMoving = EventPending(EV_MoveDone);
|
||||
ProcessEvent(EV_Door_Close);
|
||||
|
||||
if (bIsMoving) {
|
||||
// Added in OPM
|
||||
// Reopen to the other side so sentients can still pass.
|
||||
// This avoid entities like players trying to prevent the door
|
||||
// from opening in multiplayer
|
||||
diropened = -diropened;
|
||||
e = new Event(EV_Door_Open);
|
||||
e->AddEntity(other);
|
||||
ProcessEvent(e);
|
||||
}
|
||||
} else {
|
||||
e = new Event(EV_Door_Open);
|
||||
e->AddEntity(other);
|
||||
|
|
|
@ -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;
|
||||
|
@ -2996,7 +3012,6 @@ void Entity::FadeIn(Event *ev)
|
|||
|
||||
if (ev->NumArgs() > 0) {
|
||||
rate = ev->GetFloat(1);
|
||||
assert(rate);
|
||||
if (rate > 0) {
|
||||
rate = FRAMETIME / rate;
|
||||
}
|
||||
|
@ -3032,7 +3047,6 @@ void Entity::Fade(Event *ev)
|
|||
|
||||
if (ev->NumArgs() > 0) {
|
||||
rate = ev->GetFloat(1);
|
||||
assert(rate);
|
||||
if (rate > 0) {
|
||||
rate = FRAMETIME / rate;
|
||||
}
|
||||
|
@ -3611,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;
|
||||
|
@ -3692,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;
|
||||
|
||||
|
@ -3710,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",
|
||||
|
@ -5721,6 +5733,14 @@ void Entity::Delete(void)
|
|||
// Delete the entity the next frame
|
||||
|
||||
if (g_iInThinks) {
|
||||
if (ProcessingEvents) {
|
||||
// Fixed in OPM
|
||||
// Add a slight delay because otherwise this would cause an infinite loop
|
||||
// when processing pending events
|
||||
PostEvent(EV_Remove, 0.001);
|
||||
return;
|
||||
}
|
||||
|
||||
PostEvent(EV_Remove, 0);
|
||||
} else {
|
||||
delete this;
|
||||
|
|
|
@ -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;
|
||||
|
@ -43,7 +42,7 @@ Return whether or not the specified filename is for allies
|
|||
*/
|
||||
bool IsAlliedPlayerModel(const char *filename)
|
||||
{
|
||||
return !Q_stricmpn(filename, "/allied_", 8) || !Q_stricmpn(filename, "/american_", 10);
|
||||
return !Q_stricmpn(filename, "allied_", 7) || !Q_stricmpn(filename, "american_", 9);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -55,7 +54,7 @@ Return whether or not the specified filename is for axis
|
|||
*/
|
||||
bool IsGermanPlayerModel(const char *filename)
|
||||
{
|
||||
return !Q_stricmpn(filename, "/german_", 8) || !Q_stricmpn(filename, "/IT_", 4) || !Q_stricmpn(filename, "/SC_", 4);
|
||||
return !Q_stricmpn(filename, "german_", 7) || !Q_stricmpn(filename, "IT_", 3) || !Q_stricmpn(filename, "SC_", 3);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -140,9 +139,9 @@ void InitModelList()
|
|||
}
|
||||
|
||||
if (IsAlliedPlayerModel(filename)) {
|
||||
alliedModelList.AddObject(str(filename + 1, 0, len - 5));
|
||||
alliedModelList.AddObject(str(filename, 0, len - 4));
|
||||
} else {
|
||||
germanModelList.AddObject(str(filename + 1, 0, len - 5));
|
||||
germanModelList.AddObject(str(filename, 0, len - 4));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,13 +375,43 @@ bool G_IsPlayer(gentity_t *ent)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!ent->entity || ent->entity->IsSubclassOfBot()) {
|
||||
if (!ent->entity || botManager.getControllerManager().findController(ent->entity)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_GetRandomAlliedPlayerModel
|
||||
============
|
||||
*/
|
||||
const char *G_GetRandomAlliedPlayerModel()
|
||||
{
|
||||
if (!alliedModelList.NumObjects()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
const unsigned int index = rand() % alliedModelList.NumObjects();
|
||||
return alliedModelList[index];
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_GetRandomGermanPlayerModel
|
||||
============
|
||||
*/
|
||||
const char *G_GetRandomGermanPlayerModel()
|
||||
{
|
||||
if (!germanModelList.NumObjects()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
const unsigned int index = rand() % germanModelList.NumObjects();
|
||||
return germanModelList[index];
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_AddBot
|
||||
|
@ -408,7 +437,6 @@ void G_AddBot(const saved_bot_t *saved)
|
|||
|
||||
clientNum = e - g_entities;
|
||||
|
||||
current_bot_count++;
|
||||
// increase the unique ID
|
||||
botId++;
|
||||
|
||||
|
@ -429,14 +457,8 @@ void G_AddBot(const saved_bot_t *saved)
|
|||
//
|
||||
// Choose a random model
|
||||
//
|
||||
if (alliedModelList.NumObjects()) {
|
||||
const unsigned int index = rand() % alliedModelList.NumObjects();
|
||||
Info_SetValueForKey(userinfo, "dm_playermodel", alliedModelList[index]);
|
||||
}
|
||||
if (germanModelList.NumObjects()) {
|
||||
const unsigned int index = rand() % germanModelList.NumObjects();
|
||||
Info_SetValueForKey(userinfo, "dm_playergermanmodel", germanModelList[index]);
|
||||
}
|
||||
Info_SetValueForKey(userinfo, "dm_playermodel", G_GetRandomAlliedPlayerModel());
|
||||
Info_SetValueForKey(userinfo, "dm_playergermanmodel", G_GetRandomGermanPlayerModel());
|
||||
|
||||
Info_SetValueForKey(userinfo, "fov", "80");
|
||||
Info_SetValueForKey(userinfo, "ip", "localhost");
|
||||
|
@ -480,7 +502,6 @@ void G_RemoveBot(gentity_t *ent)
|
|||
}
|
||||
|
||||
G_ClientDisconnect(ent);
|
||||
current_bot_count--;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -559,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);
|
||||
|
@ -663,6 +685,18 @@ int G_CountClients()
|
|||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_RestartBots
|
||||
|
||||
Save bots
|
||||
============
|
||||
*/
|
||||
void G_RestartBots()
|
||||
{
|
||||
G_SaveBots();
|
||||
}
|
||||
|
||||
/*
|
||||
===========
|
||||
G_ResetBots
|
||||
|
@ -672,11 +706,8 @@ Save and reset the bot count
|
|||
*/
|
||||
void G_ResetBots()
|
||||
{
|
||||
G_SaveBots();
|
||||
|
||||
botManager.Cleanup();
|
||||
|
||||
current_bot_count = 0;
|
||||
botId = 0;
|
||||
}
|
||||
|
||||
|
@ -730,6 +761,7 @@ void G_SpawnBots()
|
|||
{
|
||||
unsigned int numClients;
|
||||
unsigned int numBotsToSpawn;
|
||||
unsigned int numSpawnedBots;
|
||||
|
||||
//
|
||||
// Check the minimum bot count
|
||||
|
@ -752,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,7 +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();
|
|
@ -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;
|
||||
|
||||
if (gi.SanitizeName(s, client->pers.netname)) {
|
||||
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) {
|
||||
|
@ -794,7 +804,7 @@ void G_ClientUserinfoChanged(gentity_t *ent, const char *u)
|
|||
|
||||
Q_strncpyz(client->pers.dm_playergermanmodel, s, sizeof(client->pers.dm_playergermanmodel));
|
||||
|
||||
gi.setConfigstring(CS_PLAYERS + clientnum, va("name\\%s", client->pers.netname));
|
||||
G_SetClientConfigString(ent);
|
||||
|
||||
if (ent->entity) {
|
||||
float fov;
|
||||
|
@ -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)
|
||||
|
@ -1881,8 +1888,8 @@ void G_ExitLevel(void)
|
|||
// The nextmap cvar was set (possibly by a vote - so go ahead and use it)
|
||||
level.nextmap = sv_nextmap->string;
|
||||
gi.cvar_set("nextmap", "");
|
||||
} else // Use the next map in the maplist
|
||||
{
|
||||
} else {
|
||||
// Use the next map in the maplist
|
||||
char *s, *f, *t;
|
||||
|
||||
f = NULL;
|
||||
|
@ -1892,19 +1899,17 @@ void G_ExitLevel(void)
|
|||
if (!Q_stricmp(t, level.mapname.c_str())) {
|
||||
// it's in the list, go to the next one
|
||||
t = strtok(NULL, seps);
|
||||
if (t == NULL) // end of list, go to first one
|
||||
{
|
||||
if (f == NULL) // there isn't a first one, same level
|
||||
{
|
||||
level.nextmap = level.mapname;
|
||||
} else {
|
||||
level.nextmap = f;
|
||||
}
|
||||
} else {
|
||||
if (t) {
|
||||
level.nextmap = t;
|
||||
} else if (f) {
|
||||
// end of list, go to first one
|
||||
level.nextmap = f;
|
||||
} else {
|
||||
// there isn't a first one, same level
|
||||
level.nextmap = level.mapname;
|
||||
}
|
||||
free(s);
|
||||
goto out;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// set the first map
|
||||
|
@ -1915,7 +1920,7 @@ void G_ExitLevel(void)
|
|||
}
|
||||
free(s);
|
||||
}
|
||||
out:
|
||||
|
||||
// level.nextmap should be set now, but if it isn't use the same map
|
||||
if (level.nextmap.length() == 0) {
|
||||
// Stay on the same map since no nextmap was set
|
||||
|
@ -1929,8 +1934,8 @@ void G_ExitLevel(void)
|
|||
// alias on another map
|
||||
Q_strncpyz(command, level.nextmap, sizeof(command));
|
||||
gi.SendConsoleCommand(command);
|
||||
} else // use the level.nextmap variable
|
||||
{
|
||||
} else {
|
||||
// use the level.nextmap variable
|
||||
Com_sprintf(command, sizeof(command), "gamemap \"%s\"\n", level.nextmap.c_str());
|
||||
gi.SendConsoleCommand(command);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -29,8 +29,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
|
||||
class Entity;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
typedef enum {
|
||||
STEPMOVE_OK,
|
||||
STEPMOVE_BLOCKED_BY_ENTITY,
|
||||
STEPMOVE_BLOCKED_BY_WORLD,
|
||||
|
@ -41,8 +40,7 @@ typedef enum
|
|||
} stepmoveresult_t;
|
||||
|
||||
// movetype values
|
||||
typedef enum
|
||||
{
|
||||
typedef enum {
|
||||
MOVETYPE_NONE, // never moves
|
||||
MOVETYPE_STATIONARY, // never moves but does collide agains push objects
|
||||
MOVETYPE_NOCLIP, // origin and angles change with no interaction
|
||||
|
@ -60,8 +58,7 @@ typedef enum
|
|||
MOVETYPE_PORTABLE_TURRET
|
||||
} movetype_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
Entity *ent;
|
||||
Vector localorigin;
|
||||
Vector origin;
|
||||
|
|
|
@ -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);
|
||||
|
@ -478,7 +481,7 @@ typedef struct gameImport_s {
|
|||
void (*HudDrawAlpha)(int info, float alpha);
|
||||
void (*HudDrawString)(int info, const char *string);
|
||||
void (*HudDrawFont)(int info, const char *fontName);
|
||||
qboolean (*SanitizeName)(const char *oldName, char *newName);
|
||||
qboolean (*SanitizeName)(const char *oldName, char *newName, size_t bufferSize);
|
||||
|
||||
//
|
||||
// Added in OPM
|
||||
|
|
|
@ -87,6 +87,13 @@ Called on a first-time connect
|
|||
*/
|
||||
void G_InitClientPersistant( gclient_t *client, const char *userinfo )
|
||||
{
|
||||
// Clear the persistent data
|
||||
client->pers = {};
|
||||
|
||||
// Added in OPM
|
||||
// Reset the persistent session data.
|
||||
// This fixes some bugs like the player getting score
|
||||
// from previous maps
|
||||
G_WriteClientSessionData( client );
|
||||
}
|
||||
|
||||
|
|
|
@ -924,10 +924,10 @@ float G_GetAngle(Vector movedir)
|
|||
angle = RAD2DEG(atan(1.0) * 2 + atan(-movedir[0] / sqrt(-movedir[0] * movedir[0] + 1.0)));
|
||||
|
||||
if (movedir[1] < 0) {
|
||||
return 360 - angle;
|
||||
return (int)((360 - angle) * 10000) / 10000.0;
|
||||
}
|
||||
|
||||
return angle;
|
||||
return (int)(angle * 10000) / 10000.0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2171,9 +2171,9 @@ void G_PrintToAllClients(const char *pszString, int iType)
|
|||
}
|
||||
} else {
|
||||
if (iType == 0) {
|
||||
gi.SendServerCommand(-1, "print \"" HUD_MESSAGE_YELLOW "%s\n\"", pszString);
|
||||
gi.SendServerCommand(-1, "print \"" HUD_MESSAGE_YELLOW "%s\"", pszString);
|
||||
} else {
|
||||
gi.SendServerCommand(-1, "print \"" HUD_MESSAGE_WHITE "%s\n\"", pszString);
|
||||
gi.SendServerCommand(-1, "print \"" HUD_MESSAGE_WHITE "%s\"", pszString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2232,9 +2232,12 @@ G_PrintDeathMessageEmulated(const char *s1, const char *s2, char *attackerName,
|
|||
result2 = NULL;
|
||||
|
||||
if (type == tolower(type)) {
|
||||
// Enemy
|
||||
hudColor = 4;
|
||||
} else {
|
||||
hudColor = 5;
|
||||
// Friend
|
||||
//hudColor = 5;
|
||||
hudColor = 4;
|
||||
}
|
||||
|
||||
if (*s1 != 'x') {
|
||||
|
@ -2327,7 +2330,7 @@ void G_PrintDeathMessage_Old(const char *pszString)
|
|||
continue;
|
||||
}
|
||||
|
||||
gi.SendServerCommand(ent - g_entities, "print \"" HUD_MESSAGE_CHAT_RED "%s\"", pszString);
|
||||
gi.SendServerCommand(ent - g_entities, "print \"%s\"", pszString);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2449,3 +2452,7 @@ gentity_t *G_GetGEntity(int ent_num)
|
|||
|
||||
return ent;
|
||||
}
|
||||
|
||||
unsigned int G_GetWeaponCommand(unsigned int buttons) {
|
||||
return GetWeaponCommand(buttons, g_protocol >= PROTOCOL_MOHTA_MIN ? WEAPON_COMMAND_MAX_VER17 : WEAPON_COMMAND_MAX_VER6);
|
||||
}
|
||||
|
|
|
@ -327,3 +327,4 @@ const char *WeaponHandNumToName(weaponhand_t hand);
|
|||
weaponhand_t WeaponHandNameToNum(str side);
|
||||
void G_DebugTargets(Entity *e, str from);
|
||||
void G_DebugDamage(float damage, Entity *victim, Entity *attacker, Entity *inflictor);
|
||||
unsigned int G_GetWeaponCommand(unsigned int buttons);
|
||||
|
|
|
@ -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))
|
||||
);
|
||||
}
|
||||
|
|
|
@ -418,15 +418,11 @@ void Item::RemoveFromOwner(void)
|
|||
|
||||
void Item::Delete(void)
|
||||
{
|
||||
if (g_iInThinks) {
|
||||
if (owner) {
|
||||
if (g_iInThinks && owner) {
|
||||
RemoveFromOwner();
|
||||
}
|
||||
|
||||
PostEvent(EV_Remove, 0);
|
||||
} else {
|
||||
delete this;
|
||||
}
|
||||
Animate::Delete();
|
||||
}
|
||||
|
||||
void Item::SetNoRemove(Event *ev)
|
||||
|
|
|
@ -969,8 +969,8 @@ void Level::CleanUp(qboolean samemap, qboolean resetConfigStrings)
|
|||
gi.setConfigstring(CS_RAIN_NUMSHADERS, "0");
|
||||
gi.setConfigstring(CS_CURRENT_OBJECTIVE, "");
|
||||
|
||||
for (int i = CS_OBJECTIVES; i < CS_OBJECTIVES + MAX_OBJECTIVES; i++) {
|
||||
gi.setConfigstring(i, "");
|
||||
for (i = 0; i < MAX_OBJECTIVES; i++) {
|
||||
gi.setConfigstring(CS_OBJECTIVES + i, "");
|
||||
}
|
||||
|
||||
gi.setConfigstring(CS_VOTE_TIME, "");
|
||||
|
@ -1097,6 +1097,12 @@ void Level::SpawnEntities(char *entities, int svsTime)
|
|||
int start, end;
|
||||
char name[128];
|
||||
|
||||
if (gi.Cvar_Get("g_invulnoverride", "0", 0)->integer == 1) {
|
||||
// Added in 2.30
|
||||
// Clear the invulnerable override when loading
|
||||
gi.cvar_set("g_invulnoverride", "0");
|
||||
}
|
||||
|
||||
Com_Printf("-------------------- Spawning Entities -----------------------\n");
|
||||
|
||||
t1 = gi.Milliseconds();
|
||||
|
@ -1505,7 +1511,7 @@ void Level::ServerSpawned(void)
|
|||
|
||||
void Level::SetMap(const char *themapname)
|
||||
{
|
||||
char *spawnpos;
|
||||
const char *spawnpos;
|
||||
int i;
|
||||
str text;
|
||||
|
||||
|
@ -1516,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 = "";
|
||||
|
@ -1582,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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1724,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);
|
||||
|
||||
|
@ -1910,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;
|
||||
|
||||
|
@ -3094,7 +3023,7 @@ void FuncLadder::AdjustPositionOnLadder(Entity *pUser)
|
|||
);
|
||||
}
|
||||
|
||||
pUser->setOrigin(trace.endpos + m_vFacingDir * 0.005);
|
||||
pUser->setOrigin(trace.endpos);
|
||||
}
|
||||
|
||||
void FuncLadder::EnsureOverLadder(Entity *pUser)
|
||||
|
@ -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) 2015 the OpenMoHAA team
|
||||
Copyright (C) 2025 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
|
@ -35,26 +35,19 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|||
#define MOVE_ANGLES 1
|
||||
#define MOVE_ORIGIN 2
|
||||
|
||||
CLASS_DECLARATION( Trigger, Mover, "mover" )
|
||||
{
|
||||
CLASS_DECLARATION(Trigger, Mover, "mover") {
|
||||
{&EV_MoveDone, &Mover::MoveDone},
|
||||
{NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
Mover::Mover()
|
||||
{
|
||||
endevent = NULL;
|
||||
}
|
||||
|
||||
Mover::~Mover()
|
||||
{
|
||||
}
|
||||
Mover::~Mover() {}
|
||||
|
||||
void Mover::MoveDone
|
||||
(
|
||||
Event *ev
|
||||
)
|
||||
void Mover::MoveDone(Event *ev)
|
||||
{
|
||||
Event *event;
|
||||
Vector move;
|
||||
|
@ -62,57 +55,51 @@ void Mover::MoveDone
|
|||
|
||||
// zero out the movement
|
||||
avelocity = vec_zero;
|
||||
if( moveflags & MOVE_ANGLES )
|
||||
{
|
||||
if (moveflags & MOVE_ANGLES) {
|
||||
amove = angledest - localangles;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
amove = vec_zero;
|
||||
}
|
||||
|
||||
velocity = vec_zero;
|
||||
if( moveflags & MOVE_ORIGIN )
|
||||
{
|
||||
if (moveflags & MOVE_ORIGIN) {
|
||||
move = finaldest - localorigin;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
move = vec_zero;
|
||||
}
|
||||
|
||||
accel = vec_zero;
|
||||
aaccel = vec_zero;
|
||||
|
||||
if( !G_PushMove( this, move, amove ) )
|
||||
{
|
||||
if (!G_PushMove(this, move, amove)) {
|
||||
// Added in OPM
|
||||
// Check to make sure the event isn't pending
|
||||
// blocked events called by G_PushMove() might alter
|
||||
// the mover
|
||||
if (!EventPending(EV_MoveDone)) {
|
||||
// Delay finish till we can move into the final position
|
||||
PostEvent(EV_MoveDone, FRAMETIME);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// After moving, set origin to exact final destination
|
||||
//
|
||||
if( moveflags & MOVE_ORIGIN )
|
||||
{
|
||||
if (moveflags & MOVE_ORIGIN) {
|
||||
setLocalOrigin(finaldest);
|
||||
}
|
||||
|
||||
if( moveflags & MOVE_ANGLES )
|
||||
{
|
||||
if (moveflags & MOVE_ANGLES) {
|
||||
localangles = angledest;
|
||||
|
||||
if( ( localangles.x >= 360 ) || ( localangles.x < 0 ) )
|
||||
{
|
||||
if ((localangles.x >= 360) || (localangles.x < 0)) {
|
||||
localangles.x -= ((int)localangles.x / 360) * 360;
|
||||
}
|
||||
if( ( localangles.y >= 360 ) || ( localangles.y < 0 ) )
|
||||
{
|
||||
if ((localangles.y >= 360) || (localangles.y < 0)) {
|
||||
localangles.y -= ((int)localangles.y / 360) * 360;
|
||||
}
|
||||
if( ( localangles.z >= 360 ) || ( localangles.z < 0 ) )
|
||||
{
|
||||
if ((localangles.z >= 360) || (localangles.z < 0)) {
|
||||
localangles.z -= ((int)localangles.z / 360) * 360;
|
||||
}
|
||||
}
|
||||
|
@ -120,9 +107,10 @@ void Mover::MoveDone
|
|||
event = endevent;
|
||||
endevent = NULL;
|
||||
|
||||
if( event )
|
||||
if (event) {
|
||||
ProcessEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
|
@ -141,13 +129,11 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
|
||||
assert(tspeed >= 0.0f);
|
||||
|
||||
if( !tspeed )
|
||||
{
|
||||
if (!tspeed) {
|
||||
error("MoveTo", "No speed is defined!");
|
||||
}
|
||||
|
||||
if( tspeed < 0.0f )
|
||||
{
|
||||
if (tspeed < 0.0f) {
|
||||
error("MoveTo", "Speed is negative!");
|
||||
}
|
||||
|
||||
|
@ -156,8 +142,7 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
|
||||
moveflags = 0;
|
||||
|
||||
if( endevent )
|
||||
{
|
||||
if (endevent) {
|
||||
delete endevent;
|
||||
}
|
||||
|
||||
|
@ -166,17 +151,14 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
finaldest = tdest;
|
||||
angledest = angdest;
|
||||
|
||||
if( finaldest != localorigin )
|
||||
{
|
||||
if (finaldest != localorigin) {
|
||||
moveflags |= MOVE_ORIGIN;
|
||||
}
|
||||
if( angledest != localangles )
|
||||
{
|
||||
if (angledest != localangles) {
|
||||
moveflags |= MOVE_ANGLES;
|
||||
}
|
||||
|
||||
if( !moveflags )
|
||||
{
|
||||
if (!moveflags) {
|
||||
// stop the object from moving
|
||||
velocity = vec_zero;
|
||||
avelocity = vec_zero;
|
||||
|
@ -192,13 +174,10 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
angdestdelta[1] = angledist(angdest[1] - localangles[1]);
|
||||
angdestdelta[2] = angledist(angdest[2] - localangles[2]);
|
||||
|
||||
if( tdest == localorigin )
|
||||
{
|
||||
if (tdest == localorigin) {
|
||||
// calculate length of vector based on angles
|
||||
len = angdestdelta.length();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
// calculate length of vector based on distance
|
||||
len = vdestdelta.length();
|
||||
}
|
||||
|
@ -206,21 +185,18 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
// divide by speed to get time to reach dest
|
||||
traveltime = len / tspeed;
|
||||
|
||||
if( traveltime < level.frametime )
|
||||
{
|
||||
if (traveltime < level.frametime) {
|
||||
traveltime = level.frametime;
|
||||
vdestdelta = vec_zero;
|
||||
angdestdelta = vec_zero;
|
||||
}
|
||||
|
||||
// scale the destdelta vector by the time spent traveling to get velocity
|
||||
if( moveflags & MOVE_ORIGIN )
|
||||
{
|
||||
if (moveflags & MOVE_ORIGIN) {
|
||||
velocity = vdestdelta * (1.0f / traveltime);
|
||||
}
|
||||
|
||||
if( moveflags & MOVE_ANGLES )
|
||||
{
|
||||
if (moveflags & MOVE_ANGLES) {
|
||||
avelocity = angdestdelta * (1.0f / traveltime);
|
||||
}
|
||||
|
||||
|
@ -232,20 +208,13 @@ void Mover::MoveTo( Vector tdest, Vector angdest, float tspeed, Event& event )
|
|||
LinearInterpolate
|
||||
===============
|
||||
*/
|
||||
void Mover::LinearInterpolate
|
||||
(
|
||||
Vector tdest,
|
||||
Vector angdest,
|
||||
float time,
|
||||
Event &event
|
||||
)
|
||||
void Mover::LinearInterpolate(Vector tdest, Vector angdest, float time, Event& event)
|
||||
{
|
||||
Vector vdestdelta;
|
||||
Vector angdestdelta;
|
||||
float t;
|
||||
|
||||
if( endevent )
|
||||
{
|
||||
if (endevent) {
|
||||
delete endevent;
|
||||
}
|
||||
endevent = new Event(event);
|
||||
|
@ -256,31 +225,49 @@ void Mover::LinearInterpolate
|
|||
CancelEventsOfType(EV_MoveDone);
|
||||
|
||||
// Quantize to FRAMETIME
|
||||
if( time < FRAMETIME )
|
||||
{
|
||||
if (time < FRAMETIME) {
|
||||
time = FRAMETIME;
|
||||
}
|
||||
|
||||
moveflags = 0;
|
||||
t = 1 / time;
|
||||
// scale the destdelta vector by the time spent traveling to get velocity
|
||||
if( finaldest != localorigin )
|
||||
{
|
||||
if (finaldest != localorigin) {
|
||||
vdestdelta = tdest - localorigin;
|
||||
velocity = vdestdelta * t;
|
||||
moveflags |= MOVE_ORIGIN;
|
||||
}
|
||||
|
||||
if( angledest != localangles )
|
||||
{
|
||||
if (angledest != localangles) {
|
||||
angdestdelta = angdest - localangles;
|
||||
avelocity = angdestdelta * t;
|
||||
moveflags |= MOVE_ANGLES;
|
||||
}
|
||||
|
||||
if( g_bBeforeThinks )
|
||||
if (g_bBeforeThinks) {
|
||||
time -= FRAMETIME;
|
||||
}
|
||||
|
||||
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,13 +48,11 @@ class Mover : public Trigger
|
|||
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;
|
||||
};
|
||||
|
||||
inline void Mover::Archive
|
||||
(
|
||||
Archiver &arc
|
||||
)
|
||||
inline void Mover::Archive(Archiver& arc)
|
||||
{
|
||||
Trigger::Archive(arc);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -2413,6 +2427,12 @@ void Player::InitHealth(void)
|
|||
//
|
||||
m_fHealRate = 0;
|
||||
edict->s.eFlags &= ~EF_DEAD;
|
||||
|
||||
// Fixed in OPM
|
||||
// This avoid losing weapons when dying and then immediately respawning
|
||||
CancelEventsOfType(EV_Player_DMDeathDrop);
|
||||
// And this prevents the player from dying when respawning immediately after getting killed
|
||||
CancelEventsOfType(EV_Player_Dead);
|
||||
}
|
||||
|
||||
void Player::InitModel(void)
|
||||
|
@ -2657,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;
|
||||
|
@ -3200,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);
|
||||
|
@ -4057,9 +4083,9 @@ void Player::ClientMove(usercmd_t *ucmd)
|
|||
// Also use the weapon movement speed
|
||||
//
|
||||
if (!IsZoomed()) {
|
||||
client->ps.speed = (float)client->ps.speed * pWeap->m_fMovementSpeed;
|
||||
client->ps.speed = (float)client->ps.speed * pWeap->GetMovementSpeed();
|
||||
} else {
|
||||
client->ps.speed = (float)client->ps.speed * pWeap->m_fZoomMovement * pWeap->m_fMovementSpeed;
|
||||
client->ps.speed = (float)client->ps.speed * pWeap->GetZoomMovement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4250,7 +4276,7 @@ void Player::ClientInactivityTimer(void)
|
|||
//
|
||||
// The player reached maximum team kills
|
||||
//
|
||||
G_PrintToAllClients(va("%s %s", client->pers.netname, message.c_str()), qfalse);
|
||||
G_PrintToAllClients(va("%s %s\n", client->pers.netname, message.c_str()), 2);
|
||||
|
||||
if (Q_stricmp(Info_ValueForKey(client->pers.userinfo, "ip"), "localhost")) {
|
||||
//
|
||||
|
@ -4742,7 +4768,7 @@ void Player::Think(void)
|
|||
}
|
||||
} else {
|
||||
if ((server_new_buttons & BUTTON_USE)) {
|
||||
SetPlayerSpectateRandom();
|
||||
SetPlayerSpectate(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4801,7 +4827,7 @@ void Player::Think(void)
|
|||
}
|
||||
|
||||
if (!IsDead()) {
|
||||
m_iClientWeaponCommand = (server_new_buttons & WEAPON_COMMAND_MASK) >> 7;
|
||||
m_iClientWeaponCommand = G_GetWeaponCommand(server_new_buttons);
|
||||
|
||||
switch (m_iClientWeaponCommand) {
|
||||
case 0:
|
||||
|
@ -5414,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 {
|
||||
|
@ -5421,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);
|
||||
}
|
||||
|
||||
|
@ -5504,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
|
||||
|
@ -5525,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;
|
||||
|
@ -5536,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"
|
||||
);
|
||||
|
@ -5558,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"
|
||||
);
|
||||
|
@ -6456,20 +6516,17 @@ 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)
|
||||
{
|
||||
|
@ -7279,7 +7336,7 @@ void Player::UpdateStats(void)
|
|||
|
||||
trace = G_Trace(m_vViewPos, vec_zero, vec_zero, vEnd, this, MASK_BEAM, qfalse, "infoclientcheck");
|
||||
|
||||
if (trace.ent && trace.ent->entity->IsSubclassOfPlayer()) {
|
||||
if (trace.ent && trace.ent->entity->IsSubclassOfPlayer() && !(trace.ent->r.svFlags & SVF_NOCLIENT)) {
|
||||
Player *p = static_cast<Player *>(trace.ent->entity);
|
||||
|
||||
if (IsSpectator() || p->GetTeam() == GetTeam()) {
|
||||
|
@ -8785,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;
|
||||
}
|
||||
|
||||
|
@ -8872,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");
|
||||
|
@ -9649,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)
|
||||
|
@ -10320,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,
|
||||
|
@ -10374,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)
|
||||
|
@ -10563,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
|
||||
|
@ -10737,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
|
||||
|
@ -10753,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;
|
||||
}
|
||||
|
@ -10772,15 +10851,44 @@ 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
|
||||
//=============
|
||||
// Print the dm message to console
|
||||
sToken = "";
|
||||
|
||||
for (i = 2; i <= ev->NumArgs(); i++) {
|
||||
if (i != 2) {
|
||||
sToken += " ";
|
||||
}
|
||||
|
||||
sToken += ev->GetString(i);
|
||||
}
|
||||
//=============
|
||||
|
||||
if (iMode == 0) {
|
||||
//
|
||||
// everyone
|
||||
//
|
||||
|
||||
// Added in OPM
|
||||
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++) {
|
||||
ent = &g_entities[i];
|
||||
|
@ -10821,10 +10929,27 @@ 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
|
||||
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++) {
|
||||
ent = &g_entities[i];
|
||||
|
@ -10867,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];
|
||||
|
||||
|
@ -10884,6 +11018,25 @@ void Player::EventDMMessage(Event *ev)
|
|||
return;
|
||||
}
|
||||
|
||||
// Added in OPM
|
||||
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);
|
||||
|
||||
if (ent->entity != this) {
|
||||
|
@ -11203,9 +11356,13 @@ void Player::EventIPrint(Event *ev)
|
|||
}
|
||||
|
||||
if (iBold) {
|
||||
gi.SendServerCommand(edict - g_entities, "print \"" HUD_MESSAGE_WHITE "%s\n\"", 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\"", sString.c_str());
|
||||
gi.SendServerCommand(
|
||||
edict - g_entities, "print \"" HUD_MESSAGE_YELLOW "%s\n\"", gi.LV_ConvertString(sString.c_str())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11499,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;
|
||||
}
|
||||
}
|
||||
|
@ -11681,6 +11840,13 @@ void Player::FireWeapon(int number, firemode_t mode)
|
|||
return;
|
||||
}
|
||||
|
||||
if (G_GetWeaponCommand(last_ucmd.buttons)) {
|
||||
// Added in OPM
|
||||
// If there is a weapon command (like DROP), then just don't fire
|
||||
// this prevent tricky behaviors, like silent firing
|
||||
return;
|
||||
}
|
||||
|
||||
Sentient::FireWeapon(number, mode);
|
||||
|
||||
if (g_gametype->integer != GT_SINGLE_PLAYER) {
|
||||
|
@ -11978,18 +12144,15 @@ 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);
|
||||
}
|
||||
|
||||
void Player::AddKills(int num)
|
||||
{
|
||||
num_kills += num;
|
||||
|
||||
if (g_gametype->integer >= GT_TEAM_ROUNDS) {
|
||||
num_deaths += num;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::AddDeaths(int num)
|
||||
|
|
|
@ -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;
|
||||
|
|
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