mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-06 04:05:11 +08:00
Compare commits
596 Commits
continuous
...
continuous
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98acbbad01 | ||
|
|
eb72b6baee | ||
|
|
422addcbb6 | ||
|
|
4a58be2aa0 | ||
|
|
562b54839c | ||
|
|
639eaa9416 | ||
|
|
6c6cb65b30 | ||
|
|
8ea8437e19 | ||
|
|
2656eb1aeb | ||
|
|
fa1e92b127 | ||
|
|
cff8ee13e6 | ||
|
|
3956e3863e | ||
|
|
9600218757 | ||
|
|
2db7cb0d64 | ||
|
|
267a70d621 | ||
|
|
667bedab82 | ||
|
|
49990a0859 | ||
|
|
f7c4cd9398 | ||
|
|
cd4f4d5ad4 | ||
|
|
fe429fe213 | ||
|
|
0a24ca3fe2 | ||
|
|
8c93a0d247 | ||
|
|
5c75dda864 | ||
|
|
55bdded6a4 | ||
|
|
25b2c0f7e3 | ||
|
|
ed522852cf | ||
|
|
224e42d345 | ||
|
|
128a1f59a9 | ||
|
|
40ffde0439 | ||
|
|
ec5578a437 | ||
|
|
1cf40a2d17 | ||
|
|
958ea0ac1d | ||
|
|
a9fdae28b2 | ||
|
|
3d9eb869b0 | ||
|
|
8162c6d42f | ||
|
|
48a9f17222 | ||
|
|
e381d04094 | ||
|
|
0e79326571 | ||
|
|
f7eb8cd913 | ||
|
|
a15c1f99b2 | ||
|
|
ba2191172d | ||
|
|
6ab2c9dbbf | ||
|
|
7da460d4b1 | ||
|
|
ffe7b1f4a1 | ||
|
|
6a1f502d25 | ||
|
|
434359ea01 | ||
|
|
ae2ad6ddf2 | ||
|
|
ec11683dc5 | ||
|
|
47318b0c14 | ||
|
|
60d6214ad7 | ||
|
|
a3e26a21a7 | ||
|
|
d0f3a6f74b | ||
|
|
fee236a050 | ||
|
|
e3e4bcc015 | ||
|
|
2d546ccbf7 | ||
|
|
b41804bb5b | ||
|
|
47a04df189 | ||
|
|
2efedaf46c | ||
|
|
49e43c830b | ||
|
|
763e101208 | ||
|
|
e39a62b1fd | ||
|
|
da76abda75 | ||
|
|
829d7d0a7e | ||
|
|
9f6372b305 | ||
|
|
12edd782c6 | ||
|
|
0b59fa9416 | ||
|
|
cc0f12ed26 | ||
|
|
f42553d0e1 | ||
|
|
e7564420c9 | ||
|
|
e81a0ded11 | ||
|
|
a32c702dbd | ||
|
|
23a5ed71de | ||
|
|
245dc97cfb | ||
|
|
ece204c30f | ||
|
|
1bd59096fd | ||
|
|
0b02c2c6a7 | ||
|
|
6a61a499e9 | ||
|
|
6b1c283082 | ||
|
|
5402a9611e | ||
|
|
43e06ccd45 | ||
|
|
f52c825bf5 | ||
|
|
bf8b709372 | ||
|
|
fdf82e5270 | ||
|
|
0224a1b66b | ||
|
|
505ad6d69b | ||
|
|
5bcd573821 | ||
|
|
c5a291d9c7 | ||
|
|
232a8c1148 | ||
|
|
663f6eaf5c | ||
|
|
9d3210259c | ||
|
|
4ec6c2f7cf | ||
|
|
8452bec877 | ||
|
|
0d4296e0e1 | ||
|
|
2b85da3bc9 | ||
|
|
17f194b9a3 | ||
|
|
ff47fbaedc | ||
|
|
87c88f7463 | ||
|
|
60fd5f7ab8 | ||
|
|
5ceab059dc | ||
|
|
67c898f9ad | ||
|
|
d903187eea | ||
|
|
653f0841e4 | ||
|
|
10bfadb556 | ||
|
|
0b2cc066dd | ||
|
|
60ab13d216 | ||
|
|
f90c658567 | ||
|
|
0c54895877 | ||
|
|
4eb54328f8 | ||
|
|
b1189db9c5 | ||
|
|
869578f1ba | ||
|
|
3320f776ce | ||
|
|
1d64635783 | ||
|
|
bbb076c0d4 | ||
|
|
fe2a4d0428 | ||
|
|
6bdc1941e6 | ||
|
|
9188905145 | ||
|
|
3f2fbb10d8 | ||
|
|
9c97235fe8 | ||
|
|
70a13b47db | ||
|
|
18afaf0eaf | ||
|
|
8b8c3d8116 | ||
|
|
514fc9fe43 | ||
|
|
5d8923d69c | ||
|
|
5db880af57 | ||
|
|
c05db9ce58 | ||
|
|
04079abe00 | ||
|
|
8054b69f73 | ||
|
|
b5ee777466 | ||
|
|
96f3061709 | ||
|
|
420c5a4ff3 | ||
|
|
e8f6476e8c | ||
|
|
65ec35b732 | ||
|
|
8d731b5d15 | ||
|
|
38c0dc4551 | ||
|
|
4d8cb0469f | ||
|
|
62cb8f5ba6 | ||
|
|
97c75d96d5 | ||
|
|
f5ae806b31 | ||
|
|
482dc3a5a5 | ||
|
|
a8539ac004 | ||
|
|
9970c56218 | ||
|
|
480218412a | ||
|
|
6ae09d2866 | ||
|
|
609680b328 | ||
|
|
ccbe370c8e | ||
|
|
9706e47643 | ||
|
|
d98361f782 | ||
|
|
ba7c789ec9 | ||
|
|
d128997d40 | ||
|
|
61342547ce | ||
|
|
c1a5f173b8 | ||
|
|
f5c5b7b2c8 | ||
|
|
057b47555d | ||
|
|
43299f6747 | ||
|
|
03bf6cb719 | ||
|
|
3a1bb12830 | ||
|
|
5efa68757e | ||
|
|
afaf5bf3ea | ||
|
|
50c805826f | ||
|
|
35ae9f4a64 | ||
|
|
d7d96c02a2 | ||
|
|
dd03723144 | ||
|
|
26f07196ea | ||
|
|
8c291fdfe3 | ||
|
|
d1e118f07c | ||
|
|
6c531c14e6 | ||
|
|
433213c915 | ||
|
|
ab0c0b18c2 | ||
|
|
29fd5f9fbe | ||
|
|
882d8afc93 | ||
|
|
e11635d15c | ||
|
|
5d79d93aac | ||
|
|
7ccf651fd0 | ||
|
|
67af41cce8 | ||
|
|
e2c96e62e1 | ||
|
|
2ecae442fc | ||
|
|
a1060b0eb5 | ||
|
|
ddd8de888f | ||
|
|
a758dffbc1 | ||
|
|
87775faeca | ||
|
|
ef0fc46ed8 | ||
|
|
138b4fa247 | ||
|
|
47d1f3459c | ||
|
|
4712aae834 | ||
|
|
2900ee1cde | ||
|
|
c6c4178dd2 | ||
|
|
a3ce0e6b1b | ||
|
|
0b1ad3b7f0 | ||
|
|
37fb46f092 | ||
|
|
bc8bf9a9fb | ||
|
|
9e28c98911 | ||
|
|
0a1269d52d | ||
|
|
2e5bc31c9e | ||
|
|
1b335fd945 | ||
|
|
0c8b2d007a | ||
|
|
9ee1b32e2d | ||
|
|
953ad98a16 | ||
|
|
1357057bd8 | ||
|
|
35c9323de6 | ||
|
|
13a0afef06 | ||
|
|
c7ad8e4bf6 | ||
|
|
f1754bdd5f | ||
|
|
c462a1c500 | ||
|
|
0bba184994 | ||
|
|
178602ea1f | ||
|
|
2eb8f88a20 | ||
|
|
96d11df06c | ||
|
|
950d210ec5 | ||
|
|
55c1bddac5 | ||
|
|
ac50c762d7 | ||
|
|
5c2ab150b3 | ||
|
|
0870536405 | ||
|
|
b47ede477a | ||
|
|
eef5cc17b3 | ||
|
|
ad2191333d | ||
|
|
a85cac497d | ||
|
|
e0c69d7df5 | ||
|
|
ff3d91ceb4 | ||
|
|
5777431577 | ||
|
|
cd86f80203 | ||
|
|
8c885d3f37 | ||
|
|
dddb46a6d0 | ||
|
|
6b0f378c5b | ||
|
|
9dd7f37d42 | ||
|
|
9f10fb6472 | ||
|
|
64dbccb9bd | ||
|
|
9a432a5a13 | ||
|
|
842e494fa6 | ||
|
|
7fc9ee154a | ||
|
|
5f84010c2a | ||
|
|
3dcd6cb80b | ||
|
|
79e94bf766 | ||
|
|
3de370f3d5 | ||
|
|
c84d2f4624 | ||
|
|
380a9f7a6f | ||
|
|
a6c7b67d0d | ||
|
|
c13c1f2577 | ||
|
|
151405618f | ||
|
|
70e11cc309 | ||
|
|
7619824d80 | ||
|
|
f3d181b5ee | ||
|
|
55055a70f0 | ||
|
|
22d3ba674e | ||
|
|
ac487a2133 | ||
|
|
4da3a14adc | ||
|
|
69ec810ed0 | ||
|
|
2df01316ce | ||
|
|
3a67aefee2 | ||
|
|
d114dffcb4 | ||
|
|
7bb5d9a67a | ||
|
|
a6b1e57ae1 | ||
|
|
c70c13eb5c | ||
|
|
d905ea354e | ||
|
|
99cec81894 | ||
|
|
5d5bccf1bb | ||
|
|
6fcf0a77af | ||
|
|
e7477c0abf | ||
|
|
85540855c3 | ||
|
|
2dc220b42f | ||
|
|
2d6cadbf1b | ||
|
|
340871e03a | ||
|
|
e222a74960 | ||
|
|
ab499d5095 | ||
|
|
a5f7027229 | ||
|
|
bf5cf897e2 | ||
|
|
d33c1af549 | ||
|
|
677464d04d | ||
|
|
d2d6ed8bd4 | ||
|
|
bd2a44dbdd | ||
|
|
e9ee4beb9f | ||
|
|
3b3f057f6f | ||
|
|
a9dec51e59 | ||
|
|
257312ad7c | ||
|
|
6ee8a2dfa7 | ||
|
|
75c5e9cfa7 | ||
|
|
1a94f2b585 | ||
|
|
f0b4c42c68 | ||
|
|
9be061735f | ||
|
|
6bfa525080 | ||
|
|
8fcaf18897 | ||
|
|
f558cde266 | ||
|
|
b508a33f5d | ||
|
|
b4db99006b | ||
|
|
8994f079a5 | ||
|
|
b2d184cfa5 | ||
|
|
92dc92379f | ||
|
|
2a6862ceb9 | ||
|
|
4c569e1d5f | ||
|
|
4420ffd49e | ||
|
|
fb7f57cf6a | ||
|
|
8be3bdac5d | ||
|
|
2785376bd3 | ||
|
|
d6e77e531d | ||
|
|
e686b1410d | ||
|
|
2c23a1e0a0 | ||
|
|
47eb9e8c8f | ||
|
|
712b354421 | ||
|
|
18ef4922de | ||
|
|
274f9d5846 | ||
|
|
f6fa085fe4 | ||
|
|
9ab0f04ba5 | ||
|
|
fb7854f1ef | ||
|
|
1086c31503 | ||
|
|
3a47248a09 | ||
|
|
71a333261b | ||
|
|
5ea2e295c1 | ||
|
|
1fc7547a53 | ||
|
|
a7d63649f8 | ||
|
|
2f26fcdc2a | ||
|
|
107d4cdd61 | ||
|
|
52f9aad4d0 | ||
|
|
7bb5175084 | ||
|
|
dd570b616b | ||
|
|
943a30af04 | ||
|
|
eabed60e56 | ||
|
|
f793413a79 | ||
|
|
f4a3b8571d | ||
|
|
da6586b847 | ||
|
|
4a5f34089d | ||
|
|
90da9659d1 | ||
|
|
2e30acf611 | ||
|
|
5554d13f7f | ||
|
|
a5ef33b302 | ||
|
|
9a2588f7eb | ||
|
|
cac5852e68 | ||
|
|
d52d50e283 | ||
|
|
6911da8581 | ||
|
|
e70f9a67b8 | ||
|
|
173aa7333a | ||
|
|
2396b2d4db | ||
|
|
6120c0daec | ||
|
|
790f9bde54 | ||
|
|
7a469fb481 | ||
|
|
d4a2011a59 | ||
|
|
9165832caf | ||
|
|
d274a5c13c | ||
|
|
e6bd15c68b | ||
|
|
38bef99f98 | ||
|
|
95ff9e7165 | ||
|
|
2fddbdddee | ||
|
|
465e812ed9 | ||
|
|
3b1fb79a85 | ||
|
|
0f8f35b415 | ||
|
|
a133b1c2a9 | ||
|
|
fa74acb5f0 | ||
|
|
836b4c358f | ||
|
|
982e32d108 | ||
|
|
024a335505 | ||
|
|
963cbf61e4 | ||
|
|
6d98d2c7c3 | ||
|
|
64726f13e1 | ||
|
|
85dfaaa2c2 | ||
|
|
42a915b04a | ||
|
|
42a8aa6c66 | ||
|
|
56464d3291 | ||
|
|
aed96ee753 | ||
|
|
a937320c65 | ||
|
|
a81a0cb059 | ||
|
|
5af9511505 | ||
|
|
14ae9b312d | ||
|
|
2d3e5c2e0b | ||
|
|
17950fec3e | ||
|
|
2009140da8 | ||
|
|
2a394eee62 | ||
|
|
09a7585643 | ||
|
|
a09084ceba | ||
|
|
147e5dceff | ||
|
|
3510afd30b | ||
|
|
d3586c2143 | ||
|
|
56ba2325c1 | ||
|
|
b77a4ed3a1 | ||
|
|
9b86c3127a | ||
|
|
0da7ffe45f | ||
|
|
30b78d9559 | ||
|
|
c16abc0b85 | ||
|
|
708c691cdb | ||
|
|
31c20ac4d8 | ||
|
|
1458014a29 | ||
|
|
1c84a5c8ad | ||
|
|
6728b843f7 | ||
|
|
1b55104d51 | ||
|
|
76978bfd47 | ||
|
|
6ff3231dab | ||
|
|
64716e6b42 | ||
|
|
a1191eb4ab | ||
|
|
166bed732e | ||
|
|
02cb12e4b4 | ||
|
|
159467ad44 | ||
|
|
2a006086c5 | ||
|
|
e0dc1eec93 | ||
|
|
ab130ee92c | ||
|
|
dabbe09918 | ||
|
|
296a7ac11d | ||
|
|
6bbf08893e | ||
|
|
f8b958738a | ||
|
|
1b4427f13f | ||
|
|
e55577fd26 | ||
|
|
c42960ec2a | ||
|
|
c033d4b65c | ||
|
|
dc6f03b4e4 | ||
|
|
b6967a432a | ||
|
|
7d0467863c | ||
|
|
a0b72d3995 | ||
|
|
5fe4b867f3 | ||
|
|
40af058406 | ||
|
|
b4376a6a8c | ||
|
|
457422c679 | ||
|
|
080eba948f | ||
|
|
eff86defd9 | ||
|
|
fcb463d400 | ||
|
|
efee8149e2 | ||
|
|
bc32f37fce | ||
|
|
58bfa247a4 | ||
|
|
59b9b31604 | ||
|
|
844af709c0 | ||
|
|
bb6e2d6885 | ||
|
|
6243dc7913 | ||
|
|
45c4362ae6 | ||
|
|
a0230b7e00 | ||
|
|
768755c31a | ||
|
|
3088c7f198 | ||
|
|
c8469071bf | ||
|
|
115fc301b5 | ||
|
|
bc449b8e95 | ||
|
|
74bbc0fe7e | ||
|
|
c73fa3d7a6 | ||
|
|
5694610478 | ||
|
|
ec107dfba5 | ||
|
|
64aa476330 | ||
|
|
42f6719e8d | ||
|
|
244b9dc02b | ||
|
|
fe3644a417 | ||
|
|
e18b61e041 | ||
|
|
d054782693 | ||
|
|
d56e53a347 | ||
|
|
3503c721ac | ||
|
|
0fab5f07d0 | ||
|
|
b0d12f8bf9 | ||
|
|
9fe58aaabc | ||
|
|
03c8ea14cc | ||
|
|
260edc2a08 | ||
|
|
b41591a527 | ||
|
|
4e9481451b | ||
|
|
95b48da37d | ||
|
|
1b36785177 | ||
|
|
8bc76e3d58 | ||
|
|
1a5e2b907d | ||
|
|
3717e5c2e0 | ||
|
|
33a1416199 | ||
|
|
ff4221fbe7 | ||
|
|
486bca82e8 | ||
|
|
611d07fc16 | ||
|
|
f7e12586cf | ||
|
|
f62aa051c8 | ||
|
|
2b6b898102 | ||
|
|
1dd0444531 | ||
|
|
ba9eb01c1f | ||
|
|
73a8144e75 | ||
|
|
6aef422de6 | ||
|
|
5f4b8b60cb | ||
|
|
3256236ba2 | ||
|
|
b102727320 | ||
|
|
3434005e66 | ||
|
|
b3026a7991 | ||
|
|
0a051832a8 | ||
|
|
2dbafbda02 | ||
|
|
240b6fb6f2 | ||
|
|
4163d3655a | ||
|
|
2c7bf49fc9 | ||
|
|
739592e50d | ||
|
|
393e31e509 | ||
|
|
a1dceacc8f | ||
|
|
cf26c87872 | ||
|
|
21195b3491 | ||
|
|
3f66f6a6a5 | ||
|
|
daae4f2f80 | ||
|
|
4e2708c1ac | ||
|
|
d57d8e0d5d | ||
|
|
9577a6af21 | ||
|
|
107a6aed01 | ||
|
|
2c2045d413 | ||
|
|
30fe471d2b | ||
|
|
5ab6979633 | ||
|
|
ec5e9cb6e3 | ||
|
|
f4b4546197 | ||
|
|
f047749e61 | ||
|
|
87840ce91d | ||
|
|
bf31e9f634 | ||
|
|
f86d84daed | ||
|
|
41ed920d35 | ||
|
|
df23ddb545 | ||
|
|
767556ccad | ||
|
|
f9dab2ad19 | ||
|
|
66cb3a6120 | ||
|
|
7672a370da | ||
|
|
870e47ed03 | ||
|
|
32d4bdb80f | ||
|
|
929dfd2c71 | ||
|
|
f437af6451 | ||
|
|
413a0fb2e5 | ||
|
|
793adadb06 | ||
|
|
999b43b89f | ||
|
|
bd60c88c7d | ||
|
|
23b9a2eddf | ||
|
|
0b57d97c8c | ||
|
|
6255293dd4 | ||
|
|
04136d95a3 | ||
|
|
40aa29e42a | ||
|
|
a709f30da9 | ||
|
|
0796c14e79 | ||
|
|
a9c0a4be23 | ||
|
|
3e1209d3a4 | ||
|
|
caf14c1b7c | ||
|
|
27f7d2c8d2 | ||
|
|
8ee430eda2 | ||
|
|
484e4cb225 | ||
|
|
b080ad9954 | ||
|
|
f6625d9188 | ||
|
|
1eb2816bc4 | ||
|
|
077be5aaf3 | ||
|
|
d59875f114 | ||
|
|
e89191ed39 | ||
|
|
ea21438637 | ||
|
|
0d2e8333e8 | ||
|
|
338399e622 | ||
|
|
27cab8aad5 | ||
|
|
1545a49b4c | ||
|
|
3ca15250e8 | ||
|
|
6cbac51731 | ||
|
|
e310c666b1 | ||
|
|
677b0170aa | ||
|
|
9150b770e4 | ||
|
|
2ad6511c31 | ||
|
|
0848f28d83 | ||
|
|
5d9bc950ce | ||
|
|
714da79395 | ||
|
|
823fe9ebbd | ||
|
|
4bf72b5383 | ||
|
|
51945f002b | ||
|
|
bcca9387de | ||
|
|
b8417fa46d | ||
|
|
85b0699288 | ||
|
|
6c03fb0226 | ||
|
|
a084dea07c | ||
|
|
2e0fc3e4c1 | ||
|
|
24f4d410ce | ||
|
|
052e0445ab | ||
|
|
758c908d5a | ||
|
|
3917c2589d | ||
|
|
f4a77308ec | ||
|
|
103b9724f9 | ||
|
|
75a315ecf0 | ||
|
|
63b3b9ef6d | ||
|
|
a6c2cfe89b | ||
|
|
5120657386 | ||
|
|
e754de46d1 | ||
|
|
5d718aa0d6 | ||
|
|
55fcbc8880 | ||
|
|
e19aa001b2 | ||
|
|
b447ea9c18 | ||
|
|
13274655d4 | ||
|
|
3723ac60ef | ||
|
|
da578f47f1 | ||
|
|
433e7de686 | ||
|
|
e18e9ae2ea | ||
|
|
27d5123a61 | ||
|
|
89b9f9ffe2 | ||
|
|
a17b8aaa13 | ||
|
|
e210969612 | ||
|
|
1208356b92 | ||
|
|
d7cd74fe2f | ||
|
|
31b63e9939 | ||
|
|
b99c2c2df1 | ||
|
|
94d3eff9ce | ||
|
|
b78e9961c6 | ||
|
|
b0704ca5d6 | ||
|
|
31c0934108 | ||
|
|
37083c8aef | ||
|
|
af23b0c67b | ||
|
|
a9e83fb9cf | ||
|
|
51126e1691 | ||
|
|
dd410a2de5 | ||
|
|
7ccb0b5c02 | ||
|
|
7f3e62e456 | ||
|
|
fcfc29d7ea | ||
|
|
2f3429a144 | ||
|
|
20782693f4 | ||
|
|
0cfb354374 | ||
|
|
9be5b7c6c9 | ||
|
|
e7653d2ea6 | ||
|
|
1494887e29 | ||
|
|
42dab2b1a5 | ||
|
|
36a0c1fb17 | ||
|
|
60c6767337 | ||
|
|
75451cc7fa | ||
|
|
db10035d9d |
@@ -5,6 +5,7 @@ packages:
|
|||||||
- freetype-dev
|
- freetype-dev
|
||||||
- fontconfig-dev
|
- fontconfig-dev
|
||||||
- opus-dev
|
- opus-dev
|
||||||
|
- bzip2-dev
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ packages:
|
|||||||
- libfreetype-dev
|
- libfreetype-dev
|
||||||
- libfontconfig-dev
|
- libfontconfig-dev
|
||||||
- libopus-dev
|
- libopus-dev
|
||||||
|
- libbz2-dev
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ packages:
|
|||||||
- libfreetype-dev
|
- libfreetype-dev
|
||||||
- libfontconfig-dev
|
- libfontconfig-dev
|
||||||
- libopus-dev
|
- libopus-dev
|
||||||
|
- libbz2-dev
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ packages:
|
|||||||
- print/freetype2
|
- print/freetype2
|
||||||
- x11-fonts/fontconfig
|
- x11-fonts/fontconfig
|
||||||
- audio/opus
|
- audio/opus
|
||||||
|
- archivers/bzip2
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ packages:
|
|||||||
- fontconfig
|
- fontconfig
|
||||||
- libopus
|
- libopus
|
||||||
- pkgconf
|
- pkgconf
|
||||||
|
- bzip2
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ packages:
|
|||||||
- python3
|
- python3
|
||||||
- sdl2
|
- sdl2
|
||||||
- opus
|
- opus
|
||||||
|
- bzip2
|
||||||
sources:
|
sources:
|
||||||
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
tasks:
|
tasks:
|
||||||
|
|||||||
12
.cirrus.yml
12
.cirrus.yml
@@ -1,15 +1,3 @@
|
|||||||
task:
|
|
||||||
name: freebsd-13-amd64
|
|
||||||
freebsd_instance:
|
|
||||||
image_family: freebsd-13-2
|
|
||||||
setup_script:
|
|
||||||
- pkg update
|
|
||||||
- pkg install -y pkgconf git sdl2 python fontconfig opus
|
|
||||||
- git submodule update --init --recursive
|
|
||||||
test_script:
|
|
||||||
- ./scripts/cirrus/build_freebsd.sh dedicated
|
|
||||||
- ./scripts/cirrus/build_freebsd.sh full
|
|
||||||
|
|
||||||
task:
|
task:
|
||||||
name: freebsd-14-amd64
|
name: freebsd-14-amd64
|
||||||
freebsd_instance:
|
freebsd_instance:
|
||||||
|
|||||||
360
.editorconfig
360
.editorconfig
@@ -1,9 +1,365 @@
|
|||||||
# EditorConfig is awesome: https://EditorConfig.org
|
# this file is just a suggestion, you might follow it, you might not
|
||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*]
|
[*]
|
||||||
charset = latin1
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
ij_formatter_off_tag = @formatter:off
|
||||||
|
ij_formatter_on_tag = @formatter:on
|
||||||
|
|
||||||
|
[*.{c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tli}]
|
||||||
|
|
||||||
|
# Visual C++ Formatting settings
|
||||||
|
cpp_indent_braces = false
|
||||||
|
cpp_indent_multi_line_relative_to = innermost_parenthesis
|
||||||
|
cpp_indent_within_parentheses = indent
|
||||||
|
cpp_indent_preserve_within_parentheses = true
|
||||||
|
cpp_indent_case_contents = true
|
||||||
|
cpp_indent_case_labels = false
|
||||||
|
cpp_indent_case_contents_when_block = false
|
||||||
|
cpp_indent_lambda_braces_when_parameter = true
|
||||||
|
cpp_indent_goto_labels = one_left
|
||||||
|
cpp_indent_preprocessor = leftmost_column
|
||||||
|
cpp_indent_access_specifiers = false
|
||||||
|
cpp_indent_namespace_contents = true
|
||||||
|
cpp_indent_preserve_comments = false
|
||||||
|
cpp_new_line_before_open_brace_namespace = new_line
|
||||||
|
cpp_new_line_before_open_brace_type = new_line
|
||||||
|
cpp_new_line_before_open_brace_function = new_line
|
||||||
|
cpp_new_line_before_open_brace_block = new_line
|
||||||
|
cpp_new_line_before_open_brace_lambda = new_line
|
||||||
|
cpp_new_line_scope_braces_on_separate_lines = true
|
||||||
|
cpp_new_line_close_brace_same_line_empty_type = false
|
||||||
|
cpp_new_line_close_brace_same_line_empty_function = false
|
||||||
|
cpp_new_line_before_catch = true
|
||||||
|
cpp_new_line_before_else = true
|
||||||
|
cpp_new_line_before_while_in_do_while = false
|
||||||
|
cpp_space_before_function_open_parenthesis = remove
|
||||||
|
cpp_space_within_parameter_list_parentheses = true
|
||||||
|
cpp_space_between_empty_parameter_list_parentheses = true
|
||||||
|
cpp_space_after_keywords_in_control_flow_statements = false
|
||||||
|
cpp_space_within_control_flow_statement_parentheses = true
|
||||||
|
cpp_space_before_lambda_open_parenthesis = false
|
||||||
|
cpp_space_within_cast_parentheses = false
|
||||||
|
cpp_space_after_cast_close_parenthesis = false
|
||||||
|
cpp_space_within_expression_parentheses = true
|
||||||
|
cpp_space_before_block_open_brace = true
|
||||||
|
cpp_space_between_empty_braces = true
|
||||||
|
cpp_space_before_initializer_list_open_brace = false
|
||||||
|
cpp_space_within_initializer_list_braces = true
|
||||||
|
cpp_space_preserve_in_initializer_list = true
|
||||||
|
cpp_space_before_open_square_bracket = false
|
||||||
|
cpp_space_within_square_brackets = false
|
||||||
|
cpp_space_before_empty_square_brackets = false
|
||||||
|
cpp_space_between_empty_square_brackets = false
|
||||||
|
cpp_space_group_square_brackets = true
|
||||||
|
cpp_space_within_lambda_brackets = false
|
||||||
|
cpp_space_between_empty_lambda_brackets = false
|
||||||
|
cpp_space_before_comma = false
|
||||||
|
cpp_space_after_comma = true
|
||||||
|
cpp_space_remove_around_member_operators = true
|
||||||
|
cpp_space_before_inheritance_colon = true
|
||||||
|
cpp_space_before_constructor_colon = true
|
||||||
|
cpp_space_remove_before_semicolon = true
|
||||||
|
cpp_space_after_semicolon = true
|
||||||
|
cpp_space_remove_around_unary_operator = true
|
||||||
|
cpp_space_around_binary_operator = insert
|
||||||
|
cpp_space_around_assignment_operator = insert
|
||||||
|
cpp_space_pointer_reference_alignment = right
|
||||||
|
cpp_space_around_ternary_operator = insert
|
||||||
|
cpp_use_unreal_engine_macro_formatting = true
|
||||||
|
cpp_wrap_preserve_blocks = one_liners
|
||||||
|
|
||||||
|
# IDEA settings
|
||||||
|
ij_c_add_brief_tag = false
|
||||||
|
ij_c_add_getter_prefix = true
|
||||||
|
ij_c_add_setter_prefix = true
|
||||||
|
ij_c_align_dictionary_pair_values = false
|
||||||
|
ij_c_align_group_field_declarations = false
|
||||||
|
ij_c_align_init_list_in_columns = true
|
||||||
|
ij_c_align_multiline_array_initializer_expression = false
|
||||||
|
ij_c_align_multiline_assignment = false
|
||||||
|
ij_c_align_multiline_binary_operation = false
|
||||||
|
ij_c_align_multiline_chained_methods = false
|
||||||
|
ij_c_align_multiline_for = true
|
||||||
|
ij_c_align_multiline_ternary_operation = false
|
||||||
|
ij_c_array_initializer_comma_on_next_line = false
|
||||||
|
ij_c_array_initializer_new_line_after_left_brace = false
|
||||||
|
ij_c_array_initializer_right_brace_on_new_line = false
|
||||||
|
ij_c_array_initializer_wrap = off
|
||||||
|
ij_c_assignment_wrap = off
|
||||||
|
ij_c_binary_operation_sign_on_next_line = false
|
||||||
|
ij_c_binary_operation_wrap = off
|
||||||
|
ij_c_blank_lines_after_class_header = 0
|
||||||
|
ij_c_blank_lines_after_imports = 1
|
||||||
|
ij_c_blank_lines_around_class = 1
|
||||||
|
ij_c_blank_lines_around_field = 0
|
||||||
|
ij_c_blank_lines_around_field_in_interface = 0
|
||||||
|
ij_c_blank_lines_around_method = 1
|
||||||
|
ij_c_blank_lines_around_method_in_interface = 1
|
||||||
|
ij_c_blank_lines_around_namespace = 0
|
||||||
|
ij_c_blank_lines_around_properties_in_declaration = 0
|
||||||
|
ij_c_blank_lines_around_properties_in_interface = 0
|
||||||
|
ij_c_blank_lines_before_imports = 1
|
||||||
|
ij_c_blank_lines_before_method_body = 0
|
||||||
|
ij_c_block_brace_placement = next_line
|
||||||
|
ij_c_block_brace_style = next_line
|
||||||
|
ij_c_block_comment_at_first_column = true
|
||||||
|
ij_c_catch_on_new_line = false
|
||||||
|
ij_c_class_brace_style = next_line
|
||||||
|
ij_c_class_constructor_init_list_align_multiline = true
|
||||||
|
ij_c_class_constructor_init_list_comma_on_next_line = false
|
||||||
|
ij_c_class_constructor_init_list_new_line_after_colon = never
|
||||||
|
ij_c_class_constructor_init_list_new_line_before_colon = if_long
|
||||||
|
ij_c_class_constructor_init_list_wrap = normal
|
||||||
|
ij_c_copy_is_deep = false
|
||||||
|
ij_c_create_interface_for_categories = true
|
||||||
|
ij_c_declare_generated_methods = true
|
||||||
|
ij_c_description_include_member_names = true
|
||||||
|
ij_c_discharged_short_ternary_operator = false
|
||||||
|
ij_c_do_not_add_breaks = false
|
||||||
|
ij_c_do_while_brace_force = never
|
||||||
|
ij_c_else_on_new_line = false
|
||||||
|
ij_c_enum_constants_comma_on_next_line = false
|
||||||
|
ij_c_enum_constants_wrap = off
|
||||||
|
ij_c_for_brace_force = never
|
||||||
|
ij_c_for_statement_new_line_after_left_paren = false
|
||||||
|
ij_c_for_statement_right_paren_on_new_line = false
|
||||||
|
ij_c_for_statement_wrap = off
|
||||||
|
ij_c_function_brace_placement = next_line
|
||||||
|
ij_c_function_call_arguments_align_multiline = true
|
||||||
|
ij_c_function_call_arguments_align_multiline_pars = false
|
||||||
|
ij_c_function_call_arguments_comma_on_next_line = false
|
||||||
|
ij_c_function_call_arguments_new_line_after_lpar = false
|
||||||
|
ij_c_function_call_arguments_new_line_before_rpar = false
|
||||||
|
ij_c_function_call_arguments_wrap = normal
|
||||||
|
ij_c_function_non_top_after_return_type_wrap = normal
|
||||||
|
ij_c_function_parameters_align_multiline = true
|
||||||
|
ij_c_function_parameters_align_multiline_pars = false
|
||||||
|
ij_c_function_parameters_comma_on_next_line = false
|
||||||
|
ij_c_function_parameters_new_line_after_lpar = false
|
||||||
|
ij_c_function_parameters_new_line_before_rpar = false
|
||||||
|
ij_c_function_parameters_wrap = normal
|
||||||
|
ij_c_function_top_after_return_type_wrap = normal
|
||||||
|
ij_c_generate_additional_eq_operators = true
|
||||||
|
ij_c_generate_additional_rel_operators = true
|
||||||
|
ij_c_generate_class_constructor = true
|
||||||
|
ij_c_generate_comparison_operators_use_std_tie = false
|
||||||
|
ij_c_generate_instance_variables_for_properties = ask
|
||||||
|
ij_c_generate_operators_as_members = true
|
||||||
|
ij_c_header_guard_style_pattern = ${PROJECT_NAME}_${FILE_NAME}_${EXT}
|
||||||
|
ij_c_if_brace_force = never
|
||||||
|
ij_c_in_line_short_ternary_operator = true
|
||||||
|
ij_c_indent_block_comment = true
|
||||||
|
ij_c_indent_c_struct_members = 4
|
||||||
|
ij_c_indent_case_from_switch = true
|
||||||
|
ij_c_indent_class_members = 4
|
||||||
|
ij_c_indent_directive_as_code = false
|
||||||
|
ij_c_indent_implementation_members = 0
|
||||||
|
ij_c_indent_inside_code_block = 4
|
||||||
|
ij_c_indent_interface_members = 0
|
||||||
|
ij_c_indent_interface_members_except_ivars_block = false
|
||||||
|
ij_c_indent_namespace_members = 4
|
||||||
|
ij_c_indent_preprocessor_directive = 0
|
||||||
|
ij_c_indent_visibility_keywords = 0
|
||||||
|
ij_c_insert_override = true
|
||||||
|
ij_c_insert_virtual_with_override = false
|
||||||
|
ij_c_introduce_auto_consts = false
|
||||||
|
ij_c_introduce_auto_vars = false
|
||||||
|
ij_c_introduce_const_params = false
|
||||||
|
ij_c_introduce_const_vars = false
|
||||||
|
ij_c_introduce_constexpr_consts = false
|
||||||
|
ij_c_introduce_generate_property = false
|
||||||
|
ij_c_introduce_generate_synthesize = true
|
||||||
|
ij_c_introduce_globals_to_header = true
|
||||||
|
ij_c_introduce_prop_to_private_category = false
|
||||||
|
ij_c_introduce_static_consts = true
|
||||||
|
ij_c_introduce_use_ns_types = false
|
||||||
|
ij_c_ivars_prefix = _
|
||||||
|
ij_c_ivars_suffix =
|
||||||
|
ij_c_keep_blank_lines_before_end = 2
|
||||||
|
ij_c_keep_blank_lines_before_right_brace = 2
|
||||||
|
ij_c_keep_blank_lines_in_code = 2
|
||||||
|
ij_c_keep_blank_lines_in_declarations = 2
|
||||||
|
ij_c_keep_case_expressions_in_one_line = false
|
||||||
|
ij_c_keep_control_statement_in_one_line = false
|
||||||
|
ij_c_keep_directive_at_first_column = true
|
||||||
|
ij_c_keep_first_column_comment = false
|
||||||
|
ij_c_keep_line_breaks = true
|
||||||
|
ij_c_keep_nested_namespaces_in_one_line = false
|
||||||
|
ij_c_keep_simple_blocks_in_one_line = false
|
||||||
|
ij_c_keep_simple_methods_in_one_line = false
|
||||||
|
ij_c_keep_structures_in_one_line = false
|
||||||
|
ij_c_lambda_capture_list_align_multiline = false
|
||||||
|
ij_c_lambda_capture_list_align_multiline_bracket = false
|
||||||
|
ij_c_lambda_capture_list_comma_on_next_line = false
|
||||||
|
ij_c_lambda_capture_list_new_line_after_lbracket = false
|
||||||
|
ij_c_lambda_capture_list_new_line_before_rbracket = false
|
||||||
|
ij_c_lambda_capture_list_wrap = off
|
||||||
|
ij_c_line_comment_add_space = false
|
||||||
|
ij_c_line_comment_at_first_column = true
|
||||||
|
ij_c_method_brace_placement = end_of_line
|
||||||
|
ij_c_method_call_arguments_align_by_colons = true
|
||||||
|
ij_c_method_call_arguments_align_multiline = false
|
||||||
|
ij_c_method_call_arguments_special_dictionary_pairs_treatment = true
|
||||||
|
ij_c_method_call_arguments_wrap = off
|
||||||
|
ij_c_method_call_chain_wrap = off
|
||||||
|
ij_c_method_parameters_align_by_colons = true
|
||||||
|
ij_c_method_parameters_align_multiline = false
|
||||||
|
ij_c_method_parameters_wrap = off
|
||||||
|
ij_c_namespace_brace_placement = next_line
|
||||||
|
ij_c_parentheses_expression_new_line_after_left_paren = false
|
||||||
|
ij_c_parentheses_expression_right_paren_on_new_line = false
|
||||||
|
ij_c_place_assignment_sign_on_next_line = false
|
||||||
|
ij_c_property_nonatomic = true
|
||||||
|
ij_c_put_ivars_to_implementation = true
|
||||||
|
ij_c_refactor_compatibility_aliases_and_classes = true
|
||||||
|
ij_c_refactor_properties_and_ivars = true
|
||||||
|
ij_c_release_style = ivar
|
||||||
|
ij_c_retain_object_parameters_in_constructor = true
|
||||||
|
ij_c_semicolon_after_method_signature = false
|
||||||
|
ij_c_shift_operation_align_multiline = true
|
||||||
|
ij_c_shift_operation_wrap = normal
|
||||||
|
ij_c_show_non_virtual_functions = false
|
||||||
|
ij_c_space_after_colon = true
|
||||||
|
ij_c_space_after_colon_in_foreach = true
|
||||||
|
ij_c_space_after_colon_in_selector = false
|
||||||
|
ij_c_space_after_comma = true
|
||||||
|
ij_c_space_after_cup_in_blocks = false
|
||||||
|
ij_c_space_after_dictionary_literal_colon = true
|
||||||
|
ij_c_space_after_for_semicolon = true
|
||||||
|
ij_c_space_after_init_list_colon = true
|
||||||
|
ij_c_space_after_method_parameter_type_parentheses = false
|
||||||
|
ij_c_space_after_method_return_type_parentheses = false
|
||||||
|
ij_c_space_after_pointer_in_declaration = false
|
||||||
|
ij_c_space_after_quest = true
|
||||||
|
ij_c_space_after_reference_in_declaration = false
|
||||||
|
ij_c_space_after_reference_in_rvalue = false
|
||||||
|
ij_c_space_after_structures_rbrace = true
|
||||||
|
ij_c_space_after_superclass_colon = true
|
||||||
|
ij_c_space_after_type_cast = false
|
||||||
|
ij_c_space_after_visibility_sign_in_method_declaration = true
|
||||||
|
ij_c_space_before_autorelease_pool_lbrace = true
|
||||||
|
ij_c_space_before_catch_keyword = true
|
||||||
|
ij_c_space_before_catch_left_brace = true
|
||||||
|
ij_c_space_before_catch_parentheses = false
|
||||||
|
ij_c_space_before_category_parentheses = true
|
||||||
|
ij_c_space_before_chained_send_message = true
|
||||||
|
ij_c_space_before_class_left_brace = true
|
||||||
|
ij_c_space_before_colon = true
|
||||||
|
ij_c_space_before_colon_in_foreach = true
|
||||||
|
ij_c_space_before_comma = false
|
||||||
|
ij_c_space_before_dictionary_literal_colon = true
|
||||||
|
ij_c_space_before_do_left_brace = true
|
||||||
|
ij_c_space_before_else_keyword = true
|
||||||
|
ij_c_space_before_else_left_brace = true
|
||||||
|
ij_c_space_before_export_lbrace = true
|
||||||
|
ij_c_space_before_for_left_brace = true
|
||||||
|
ij_c_space_before_for_parentheses = false
|
||||||
|
ij_c_space_before_for_semicolon = false
|
||||||
|
ij_c_space_before_if_left_brace = true
|
||||||
|
ij_c_space_before_if_parentheses = false
|
||||||
|
ij_c_space_before_init_list = false
|
||||||
|
ij_c_space_before_init_list_colon = true
|
||||||
|
ij_c_space_before_method_call_parentheses = false
|
||||||
|
ij_c_space_before_method_left_brace = true
|
||||||
|
ij_c_space_before_method_parentheses = false
|
||||||
|
ij_c_space_before_namespace_lbrace = true
|
||||||
|
ij_c_space_before_pointer_in_declaration = true
|
||||||
|
ij_c_space_before_property_attributes_parentheses = false
|
||||||
|
ij_c_space_before_protocols_brackets = true
|
||||||
|
ij_c_space_before_quest = true
|
||||||
|
ij_c_space_before_reference_in_declaration = true
|
||||||
|
ij_c_space_before_superclass_colon = true
|
||||||
|
ij_c_space_before_switch_left_brace = true
|
||||||
|
ij_c_space_before_switch_parentheses = false
|
||||||
|
ij_c_space_before_template_call_lt = false
|
||||||
|
ij_c_space_before_template_declaration_lt = true
|
||||||
|
ij_c_space_before_try_left_brace = true
|
||||||
|
ij_c_space_before_while_keyword = true
|
||||||
|
ij_c_space_before_while_left_brace = true
|
||||||
|
ij_c_space_before_while_parentheses = false
|
||||||
|
ij_c_space_between_adjacent_brackets = false
|
||||||
|
ij_c_space_between_operator_and_punctuator = false
|
||||||
|
ij_c_space_within_empty_array_initializer_braces = true
|
||||||
|
ij_c_spaces_around_additive_operators = true
|
||||||
|
ij_c_spaces_around_assignment_operators = true
|
||||||
|
ij_c_spaces_around_bitwise_operators = true
|
||||||
|
ij_c_spaces_around_equality_operators = true
|
||||||
|
ij_c_spaces_around_lambda_arrow = true
|
||||||
|
ij_c_spaces_around_logical_operators = true
|
||||||
|
ij_c_spaces_around_multiplicative_operators = true
|
||||||
|
ij_c_spaces_around_pm_operators = false
|
||||||
|
ij_c_spaces_around_relational_operators = true
|
||||||
|
ij_c_spaces_around_shift_operators = true
|
||||||
|
ij_c_spaces_around_unary_operator = false
|
||||||
|
ij_c_spaces_within_array_initializer_braces = true
|
||||||
|
ij_c_spaces_within_braces = false
|
||||||
|
ij_c_spaces_within_brackets = false
|
||||||
|
ij_c_spaces_within_cast_parentheses = false
|
||||||
|
ij_c_spaces_within_catch_parentheses = true
|
||||||
|
ij_c_spaces_within_category_parentheses = false
|
||||||
|
ij_c_spaces_within_empty_braces = false
|
||||||
|
ij_c_spaces_within_empty_function_call_parentheses = true
|
||||||
|
ij_c_spaces_within_empty_function_declaration_parentheses = true
|
||||||
|
ij_c_spaces_within_empty_lambda_capture_list_bracket = false
|
||||||
|
ij_c_spaces_within_empty_template_call_ltgt = false
|
||||||
|
ij_c_spaces_within_empty_template_declaration_ltgt = false
|
||||||
|
ij_c_spaces_within_for_parentheses = true
|
||||||
|
ij_c_spaces_within_function_call_parentheses = true
|
||||||
|
ij_c_spaces_within_function_declaration_parentheses = true
|
||||||
|
ij_c_spaces_within_if_parentheses = true
|
||||||
|
ij_c_spaces_within_lambda_capture_list_bracket = false
|
||||||
|
ij_c_spaces_within_method_parameter_type_parentheses = false
|
||||||
|
ij_c_spaces_within_method_return_type_parentheses = false
|
||||||
|
ij_c_spaces_within_parentheses = true
|
||||||
|
ij_c_spaces_within_property_attributes_parentheses = false
|
||||||
|
ij_c_spaces_within_protocols_brackets = false
|
||||||
|
ij_c_spaces_within_send_message_brackets = false
|
||||||
|
ij_c_spaces_within_structured_binding_list_bracket = false
|
||||||
|
ij_c_spaces_within_switch_parentheses = true
|
||||||
|
ij_c_spaces_within_template_call_ltgt = false
|
||||||
|
ij_c_spaces_within_template_declaration_ltgt = false
|
||||||
|
ij_c_spaces_within_template_double_gt = false
|
||||||
|
ij_c_spaces_within_while_parentheses = true
|
||||||
|
ij_c_special_else_if_treatment = true
|
||||||
|
ij_c_structured_binding_list_align_multiline = false
|
||||||
|
ij_c_structured_binding_list_align_multiline_bracket = false
|
||||||
|
ij_c_structured_binding_list_comma_on_next_line = false
|
||||||
|
ij_c_structured_binding_list_new_line_after_lbracket = false
|
||||||
|
ij_c_structured_binding_list_new_line_before_rbracket = false
|
||||||
|
ij_c_structured_binding_list_wrap = off
|
||||||
|
ij_c_superclass_list_after_colon = never
|
||||||
|
ij_c_superclass_list_align_multiline = true
|
||||||
|
ij_c_superclass_list_before_colon = if_long
|
||||||
|
ij_c_superclass_list_comma_on_next_line = false
|
||||||
|
ij_c_superclass_list_wrap = on_every_item
|
||||||
|
ij_c_tag_prefix_of_block_comment = at
|
||||||
|
ij_c_tag_prefix_of_line_comment = back_slash
|
||||||
|
ij_c_template_call_arguments_align_multiline = false
|
||||||
|
ij_c_template_call_arguments_align_multiline_pars = false
|
||||||
|
ij_c_template_call_arguments_comma_on_next_line = false
|
||||||
|
ij_c_template_call_arguments_new_line_after_lt = false
|
||||||
|
ij_c_template_call_arguments_new_line_before_gt = false
|
||||||
|
ij_c_template_call_arguments_wrap = off
|
||||||
|
ij_c_template_declaration_function_body_indent = false
|
||||||
|
ij_c_template_declaration_function_wrap = split_into_lines
|
||||||
|
ij_c_template_declaration_struct_body_indent = false
|
||||||
|
ij_c_template_declaration_struct_wrap = split_into_lines
|
||||||
|
ij_c_template_parameters_align_multiline = false
|
||||||
|
ij_c_template_parameters_align_multiline_pars = false
|
||||||
|
ij_c_template_parameters_comma_on_next_line = false
|
||||||
|
ij_c_template_parameters_new_line_after_lt = false
|
||||||
|
ij_c_template_parameters_new_line_before_gt = false
|
||||||
|
ij_c_template_parameters_wrap = off
|
||||||
|
ij_c_ternary_operation_signs_on_next_line = false
|
||||||
|
ij_c_ternary_operation_wrap = off
|
||||||
|
ij_c_type_qualifiers_placement = before
|
||||||
|
ij_c_use_modern_casts = true
|
||||||
|
ij_c_use_setters_in_constructor = true
|
||||||
|
ij_c_while_brace_force = never
|
||||||
|
ij_c_while_on_new_line = false
|
||||||
|
ij_c_wrap_property_declaration = off
|
||||||
|
|||||||
74
.github/workflows/c-cpp.yml
vendored
74
.github/workflows/c-cpp.yml
vendored
@@ -43,80 +43,82 @@ jobs:
|
|||||||
- os: windows-2019 # always use the oldest possible for 32-bit because of older compilers, and better support of certain legacy OSes
|
- os: windows-2019 # always use the oldest possible for 32-bit because of older compilers, and better support of certain legacy OSes
|
||||||
targetos: win32
|
targetos: win32
|
||||||
targetarch: i386
|
targetarch: i386
|
||||||
|
- os: macos-14 # in GitHub documentation, it's an ARM64 machine
|
||||||
|
targetos: apple
|
||||||
|
targetarch: arm64
|
||||||
|
- os: macos-12 # in GitHub documentation, it's an x86 machine
|
||||||
|
targetos: apple
|
||||||
|
targetarch: amd64
|
||||||
env:
|
env:
|
||||||
SDL_VERSION: 2.28.5
|
SDL_VERSION: 2.30.3
|
||||||
GH_CPU_ARCH: ${{ matrix.targetarch }}
|
GH_CPU_ARCH: ${{ matrix.targetarch }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: bash scripts/gha/deps_${{ matrix.targetos }}.sh
|
run: bash scripts/gha/deps_${{ matrix.targetos }}.sh
|
||||||
- name: Build engine
|
- name: Build engine
|
||||||
|
env:
|
||||||
|
FWGS_PFX_PASSWORD: ${{ secrets.FWGS_PFX_PASSWORD }}
|
||||||
run: bash scripts/gha/build_${{ matrix.targetos }}.sh
|
run: bash scripts/gha/build_${{ matrix.targetos }}.sh
|
||||||
- name: Upload engine (artifacts)
|
- name: Upload engine (artifacts)
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: artifact-${{ matrix.targetos }}-${{ matrix.targetarch }}
|
name: artifact-${{ matrix.targetos }}-${{ matrix.targetarch }}
|
||||||
path: artifacts/*
|
path: artifacts/*
|
||||||
flatpak:
|
flatpak:
|
||||||
name: "Flatpak"
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- app: su.xash.Engine.Compat.i386
|
- app: su.xash.Engine.Compat.i386
|
||||||
container:
|
container:
|
||||||
image: bilelmoussaoui/flatpak-github-actions:freedesktop-22.08
|
image: bilelmoussaoui/flatpak-github-actions:freedesktop-23.08
|
||||||
options: --privileged
|
options: --privileged
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Build flatpak (Compat.i386)
|
- name: Build flatpak (Compat.i386)
|
||||||
uses: FWGS/flatpak-github-actions/flatpak-builder@v6.1
|
uses: FWGS/flatpak-github-actions/flatpak-builder@v6.3
|
||||||
with:
|
with:
|
||||||
bundle: ${{ matrix.app }}.flatpak
|
bundle: ${{ matrix.app }}.flatpak
|
||||||
manifest-path: scripts/flatpak/${{ matrix.app }}.yml
|
manifest-path: scripts/flatpak/${{ matrix.app }}.yml
|
||||||
- name: Upload engine (artifacts)
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: artifact-${{ matrix.targetos }}-${{ matrix.targetarch }}
|
|
||||||
path: artifacts/*
|
|
||||||
release:
|
release:
|
||||||
name: "Upload releases"
|
name: "Upload releases"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build, flatpak]
|
needs: [build, flatpak]
|
||||||
if: ${{ github.event_name == 'push' }}
|
if: ${{ github.event_name == 'push' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Remove old release
|
- name: Remove old release, fetch artifacts, repackage binaries and upload new release
|
||||||
uses: FWGS/delete-tag-and-release@v0.2.1-dev
|
env:
|
||||||
with:
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
tag_name: ${{ github.ref_name == 'master' && 'continuous' || format('continuous-{0}', github.ref_name) }}
|
RELEASE_TAG: ${{ github.ref_name == 'master' && 'continuous' || format('continuous-{0}', github.ref_name) }}
|
||||||
delete_release: true
|
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Fetch artifacts
|
|
||||||
uses: actions/download-artifact@v3.0.1
|
|
||||||
with:
|
|
||||||
path: artifacts/
|
|
||||||
- name: Repackage binaries and allow GitHub to process removed release for few seconds
|
|
||||||
run: |
|
run: |
|
||||||
cd artifacts/
|
gh release delete "$RELEASE_TAG" \
|
||||||
for i in artifact-* su.xash.Engine.*; do
|
--yes \
|
||||||
|
--cleanup-tag \
|
||||||
|
--repo "$GITHUB_REPOSITORY" || true
|
||||||
|
sleep 20s
|
||||||
|
gh run download "$GITHUB_RUN_ID" \
|
||||||
|
--dir artifacts/ \
|
||||||
|
--repo "$GITHUB_REPOSITORY"
|
||||||
|
pushd artifacts/
|
||||||
|
echo "Found artifacts:"
|
||||||
|
ls
|
||||||
|
for i in $(find -mindepth 1 -maxdepth 1 -type d); do
|
||||||
mv "$i"/* .
|
mv "$i"/* .
|
||||||
rm -rf "$i"
|
rm -rf "$i"
|
||||||
done
|
done
|
||||||
ls -R .
|
echo "Repackaged artifacts:"
|
||||||
cd ../
|
ls -R
|
||||||
|
popd
|
||||||
sleep 20s
|
sleep 20s
|
||||||
- name: Upload new release
|
gh release create "$RELEASE_TAG" artifacts/* \
|
||||||
uses: FWGS/action-gh-release@v0.1.15
|
--title "Xash3D FWGS Continuous ${{ github.ref_name }} Build" \
|
||||||
with:
|
--target $GITHUB_SHA \
|
||||||
name: Xash3D FWGS Continuous ${{ github.ref_name }} Build
|
--repo "$GITHUB_REPOSITORY" \
|
||||||
tag_name: ${{ github.ref_name == 'master' && 'continuous' || format('continuous-{0}', github.ref_name) }}
|
--prerelease
|
||||||
prerelease: true
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
files: artifacts/*
|
|
||||||
draft: false
|
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -342,3 +342,6 @@ enc_temp_folder/
|
|||||||
|
|
||||||
# KDevelop4
|
# KDevelop4
|
||||||
*.kdev4
|
*.kdev4
|
||||||
|
|
||||||
|
# ccls langauge server
|
||||||
|
.ccls-*
|
||||||
|
|||||||
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -19,3 +19,9 @@
|
|||||||
[submodule "3rdparty/xash-extras"]
|
[submodule "3rdparty/xash-extras"]
|
||||||
path = 3rdparty/extras/xash-extras
|
path = 3rdparty/extras/xash-extras
|
||||||
url = https://github.com/FWGS/xash-extras
|
url = https://github.com/FWGS/xash-extras
|
||||||
|
[submodule "3rdparty/bzip2/bzip2"]
|
||||||
|
path = 3rdparty/bzip2/bzip2
|
||||||
|
url = https://gitlab.com/bzip2/bzip2
|
||||||
|
[submodule "3rdparty/MultiEmulator"]
|
||||||
|
path = 3rdparty/MultiEmulator
|
||||||
|
url = https://github.com/FWGS/MultiEmulator
|
||||||
|
|||||||
1
3rdparty/MultiEmulator
vendored
Submodule
1
3rdparty/MultiEmulator
vendored
Submodule
Submodule 3rdparty/MultiEmulator added at 2f3c3a40cd
1
3rdparty/bzip2/bz_version.h
vendored
Normal file
1
3rdparty/bzip2/bz_version.h
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#define BZ_VERSION "1.1.0-fwgs"
|
||||||
1
3rdparty/bzip2/bzip2
vendored
Submodule
1
3rdparty/bzip2/bzip2
vendored
Submodule
Submodule 3rdparty/bzip2/bzip2 added at 66c46b8c94
34
3rdparty/bzip2/wscript
vendored
Normal file
34
3rdparty/bzip2/wscript
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
def options(opt):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def configure(conf):
|
||||||
|
conf.define('_GNU_SOURCE', 1)
|
||||||
|
conf.define('BZ_NO_STDIO', 1)
|
||||||
|
|
||||||
|
if conf.env.DEST_OS == 'win32':
|
||||||
|
conf.define('BZ_LCCWIN32', 1)
|
||||||
|
else:
|
||||||
|
conf.define('BZ_UNIX', 1)
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
# doesn't work with CMake generator
|
||||||
|
# bld(
|
||||||
|
# features = 'subst',
|
||||||
|
# source = 'bzip2/bz_version.h.in',
|
||||||
|
# target = 'bz_version.h',
|
||||||
|
# BZ_VERSION='1.1.0-fwgs'
|
||||||
|
# )
|
||||||
|
|
||||||
|
bz_sources = ['bzip2/blocksort.c', 'bzip2/huffman.c', 'bzip2/crctable.c', 'bzip2/randtable.c', 'bzip2/compress.c', 'bzip2/decompress.c', 'bzip2/bzlib.c']
|
||||||
|
|
||||||
|
bld.stlib(
|
||||||
|
source = bz_sources,
|
||||||
|
target = 'bzip2',
|
||||||
|
# use = 'bz_version.h',
|
||||||
|
includes = ['.', 'bzip2/'],
|
||||||
|
subsystem = bld.env.MSVC_SUBSYSTEM,
|
||||||
|
export_includes = ['bzip2/']
|
||||||
|
)
|
||||||
2
3rdparty/extras/xash-extras
vendored
2
3rdparty/extras/xash-extras
vendored
Submodule 3rdparty/extras/xash-extras updated: 853f633be1...9050d05a7b
2
3rdparty/gl-wes-v2
vendored
2
3rdparty/gl-wes-v2
vendored
Submodule 3rdparty/gl-wes-v2 updated: 2d9b5afe10...d4ed038d13
1
3rdparty/gl4es/wscript
vendored
1
3rdparty/gl4es/wscript
vendored
@@ -16,7 +16,6 @@ def build(bld):
|
|||||||
|
|
||||||
bld.stlib(source = gl4es_srcdir.ant_glob(['gl/*.c', 'gl/*/*.c', 'glx/hardext.c']),
|
bld.stlib(source = gl4es_srcdir.ant_glob(['gl/*.c', 'gl/*/*.c', 'glx/hardext.c']),
|
||||||
target = 'gl4es',
|
target = 'gl4es',
|
||||||
features = 'c',
|
|
||||||
includes = ['gl4es/src', 'gl4es/src/gl', 'gl4es/src/glx', 'gl4es/include'],
|
includes = ['gl4es/src', 'gl4es/src/gl', 'gl4es/src/glx', 'gl4es/include'],
|
||||||
defines = ['NOX11', 'NO_GBM', 'NO_INIT_CONSTRUCTOR', 'DEFAULT_ES=2', 'NOEGL', 'NO_LOADER', 'STATICLIB'],
|
defines = ['NOX11', 'NO_GBM', 'NO_INIT_CONSTRUCTOR', 'DEFAULT_ES=2', 'NOEGL', 'NO_LOADER', 'STATICLIB'],
|
||||||
cflags = ['-w', '-fvisibility=hidden', '-std=gnu99'],
|
cflags = ['-w', '-fvisibility=hidden', '-std=gnu99'],
|
||||||
|
|||||||
2
3rdparty/mainui
vendored
2
3rdparty/mainui
vendored
Submodule 3rdparty/mainui updated: f5497ceb04...0bb921ea8d
2
3rdparty/nanogl
vendored
2
3rdparty/nanogl
vendored
Submodule 3rdparty/nanogl updated: e75792de03...6c0f341b7b
2
3rdparty/opus/opus
vendored
2
3rdparty/opus/opus
vendored
Submodule 3rdparty/opus/opus updated: 8cf872a186...82ac57d9f1
2
3rdparty/opus/wscript
vendored
2
3rdparty/opus/wscript
vendored
@@ -27,7 +27,7 @@ def build(bld):
|
|||||||
'opus/celt/opus_custom_demo.c'
|
'opus/celt/opus_custom_demo.c'
|
||||||
])
|
])
|
||||||
includes = ['opus/include/', 'opus/celt/', 'opus/silk/', 'opus/silk/float/']
|
includes = ['opus/include/', 'opus/celt/', 'opus/silk/', 'opus/silk/float/']
|
||||||
defines = ['USE_ALLOCA', 'OPUS_BUILD', 'FLOAT_APPROX', 'PACKAGE_VERSION="1.3.1"', 'CUSTOM_MODES']
|
defines = ['USE_ALLOCA', 'OPUS_BUILD', 'FLOAT_APPROX', 'PACKAGE_VERSION="1.4.0"', 'CUSTOM_MODES']
|
||||||
|
|
||||||
bld.stlib(
|
bld.stlib(
|
||||||
source = sources,
|
source = sources,
|
||||||
|
|||||||
2
3rdparty/vgui_support
vendored
2
3rdparty/vgui_support
vendored
Submodule 3rdparty/vgui_support updated: a2a7b9073f...e0ab95229d
@@ -13,3 +13,5 @@ When `-bugcomp` is specified with argument, it interpreted as flags separated wi
|
|||||||
| Flag | Description | Games that require this flag |
|
| Flag | Description | Games that require this flag |
|
||||||
| ------- | ----------- | ---------------------------- |
|
| ------- | ----------- | ---------------------------- |
|
||||||
| `peoei` | Reverts `pfnPEntityOfEntIndex` behavior to GoldSrc, where it returns NULL for last player due to incorrect player index comparison | * Counter-Strike: Condition Zero - Deleted Scenes |
|
| `peoei` | Reverts `pfnPEntityOfEntIndex` behavior to GoldSrc, where it returns NULL for last player due to incorrect player index comparison | * Counter-Strike: Condition Zero - Deleted Scenes |
|
||||||
|
| `gsmrf` | Rewrites message at the moment when Game DLL attempts to write an internal engine message, usually specific to GoldSrc protocol. Right now only supports `svc_spawnstaticsound`, more messages added by request. | * MetaMod/AMXModX based mods |
|
||||||
|
| `sp_attn_none` | Makes sounds with attenuation zero spatialized, i.e. have a stereo effect. | Possibly, every game that was made for GoldSrc. |
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ These strings are specific to Xash3D FWGS.
|
|||||||
| `internal_vgui_support` | boolean | 0 | Only for programmers! Required to be set as 1 for PrimeXT!<br>When set to 1, the engine will not load vgui_support DLL, as VGUI support is done (or intentionally ignored) on the game side. |
|
| `internal_vgui_support` | boolean | 0 | Only for programmers! Required to be set as 1 for PrimeXT!<br>When set to 1, the engine will not load vgui_support DLL, as VGUI support is done (or intentionally ignored) on the game side. |
|
||||||
| `render_picbutton_text` | boolean | 0 | When set to 1, the UI will not use prerendered `btns_main.bmp` and dynamically render them instead |
|
| `render_picbutton_text` | boolean | 0 | When set to 1, the UI will not use prerendered `btns_main.bmp` and dynamically render them instead |
|
||||||
| `quicksave_aged_count` | integer | 2 | Quick saves limit used in saves rotation |
|
| `quicksave_aged_count` | integer | 2 | Quick saves limit used in saves rotation |
|
||||||
|
| `demomap` | string | Empty string | The name of the demo chapter map (Half-Life Uplink) |
|
||||||
|
|
||||||
## Note on GoldSrc liblist.gam support
|
## Note on GoldSrc liblist.gam support
|
||||||
|
|
||||||
|
|||||||
14
Documentation/goldsrc-protocol-support.md
Normal file
14
Documentation/goldsrc-protocol-support.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Support for GoldSrc network protocol
|
||||||
|
This feature is still work-in-progress, but for now it's available for all users, and we appreciate any bug-reports and contributions around it.
|
||||||
|
|
||||||
|
For connecting to GoldSrc-based servers, use this command:
|
||||||
|
```
|
||||||
|
connect ip:port gs
|
||||||
|
```
|
||||||
|
|
||||||
|
But keep in mind, there are requirement for server to be able to accept connections from Xash3D-based clients: it should accept HLTV connections.
|
||||||
|
Without this requirement, you will just get "Steam validation rejected" error on connecting.
|
||||||
|
|
||||||
|
That is because proper authorization with Steam API is not implemented in engine yet (but we have plans on it).
|
||||||
|
|
||||||
|
In case of ReHLDS with Reunion plugin, by default it rejects HLTV clients. But connections from HLTV can be easily enabled in `reunion.cfg` file.
|
||||||
40
Documentation/hd-textures.md
Normal file
40
Documentation/hd-textures.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
### HD (external) textures support
|
||||||
|
|
||||||
|
Xash3D supports loading texture replacements in TGA format for almost all types of models in the game, except alias models at this time.
|
||||||
|
|
||||||
|
Textures are expected to be located at:
|
||||||
|
* `modfolder/materials/<mapname>` - for a specific map
|
||||||
|
* `modfolder/materials/common` - common for all maps
|
||||||
|
* `modfolder/materials/decals` - for decals
|
||||||
|
* `modfolder/materials/models/<model>` - for models (texture name must match the internal texture name in the model)
|
||||||
|
|
||||||
|
Support for high-resolution textures is enabled setting `host_allow_materials` cvar to `1` or in the menu, in "Video options" section.
|
||||||
|
|
||||||
|
#### Xash3D FWGS additions
|
||||||
|
|
||||||
|
In addition to paths above, Xash3D FWGS checks following paths:
|
||||||
|
|
||||||
|
* `modfolder/materials/sprites/<sprite>` - for sprites, except HUD sprites
|
||||||
|
|
||||||
|
Also, to check which texture replacements are loaded successfully, failed or weren't found, a mod developer can set `host_allow_materials` cvar value to `2`. The engine will spew log at any developer level in the following format:
|
||||||
|
|
||||||
|
```
|
||||||
|
Looking for <replacement> replacement... <status code> (<path relative to mod directory>)
|
||||||
|
```
|
||||||
|
|
||||||
|
Status codes:
|
||||||
|
* `OK` - texture replacement file was found and loaded into GPU memory successfully
|
||||||
|
* `FAIL` - texture file was found but hasn't been parsed or loaded successfully. Refer to engine log for more details.
|
||||||
|
* `MISS` - texture file wasn't found
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
Looking for maps/bounce.bsp:!waterblue tex replacement...OK (materials/common/!waterblue.tga)
|
||||||
|
Looking for maps/bounce.bsp:!waterblue_luma tex replacement...MISS (not found)
|
||||||
|
Looking for {shot2 decal replacement...MISS (materials/decals/{shot2.tga)
|
||||||
|
Looking for {shot4 decal replacement...MISS (materials/decals/{shot4.tga)
|
||||||
|
Looking for {shot3 decal replacement...MISS (materials/decals/{shot3.tga)
|
||||||
|
Looking for models/gman tex replacement...FAIL (materials/models/gman/GMan_Case1.tga)
|
||||||
|
Looking for models/gman tex replacement...FAIL (materials/models/gman/inside_1.tga)
|
||||||
|
```
|
||||||
|
|
||||||
@@ -19,7 +19,22 @@
|
|||||||
- [List of XashXT-based mods](#list-of-xashxt-based-mods)
|
- [List of XashXT-based mods](#list-of-xashxt-based-mods)
|
||||||
- [List of maps for They Hunger](#list-of-maps-for-they-hunger)
|
- [List of maps for They Hunger](#list-of-maps-for-they-hunger)
|
||||||
- [List of games and mods with custom gamedll](#list-of-games-and-mods-with-custom-gamedll)
|
- [List of games and mods with custom gamedll](#list-of-games-and-mods-with-custom-gamedll)
|
||||||
- [List of mods for Counter Strike(Android only)](#list-of-mods-for-counter-strike)
|
- [List of mods for Counter Strike](#list-of-mods-for-counter-strike)
|
||||||
|
- [List of supported mods from mobile_hacks branch of HLSDK Portable by FWGS](#list-of-supported-mods-from-mobile_hacks-branch-of-hlsdk-portable-by-fwgs)
|
||||||
|
|
||||||
|
# List of supported mods from mobile_hacks branch of HLSDK Portable by FWGS
|
||||||
|
1. [Afraid of Monsters](https://www.moddb.com/mods/afraid-of-monsters/downloads/afraid-of-monsters-v1)
|
||||||
|
2. [Big Lolly](https://www.moddb.com/mods/big-lolly)
|
||||||
|
3. [Half-Life: Blue Shift](https://store.steampowered.com/app/130/HalfLife_Blue_Shift/)
|
||||||
|
4. [Half-Secret](https://www.moddb.com/mods/half-secret)
|
||||||
|
5. [Case Closed](https://www.moddb.com/mods/caseclosed)
|
||||||
|
6. [Bloody Pizza - Vendetta](https://www.moddb.com/games/half-life/addons/bloody-pizza-vendetta)
|
||||||
|
7. [Borderlands](https://www.moddb.com/games/half-life/addons/borderlands-v04)
|
||||||
|
8. [Half-Life: Induction](https://www.moddb.com/mods/half-life-induction/downloads/half-life-induction-12)
|
||||||
|
9. [Redemption/Absolute Redemption](https://www.moddb.com/mods/absolute-redemption)
|
||||||
|
10. [Sewer beta](https://www.moddb.com/games/half-life/addons/sewer-beta)
|
||||||
|
11. [Times of Troubles](https://www.moddb.com/mods/times-of-troubles)
|
||||||
|
12. [Half-Life: Urbicide](https://www.moddb.com/mods/half-life-urbicide)
|
||||||
|
|
||||||
# List of Half-Life-based mods
|
# List of Half-Life-based mods
|
||||||
Originally this list was written by *Qwertyus*(*Qortez*)
|
Originally this list was written by *Qwertyus*(*Qortez*)
|
||||||
@@ -176,7 +191,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
143. [Operation: Nova](http://www.moddb.com/mods/half-life-operation-nova) (there is an inner bug with an M60 machinegun on a map with Osprey: it can be activated and used if you are staying in front of it, not behind it)
|
143. [Operation: Nova](http://www.moddb.com/mods/half-life-operation-nova) (there is an inner bug with an M60 machinegun on a map with Osprey: it can be activated and used if you are staying in front of it, not behind it)
|
||||||
144. [Optimum Fear](https://www.fileplanet.com/7472/0/fileinfo/Optimum-Fear)
|
144. [Optimum Fear](https://www.fileplanet.com/7472/0/fileinfo/Optimum-Fear)
|
||||||
145. [Outrun](http://www.moddb.com/mods/outrun)
|
145. [Outrun](http://www.moddb.com/mods/outrun)
|
||||||
146. [Outwards (Day One)](https://drive.google.com/file/d/1mjQ8wUazYbwTq9Ocg0Vs0raq4avbTRne/view?usp=sharing)
|
146. [Outwards (Day One)](https://web.archive.org/web/20161026104825/http://visgi.info/maps/)
|
||||||
147. [Overhaul Pack](http://www.moddb.com/mods/half-life-overhaul-pack) (Just HD pack for Half-Life)
|
147. [Overhaul Pack](http://www.moddb.com/mods/half-life-overhaul-pack) (Just HD pack for Half-Life)
|
||||||
148. [P.I.Z.D.E.C.](https://www.runthinkshootlive.com/posts/pizdec/)
|
148. [P.I.Z.D.E.C.](https://www.runthinkshootlive.com/posts/pizdec/)
|
||||||
149. [pagoda](http://www.moddb.com/mods/pagoda1)
|
149. [pagoda](http://www.moddb.com/mods/pagoda1)
|
||||||
@@ -282,7 +297,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
6. [Catacombs: Part 1](https://www.runthinkshootlive.com/posts/catacombs/)
|
6. [Catacombs: Part 1](https://www.runthinkshootlive.com/posts/catacombs/)
|
||||||
7. [Cro-man's Office Mappack](http://twhl.info/vault.php?map=5547)
|
7. [Cro-man's Office Mappack](http://twhl.info/vault.php?map=5547)
|
||||||
8. [Half-Life Episode Two Demo Alpha v1.0](http://hl.loess.ru/?mod=451)
|
8. [Half-Life Episode Two Demo Alpha v1.0](http://hl.loess.ru/?mod=451)
|
||||||
9. [Hazardous-Course (first version of Hazardous-Course 2)](https://drive.google.com/file/d/16djJZSpNWKyScSxSyMqX-u_S-2i400rl/view?usp=sharing)
|
9. [Hazardous-Course (first version of Hazardous-Course 2)](https://web.archive.org/web/20110512012317/http://www.richmans-maps.ch.vu/)
|
||||||
10. [High Tech v0.2](http://hl.loess.ru/?mod=499)
|
10. [High Tech v0.2](http://hl.loess.ru/?mod=499)
|
||||||
11. [HL Shadows, Part 1](https://www.fileplanet.com/7466/0/fileinfo/'HL-Shadows',-Part-1)
|
11. [HL Shadows, Part 1](https://www.fileplanet.com/7466/0/fileinfo/'HL-Shadows',-Part-1)
|
||||||
12. [HLNewEnd](http://twhl.info/vault.php?map=2275)
|
12. [HLNewEnd](http://twhl.info/vault.php?map=2275)
|
||||||
@@ -305,11 +320,11 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
29. [Shortcut v1.0 Beta](https://www.runthinkshootlive.com/posts/shortcut/)
|
29. [Shortcut v1.0 Beta](https://www.runthinkshootlive.com/posts/shortcut/)
|
||||||
30. [Stoka](https://www.ceskemody.cz/mapy.php?lng=1&clanek=222&razeni_hra=1&pn=stoka)
|
30. [Stoka](https://www.ceskemody.cz/mapy.php?lng=1&clanek=222&razeni_hra=1&pn=stoka)
|
||||||
31. [Striker's Compo 26](http://twhl.info/vault.php?map=5190) (buggy)
|
31. [Striker's Compo 26](http://twhl.info/vault.php?map=5190) (buggy)
|
||||||
32. [Technology Test 2](https://drive.google.com/file/d/1LfldzsMIN5j07bgtNkfY5v0Xl0S9de_G/view?usp=sharing)
|
32. [Technology Test 2](https://web.archive.org/web/20110512012317/http://www.richmans-maps.ch.vu/)
|
||||||
33. [The Gate Playable Demo](https://www.fileplanet.com/116347/110000/fileinfo/The-Gate-Playable-Demo)
|
33. [The Gate Playable Demo](https://www.fileplanet.com/116347/110000/fileinfo/The-Gate-Playable-Demo)
|
||||||
34. [They are Back](https://www.runthinkshootlive.com/posts/they-are-back/)
|
34. [They are Back](https://www.runthinkshootlive.com/posts/they-are-back/)
|
||||||
35. [Tiefseelabor( Deep Sea Laboratory )](https://www.runthinkshootlive.com/posts/deep-sea-laboratory/)
|
35. [Tiefseelabor( Deep Sea Laboratory )](https://www.runthinkshootlive.com/posts/deep-sea-laboratory/)
|
||||||
36. [Time-Shift](https://drive.google.com/file/d/1pK1s-2SIlSMQHVRPMLdC_94wTa__8_DX/view?usp=sharing)
|
36. [Time-Shift](https://web.archive.org/web/20110512012317/http://www.richmans-maps.ch.vu/)
|
||||||
37. [Train Single Beta](https://cs-mapping.com.ua/forum/showthread.php?t=36394) (Remove **gfx.wad** from **TrainSingle** folder)
|
37. [Train Single Beta](https://cs-mapping.com.ua/forum/showthread.php?t=36394) (Remove **gfx.wad** from **TrainSingle** folder)
|
||||||
38. [WAR: The Killer Beta 0.1](http://www.moddb.com/mods/war)
|
38. [WAR: The Killer Beta 0.1](http://www.moddb.com/mods/war)
|
||||||
39. [White Force Beta( Residual Point prototype )](http://www.moddb.com/mods/hl-residual-point/downloads/white-force-beta-2002)
|
39. [White Force Beta( Residual Point prototype )](http://www.moddb.com/mods/hl-residual-point/downloads/white-force-beta-2002)
|
||||||
@@ -379,7 +394,7 @@ Mods:
|
|||||||
5. [Half-Life Baby v1.4](http://www.moddb.com/games/half-life/addons/half-life-baby) (it's an unfinished but playable mod; after installing of the mod open **liblist.gam** or **gameinfo.txt** file in the mod's folder and correct the line **gamedll "..\hlbaby\dlls\hl.dll"** for **gamedll "dlls\hl.dll"**, otherwise you'll not be able to start a game)
|
5. [Half-Life Baby v1.4](http://www.moddb.com/games/half-life/addons/half-life-baby) (it's an unfinished but playable mod; after installing of the mod open **liblist.gam** or **gameinfo.txt** file in the mod's folder and correct the line **gamedll "..\hlbaby\dlls\hl.dll"** for **gamedll "dlls\hl.dll"**, otherwise you'll not be able to start a game)
|
||||||
6. [Half-Secret](http://www.moddb.com/mods/half-secret) (this mod has custom **weapon_snark** code)
|
6. [Half-Secret](http://www.moddb.com/mods/half-secret) (this mod has custom **weapon_snark** code)
|
||||||
7. [Induction](http://www.moddb.com/mods/half-life-induction) (this mod has new item - **item_flashlight**)
|
7. [Induction](http://www.moddb.com/mods/half-life-induction) (this mod has new item - **item_flashlight**)
|
||||||
8. [Lost in Black Mesa(first version without HLFX)](https://drive.google.com/file/d/1bEnm_AxJs-ly8hTEZIQBw_v2BsXdSiGa/view?usp=sharing)
|
8. [Lost in Black Mesa(first version without HLFX)](https://web.archive.org/web/20160407041812/http://half-life.ru/forum/showthread.php?threadid=13959) (download links dead!)
|
||||||
9. [Soldier](http://www.moddb.com/mods/half-life-soldier)
|
9. [Soldier](http://www.moddb.com/mods/half-life-soldier)
|
||||||
10. [Solo Operations](http://www.moddb.com/mods/solo-operations)
|
10. [Solo Operations](http://www.moddb.com/mods/solo-operations)
|
||||||
11. [The Blood v1.1](http://hl.loess.ru/?mods=&search=The+Blood) (there are some inner bugs in the mod, but they don't interfere with a game progress)
|
11. [The Blood v1.1](http://hl.loess.ru/?mods=&search=The+Blood) (there are some inner bugs in the mod, but they don't interfere with a game progress)
|
||||||
@@ -440,7 +455,7 @@ Mods:
|
|||||||
51. [Data-base](https://www.runthinkshootlive.com/posts/database/)
|
51. [Data-base](https://www.runthinkshootlive.com/posts/database/)
|
||||||
52. [de_dust2_azabetfeN](https://cs-mapping.com.ua/forum/showthread.php?t=36394) (remove **cl_dlls** & **dlls** folders from inside of mod's directory before you start the game)
|
52. [de_dust2_azabetfeN](https://cs-mapping.com.ua/forum/showthread.php?t=36394) (remove **cl_dlls** & **dlls** folders from inside of mod's directory before you start the game)
|
||||||
53. [De-railed](http://twhl.info/competitions.php?results=7)
|
53. [De-railed](http://twhl.info/competitions.php?results=7)
|
||||||
54. [Dead Shift Beta](http://www.moddb.com/mods/dead-shift) - [Demo 1](https://www.gamewatcher.com/mods/half-life-mod/dead-shift-1-0-beta) & [Demo 2](https://drive.google.com/file/d/1uHvr8xONogTTNOy-8X6G4ehFV6Eawvbq/view?usp=sharing)
|
54. [Dead Shift Beta](http://www.moddb.com/mods/dead-shift) - [Demo 1](https://www.gamewatcher.com/mods/half-life-mod/dead-shift-1-0-beta) & [Demo 2](https://web.archive.org/web/20151030005310/http://www.gamefront.com/files/13532512)
|
||||||
55. [Deep](http://twhl.info/vault.php?map=1669)
|
55. [Deep](http://twhl.info/vault.php?map=1669)
|
||||||
56. [Desert Attack](http://fyzzer.narod.ru/index.html)
|
56. [Desert Attack](http://fyzzer.narod.ru/index.html)
|
||||||
57. [Desert Combat Demo](https://www.fileplanet.com/190487/190000/fileinfo/Half-Life---Desert-Combat-Mod) (despite a big file size there's only one small unfinished map)
|
57. [Desert Combat Demo](https://www.fileplanet.com/190487/190000/fileinfo/Half-Life---Desert-Combat-Mod) (despite a big file size there's only one small unfinished map)
|
||||||
@@ -498,8 +513,8 @@ Mods:
|
|||||||
109. [Hospital](https://gamebanana.com/maps/167446) (you need to edit **liblist.gam** file in the mod's folder - delete *gamedll & type* strings from it before you start to play)
|
109. [Hospital](https://gamebanana.com/maps/167446) (you need to edit **liblist.gam** file in the mod's folder - delete *gamedll & type* strings from it before you start to play)
|
||||||
110. [Hostage](https://www.runthinkshootlive.com/posts/hostage-2/)
|
110. [Hostage](https://www.runthinkshootlive.com/posts/hostage-2/)
|
||||||
111. [House](http://www.artpeter.net/Data/HalfLife/Hl.php)
|
111. [House](http://www.artpeter.net/Data/HalfLife/Hl.php)
|
||||||
112. [Impulse 101 Fun - The Train](https://drive.google.com/file/d/1jAuMCCmREH0mfAEAscqaG8FQGa2uNknb/view?usp=sharing) (map from *TWHL* by *Archie* aka *The Hunter*)
|
112. [Impulse 101 Fun - The Train](http://web.archive.org/web/20070305075816/http://www.twhl.co.za/mapvault/2817.zip) (map from *TWHL* by *Archie* aka *The Hunter*)
|
||||||
113. [In America](https://drive.google.com/file/d/1gOC8zfnUvBxRy8Rr8juNiUNbLYjoZpnn/view?usp=sharing)
|
113. [In America](https://web.archive.org/web/20170221213409/http://www.lambda-force.org/load/half_life/karty/half_life_in_america/18-1-0-476)
|
||||||
114. [In the Kitchen](http://twhl.info/vault.php?map=4314)
|
114. [In the Kitchen](http://twhl.info/vault.php?map=4314)
|
||||||
115. [Infiltration](https://www.fileplanet.com/7467/0/fileinfo/Infiltration)
|
115. [Infiltration](https://www.fileplanet.com/7467/0/fileinfo/Infiltration)
|
||||||
116. [Interactivity & Lots of Entities](http://twhl.info/vault.php?map=5744) (link dead!)
|
116. [Interactivity & Lots of Entities](http://twhl.info/vault.php?map=5744) (link dead!)
|
||||||
|
|||||||
70
README.md
70
README.md
@@ -2,7 +2,7 @@
|
|||||||
[](https://builds.sr.ht/~a1batross/xash3d-fwgs?) [](https://github.com/FWGS/xash3d-fwgs/actions/workflows/c-cpp.yml) [](https://cirrus-ci.com/github/FWGS/xash3d-fwgs) [](http://fwgsdiscord.mentality.rip/) \
|
[](https://builds.sr.ht/~a1batross/xash3d-fwgs?) [](https://github.com/FWGS/xash3d-fwgs/actions/workflows/c-cpp.yml) [](https://cirrus-ci.com/github/FWGS/xash3d-fwgs) [](http://fwgsdiscord.mentality.rip/) \
|
||||||
[](https://github.com/FWGS/xash3d-fwgs/releases/latest) [](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous)
|
[](https://github.com/FWGS/xash3d-fwgs/releases/latest) [](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous)
|
||||||
|
|
||||||
Xash3D FWGS is a game engine, aimed to provide compatibility with Half-Life Engine and extend it, as well as to give game developers well known workflow.
|
Xash3D (pronounced `[ksɑʂ]`) FWGS is a game engine, aimed to provide compatibility with Half-Life Engine and extend it, as well as to give game developers well known workflow.
|
||||||
|
|
||||||
Xash3D FWGS is a heavily modified fork of an original [Xash3D Engine](https://www.moddb.com/engines/xash3d-engine) by Unkle Mike.
|
Xash3D FWGS is a heavily modified fork of an original [Xash3D Engine](https://www.moddb.com/engines/xash3d-engine) by Unkle Mike.
|
||||||
|
|
||||||
@@ -11,12 +11,12 @@ Xash3D FWGS is a heavily modified fork of an original [Xash3D Engine](https://ww
|
|||||||
If you like Xash3D FWGS, consider supporting individual engine maintainers. By supporting us, you help to continue developing this game engine further. The sponsorship links are available in [documentation](Documentation/donate.md).
|
If you like Xash3D FWGS, consider supporting individual engine maintainers. By supporting us, you help to continue developing this game engine further. The sponsorship links are available in [documentation](Documentation/donate.md).
|
||||||
|
|
||||||
## Fork features
|
## Fork features
|
||||||
* Steam Half-Life (HLSDK 2.4) support.
|
* Steam Half-Life (HLSDK 2.5) support.
|
||||||
* Crossplatform and modern compilers support: supports Windows, Linux, BSD & Android on x86 & ARM and [many more](Documentation/ports.md).
|
* Crossplatform and modern compilers support: supports Windows, Linux, BSD & Android on x86 & ARM and [many more](Documentation/ports.md).
|
||||||
* Better multiplayer support: multiple master servers, headless dedicated server, voice chat and IPv6 support.
|
* Better multiplayer: multiple master servers, headless dedicated server, voice chat, [GoldSrc protocol support](Documentation/goldsrc-protocol-support.md) and IPv6 support.
|
||||||
* Multiple renderers support: OpenGL, GLESv1, GLESv2 and Software.
|
* Multiple renderers support: OpenGL, GLESv1, GLESv2 and Software.
|
||||||
* Advanced virtual filesystem: `.pk3` and `.pk3dir` support, compatibility with GoldSrc FS module, fast case-insensitivity emulation for crossplatform.
|
* Advanced virtual filesystem: `.pk3` and `.pk3dir` support, compatibility with GoldSrc FS module, fast case-insensitivity emulation for crossplatform.
|
||||||
* Mobility API: better game integration on mobile devices (vibration, touch controls)
|
* Mobility API: better game integration on mobile devices (vibration, touch controls).
|
||||||
* Different input methods: touch and gamepad in addition to mouse & keyboard.
|
* Different input methods: touch and gamepad in addition to mouse & keyboard.
|
||||||
* TrueType font rendering, as a part of mainui_cpp.
|
* TrueType font rendering, as a part of mainui_cpp.
|
||||||
* External VGUI support module.
|
* External VGUI support module.
|
||||||
@@ -28,29 +28,28 @@ If you like Xash3D FWGS, consider supporting individual engine maintainers. By s
|
|||||||
1) Copy engine binaries to some directory.
|
1) Copy engine binaries to some directory.
|
||||||
2) Copy `valve` directory from [Half-Life](https://store.steampowered.com/app/70/HalfLife/) to directory with engine binaries.
|
2) Copy `valve` directory from [Half-Life](https://store.steampowered.com/app/70/HalfLife/) to directory with engine binaries.
|
||||||
If your CPU is NOT x86 compatible or you're running 64-bit version of the engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
|
If your CPU is NOT x86 compatible or you're running 64-bit version of the engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
|
||||||
This repository contains our fork of HLSDK and restored source code for some of the mods. Not all of them, of course.
|
This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
|
||||||
You still needed to copy `valve` directory as all game resources located there.
|
You still needed to copy `valve` directory as all game resources located there.
|
||||||
3) Run the main executable (`xash3d.exe` or AppImage).
|
3) Run the main executable (`xash3d.exe` or AppImage).
|
||||||
|
|
||||||
For additional info, run Xash3D with `-help` command line key.
|
For additional info, run Xash3D with `-help` command line key.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
* Before sending an issue, check if someone already reported your issue. Make sure you're following "How To Ask Questions The Smart Way" guide by Eric Steven Raymond. Read more: http://www.catb.org/~esr/faqs/smart-questions.html
|
* Before sending an issue, check if someone already reported your issue. Make sure you're following "How To Ask Questions The Smart Way" guide by Eric Steven Raymond. Read more: http://www.catb.org/~esr/faqs/smart-questions.html.
|
||||||
* Issues are accepted in both English and Russian
|
* Issues are accepted in both English and Russian.
|
||||||
* Before sending a PR, check if you followed our contribution guide in CONTRIBUTING.md file.
|
* Before sending a PR, check if you followed our contribution guide in CONTRIBUTING.md file.
|
||||||
|
|
||||||
## Build instructions
|
## Build instructions
|
||||||
We are using Waf build system. If you have some Waf-related questions, I recommend you to read https://waf.io/book/
|
We are using Waf build system. If you have some Waf-related questions, I recommend you to read [Waf Book](https://waf.io/book/).
|
||||||
|
|
||||||
NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
|
NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
If your CPU is x86 compatible and you're on Windows or Linux, we are building 32-bit code by default. This was done to maintain compatibility with Steam releases of Half-Life and based on it's engine games.
|
||||||
If your CPU is x86 compatible, we are building 32-bit code by default. This was done to maintain compatibility with Steam releases of Half-Life and based on it's engine games.
|
|
||||||
Even if Xash3D FWGS does support targetting 64-bit, you can't load games without recompiling them from source code!
|
Even if Xash3D FWGS does support targetting 64-bit, you can't load games without recompiling them from source code!
|
||||||
|
|
||||||
If your CPU is NOT x86 compatible or you decided build 64-bit version of engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
|
If your CPU is NOT x86 compatible or you decided build 64-bit version of engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
|
||||||
This repository contains our fork of HLSDK and restored source code for some of the mods. Not all of them, of course.
|
This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
|
||||||
|
|
||||||
#### Windows (Visual Studio)
|
#### Windows (Visual Studio)
|
||||||
* Install Visual Studio.
|
* Install Visual Studio.
|
||||||
@@ -62,31 +61,40 @@ This repository contains our fork of HLSDK and restored source code for some of
|
|||||||
|
|
||||||
#### GNU/Linux
|
#### GNU/Linux
|
||||||
##### Debian/Ubuntu
|
##### Debian/Ubuntu
|
||||||
* Enable i386 on your system, if you're compiling 32-bit engine on amd64. If not, skip this
|
* Only for 32-bit engine on 64-bit x86 operating system:
|
||||||
|
* Enable i386 on your system: `$ sudo dpkg --add-architecture i386`.
|
||||||
|
* Install `aptitude` ([why?](https://github.com/FWGS/xash3d-fwgs/issues/1828#issuecomment-2415131759)): `$ sudo apt update && sudo apt upgrade && sudo apt install aptitude`
|
||||||
|
* Install development tools: `$ sudo aptitude --without-recommends install git build-essential gcc-multilib g++-multilib libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype-dev:i386 libopus-dev:i386 libbz2-dev:i386`.
|
||||||
|
* Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig`.
|
||||||
|
|
||||||
`$ sudo dpkg --add-architecture i386`
|
* For 64-bit engine on 64-bit x86 and other non-x86 systems:
|
||||||
* Install development tools
|
* Install development tools: `$ sudo apt install git build-essential python libsdl2-dev libfontconfig-dev libfreetype6-dev libopus-dev libbz2-dev`.
|
||||||
* For 32-bit engine on amd64: \
|
|
||||||
`$ sudo apt install build-essential gcc-multilib g++-multilib python libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype6-dev:i386`
|
* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
|
||||||
* For everything else: \
|
|
||||||
`$ sudo apt install build-essential python libsdl2-dev libfontconfig-dev libfreetype6-dev`
|
##### RedHat/Fedora
|
||||||
* Clone this repostory:
|
* Only for 32-bit engine on 64-bit x86 operating system:
|
||||||
`$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`
|
* Install development tools: `$ sudo dnf install git gcc gcc-c++ glibc-devel.i686 SDL2-devel.i686 opus-devel.i686 fontconfig-devel.i686 freetype-devel.i686 bzip2-devel.i686`.
|
||||||
|
* Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig`.
|
||||||
|
|
||||||
|
* For 64-bit engine on 64-bit x86 and other non-x86 systems:
|
||||||
|
* Install development tools: `$ sudo dnf install git gcc gcc-c++ SDL2-devel opus-devel fontconfig-devel freetype-devel bzip2-devel`.
|
||||||
|
|
||||||
|
* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
#### Windows (Visual Studio)
|
#### Windows (Visual Studio)
|
||||||
0) Open command line
|
0) Open command line.
|
||||||
1) Navigate to `xash3d-fwgs` directory.
|
1) Navigate to `xash3d-fwgs` directory.
|
||||||
2) Carefully examine which build options are available: `waf --help`
|
2) (optional) Examine which build options are available: `waf --help`.
|
||||||
3) Configure build: `waf configure -T release --sdl2=c:/path/to/SDL2`
|
3) Configure build: `waf configure --sdl2=c:/path/to/SDL2`.
|
||||||
4) Compile: `waf build`
|
4) Compile: `waf build`.
|
||||||
5) Install: `waf install --destdir=c:/path/to/any/output/directory`
|
5) Install: `waf install --destdir=c:/path/to/any/output/directory`.
|
||||||
|
|
||||||
#### Linux
|
#### Linux
|
||||||
If compiling 32-bit on amd64, you may need to supply `export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig` prior to running configure.
|
If compiling 32-bit on amd64, make sure `PKG_CONFIG_PATH` from the previous step is set correctly, prior to running configure.
|
||||||
|
|
||||||
0) Examine which build options are available: `./waf --help`
|
0) (optional) Examine which build options are available: `./waf --help`.
|
||||||
1) Configure build: `./waf configure -T release`
|
1) Configure build: `./waf configure` (you need to pass `-8` to compile 64-bit engine on 64-bit x86 processor).
|
||||||
(You need to pass `-8` to compile 64-bit engine on 64-bit x86 processor)
|
2) Compile: `./waf build`.
|
||||||
2) Compile: `./waf build`
|
3) Install: `./waf install --destdir=/path/to/any/output/directory`.
|
||||||
3) Install(optional): `./waf install --destdir=/path/to/any/output/directory`
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
boneinfo.h - structure that send delta-compressed bones across network
|
|
||||||
Copyright (C) 2018 Uncle Mike
|
|
||||||
|
|
||||||
This program 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 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BONEINFO_H
|
|
||||||
#define BONEINFO_H
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vec3_t angles;
|
|
||||||
vec3_t origin;
|
|
||||||
} boneinfo_t;
|
|
||||||
|
|
||||||
#endif//BONEINFO_H
|
|
||||||
@@ -127,14 +127,23 @@ typedef struct
|
|||||||
int flags; // sky or slime, no lightmap or 256 subdivision
|
int flags; // sky or slime, no lightmap or 256 subdivision
|
||||||
} mtexinfo_t;
|
} mtexinfo_t;
|
||||||
|
|
||||||
typedef struct glpoly_s
|
// a1ba: changed size to avoid undefined behavior. Check your allocations if you take this header!
|
||||||
|
// For example:
|
||||||
|
// before: malloc( sizeof( glpoly_t ) + ( numverts - 4 ) * VERTEXSIZE * sizeof( float ))
|
||||||
|
// after (C): malloc( sizeof( glpoly_t ) + numverts * VERTEXSIZE * sizeof( float ))
|
||||||
|
// after (C++): malloc( sizeof( glpoly_t ) + ( numverts - 1 ) * VERTEXSIZE * sizeof( float ))
|
||||||
|
typedef struct glpoly2_s
|
||||||
{
|
{
|
||||||
struct glpoly_s *next;
|
struct glpoly2_s *next;
|
||||||
struct glpoly_s *chain;
|
struct glpoly2_s *chain;
|
||||||
int numverts;
|
int numverts;
|
||||||
int flags; // for SURF_UNDERWATER
|
int flags; // for SURF_UNDERWATER
|
||||||
float verts[4][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2)
|
#ifdef __cplusplus
|
||||||
} glpoly_t;
|
float verts[1][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2)
|
||||||
|
#else
|
||||||
|
float verts[][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2)
|
||||||
|
#endif
|
||||||
|
} glpoly2_t;
|
||||||
|
|
||||||
typedef struct mnode_s
|
typedef struct mnode_s
|
||||||
{
|
{
|
||||||
@@ -173,7 +182,7 @@ struct decal_s
|
|||||||
short entityIndex; // Entity this is attached to
|
short entityIndex; // Entity this is attached to
|
||||||
// Xash3D specific
|
// Xash3D specific
|
||||||
vec3_t position; // location of the decal center in world space.
|
vec3_t position; // location of the decal center in world space.
|
||||||
glpoly_t *polys; // precomputed decal vertices
|
glpoly2_t *polys; // precomputed decal vertices
|
||||||
intptr_t reserved[4]; // just for future expansions or mod-makers
|
intptr_t reserved[4]; // just for future expansions or mod-makers
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -246,7 +255,7 @@ struct msurface_s
|
|||||||
|
|
||||||
int light_s, light_t; // gl lightmap coordinates
|
int light_s, light_t; // gl lightmap coordinates
|
||||||
|
|
||||||
glpoly_t *polys; // multiple if warped
|
glpoly2_t *polys; // multiple if warped
|
||||||
struct msurface_s *texturechain;
|
struct msurface_s *texturechain;
|
||||||
|
|
||||||
mtexinfo_t *texinfo;
|
mtexinfo_t *texinfo;
|
||||||
@@ -488,7 +497,8 @@ typedef struct
|
|||||||
int flags;
|
int flags;
|
||||||
float size;
|
float size;
|
||||||
|
|
||||||
int reserved[8]; // VBO offsets
|
const trivertex_t **pposeverts; // only valid during loading, used to build GL mesh
|
||||||
|
intptr_t reserved[7]; // VBO offsets
|
||||||
|
|
||||||
int numposes;
|
int numposes;
|
||||||
int poseverts;
|
int poseverts;
|
||||||
@@ -531,17 +541,10 @@ typedef struct
|
|||||||
#define MAX_MOVIES 8
|
#define MAX_MOVIES 8
|
||||||
#define MAX_CDTRACKS 32
|
#define MAX_CDTRACKS 32
|
||||||
#define MAX_CLIENT_SPRITES 512 // SpriteTextures (0-256 hud, 256-512 client)
|
#define MAX_CLIENT_SPRITES 512 // SpriteTextures (0-256 hud, 256-512 client)
|
||||||
#define MAX_EFRAGS 8192 // Arcane Dimensions required
|
|
||||||
#define MAX_REQUESTS 64
|
#define MAX_REQUESTS 64
|
||||||
|
|
||||||
#if ! XASH_64BIT
|
STATIC_CHECK_SIZEOF( mextrasurf_t, 324, 496 );
|
||||||
STATIC_ASSERT( sizeof( mextrasurf_t ) == 324, "mextrasurf_t unexpected size" );
|
STATIC_CHECK_SIZEOF( decal_t, 60, 88 );
|
||||||
STATIC_ASSERT( sizeof( decal_t ) == 60, "decal_t unexpected size");
|
STATIC_CHECK_SIZEOF( mfaceinfo_t, 176, 304 );
|
||||||
STATIC_ASSERT( sizeof( mfaceinfo_t ) == 176, "mfaceinfo_t unexpected size");
|
|
||||||
#else
|
|
||||||
STATIC_ASSERT( sizeof( mextrasurf_t) == 496, "mextrasurf_t unexpected size");
|
|
||||||
STATIC_ASSERT( sizeof( decal_t ) == 88, "decal_t unexpected size");
|
|
||||||
STATIC_ASSERT( sizeof( mfaceinfo_t ) == 304, "mfaceinfo_t unexpected size");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif//COM_MODEL_H
|
#endif//COM_MODEL_H
|
||||||
|
|||||||
159
common/cvardef.h
159
common/cvardef.h
@@ -1,49 +1,122 @@
|
|||||||
/***
|
/*
|
||||||
*
|
cvardef.h - quake cvar definition
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
*
|
Copyright (C) 2024 Alibek Omarov
|
||||||
* This product contains software technology licensed from Id
|
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
|
||||||
* object code is restricted to non-commercial enhancements to products from
|
|
||||||
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
||||||
* without written permission from Valve LLC.
|
|
||||||
*
|
|
||||||
****/
|
|
||||||
#ifndef CVARDEF_H
|
|
||||||
#define CVARDEF_H
|
|
||||||
|
|
||||||
#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc
|
This program is free software; you can redistribute it and/or
|
||||||
#define FCVAR_USERINFO (1<<1) // changes the client's info string
|
modify it under the terms of the GNU General Public License
|
||||||
#define FCVAR_SERVER (1<<2) // notifies players when changed
|
as published by the Free Software Foundation; either version 2
|
||||||
#define FCVAR_EXTDLL (1<<3) // defined by external DLL
|
of the License, or (at your option) any later version.
|
||||||
#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll
|
|
||||||
#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value
|
|
||||||
#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server.
|
|
||||||
#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
|
|
||||||
#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
|
|
||||||
#define FCVAR_NOEXTRAWHITEPACE (1<<9) // strip trailing/leading white space from this cvar
|
|
||||||
#define FCVAR_PRIVILEGED (1<<10) // only available in privileged mode
|
|
||||||
#define FCVAR_FILTERABLE (1<<11) // filtered in unprivileged mode if cl_filterstuffcmd is 1
|
|
||||||
|
|
||||||
// Xash3D extensions
|
This program is distributed in the hope that it will be useful,
|
||||||
#define FCVAR_GLCONFIG (1<<12) // write it into <renderer>.cfg(see RefAPI)
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
#define FCVAR_CHANGED (1<<13) // set each time the cvar is changed
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
#define FCVAR_GAMEUIDLL (1<<14) // defined by the menu DLL
|
|
||||||
#define FCVAR_CHEAT (1<<15) // can not be changed if cheats are disabled
|
|
||||||
|
|
||||||
// a1ba: let's reuse higher bits for flags extensions from now on
|
See the GNU General Public License for more details.
|
||||||
#define FCVAR_LATCH (1<<30) // notify client what this cvar will be applied only after server restart (but don't does more nothing)
|
|
||||||
|
|
||||||
typedef struct cvar_s
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
#ifndef CVAR
|
||||||
|
#define CVAR
|
||||||
|
|
||||||
|
#include STDINT_H
|
||||||
|
#include "xash3d_types.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
cvar_t variables are used to hold scalar or string variables that can be changed
|
||||||
|
or displayed at the console or prog code as well as accessed directly
|
||||||
|
in C code.
|
||||||
|
|
||||||
|
The user can access cvars from the console in three ways:
|
||||||
|
r_draworder prints the current value
|
||||||
|
r_draworder 0 sets the current value to 0
|
||||||
|
set r_draworder 0 as above, but creates the cvar if not present
|
||||||
|
|
||||||
|
Cvars are restricted from having the same names as commands to keep this
|
||||||
|
interface from being ambiguous.
|
||||||
|
|
||||||
|
The are also occasionally used to communicated information between different
|
||||||
|
modules of the program.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum
|
||||||
{
|
{
|
||||||
char *name;
|
// GoldSrc compatibility flags
|
||||||
char *string;
|
FCVAR_ARCHIVE = 1 << 0, // set to cause it to be saved to vars.rc
|
||||||
int flags;
|
FCVAR_USERINFO = 1 << 1, // added to userinfo when changed
|
||||||
float value;
|
FCVAR_SERVER = 1 << 2, // added to serverinfo when changed, will notify clients by default
|
||||||
struct cvar_s *next;
|
FCVAR_EXTDLL = 1 << 3, // defined by server.dll
|
||||||
} cvar_t;
|
FCVAR_CLIENTDLL = 1 << 4, // defined by client.dll
|
||||||
|
FCVAR_PROTECTED = 1 << 5, // private server cvar
|
||||||
|
FCVAR_SPONLY = 1 << 6, // can be set only in singleplayer
|
||||||
|
FCVAR_PRINTABLEONLY = 1 << 7, // only allows printable characters
|
||||||
|
FCVAR_UNLOGGED = 1 << 8, // disables notifying client about server cvar change
|
||||||
|
FCVAR_NOEXTRAWHITESPACE = 1 << 9, // removes space characters from the beginning and the end of the string
|
||||||
|
FCVAR_PRIVILEGED = 1 << 10, // only available in privileged mode
|
||||||
|
FCVAR_FILTERABLE = 1 << 11, // treated as privileged if cl_filterstuffcmd is 1, otherwise ignored
|
||||||
|
|
||||||
#endif//CVARDEF_H
|
// Xash3D public flags
|
||||||
|
// FCVAR_LATCH = 1 << 11, // deprecated Xash3D flag, conflicts with FCVAR_FILTERABLE. Use another FCVAR_LATCH!
|
||||||
|
FCVAR_GLCONFIG = 1 << 12, // set to cause it to be saved to <renderer>.cfg (see RefAPI)
|
||||||
|
FCVAR_CHANGED = 1 << 13, // set each time the cvar changed
|
||||||
|
FCVAR_GAMEUIDLL = 1 << 14, // defined by menu.dll
|
||||||
|
FCVAR_CHEAT = 1 << 15, // cannot be changed if sv_cheats is 0
|
||||||
|
|
||||||
|
#if REF_DLL || ENGINE_DLL // Xash3D internal flags, MUST NOT be used outside of engine
|
||||||
|
FCVAR_RENDERINFO = 1 << 16, // set to cause it to be saved to video.cfg
|
||||||
|
FCVAR_READ_ONLY = 1 << 17, // display only, cannot be set by user at all
|
||||||
|
FCVAR_EXTENDED = 1 << 18, // extended cvar structure
|
||||||
|
FCVAR_ALLOCATED = 1 << 19, // allocated by the engine, must be freed with Mem_Free
|
||||||
|
FCVAR_VIDRESTART = 1 << 20, // triggers video subsystem to recreate/modify window parameters
|
||||||
|
FCVAR_TEMPORARY = 1 << 21, // only used to temporarly hold some value, can be unlinked
|
||||||
|
FCVAR_MOVEVARS = 1 << 22, // access to movevars_t structure, synchornized between client and server
|
||||||
|
FCVAR_USER_CREATED = 1 << 23, // created by a set command
|
||||||
|
|
||||||
|
FCVAR_REFDLL = 1 << 29, // (Xash3D FWGS internal flag) defined by the renderer DLL
|
||||||
|
#endif // REF_DLL || ENGINE_DLL
|
||||||
|
|
||||||
|
FCVAR_LATCH = 1 << 30, // (Xash3D FWGS public flag, was FCVAR_FILTERABLE in Xash3D) save changes until server restart
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cvar_s {
|
||||||
|
char *name;
|
||||||
|
char *string;
|
||||||
|
uint32_t flags;
|
||||||
|
float value;
|
||||||
|
struct cvar_s *next;
|
||||||
|
};
|
||||||
|
typedef struct cvar_s cvar_t;
|
||||||
|
|
||||||
|
STATIC_CHECK_SIZEOF( struct cvar_s, 20, 32 );
|
||||||
|
|
||||||
|
#if REF_DLL || ENGINE_DLL // Xash3D internal cvar format, MUST NOT be used outside of engine
|
||||||
|
struct convar_s {
|
||||||
|
char *name;
|
||||||
|
char *string;
|
||||||
|
uint32_t flags;
|
||||||
|
float value;
|
||||||
|
struct convar_s *next;
|
||||||
|
char *desc;
|
||||||
|
char *def_string;
|
||||||
|
};
|
||||||
|
typedef struct convar_s convar_t;
|
||||||
|
|
||||||
|
#if XASH_64BIT
|
||||||
|
#define CVAR_SENTINEL (uintptr_t)0xDEADBEEFDEADBEEF
|
||||||
|
#else
|
||||||
|
#define CVAR_SENTINEL (uintptr_t)0xDEADBEEF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CVAR_CHECK_SENTINEL( cv ) ((uintptr_t)(cv)->next == CVAR_SENTINEL)
|
||||||
|
|
||||||
|
#define CVAR_DEFINE( cv, cvname, cvstr, cvflags, cvdesc ) \
|
||||||
|
convar_t cv = { (char*)cvname, (char*)cvstr, cvflags, 0.0f, (void *)CVAR_SENTINEL, (char*)cvdesc, NULL }
|
||||||
|
|
||||||
|
#define CVAR_DEFINE_AUTO( cv, cvstr, cvflags, cvdesc ) CVAR_DEFINE( cv, #cv, cvstr, cvflags, cvdesc )
|
||||||
|
#endif // REF_DLL || ENGINE_DLL
|
||||||
|
|
||||||
|
#endif // CVAR
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
features.h - engine features that can be enabled by mod-maker request
|
enginefeatures.h - engine features that can be enabled by mod-maker request
|
||||||
Copyright (C) 2012 Uncle Mike
|
Copyright (C) 2012 Uncle Mike
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
@@ -27,6 +27,7 @@ GNU General Public License for more details.
|
|||||||
#define ENGINE_COMPUTE_STUDIO_LERP (1<<7) // enable MOVETYPE_STEP lerping back in engine
|
#define ENGINE_COMPUTE_STUDIO_LERP (1<<7) // enable MOVETYPE_STEP lerping back in engine
|
||||||
#define ENGINE_LINEAR_GAMMA_SPACE (1<<8) // disable influence of gamma/brightness cvars to textures/lightmaps, for mods with custom renderer
|
#define ENGINE_LINEAR_GAMMA_SPACE (1<<8) // disable influence of gamma/brightness cvars to textures/lightmaps, for mods with custom renderer
|
||||||
|
|
||||||
|
#define ENGINE_DISABLE_HDTEXTURES (1U<<30) // disable support of HD-textures in case custom renderer have separate way to load them
|
||||||
#define ENGINE_STEP_POSHISTORY_LERP (1U<<31) // enable MOVETYPE_STEP interpolation based on position history. Incompatible with ENGINE_COMPUTE_STUDIO_LERP!
|
#define ENGINE_STEP_POSHISTORY_LERP (1U<<31) // enable MOVETYPE_STEP interpolation based on position history. Incompatible with ENGINE_COMPUTE_STUDIO_LERP!
|
||||||
|
|
||||||
// adjust the mask when features will be added or removed
|
// adjust the mask when features will be added or removed
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ GAMEINFO stuff
|
|||||||
internal shared gameinfo structure (readonly for engine parts)
|
internal shared gameinfo structure (readonly for engine parts)
|
||||||
========================================================================
|
========================================================================
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct GAMEINFO_s
|
||||||
{
|
{
|
||||||
// filesystem info
|
// filesystem info
|
||||||
char gamefolder[64]; // used for change game '-game x'
|
char gamefolder[64]; // used for change game '-game x'
|
||||||
@@ -50,4 +50,48 @@ typedef struct
|
|||||||
int gamemode;
|
int gamemode;
|
||||||
} GAMEINFO;
|
} GAMEINFO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
Extended GameInfo struct introduced in Xash3D FWGS
|
||||||
|
|
||||||
|
GAMEINFO can't be reliably extended, as nor engine, nor menu can't be
|
||||||
|
sure about struct size. By adding struct versioning, we can check the
|
||||||
|
presense for extra fields.
|
||||||
|
========================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GAMEINFO_VERSION 2
|
||||||
|
|
||||||
|
typedef enum gametype_e
|
||||||
|
{
|
||||||
|
GAME_NORMAL,
|
||||||
|
GAME_SINGLEPLAYER_ONLY,
|
||||||
|
GAME_MULTIPLAYER_ONLY,
|
||||||
|
} gametype_t;
|
||||||
|
|
||||||
|
typedef struct gameinfo2_s
|
||||||
|
{
|
||||||
|
int gi_version; // should be set to desired struct version, e.g. GAMEINFO_VERSION
|
||||||
|
|
||||||
|
// filesystem info
|
||||||
|
char gamefolder[64]; // used for change game
|
||||||
|
char startmap[64]; // map to start singleplayer game from
|
||||||
|
char trainmap[64]; // map to start hazardous course from (if specified)
|
||||||
|
char demomap[64]; // map to start demo chapter from (if specified)
|
||||||
|
char title[64]; // game title
|
||||||
|
char iconpath[64]; // path to game icon
|
||||||
|
char version[16]; // game version (optional)
|
||||||
|
uint32_t flags; // gameinfo flags, extended to fit more flags
|
||||||
|
|
||||||
|
// mod info
|
||||||
|
char game_url[256]; // link to a developer's site
|
||||||
|
char update_url[256]; // link to updates page
|
||||||
|
char type[64]; // single, toolkit, multiplayer, etc
|
||||||
|
char date[64]; // release date
|
||||||
|
uint64_t size; // size in bytes
|
||||||
|
|
||||||
|
gametype_t gamemode;
|
||||||
|
} gameinfo2_t;
|
||||||
|
|
||||||
#endif//GAMEINFO_H
|
#endif//GAMEINFO_H
|
||||||
|
|||||||
@@ -30,6 +30,6 @@ typedef struct
|
|||||||
int state; // low bit is down state
|
int state; // low bit is down state
|
||||||
} kbutton_t;
|
} kbutton_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( kbutton_t ) == 12, "kbutton_t isn't 12 bytes!" );
|
STATIC_CHECK_SIZEOF( kbutton_t, 12, 12 );
|
||||||
|
|
||||||
#endif // KBUTTON_H
|
#endif // KBUTTON_H
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
// Set this flag for things like broadcast requests, etc. where the engine should not
|
// Set this flag for things like broadcast requests, etc. where the engine should not
|
||||||
// kill the request hook after receiving the first response
|
// kill the request hook after receiving the first response
|
||||||
#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 )
|
#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 )
|
||||||
|
#define FNETAPI_LEGACY_PROTOCOL ( 1<<1 ) // xash3d-fwgs extension
|
||||||
|
|
||||||
struct net_response_s;
|
struct net_response_s;
|
||||||
typedef void (*net_api_response_func_t) ( struct net_response_s *response );
|
typedef void (*net_api_response_func_t) ( struct net_response_s *response );
|
||||||
@@ -35,6 +36,7 @@ typedef void (*net_api_response_func_t) ( struct net_response_s *response );
|
|||||||
#define NET_ERROR_TIMEOUT ( 1<<0 )
|
#define NET_ERROR_TIMEOUT ( 1<<0 )
|
||||||
#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 )
|
#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 )
|
||||||
#define NET_ERROR_UNDEFINED ( 1<<2 )
|
#define NET_ERROR_UNDEFINED ( 1<<2 )
|
||||||
|
#define NET_ERROR_FORBIDDEN ( 1<<3 ) // xash3d-fwgs extension
|
||||||
|
|
||||||
typedef struct net_adrlist_s
|
typedef struct net_adrlist_s
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,6 +69,6 @@ typedef struct netadr_s
|
|||||||
} netadr_t;
|
} netadr_t;
|
||||||
#pragma pack( pop )
|
#pragma pack( pop )
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( netadr_t ) == 20, "netadr_t isn't 20 bytes!" );
|
STATIC_CHECK_SIZEOF( netadr_t, 20, 20 );
|
||||||
|
|
||||||
#endif // NET_ADR_H
|
#endif // NET_ADR_H
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ color24 gTracerColors[] =
|
|||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define TRACER_COLORINDEX_DEFAULT 4
|
||||||
|
|
||||||
// Temporary entity array
|
// Temporary entity array
|
||||||
#define TENTPRIORITY_LOW 0
|
#define TENTPRIORITY_LOW 0
|
||||||
#define TENTPRIORITY_HIGH 1
|
#define TENTPRIORITY_HIGH 1
|
||||||
|
|||||||
@@ -70,48 +70,64 @@ typedef uint64_t longtime_t;
|
|||||||
#define IsColorString( p ) ( p && *( p ) == '^' && *(( p ) + 1) && *(( p ) + 1) >= '0' && *(( p ) + 1 ) <= '9' )
|
#define IsColorString( p ) ( p && *( p ) == '^' && *(( p ) + 1) && *(( p ) + 1) >= '0' && *(( p ) + 1 ) <= '9' )
|
||||||
#define ColorIndex( c ) ((( c ) - '0' ) & 7 )
|
#define ColorIndex( c ) ((( c ) - '0' ) & 7 )
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined( __GNUC__ )
|
||||||
#ifdef __i386__
|
#if defined( __i386__ )
|
||||||
#define EXPORT __attribute__ ((visibility ("default"),force_align_arg_pointer))
|
#define EXPORT __attribute__(( visibility( "default" ), force_align_arg_pointer ))
|
||||||
#define GAME_EXPORT __attribute((force_align_arg_pointer))
|
#define GAME_EXPORT __attribute(( force_align_arg_pointer ))
|
||||||
#else
|
#else
|
||||||
#define EXPORT __attribute__ ((visibility ("default")))
|
#define EXPORT __attribute__(( visibility ( "default" )))
|
||||||
#define GAME_EXPORT
|
#define GAME_EXPORT
|
||||||
#endif
|
#endif
|
||||||
#define _format(x) __attribute__((format(printf, x, x+1)))
|
|
||||||
#define NORETURN __attribute__((noreturn))
|
#define MALLOC __attribute__(( malloc ))
|
||||||
#define NONNULL __attribute__((nonnull))
|
|
||||||
#define ALLOC_CHECK(x) __attribute__((alloc_size(x)))
|
// added in GCC 11
|
||||||
#elif defined(_MSC_VER)
|
#if __GNUC__ >= 11
|
||||||
#define EXPORT __declspec( dllexport )
|
// might want to set noclone due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116893
|
||||||
#define GAME_EXPORT
|
// but it's easier to not force mismatched-dealloc to error yet
|
||||||
#define _format(x)
|
#define MALLOC_LIKE( x, y ) __attribute__(( malloc( x, y )))
|
||||||
#define NORETURN
|
#else
|
||||||
#define NONNULL
|
#define MALLOC_LIKE( x, y ) MALLOC
|
||||||
#define ALLOC_CHECK(x)
|
#endif
|
||||||
|
#define NORETURN __attribute__(( noreturn ))
|
||||||
|
#define NONNULL __attribute__(( nonnull ))
|
||||||
|
#define _format( x ) __attribute__(( format( printf, x, x + 1 )))
|
||||||
|
#define ALLOC_CHECK( x ) __attribute__(( alloc_size( x )))
|
||||||
|
#define NO_ASAN __attribute__(( no_sanitize( "address" )))
|
||||||
|
#define WARN_UNUSED_RESULT __attribute__(( warn_unused_result ))
|
||||||
|
#define RENAME_SYMBOL( x ) asm( x )
|
||||||
#else
|
#else
|
||||||
#define EXPORT
|
#if defined( _MSC_VER )
|
||||||
|
#define EXPORT __declspec( dllexport )
|
||||||
|
#define NO_ASAN __declspec( no_sanitize_address )
|
||||||
|
#else
|
||||||
|
#define EXPORT
|
||||||
|
#define NO_ASAN
|
||||||
|
#endif
|
||||||
#define GAME_EXPORT
|
#define GAME_EXPORT
|
||||||
#define _format(x)
|
|
||||||
#define NORETURN
|
#define NORETURN
|
||||||
#define NONNULL
|
#define NONNULL
|
||||||
#define ALLOC_CHECK(x)
|
#define _format( x )
|
||||||
|
#define ALLOC_CHECK( x )
|
||||||
|
#define RENAME_SYMBOL( x )
|
||||||
|
#define MALLOC
|
||||||
|
#define MALLOC_LIKE( x, y )
|
||||||
|
#define WARN_UNUSED_RESULT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ( __GNUC__ >= 3 )
|
#if __GNUC__ >= 3
|
||||||
#define unlikely(x) __builtin_expect(x, 0)
|
#define unlikely( x ) __builtin_expect( x, 0 )
|
||||||
#define likely(x) __builtin_expect(x, 1)
|
#define likely( x ) __builtin_expect( x, 1 )
|
||||||
#elif defined( __has_builtin )
|
#elif defined( __has_builtin )
|
||||||
#if __has_builtin( __builtin_expect )
|
#if __has_builtin( __builtin_expect ) // this must be after defined() check
|
||||||
#define unlikely(x) __builtin_expect(x, 0)
|
#define unlikely( x ) __builtin_expect( x, 0 )
|
||||||
#define likely(x) __builtin_expect(x, 1)
|
#define likely( x ) __builtin_expect( x, 1 )
|
||||||
#else
|
|
||||||
#define unlikely(x) (x)
|
|
||||||
#define likely(x) (x)
|
|
||||||
#endif
|
#endif
|
||||||
#else
|
#endif
|
||||||
#define unlikely(x) (x)
|
|
||||||
#define likely(x) (x)
|
#if !defined( unlikely ) || !defined( likely )
|
||||||
|
#define unlikely( x ) ( x )
|
||||||
|
#define likely( x ) ( x )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __STDC_VERSION__ >= 202311L || __cplusplus >= 201103L // C23 or C++ static_assert is a keyword
|
#if __STDC_VERSION__ >= 202311L || __cplusplus >= 201103L // C23 or C++ static_assert is a keyword
|
||||||
@@ -128,6 +144,23 @@ typedef uint64_t longtime_t;
|
|||||||
#define STATIC_ASSERT( x, y ) STATIC_ASSERT_2( __LINE__, x, y )
|
#define STATIC_ASSERT( x, y ) STATIC_ASSERT_2( __LINE__, x, y )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// at least, statically check size of some public structures
|
||||||
|
#if XASH_64BIT
|
||||||
|
#define STATIC_CHECK_SIZEOF( type, size32, size64 ) \
|
||||||
|
STATIC_ASSERT( sizeof( type ) == size64, #type " unexpected size" )
|
||||||
|
#else
|
||||||
|
#define STATIC_CHECK_SIZEOF( type, size32, size64 ) \
|
||||||
|
STATIC_ASSERT( sizeof( type ) == size32, #type " unexpected size" )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined( __cplusplus ) && __STDC_VERSION__ >= 199101L // not C++ and C99 or newer
|
||||||
|
#define XASH_RESTRICT restrict
|
||||||
|
#elif _MSC_VER || __GNUC__ || __clang__ // compiler-specific extensions
|
||||||
|
#define XASH_RESTRICT __restrict
|
||||||
|
#else
|
||||||
|
#define XASH_RESTRICT // nothing
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef XASH_BIG_ENDIAN
|
#ifdef XASH_BIG_ENDIAN
|
||||||
#define LittleLong(x) (((int)(((x)&255)<<24)) + ((int)((((x)>>8)&255)<<16)) + ((int)(((x)>>16)&255)<<8) + (((x) >> 24)&255))
|
#define LittleLong(x) (((int)(((x)&255)<<24)) + ((int)((((x)>>8)&255)<<16)) + ((int)(((x)>>16)&255)<<8) + (((x) >> 24)&255))
|
||||||
#define LittleLongSW(x) (x = LittleLong(x) )
|
#define LittleLongSW(x) (x = LittleLong(x) )
|
||||||
@@ -158,8 +191,9 @@ _inline float LittleFloat( float f )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef unsigned int dword;
|
typedef unsigned int dword;
|
||||||
typedef unsigned int uint;
|
typedef unsigned int uint;
|
||||||
|
typedef unsigned long ulong;
|
||||||
typedef char string[MAX_STRING];
|
typedef char string[MAX_STRING];
|
||||||
typedef struct file_s file_t; // normal file
|
typedef struct file_s file_t; // normal file
|
||||||
typedef struct stream_s stream_t; // sound stream for background music playing
|
typedef struct stream_s stream_t; // sound stream for background music playing
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ typedef struct
|
|||||||
float size;
|
float size;
|
||||||
} daliashdr_t;
|
} daliashdr_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliashdr_t ) == 84, "invalid daliashdr_t size" );
|
STATIC_CHECK_SIZEOF( daliashdr_t, 84, 84 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -83,7 +83,7 @@ typedef struct
|
|||||||
int32_t t;
|
int32_t t;
|
||||||
} stvert_t;
|
} stvert_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( stvert_t ) == 12, "invalid stvert_t size" );
|
STATIC_CHECK_SIZEOF( stvert_t, 12, 12 );
|
||||||
|
|
||||||
typedef struct dtriangle_s
|
typedef struct dtriangle_s
|
||||||
{
|
{
|
||||||
@@ -91,7 +91,7 @@ typedef struct dtriangle_s
|
|||||||
int32_t vertindex[3];
|
int32_t vertindex[3];
|
||||||
} dtriangle_t;
|
} dtriangle_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( dtriangle_t ) == 16, "invalid dtriangle_t size" );
|
STATIC_CHECK_SIZEOF( dtriangle_t, 16, 16 );
|
||||||
|
|
||||||
#define DT_FACES_FRONT 0x0010
|
#define DT_FACES_FRONT 0x0010
|
||||||
#define ALIAS_ONSEAM 0x0020
|
#define ALIAS_ONSEAM 0x0020
|
||||||
@@ -103,7 +103,7 @@ typedef struct
|
|||||||
char name[16]; // frame name from grabbing
|
char name[16]; // frame name from grabbing
|
||||||
} daliasframe_t;
|
} daliasframe_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasframe_t ) == 24, "invalid daliasframe_t size" );
|
STATIC_CHECK_SIZEOF( daliasframe_t, 24, 24 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -112,41 +112,41 @@ typedef struct
|
|||||||
trivertex_t bboxmax; // lightnormal isn't used
|
trivertex_t bboxmax; // lightnormal isn't used
|
||||||
} daliasgroup_t;
|
} daliasgroup_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasgroup_t ) == 12, "invalid daliasgrou_t size" );
|
STATIC_CHECK_SIZEOF( daliasgroup_t, 12, 12 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int32_t numskins;
|
int32_t numskins;
|
||||||
} daliasskingroup_t;
|
} daliasskingroup_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasskingroup_t ) == 4, "invalid daliasskingroup_t size" );
|
STATIC_CHECK_SIZEOF( daliasskingroup_t, 4, 4 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float interval;
|
float interval;
|
||||||
} daliasinterval_t;
|
} daliasinterval_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasinterval_t ) == 4, "invalid daliasinterval_t size" );
|
STATIC_CHECK_SIZEOF( daliasinterval_t, 4, 4 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float interval;
|
float interval;
|
||||||
} daliasskininterval_t;
|
} daliasskininterval_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasskininterval_t ) == 4, "invalid daliasskininterval_t size" );
|
STATIC_CHECK_SIZEOF( daliasskininterval_t, 4, 4 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t type; // was aliasframetype_t
|
uint32_t type; // was aliasframetype_t
|
||||||
} daliasframetype_t;
|
} daliasframetype_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasframetype_t ) == 4, "invalid daliasframetype_t size" );
|
STATIC_CHECK_SIZEOF( daliasframetype_t, 4, 4 );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t type; // was aliasskintype_t
|
uint32_t type; // was aliasskintype_t
|
||||||
} daliasskintype_t;
|
} daliasskintype_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof( daliasskintype_t ) == 4, "invalid daliasskintype_t size" );
|
STATIC_CHECK_SIZEOF( daliasskintype_t, 4, 4 );
|
||||||
|
|
||||||
#endif//ALIAS_H
|
#endif//ALIAS_H
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ void CL_PlayCDTrack_f( void )
|
|||||||
if( paused ) Con_Printf( "Paused %s track %u\n", looped ? "looping" : "playing", track );
|
if( paused ) Con_Printf( "Paused %s track %u\n", looped ? "looping" : "playing", track );
|
||||||
else Con_Printf( "Currently %s track %u\n", looped ? "looping" : "playing", track );
|
else Con_Printf( "Currently %s track %u\n", looped ? "looping" : "playing", track );
|
||||||
}
|
}
|
||||||
Con_Printf( "Volume is %f\n", Cvar_VariableValue( "MP3Volume" ));
|
Con_Printf( "Volume is %f\n", s_musicvolume.value );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else Con_Printf( "%s: unknown command %s\n", Cmd_Argv( 0 ), command );
|
else Con_Printf( "%s: unknown command %s\n", Cmd_Argv( 0 ), command );
|
||||||
@@ -274,6 +274,13 @@ void CL_GenericShot_f( void )
|
|||||||
string checkname;
|
string checkname;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// allow overriding screenshot by users request
|
||||||
|
if( Cmd_Argc() > 1 )
|
||||||
|
{
|
||||||
|
Q_strncpy( cls.shotname, Cmd_Argv( 1 ), sizeof( cls.shotname ));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if( type == scrshot_snapshot )
|
if( type == scrshot_snapshot )
|
||||||
{
|
{
|
||||||
fmt = "../%s_%04d.png";
|
fmt = "../%s_%04d.png";
|
||||||
@@ -349,7 +356,7 @@ void CL_SetSky_f( void )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref.dllFuncs.R_SetupSky( Cmd_Argv( 1 ));
|
R_SetupSky( Cmd_Argv( 1 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ qboolean CL_CheckFile( sizebuf_t *msg, resource_t *pResource )
|
|||||||
|
|
||||||
if( !cl_allow_download.value )
|
if( !cl_allow_download.value )
|
||||||
{
|
{
|
||||||
Con_Reportf( "Download refused, cl_allow_download is 0\n" );
|
Con_Reportf( "Download refused, cl_allowdownload is 0\n" );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,17 +70,18 @@ qboolean CL_CheckFile( sizebuf_t *msg, resource_t *pResource )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( cl.downloadUrl[0] )
|
|
||||||
{
|
|
||||||
HTTP_AddDownload( filepath, pResource->nDownloadSize, true );
|
|
||||||
host.downloadcount++;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MSG_BeginClientCmd( msg, clc_stringcmd );
|
|
||||||
MSG_WriteStringf( msg, "dlfile %s", filepath );
|
|
||||||
host.downloadcount++;
|
host.downloadcount++;
|
||||||
|
|
||||||
|
if( cl.http_download )
|
||||||
|
{
|
||||||
|
HTTP_AddDownload( filepath, pResource->nDownloadSize, true, pResource );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MSG_BeginClientCmd( msg, clc_stringcmd );
|
||||||
|
MSG_WriteStringf( msg, "dlfile %s", filepath );
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ void CL_AddToResourceList( resource_t *pResource, resource_t *pList )
|
|||||||
void CL_RemoveFromResourceList( resource_t *pResource )
|
void CL_RemoveFromResourceList( resource_t *pResource )
|
||||||
{
|
{
|
||||||
if( pResource->pPrev == NULL || pResource->pNext == NULL )
|
if( pResource->pPrev == NULL || pResource->pNext == NULL )
|
||||||
Host_Error( "mislinked resource in CL_RemoveFromResourceList\n" );
|
Host_Error( "mislinked resource in %s\n", __func__ );
|
||||||
|
|
||||||
if( pResource->pNext == pResource || pResource->pPrev == pResource )
|
if( pResource->pNext == pResource || pResource->pPrev == pResource )
|
||||||
Host_Error( "attempt to free last entry in list.\n" );
|
Host_Error( "attempt to free last entry in list.\n" );
|
||||||
@@ -119,7 +120,7 @@ void CL_MoveToOnHandList( resource_t *pResource )
|
|||||||
{
|
{
|
||||||
if( !pResource )
|
if( !pResource )
|
||||||
{
|
{
|
||||||
Con_Reportf( "Null resource passed to CL_MoveToOnHandList\n" );
|
Con_Reportf( "Null resource passed to %s\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,29 @@ const char *CL_MsgInfo( int cmd )
|
|||||||
if( cmd >= 0 && cmd <= svc_lastmsg )
|
if( cmd >= 0 && cmd <= svc_lastmsg )
|
||||||
{
|
{
|
||||||
// get engine message name
|
// get engine message name
|
||||||
Q_strncpy( sz, svc_strings[cmd], sizeof( sz ));
|
const char *svc_string = NULL;
|
||||||
|
|
||||||
|
switch( cls.legacymode )
|
||||||
|
{
|
||||||
|
case PROTO_CURRENT:
|
||||||
|
svc_string = svc_strings[cmd];
|
||||||
|
break;
|
||||||
|
case PROTO_LEGACY:
|
||||||
|
svc_string = svc_legacy_strings[cmd];
|
||||||
|
break;
|
||||||
|
case PROTO_QUAKE:
|
||||||
|
svc_string = svc_quake_strings[cmd];
|
||||||
|
break;
|
||||||
|
case PROTO_GOLDSRC:
|
||||||
|
svc_string = svc_goldsrc_strings[cmd];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fall back to current protocol strings
|
||||||
|
if( !svc_string )
|
||||||
|
svc_string = svc_strings[cmd];
|
||||||
|
|
||||||
|
Q_strncpy( sz, svc_string, sizeof( sz ));
|
||||||
}
|
}
|
||||||
else if( cmd > svc_lastmsg && cmd <= ( svc_lastmsg + MAX_USER_MESSAGES ))
|
else if( cmd > svc_lastmsg && cmd <= ( svc_lastmsg + MAX_USER_MESSAGES ))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ GNU General Public License for more details.
|
|||||||
#define IDEMOHEADER (('M'<<24)+('E'<<16)+('D'<<8)+'I') // little-endian "IDEM"
|
#define IDEMOHEADER (('M'<<24)+('E'<<16)+('D'<<8)+'I') // little-endian "IDEM"
|
||||||
#define DEMO_PROTOCOL 3
|
#define DEMO_PROTOCOL 3
|
||||||
|
|
||||||
|
#define PROTOCOL_GOLDSRC_VERSION_DEMO (PROTOCOL_GOLDSRC_VERSION | (BIT( 7 ))) // should be 48, only to differentiate it from PROTOCOL_LEGACY_VERSION
|
||||||
|
|
||||||
const char *demo_cmd[dem_lastcmd+1] =
|
const char *demo_cmd[dem_lastcmd+1] =
|
||||||
{
|
{
|
||||||
"dem_unknown",
|
"dem_unknown",
|
||||||
@@ -79,7 +81,7 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
demoentry_t *entries; // track entry info
|
demoentry_t *entries; // track entry info
|
||||||
int numentries; // number of tracks
|
int32_t numentries; // number of tracks
|
||||||
} demodirectory_t;
|
} demodirectory_t;
|
||||||
|
|
||||||
// add angles
|
// add angles
|
||||||
@@ -109,6 +111,40 @@ struct
|
|||||||
|
|
||||||
static qboolean CL_NextDemo( void );
|
static qboolean CL_NextDemo( void );
|
||||||
|
|
||||||
|
static int CL_GetDemoNetProtocol( connprotocol_t proto )
|
||||||
|
{
|
||||||
|
switch( proto )
|
||||||
|
{
|
||||||
|
case PROTO_CURRENT:
|
||||||
|
return PROTOCOL_VERSION;
|
||||||
|
case PROTO_LEGACY:
|
||||||
|
return PROTOCOL_LEGACY_VERSION;
|
||||||
|
case PROTO_QUAKE:
|
||||||
|
return PROTOCOL_VERSION_QUAKE;
|
||||||
|
case PROTO_GOLDSRC:
|
||||||
|
return PROTOCOL_GOLDSRC_VERSION_DEMO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PROTOCOL_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static connprotocol_t CL_GetProtocolFromDemo( int net_protocol )
|
||||||
|
{
|
||||||
|
switch( net_protocol )
|
||||||
|
{
|
||||||
|
case PROTOCOL_VERSION:
|
||||||
|
return PROTO_CURRENT;
|
||||||
|
case PROTOCOL_LEGACY_VERSION:
|
||||||
|
return PROTO_LEGACY;
|
||||||
|
case PROTOCOL_VERSION_QUAKE:
|
||||||
|
return PROTO_QUAKE;
|
||||||
|
case PROTOCOL_GOLDSRC_VERSION_DEMO:
|
||||||
|
return PROTO_GOLDSRC;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PROTO_CURRENT;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
CL_StartupDemoHeader
|
CL_StartupDemoHeader
|
||||||
@@ -119,12 +155,8 @@ we record a demo on this level
|
|||||||
*/
|
*/
|
||||||
void CL_StartupDemoHeader( void )
|
void CL_StartupDemoHeader( void )
|
||||||
{
|
{
|
||||||
if( cls.demoheader )
|
CL_CloseDemoHeader();
|
||||||
{
|
|
||||||
FS_Close( cls.demoheader );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: this is replacing tmpfile()
|
|
||||||
cls.demoheader = FS_Open( "demoheader.tmp", "w+b", true );
|
cls.demoheader = FS_Open( "demoheader.tmp", "w+b", true );
|
||||||
|
|
||||||
if( !cls.demoheader )
|
if( !cls.demoheader )
|
||||||
@@ -253,7 +285,7 @@ void CL_WriteDemoUserCmd( int cmdnumber )
|
|||||||
|
|
||||||
// write usercmd_t
|
// write usercmd_t
|
||||||
MSG_Init( &buf, "UserCmd", data, sizeof( data ));
|
MSG_Init( &buf, "UserCmd", data, sizeof( data ));
|
||||||
CL_WriteUsercmd( &buf, -1, cmdnumber ); // always no delta
|
CL_WriteUsercmd( PROTO_CURRENT, &buf, -1, cmdnumber ); // always no delta, always in current protocol
|
||||||
|
|
||||||
bytes = MSG_GetNumBytesWritten( &buf );
|
bytes = MSG_GetNumBytesWritten( &buf );
|
||||||
|
|
||||||
@@ -297,10 +329,6 @@ void CL_WriteDemoMessage( qboolean startup, int start, sizebuf_t *msg )
|
|||||||
|
|
||||||
if( !file ) return;
|
if( !file ) return;
|
||||||
|
|
||||||
// past the start but not recording a demo.
|
|
||||||
if( !startup && !cls.demorecording )
|
|
||||||
return;
|
|
||||||
|
|
||||||
swlen = MSG_GetNumBytesWritten( msg ) - start;
|
swlen = MSG_GetNumBytesWritten( msg ) - start;
|
||||||
if( swlen <= 0 ) return;
|
if( swlen <= 0 ) return;
|
||||||
|
|
||||||
@@ -373,7 +401,7 @@ static void CL_WriteDemoHeader( const char *name )
|
|||||||
|
|
||||||
demo.header.id = IDEMOHEADER;
|
demo.header.id = IDEMOHEADER;
|
||||||
demo.header.dem_protocol = DEMO_PROTOCOL;
|
demo.header.dem_protocol = DEMO_PROTOCOL;
|
||||||
demo.header.net_protocol = cls.legacymode ? PROTOCOL_LEGACY_VERSION : PROTOCOL_VERSION;
|
demo.header.net_protocol = CL_GetDemoNetProtocol( cls.legacymode );
|
||||||
demo.header.host_fps = host_maxfps.value ? bound( MIN_FPS, host_maxfps.value, MAX_FPS ) : MAX_FPS;
|
demo.header.host_fps = host_maxfps.value ? bound( MIN_FPS, host_maxfps.value, MAX_FPS ) : MAX_FPS;
|
||||||
Q_strncpy( demo.header.mapname, clgame.mapname, sizeof( demo.header.mapname ));
|
Q_strncpy( demo.header.mapname, clgame.mapname, sizeof( demo.header.mapname ));
|
||||||
Q_strncpy( demo.header.comment, clgame.maptitle, sizeof( demo.header.comment ));
|
Q_strncpy( demo.header.comment, clgame.maptitle, sizeof( demo.header.comment ));
|
||||||
@@ -393,6 +421,7 @@ static void CL_WriteDemoHeader( const char *name )
|
|||||||
|
|
||||||
// finish off the startup info.
|
// finish off the startup info.
|
||||||
CL_WriteDemoCmdHeader( dem_stop, cls.demoheader );
|
CL_WriteDemoCmdHeader( dem_stop, cls.demoheader );
|
||||||
|
FS_Flush( cls.demoheader );
|
||||||
|
|
||||||
// now copy the stuff we cached from the server.
|
// now copy the stuff we cached from the server.
|
||||||
copysize = savepos = FS_Tell( cls.demoheader );
|
copysize = savepos = FS_Tell( cls.demoheader );
|
||||||
@@ -679,7 +708,7 @@ static void CL_DemoStartPlayback( int mode )
|
|||||||
|
|
||||||
demo.starttime = CL_GetDemoPlaybackClock(); // for determining whether to read another message
|
demo.starttime = CL_GetDemoPlaybackClock(); // for determining whether to read another message
|
||||||
|
|
||||||
Netchan_Setup( NS_CLIENT, &cls.netchan, net_from, Cvar_VariableInteger( "net_qport" ), NULL, CL_GetFragmentSize );
|
CL_SetupNetchanForProtocol( cls.legacymode );
|
||||||
|
|
||||||
memset( demo.cmds, 0, sizeof( demo.cmds ));
|
memset( demo.cmds, 0, sizeof( demo.cmds ));
|
||||||
demo.angle_position = 1;
|
demo.angle_position = 1;
|
||||||
@@ -1119,6 +1148,7 @@ show stats
|
|||||||
*/
|
*/
|
||||||
static void CL_FinishTimeDemo( void )
|
static void CL_FinishTimeDemo( void )
|
||||||
{
|
{
|
||||||
|
qboolean temp = host.allow_console;
|
||||||
int frames;
|
int frames;
|
||||||
double time;
|
double time;
|
||||||
|
|
||||||
@@ -1129,7 +1159,9 @@ static void CL_FinishTimeDemo( void )
|
|||||||
time = host.realtime - cls.td_starttime;
|
time = host.realtime - cls.td_starttime;
|
||||||
if( !time ) time = 1.0;
|
if( !time ) time = 1.0;
|
||||||
|
|
||||||
|
host.allow_console = true;
|
||||||
Con_Printf( "timedemo result: %i frames %5.3f seconds %5.3f fps\n", frames, time, frames / time );
|
Con_Printf( "timedemo result: %i frames %5.3f seconds %5.3f fps\n", frames, time, frames / time );
|
||||||
|
host.allow_console = temp;
|
||||||
|
|
||||||
if( Sys_CheckParm( "-timedemo" ))
|
if( Sys_CheckParm( "-timedemo" ))
|
||||||
CL_Quit_f();
|
CL_Quit_f();
|
||||||
@@ -1418,6 +1450,51 @@ void CL_Record_f( void )
|
|||||||
CL_WriteDemoHeader( demopath );
|
CL_WriteDemoHeader( demopath );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static qboolean CL_ParseDemoHeader( const char *callee, const char *filename, file_t *f, demoheader_t *hdr, int32_t *numentries )
|
||||||
|
{
|
||||||
|
if( FS_Read( f, hdr, sizeof( *hdr )) != sizeof( *hdr ) || hdr->id != IDEMOHEADER )
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: %s is not in supported format or not a demo file\n", callee, filename );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// force null terminate strings
|
||||||
|
hdr->mapname[sizeof( hdr->mapname ) - 1] = 0;
|
||||||
|
hdr->comment[sizeof( hdr->comment ) - 1] = 0;
|
||||||
|
hdr->gamedir[sizeof( hdr->gamedir ) - 1] = 0;
|
||||||
|
|
||||||
|
if( hdr->dem_protocol != DEMO_PROTOCOL )
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: demo protocol outdated (%i should be %i)\n",
|
||||||
|
callee, hdr->net_protocol, DEMO_PROTOCOL );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( hdr->net_protocol != PROTOCOL_VERSION && hdr->net_protocol != PROTOCOL_LEGACY_VERSION && hdr->net_protocol != PROTOCOL_GOLDSRC_VERSION_DEMO )
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: net protocol outdated (%i should be %i or %i)\n",
|
||||||
|
callee, hdr->net_protocol, PROTOCOL_VERSION, PROTOCOL_LEGACY_VERSION );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FS_Seek( f, hdr->directory_offset, SEEK_SET ) < 0
|
||||||
|
|| FS_Read( f, numentries, sizeof( *numentries )) != sizeof( *numentries ))
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: can't find directory offset in %s, demo file corrupted\n",
|
||||||
|
callee, filename );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(( *numentries < 1 ) || ( *numentries > 1024 ))
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: demo have bogus # of directory entries: %i\n",
|
||||||
|
callee, *numentries );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
CL_PlayDemo_f
|
CL_PlayDemo_f
|
||||||
@@ -1438,9 +1515,7 @@ void CL_PlayDemo_f( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( cls.demoplayback )
|
if( cls.demoplayback )
|
||||||
{
|
|
||||||
CL_StopPlayback();
|
CL_StopPlayback();
|
||||||
}
|
|
||||||
|
|
||||||
if( cls.demorecording )
|
if( cls.demorecording )
|
||||||
{
|
{
|
||||||
@@ -1490,51 +1565,32 @@ void CL_PlayDemo_f( void )
|
|||||||
|
|
||||||
if( neg ) cls.forcetrack = -cls.forcetrack;
|
if( neg ) cls.forcetrack = -cls.forcetrack;
|
||||||
CL_DemoStartPlayback( DEMO_QUAKE1 );
|
CL_DemoStartPlayback( DEMO_QUAKE1 );
|
||||||
|
cls.legacymode = PROTO_QUAKE;
|
||||||
return; // quake demo is started
|
return; // quake demo is started
|
||||||
}
|
}
|
||||||
|
|
||||||
// read in the demo header
|
// read in the demo header
|
||||||
FS_Read( cls.demofile, &demo.header, sizeof( demoheader_t ));
|
if( !CL_ParseDemoHeader( Cmd_Argv( 0 ), filename, cls.demofile, &demo.header, &demo.directory.numentries ))
|
||||||
|
|
||||||
if( demo.header.id != IDEMOHEADER )
|
|
||||||
{
|
{
|
||||||
Con_Printf( S_ERROR "%s is not a demo file\n", demoname );
|
|
||||||
CL_DemoAborted();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( demo.header.dem_protocol != DEMO_PROTOCOL )
|
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "playdemo: demo protocol outdated (%i should be %i)\n", demo.header.dem_protocol, DEMO_PROTOCOL );
|
|
||||||
CL_DemoAborted();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( demo.header.net_protocol != PROTOCOL_VERSION &&
|
|
||||||
demo.header.net_protocol != PROTOCOL_LEGACY_VERSION )
|
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "playdemo: net protocol outdated (%i should be %i)\n", demo.header.net_protocol, PROTOCOL_VERSION );
|
|
||||||
CL_DemoAborted();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// now read in the directory structure.
|
|
||||||
FS_Seek( cls.demofile, demo.header.directory_offset, SEEK_SET );
|
|
||||||
FS_Read( cls.demofile, &demo.directory.numentries, sizeof( int ));
|
|
||||||
|
|
||||||
if( demo.directory.numentries < 1 || demo.directory.numentries > 1024 )
|
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "demo had bogus # of directory entries: %i\n", demo.directory.numentries );
|
|
||||||
CL_DemoAborted();
|
CL_DemoAborted();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate demo entries
|
// allocate demo entries
|
||||||
demo.directory.entries = Mem_Malloc( cls.mempool, sizeof( demoentry_t ) * demo.directory.numentries );
|
demo.directory.entries = Mem_Malloc( cls.mempool, sizeof( *demo.directory.entries ) * demo.directory.numentries );
|
||||||
|
|
||||||
for( i = 0; i < demo.directory.numentries; i++ )
|
for( i = 0; i < demo.directory.numentries; i++ )
|
||||||
{
|
{
|
||||||
FS_Read( cls.demofile, &demo.directory.entries[i], sizeof( demoentry_t ));
|
demoentry_t *entry = &demo.directory.entries[i];
|
||||||
|
|
||||||
|
if( FS_Read( cls.demofile, entry, sizeof( *entry )) != sizeof( *entry ))
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "%s: demo entry %i of %s corrupted", Cmd_Argv( 0 ), i, filename );
|
||||||
|
CL_DemoAborted();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->description[sizeof( entry->description ) - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
demo.entryIndex = 0;
|
demo.entryIndex = 0;
|
||||||
@@ -1544,9 +1600,11 @@ void CL_PlayDemo_f( void )
|
|||||||
|
|
||||||
CL_DemoStartPlayback( DEMO_XASH3D );
|
CL_DemoStartPlayback( DEMO_XASH3D );
|
||||||
|
|
||||||
|
// must be after DemoStartPlayback, as CL_Disconnect_f resets the protocol
|
||||||
|
cls.legacymode = CL_GetProtocolFromDemo( demo.header.net_protocol );
|
||||||
|
|
||||||
// g-cont. is this need?
|
// g-cont. is this need?
|
||||||
Q_strncpy( cls.servername, demoname, sizeof( cls.servername ));
|
Q_strncpy( cls.servername, demoname, sizeof( cls.servername ));
|
||||||
cls.legacymode = demo.header.net_protocol == PROTOCOL_LEGACY_VERSION;
|
|
||||||
|
|
||||||
// begin a playback demo
|
// begin a playback demo
|
||||||
}
|
}
|
||||||
@@ -1588,7 +1646,7 @@ void CL_StartDemos_f( void )
|
|||||||
c = Cmd_Argc() - 1;
|
c = Cmd_Argc() - 1;
|
||||||
if( c > MAX_DEMOS )
|
if( c > MAX_DEMOS )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_WARN "Host_StartDemos: max %i demos in demoloop\n", MAX_DEMOS );
|
Con_DPrintf( S_WARN "%s: max %i demos in demoloop\n", __func__, MAX_DEMOS );
|
||||||
c = MAX_DEMOS;
|
c = MAX_DEMOS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1646,3 +1704,78 @@ void CL_Stop_f( void )
|
|||||||
S_StopBackgroundTrack();
|
S_StopBackgroundTrack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CL_ListDemo_f( void )
|
||||||
|
{
|
||||||
|
demoheader_t hdr;
|
||||||
|
int32_t num_entries;
|
||||||
|
file_t *f;
|
||||||
|
char filename[MAX_QPATH];
|
||||||
|
char demoname[MAX_QPATH];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( Cmd_Argc() < 2 )
|
||||||
|
{
|
||||||
|
Con_Printf( S_USAGE "%s <demoname>\n", Cmd_Argv( 0 ));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_strncpy( demoname, Cmd_Argv( 1 ), sizeof( demoname ));
|
||||||
|
COM_StripExtension( demoname );
|
||||||
|
Q_snprintf( filename, sizeof( filename ), "%s.dem", demoname );
|
||||||
|
|
||||||
|
f = FS_Open( filename, "rb", true );
|
||||||
|
if( !f )
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "couldn't open %s\n", filename );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !CL_ParseDemoHeader( Cmd_Argv( 0 ), filename, f, &hdr, &num_entries ))
|
||||||
|
{
|
||||||
|
FS_Close( f );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Con_Printf( "Demo contents for %s:\n"
|
||||||
|
"\tProtocol: %i net/%i demo\n"
|
||||||
|
"\tFPS: %g\n"
|
||||||
|
"\tMap: %s\n"
|
||||||
|
"\tComment: %s\n"
|
||||||
|
"\tGame: %s\n",
|
||||||
|
filename, hdr.net_protocol, hdr.dem_protocol, hdr.host_fps, hdr.mapname,
|
||||||
|
hdr.comment, hdr.gamedir );
|
||||||
|
|
||||||
|
for( i = 0; i < num_entries; i++ )
|
||||||
|
{
|
||||||
|
demoentry_t entry;
|
||||||
|
|
||||||
|
Con_Printf( "Demo entry #%i:\n", i );
|
||||||
|
|
||||||
|
if( FS_Read( f, &entry, sizeof( entry )) != sizeof( entry ))
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "can't read demo entry\n" );
|
||||||
|
FS_Close( f );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.description[sizeof( entry.description ) - 1] = 0;
|
||||||
|
|
||||||
|
if( entry.entrytype == DEMO_STARTUP )
|
||||||
|
{
|
||||||
|
// startup entries don't have anything useful
|
||||||
|
Con_Printf( "\tEntry type: " S_YELLOW "startup" S_DEFAULT "\n" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Con_Printf( "\tEntry type: " S_GREEN "normal" S_DEFAULT " (%i)\n"
|
||||||
|
"\tEntry playback time/frames: %.2f seconds/%i frames\n"
|
||||||
|
"\tEntry flags: 0x%x\n"
|
||||||
|
"\tEntry description: %s\n",
|
||||||
|
entry.entrytype, entry.playback_time, entry.playback_frames,
|
||||||
|
entry.flags, entry.description );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FS_Close( f );
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,10 +28,51 @@ GNU General Public License for more details.
|
|||||||
===============================================================================
|
===============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define NUM_EFRAGS_ALLOC 64 // alloc 64 efrags (1-2kb each alloc)
|
||||||
|
|
||||||
static efrag_t **lastlink;
|
static efrag_t **lastlink;
|
||||||
static mnode_t *r_pefragtopnode;
|
static mnode_t *r_pefragtopnode;
|
||||||
static vec3_t r_emins, r_emaxs;
|
static vec3_t r_emins, r_emaxs;
|
||||||
static cl_entity_t *r_addent;
|
static cl_entity_t *r_addent;
|
||||||
|
static int cl_efrags_num;
|
||||||
|
static efrag_t *cl_efrags;
|
||||||
|
|
||||||
|
static efrag_t *CL_AllocEfrags( int num )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
efrag_t *efrags;
|
||||||
|
|
||||||
|
if( !cl.worldmodel )
|
||||||
|
{
|
||||||
|
Host_Error( "%s: called with NULL world\n", __func__ );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( num == 0 )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// set world to be the owner, so it will get automatically cleaned up
|
||||||
|
efrags = Mem_Calloc( cl.worldmodel->mempool, sizeof( *efrags ) * num );
|
||||||
|
|
||||||
|
// initialize linked list
|
||||||
|
for( i = 0; i < num - 1; i++ )
|
||||||
|
efrags[i].entnext = &efrags[i + 1];
|
||||||
|
|
||||||
|
cl_efrags_num += num;
|
||||||
|
|
||||||
|
return efrags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
CL_ClearEfrags
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
void CL_ClearEfrags( void )
|
||||||
|
{
|
||||||
|
cl_efrags_num = 0;
|
||||||
|
cl_efrags = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===================
|
===================
|
||||||
@@ -56,14 +97,11 @@ static void R_SplitEntityOnNode( mnode_t *node )
|
|||||||
leaf = (mleaf_t *)node;
|
leaf = (mleaf_t *)node;
|
||||||
|
|
||||||
// grab an efrag off the free list
|
// grab an efrag off the free list
|
||||||
ef = clgame.free_efrags;
|
ef = cl_efrags;
|
||||||
if( !ef )
|
if( !ef )
|
||||||
{
|
ef = CL_AllocEfrags( NUM_EFRAGS_ALLOC );
|
||||||
Con_Printf( S_ERROR "too many efrags!\n" );
|
|
||||||
return; // no free fragments...
|
|
||||||
}
|
|
||||||
|
|
||||||
clgame.free_efrags = ef->entnext;
|
cl_efrags = ef->entnext;
|
||||||
ef->entity = r_addent;
|
ef->entity = r_addent;
|
||||||
|
|
||||||
// add the entity link
|
// add the entity link
|
||||||
@@ -133,35 +171,29 @@ R_StoreEfrags
|
|||||||
*/
|
*/
|
||||||
void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
||||||
{
|
{
|
||||||
cl_entity_t *pent;
|
efrag_t *pefrag;
|
||||||
model_t *clmodel;
|
cl_entity_t *pent;
|
||||||
efrag_t *pefrag;
|
model_t *clmodel;
|
||||||
|
|
||||||
while(( pefrag = *ppefrag ) != NULL )
|
while(( pefrag = *ppefrag ) != NULL )
|
||||||
{
|
{
|
||||||
pent = pefrag->entity;
|
pent = pefrag->entity;
|
||||||
clmodel = pent->model;
|
clmodel = pent->model;
|
||||||
|
|
||||||
switch( clmodel->type )
|
// how this could happen?
|
||||||
{
|
if( unlikely( clmodel->type < mod_brush || clmodel->type > mod_studio ))
|
||||||
case mod_alias:
|
continue;
|
||||||
case mod_brush:
|
|
||||||
case mod_studio:
|
|
||||||
case mod_sprite:
|
|
||||||
if( pent->visframe != framecount )
|
|
||||||
{
|
|
||||||
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
|
||||||
{
|
|
||||||
// mark that we've recorded this entity for this frame
|
|
||||||
pent->curstate.messagenum = cl.parsecount;
|
|
||||||
pent->visframe = framecount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ppefrag = &pefrag->leafnext;
|
if( pent->visframe != framecount )
|
||||||
break;
|
{
|
||||||
default:
|
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
||||||
break;
|
{
|
||||||
|
// mark that we've recorded this entity for this frame
|
||||||
|
pent->curstate.messagenum = cl.parsecount;
|
||||||
|
pent->visframe = framecount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ppefrag = &pefrag->leafnext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,13 +25,16 @@ static CVAR_DEFINE_AUTO( tracerspeed, "6000", 0, "tracer speed" );
|
|||||||
static CVAR_DEFINE_AUTO( tracerlength, "0.8", 0, "tracer length factor" );
|
static CVAR_DEFINE_AUTO( tracerlength, "0.8", 0, "tracer length factor" );
|
||||||
static CVAR_DEFINE_AUTO( traceroffset, "30", 0, "tracer starting offset" );
|
static CVAR_DEFINE_AUTO( traceroffset, "30", 0, "tracer starting offset" );
|
||||||
|
|
||||||
particle_t *cl_active_particles;
|
static particle_t *cl_active_particles;
|
||||||
particle_t *cl_active_tracers;
|
static particle_t *cl_active_tracers;
|
||||||
particle_t *cl_free_particles;
|
static particle_t *cl_free_particles;
|
||||||
particle_t *cl_particles = NULL; // particle pool
|
static particle_t *cl_particles = NULL; // particle pool
|
||||||
static vec3_t cl_avelocities[NUMVERTEXNORMALS];
|
static vec3_t cl_avelocities[NUMVERTEXNORMALS];
|
||||||
static float cl_lasttimewarn = 0.0f;
|
static float cl_lasttimewarn = 0.0f;
|
||||||
|
|
||||||
|
// expand debugging BBOX particle hulls by this many units.
|
||||||
|
#define BOX_GAP 0.0f
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
R_LookupColor
|
R_LookupColor
|
||||||
@@ -250,7 +253,7 @@ static particle_t *R_AllocTracer( const vec3_t org, const vec3_t vel, float life
|
|||||||
VectorCopy( vel, p->vel );
|
VectorCopy( vel, p->vel );
|
||||||
p->die = cl.time + life;
|
p->die = cl.time + life;
|
||||||
p->ramp = tracerlength.value;
|
p->ramp = tracerlength.value;
|
||||||
p->color = 4; // select custom color
|
p->color = TRACER_COLORINDEX_DEFAULT; // select custom color
|
||||||
p->packedColor = 255; // alpha
|
p->packedColor = 255; // alpha
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
@@ -262,9 +265,9 @@ VIEWBEAMS MANAGEMENT
|
|||||||
|
|
||||||
==============================================================
|
==============================================================
|
||||||
*/
|
*/
|
||||||
BEAM *cl_active_beams;
|
static BEAM *cl_active_beams;
|
||||||
BEAM *cl_free_beams;
|
static BEAM *cl_free_beams;
|
||||||
BEAM *cl_viewbeams = NULL; // beams pool
|
static BEAM *cl_viewbeams = NULL; // beams pool
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -636,12 +639,24 @@ and all particle trails (if this is a beamfollow)
|
|||||||
*/
|
*/
|
||||||
void GAME_EXPORT R_BeamKill( int deadEntity )
|
void GAME_EXPORT R_BeamKill( int deadEntity )
|
||||||
{
|
{
|
||||||
cl_entity_t *pDeadEntity;
|
BEAM *beam;
|
||||||
|
|
||||||
pDeadEntity = R_BeamGetEntity( deadEntity );
|
for( beam = cl_active_beams; beam; beam = beam->next )
|
||||||
if( !pDeadEntity ) return;
|
{
|
||||||
|
if( FBitSet( beam->flags, FBEAM_STARTENTITY ) && beam->startEntity == deadEntity )
|
||||||
|
{
|
||||||
|
if( beam->type != TE_BEAMFOLLOW )
|
||||||
|
beam->die = cl.time;
|
||||||
|
|
||||||
CL_KillDeadBeams( pDeadEntity );
|
ClearBits( beam->flags, FBEAM_STARTENTITY );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FBitSet( beam->flags, FBEAM_ENDENTITY ) && beam->endEntity == deadEntity )
|
||||||
|
{
|
||||||
|
beam->die = cl.time;
|
||||||
|
ClearBits( beam->flags, FBEAM_ENDENTITY );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1094,9 +1109,7 @@ void GAME_EXPORT R_ParticleExplosion2( const vec3_t org, int colorStart, int col
|
|||||||
int colorMod = 0, packedColor;
|
int colorMod = 0, packedColor;
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
|
|
||||||
if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE ))
|
packedColor = Host_IsQuakeCompatible( ) ? 255 : 0; // use old code for blob particles
|
||||||
packedColor = 255; // use old code for blob particles
|
|
||||||
else packedColor = 0;
|
|
||||||
|
|
||||||
for( i = 0; i < 512; i++ )
|
for( i = 0; i < 512; i++ )
|
||||||
{
|
{
|
||||||
@@ -1129,9 +1142,7 @@ void GAME_EXPORT R_BlobExplosion( const vec3_t org )
|
|||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i, j, packedColor;
|
int i, j, packedColor;
|
||||||
|
|
||||||
if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE ))
|
packedColor = Host_IsQuakeCompatible( ) ? 255 : 0; // use old code for blob particles
|
||||||
packedColor = 255; // use old code for blob particles
|
|
||||||
else packedColor = 0;
|
|
||||||
|
|
||||||
for( i = 0; i < 1024; i++ )
|
for( i = 0; i < 1024; i++ )
|
||||||
{
|
{
|
||||||
@@ -1593,6 +1604,73 @@ void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
PM_ParticleLine
|
||||||
|
|
||||||
|
draw line from particles
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
static void PM_ParticleLine( const vec3_t start, const vec3_t end, int pcolor, float life, float zvel )
|
||||||
|
{
|
||||||
|
float len, curdist;
|
||||||
|
vec3_t diff, pos;
|
||||||
|
|
||||||
|
// determine distance
|
||||||
|
VectorSubtract( end, start, diff );
|
||||||
|
len = VectorNormalizeLength( diff );
|
||||||
|
curdist = 0;
|
||||||
|
|
||||||
|
while( curdist <= len )
|
||||||
|
{
|
||||||
|
VectorMA( start, curdist, diff, pos );
|
||||||
|
CL_Particle( pos, pcolor, life, 0, zvel );
|
||||||
|
curdist += 2.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
PM_DrawRectangle
|
||||||
|
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
static void PM_DrawRectangle( const vec3_t tl, const vec3_t bl, const vec3_t tr, const vec3_t br, int pcolor, float life )
|
||||||
|
{
|
||||||
|
PM_ParticleLine( tl, bl, pcolor, life, 0 );
|
||||||
|
PM_ParticleLine( bl, br, pcolor, life, 0 );
|
||||||
|
PM_ParticleLine( br, tr, pcolor, life, 0 );
|
||||||
|
PM_ParticleLine( tr, tl, pcolor, life, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
PM_DrawBBox
|
||||||
|
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
static void PM_DrawBBox( const vec3_t mins, const vec3_t maxs, const vec3_t origin, int pcolor, float life )
|
||||||
|
{
|
||||||
|
vec3_t p[8], tmp;
|
||||||
|
float gap = BOX_GAP;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < 8; i++ )
|
||||||
|
{
|
||||||
|
tmp[0] = (i & 1) ? mins[0] - gap : maxs[0] + gap;
|
||||||
|
tmp[1] = (i & 2) ? mins[1] - gap : maxs[1] + gap ;
|
||||||
|
tmp[2] = (i & 4) ? mins[2] - gap : maxs[2] + gap ;
|
||||||
|
|
||||||
|
VectorAdd( tmp, origin, tmp );
|
||||||
|
VectorCopy( tmp, p[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i = 0; i < 6; i++ )
|
||||||
|
{
|
||||||
|
PM_DrawRectangle( p[boxpnt[i][1]], p[boxpnt[i][0]], p[boxpnt[i][2]], p[boxpnt[i][3]], pcolor, life );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
R_ParticleLine
|
R_ParticleLine
|
||||||
@@ -1756,25 +1834,6 @@ void GAME_EXPORT R_StreakSplash( const vec3_t pos, const vec3_t dir, int color,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
===============
|
|
||||||
R_DebugParticle
|
|
||||||
|
|
||||||
just for debug purposes
|
|
||||||
===============
|
|
||||||
*/
|
|
||||||
void R_DebugParticle( const vec3_t pos, byte r, byte g, byte b )
|
|
||||||
{
|
|
||||||
particle_t *p;
|
|
||||||
|
|
||||||
p = R_AllocParticle( NULL );
|
|
||||||
if( !p ) return;
|
|
||||||
|
|
||||||
VectorCopy( pos, p->org );
|
|
||||||
p->color = R_LookupColor( r, g, b );
|
|
||||||
p->die = cl.time + 0.01f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============
|
===============
|
||||||
CL_Particle
|
CL_Particle
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ void CL_RegisterEvent( int lastnum, const char *szEvName, pfnEventHook func )
|
|||||||
ev = clgame.events[lastnum];
|
ev = clgame.events[lastnum];
|
||||||
|
|
||||||
// NOTE: ev->index will be set later
|
// NOTE: ev->index will be set later
|
||||||
Q_strncpy( ev->name, szEvName, MAX_QPATH );
|
Q_strncpy( ev->name, szEvName, sizeof( ev->name ));
|
||||||
ev->func = func;
|
ev->func = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ static qboolean CL_FireEvent( event_info_t *ei, int slot )
|
|||||||
if( !ev )
|
if( !ev )
|
||||||
{
|
{
|
||||||
idx = bound( 1, ei->index, ( MAX_EVENTS - 1 ));
|
idx = bound( 1, ei->index, ( MAX_EVENTS - 1 ));
|
||||||
Con_Reportf( S_ERROR "CL_FireEvent: %s not precached\n", cl.event_precache[idx] );
|
Con_Reportf( S_ERROR "%s: %s not precached\n", __func__, cl.event_precache[idx] );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ static qboolean CL_FireEvent( event_info_t *ei, int slot )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Con_Reportf( S_ERROR "CL_FireEvent: %s not hooked\n", name );
|
Con_Reportf( S_ERROR "%s: %s not hooked\n", __func__, name );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -380,7 +380,7 @@ CL_ParseReliableEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_ParseReliableEvent( sizebuf_t *msg )
|
void CL_ParseReliableEvent( sizebuf_t *msg, connprotocol_t proto )
|
||||||
{
|
{
|
||||||
int event_index;
|
int event_index;
|
||||||
event_args_t nullargs, args;
|
event_args_t nullargs, args;
|
||||||
@@ -390,11 +390,19 @@ void CL_ParseReliableEvent( sizebuf_t *msg )
|
|||||||
|
|
||||||
event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
||||||
|
|
||||||
if( MSG_ReadOneBit( msg ))
|
|
||||||
delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f);
|
|
||||||
|
|
||||||
// reliable events not use delta-compression just null-compression
|
// reliable events not use delta-compression just null-compression
|
||||||
MSG_ReadDeltaEvent( msg, &nullargs, &args );
|
if( proto == PROTO_GOLDSRC )
|
||||||
|
{
|
||||||
|
Delta_ReadGSFields( msg, DT_EVENT_T, &nullargs, &args, 0.0f );
|
||||||
|
if( MSG_ReadOneBit( msg ))
|
||||||
|
delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( MSG_ReadOneBit( msg ))
|
||||||
|
delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f);
|
||||||
|
MSG_ReadDeltaEvent( msg, &nullargs, &args );
|
||||||
|
}
|
||||||
|
|
||||||
if( args.entindex > 0 && args.entindex <= cl.maxclients )
|
if( args.entindex > 0 && args.entindex <= cl.maxclients )
|
||||||
args.angles[PITCH] *= -3.0f;
|
args.angles[PITCH] *= -3.0f;
|
||||||
@@ -409,33 +417,42 @@ CL_ParseEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_ParseEvent( sizebuf_t *msg )
|
void CL_ParseEvent( sizebuf_t *msg, connprotocol_t proto )
|
||||||
{
|
{
|
||||||
int event_index;
|
int event_index;
|
||||||
int i, num_events;
|
int i, num_events;
|
||||||
int packet_index;
|
int packet_index;
|
||||||
event_args_t nullargs, args;
|
const event_args_t nullargs = { 0 };
|
||||||
|
event_args_t args = { 0 };
|
||||||
entity_state_t *state;
|
entity_state_t *state;
|
||||||
float delay;
|
float delay;
|
||||||
|
int entity_bits;
|
||||||
memset( &nullargs, 0, sizeof( nullargs ));
|
|
||||||
memset( &args, 0, sizeof( args ));
|
|
||||||
|
|
||||||
num_events = MSG_ReadUBitLong( msg, 5 );
|
num_events = MSG_ReadUBitLong( msg, 5 );
|
||||||
|
|
||||||
|
if( proto == PROTO_GOLDSRC )
|
||||||
|
entity_bits = MAX_GOLDSRC_ENTITY_BITS;
|
||||||
|
else if( proto == PROTO_LEGACY )
|
||||||
|
entity_bits = MAX_LEGACY_ENTITY_BITS;
|
||||||
|
else entity_bits = MAX_ENTITY_BITS;
|
||||||
|
|
||||||
// parse events queue
|
// parse events queue
|
||||||
for( i = 0 ; i < num_events; i++ )
|
for( i = 0 ; i < num_events; i++ )
|
||||||
{
|
{
|
||||||
event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
||||||
|
|
||||||
if( MSG_ReadOneBit( msg ))
|
|
||||||
packet_index = MSG_ReadUBitLong( msg, cls.legacymode ? MAX_LEGACY_ENTITY_BITS : MAX_ENTITY_BITS );
|
|
||||||
else packet_index = -1;
|
|
||||||
|
|
||||||
if( MSG_ReadOneBit( msg ))
|
if( MSG_ReadOneBit( msg ))
|
||||||
{
|
{
|
||||||
MSG_ReadDeltaEvent( msg, &nullargs, &args );
|
packet_index = MSG_ReadUBitLong( msg, entity_bits );
|
||||||
|
|
||||||
|
if( MSG_ReadOneBit( msg ))
|
||||||
|
{
|
||||||
|
if( proto == PROTO_GOLDSRC )
|
||||||
|
Delta_ReadGSFields( msg, DT_EVENT_T, &nullargs, &args, 0.0f );
|
||||||
|
else MSG_ReadDeltaEvent( msg, &nullargs, &args );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else packet_index = -1;
|
||||||
|
|
||||||
if( MSG_ReadOneBit( msg ))
|
if( MSG_ReadOneBit( msg ))
|
||||||
delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f);
|
delay = (float)MSG_ReadWord( msg ) * (1.0f / 100.0f);
|
||||||
@@ -497,14 +514,14 @@ void GAME_EXPORT CL_PlaybackEvent( int flags, const edict_t *pInvoker, word even
|
|||||||
// first check event for out of bounds
|
// first check event for out of bounds
|
||||||
if( eventindex < 1 || eventindex >= MAX_EVENTS )
|
if( eventindex < 1 || eventindex >= MAX_EVENTS )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "CL_PlaybackEvent: invalid eventindex %i\n", eventindex );
|
Con_DPrintf( S_ERROR "%s: invalid eventindex %i\n", __func__, eventindex );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check event for precached
|
// check event for precached
|
||||||
if( !CL_EventIndex( cl.event_precache[eventindex] ))
|
if( !CL_EventIndex( cl.event_precache[eventindex] ))
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "CL_PlaybackEvent: event %i was not precached\n", eventindex );
|
Con_DPrintf( S_ERROR "%s: event %i was not precached\n", __func__, eventindex );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,8 +95,7 @@ static void CL_ResetPositions( cl_entity_t *ent )
|
|||||||
ent->current_position = 1;
|
ent->current_position = 1;
|
||||||
|
|
||||||
memset( ent->ph, 0, sizeof( position_history_t ) * HISTORY_MAX );
|
memset( ent->ph, 0, sizeof( position_history_t ) * HISTORY_MAX );
|
||||||
memcpy( &ent->ph[1], &store, sizeof( position_history_t ));
|
ent->ph[1] = ent->ph[0] = store;
|
||||||
memcpy( &ent->ph[0], &store, sizeof( position_history_t ));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -175,7 +174,7 @@ static qboolean CL_EntityCustomLerp( cl_entity_t *e )
|
|||||||
// INTERPOLATION IN GRAVGUNMOD COOP
|
// INTERPOLATION IN GRAVGUNMOD COOP
|
||||||
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
||||||
case MOVETYPE_TOSS:
|
case MOVETYPE_TOSS:
|
||||||
if( cls.legacymode && e->model && e->model->type == mod_studio )
|
if( cls.legacymode == PROTO_LEGACY && e->model && e->model->type == mod_studio )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,9 +669,9 @@ FRAME PARSING
|
|||||||
|
|
||||||
=========================================================================
|
=========================================================================
|
||||||
*/
|
*/
|
||||||
static qboolean CL_ParseEntityNumFromPacket( sizebuf_t *msg, int *newnum )
|
static qboolean CL_ParseEntityNumFromPacket( sizebuf_t *msg, int *newnum, connprotocol_t proto )
|
||||||
{
|
{
|
||||||
if( cls.legacymode )
|
if( proto == PROTO_LEGACY )
|
||||||
{
|
{
|
||||||
*newnum = MSG_ReadWord( msg );
|
*newnum = MSG_ReadWord( msg );
|
||||||
if( *newnum == 0 )
|
if( *newnum == 0 )
|
||||||
@@ -695,7 +694,7 @@ CL_FlushEntityPacket
|
|||||||
Read and ignore whole entity packet.
|
Read and ignore whole entity packet.
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static void CL_FlushEntityPacket( sizebuf_t *msg )
|
static void CL_FlushEntityPacket( sizebuf_t *msg, connprotocol_t proto )
|
||||||
{
|
{
|
||||||
int newnum;
|
int newnum;
|
||||||
entity_state_t from, to;
|
entity_state_t from, to;
|
||||||
@@ -708,16 +707,57 @@ static void CL_FlushEntityPacket( sizebuf_t *msg )
|
|||||||
// read it all, but ignore it
|
// read it all, but ignore it
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
if( !CL_ParseEntityNumFromPacket( msg, &newnum ))
|
if( !CL_ParseEntityNumFromPacket( msg, &newnum, proto ))
|
||||||
break; // done
|
break; // done
|
||||||
|
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
Host_Error( "CL_FlushEntityPacket: overflow\n" );
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
|
|
||||||
MSG_ReadDeltaEntity( msg, &from, &to, newnum, CL_IsPlayerIndex( newnum ) ? DELTA_PLAYER : DELTA_ENTITY, cl.mtime[0] );
|
MSG_ReadDeltaEntity( msg, &from, &to, newnum, CL_IsPlayerIndex( newnum ) ? DELTA_PLAYER : DELTA_ENTITY, cl.mtime[0] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean CL_ValidateDeltaPacket( uint oldpacket, frame_t *oldframe )
|
||||||
|
{
|
||||||
|
int subtracted = ( cls.netchan.incoming_sequence - oldpacket ) & 0xFF;
|
||||||
|
|
||||||
|
if( subtracted == 0 )
|
||||||
|
{
|
||||||
|
Con_NPrintf( 2, "^3Warning:^1 update too old\n^7\n" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( subtracted >= CL_UPDATE_MASK )
|
||||||
|
{
|
||||||
|
// we can't use this, it is too old
|
||||||
|
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(( cls.next_client_entities - oldframe->first_entity ) > ( cls.num_client_entities - NUM_PACKET_ENTITIES ))
|
||||||
|
{
|
||||||
|
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CL_UpdateOldEntNum( int oldindex, frame_t *oldframe, entity_state_t **oldent )
|
||||||
|
{
|
||||||
|
if( !oldframe )
|
||||||
|
{
|
||||||
|
*oldent = NULL;
|
||||||
|
return MAX_ENTNUMBER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( oldindex >= oldframe->num_entities )
|
||||||
|
return MAX_ENTNUMBER;
|
||||||
|
|
||||||
|
*oldent = &cls.packet_entities[(oldframe->first_entity + oldindex) % cls.num_client_entities];
|
||||||
|
return (*oldent)->number;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
CL_DeltaEntity
|
CL_DeltaEntity
|
||||||
@@ -740,7 +780,7 @@ static void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_s
|
|||||||
|
|
||||||
if(( newnum < 0 ) || ( newnum >= clgame.maxEntities ))
|
if(( newnum < 0 ) || ( newnum >= clgame.maxEntities ))
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "CL_DeltaEntity: invalid newnum: %d\n", newnum );
|
Con_DPrintf( S_ERROR "%s: invalid newnum: %d\n", __func__, newnum );
|
||||||
if( has_update )
|
if( has_update )
|
||||||
MSG_ReadDeltaEntity( msg, old, state, newnum, delta_type, cl.mtime[0] );
|
MSG_ReadDeltaEntity( msg, old, state, newnum, delta_type, cl.mtime[0] );
|
||||||
return;
|
return;
|
||||||
@@ -752,7 +792,7 @@ static void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_s
|
|||||||
|
|
||||||
if( has_update )
|
if( has_update )
|
||||||
alive = MSG_ReadDeltaEntity( msg, old, state, newnum, delta_type, cl.mtime[0] );
|
alive = MSG_ReadDeltaEntity( msg, old, state, newnum, delta_type, cl.mtime[0] );
|
||||||
else memcpy( state, old, sizeof( entity_state_t ));
|
else *state = *old;
|
||||||
|
|
||||||
if( !alive )
|
if( !alive )
|
||||||
{
|
{
|
||||||
@@ -788,7 +828,7 @@ An svc_packetentities has just been parsed, deal with the
|
|||||||
rest of the data stream.
|
rest of the data stream.
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta, connprotocol_t proto )
|
||||||
{
|
{
|
||||||
frame_t *newframe, *oldframe;
|
frame_t *newframe, *oldframe;
|
||||||
int oldindex, newnum, oldnum;
|
int oldindex, newnum, oldnum;
|
||||||
@@ -804,7 +844,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
CL_WriteDemoJumpTime();
|
CL_WriteDemoJumpTime();
|
||||||
|
|
||||||
// sentinel count. save it for debug checking
|
// sentinel count. save it for debug checking
|
||||||
if( cls.legacymode )
|
if( proto == PROTO_LEGACY )
|
||||||
count = MSG_ReadWord( msg );
|
count = MSG_ReadWord( msg );
|
||||||
else count = MSG_ReadUBitLong( msg, MAX_VISIBLE_PACKET_BITS ) + 1;
|
else count = MSG_ReadUBitLong( msg, MAX_VISIBLE_PACKET_BITS ) + 1;
|
||||||
|
|
||||||
@@ -818,32 +858,12 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
|
|
||||||
if( delta )
|
if( delta )
|
||||||
{
|
{
|
||||||
int subtracted;
|
uint oldpacket = MSG_ReadByte( msg );
|
||||||
|
|
||||||
oldpacket = MSG_ReadByte( msg );
|
|
||||||
subtracted = ( cls.netchan.incoming_sequence - oldpacket ) & 0xFF;
|
|
||||||
|
|
||||||
if( subtracted == 0 )
|
|
||||||
{
|
|
||||||
Con_NPrintf( 2, "^3Warning:^1 update too old\n^7\n" );
|
|
||||||
CL_FlushEntityPacket( msg );
|
|
||||||
return playerbytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( subtracted >= CL_UPDATE_MASK )
|
|
||||||
{
|
|
||||||
// we can't use this, it is too old
|
|
||||||
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
|
||||||
CL_FlushEntityPacket( msg );
|
|
||||||
return playerbytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldframe = &cl.frames[oldpacket & CL_UPDATE_MASK];
|
oldframe = &cl.frames[oldpacket & CL_UPDATE_MASK];
|
||||||
|
|
||||||
if(( cls.next_client_entities - oldframe->first_entity ) > ( cls.num_client_entities - NUM_PACKET_ENTITIES ))
|
if( !CL_ValidateDeltaPacket( oldpacket, oldframe ))
|
||||||
{
|
{
|
||||||
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
CL_FlushEntityPacket( msg, proto );
|
||||||
CL_FlushEntityPacket( msg );
|
|
||||||
return playerbytes;
|
return playerbytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -861,31 +881,15 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
|
|
||||||
oldent = NULL;
|
oldent = NULL;
|
||||||
oldindex = 0;
|
oldindex = 0;
|
||||||
|
oldnum = CL_UpdateOldEntNum( oldindex, oldframe, &oldent );
|
||||||
if( !oldframe )
|
|
||||||
{
|
|
||||||
oldnum = MAX_ENTNUMBER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( oldindex >= oldframe->num_entities )
|
|
||||||
{
|
|
||||||
oldnum = MAX_ENTNUMBER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oldent = &cls.packet_entities[(oldframe->first_entity+oldindex) % cls.num_client_entities];
|
|
||||||
oldnum = oldent->number;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
if( !CL_ParseEntityNumFromPacket( msg, &newnum ))
|
if( !CL_ParseEntityNumFromPacket( msg, &newnum, proto ))
|
||||||
break; // done
|
break; // done
|
||||||
|
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
Host_Error( "CL_ParsePacketEntities: overflow\n" );
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
|
|
||||||
player = CL_IsPlayerIndex( newnum );
|
player = CL_IsPlayerIndex( newnum );
|
||||||
|
|
||||||
@@ -893,17 +897,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
{
|
{
|
||||||
// one or more entities from the old packet are unchanged
|
// one or more entities from the old packet are unchanged
|
||||||
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
||||||
oldindex++;
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
|
||||||
if( oldindex >= oldframe->num_entities )
|
|
||||||
{
|
|
||||||
oldnum = MAX_ENTNUMBER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oldent = &cls.packet_entities[(oldframe->first_entity+oldindex) % cls.num_client_entities];
|
|
||||||
oldnum = oldent->number;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( oldnum == newnum )
|
if( oldnum == newnum )
|
||||||
@@ -912,17 +906,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
bufStart = MSG_GetNumBytesRead( msg );
|
bufStart = MSG_GetNumBytesRead( msg );
|
||||||
CL_DeltaEntity( msg, newframe, newnum, oldent, true );
|
CL_DeltaEntity( msg, newframe, newnum, oldent, true );
|
||||||
if( player ) playerbytes += MSG_GetNumBytesRead( msg ) - bufStart;
|
if( player ) playerbytes += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
oldindex++;
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
|
||||||
if( oldindex >= oldframe->num_entities )
|
|
||||||
{
|
|
||||||
oldnum = MAX_ENTNUMBER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oldent = &cls.packet_entities[(oldframe->first_entity+oldindex) % cls.num_client_entities];
|
|
||||||
oldnum = oldent->number;
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -941,21 +925,11 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
{
|
{
|
||||||
// one or more entities from the old packet are unchanged
|
// one or more entities from the old packet are unchanged
|
||||||
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
||||||
oldindex++;
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
|
||||||
if( oldindex >= oldframe->num_entities )
|
|
||||||
{
|
|
||||||
oldnum = MAX_ENTNUMBER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oldent = &cls.packet_entities[(oldframe->first_entity+oldindex) % cls.num_client_entities];
|
|
||||||
oldnum = oldent->number;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( newframe->num_entities != count && newframe->num_entities != 0 )
|
if( newframe->num_entities != count && newframe->num_entities != 0 )
|
||||||
Con_Reportf( S_WARN "CL_Parse%sPacketEntities: (%i should be %i)\n", delta ? "Delta" : "", newframe->num_entities, count );
|
Con_Reportf( S_WARN "%s%s: (%i should be %i)\n", __func__, delta ? "Delta" : "", newframe->num_entities, count );
|
||||||
|
|
||||||
if( !newframe->valid )
|
if( !newframe->valid )
|
||||||
return playerbytes; // frame is not valid but message was parsed
|
return playerbytes; // frame is not valid but message was parsed
|
||||||
@@ -973,7 +947,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
cls.signon = SIGNONS;
|
cls.signon = SIGNONS;
|
||||||
|
|
||||||
// Clear loading plaque.
|
// Clear loading plaque.
|
||||||
CL_SignonReply ();
|
CL_SignonReply( proto );
|
||||||
}
|
}
|
||||||
|
|
||||||
return playerbytes;
|
return playerbytes;
|
||||||
@@ -1187,7 +1161,7 @@ static void CL_LinkPacketEntities( frame_t *frame )
|
|||||||
|
|
||||||
if( !ent )
|
if( !ent )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "CL_LinkPacketEntity: bad entity %i\n", state->number );
|
Con_Reportf( S_ERROR "%s: bad entity %i\n", __func__, state->number );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1291,7 +1265,7 @@ static void CL_LinkPacketEntities( frame_t *frame )
|
|||||||
// ABSOLUTELY STUPID HACK TO ALLOW MONSTERS
|
// ABSOLUTELY STUPID HACK TO ALLOW MONSTERS
|
||||||
// INTERPOLATION IN GRAVGUNMOD COOP
|
// INTERPOLATION IN GRAVGUNMOD COOP
|
||||||
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
||||||
else if( cls.legacymode && ent->model->type == mod_studio && ent->curstate.movetype == MOVETYPE_TOSS )
|
else if( cls.legacymode == PROTO_LEGACY && ent->model->type == mod_studio && ent->curstate.movetype == MOVETYPE_TOSS )
|
||||||
{
|
{
|
||||||
if( !CL_InterpolateModel( ent ))
|
if( !CL_InterpolateModel( ent ))
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ GNU General Public License for more details.
|
|||||||
#define MAX_TEXTCHANNELS 8 // must be power of two (GoldSrc uses 4 channels)
|
#define MAX_TEXTCHANNELS 8 // must be power of two (GoldSrc uses 4 channels)
|
||||||
#define TEXT_MSGNAME "TextMessage%i"
|
#define TEXT_MSGNAME "TextMessage%i"
|
||||||
|
|
||||||
char cl_textbuffer[MAX_TEXTCHANNELS][2048];
|
static char cl_textbuffer[MAX_TEXTCHANNELS][2048];
|
||||||
client_textmessage_t cl_textmessage[MAX_TEXTCHANNELS];
|
static client_textmessage_t cl_textmessage[MAX_TEXTCHANNELS];
|
||||||
|
|
||||||
static dllfunc_t cdll_exports[] =
|
static const dllfunc_t cdll_exports[] =
|
||||||
{
|
{
|
||||||
{ "Initialize", (void **)&clgame.dllFuncs.pfnInitialize },
|
{ "Initialize", (void **)&clgame.dllFuncs.pfnInitialize },
|
||||||
{ "HUD_VidInit", (void **)&clgame.dllFuncs.pfnVidInit },
|
{ "HUD_VidInit", (void **)&clgame.dllFuncs.pfnVidInit },
|
||||||
@@ -80,7 +80,7 @@ static dllfunc_t cdll_exports[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
// optional exports
|
// optional exports
|
||||||
static dllfunc_t cdll_new_exports[] = // allowed only in SDK 2.3 and higher
|
static const dllfunc_t cdll_new_exports[] = // allowed only in SDK 2.3 and higher
|
||||||
{
|
{
|
||||||
{ "HUD_GetStudioModelInterface", (void **)&clgame.dllFuncs.pfnGetStudioModelInterface },
|
{ "HUD_GetStudioModelInterface", (void **)&clgame.dllFuncs.pfnGetStudioModelInterface },
|
||||||
{ "HUD_DirectorMessage", (void **)&clgame.dllFuncs.pfnDirectorMessage },
|
{ "HUD_DirectorMessage", (void **)&clgame.dllFuncs.pfnDirectorMessage },
|
||||||
@@ -140,11 +140,7 @@ returns true if thirdperson is enabled
|
|||||||
*/
|
*/
|
||||||
qboolean CL_IsThirdPerson( void )
|
qboolean CL_IsThirdPerson( void )
|
||||||
{
|
{
|
||||||
cl.local.thirdperson = clgame.dllFuncs.CL_IsThirdPerson();
|
return clgame.dllFuncs.CL_IsThirdPerson() ? true : false;
|
||||||
|
|
||||||
if( cl.local.thirdperson )
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -231,7 +227,7 @@ static void CL_InitCDAudio( const char *filename )
|
|||||||
|
|
||||||
if( ++c > MAX_CDTRACKS - 1 )
|
if( ++c > MAX_CDTRACKS - 1 )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_WARN "CD_Init: too many tracks %i in %s\n", MAX_CDTRACKS, filename );
|
Con_Reportf( S_WARN "%s: too many tracks %i in %s\n", __func__, MAX_CDTRACKS, filename );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -252,18 +248,18 @@ static int CL_AdjustXPos( float x, int width, int totalWidth )
|
|||||||
|
|
||||||
if( x == -1 )
|
if( x == -1 )
|
||||||
{
|
{
|
||||||
xPos = ( refState.width - width ) * 0.5f;
|
xPos = ( clgame.scrInfo.iWidth - width ) * 0.5f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( x < 0 )
|
if ( x < 0 )
|
||||||
xPos = (1.0f + x) * refState.width - totalWidth; // Alight right
|
xPos = (1.0f + x) * clgame.scrInfo.iWidth - totalWidth; // Alight right
|
||||||
else // align left
|
else // align left
|
||||||
xPos = x * refState.width;
|
xPos = x * clgame.scrInfo.iWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( xPos + width > refState.width )
|
if( xPos + width > clgame.scrInfo.iWidth )
|
||||||
xPos = refState.width - width;
|
xPos = clgame.scrInfo.iWidth - width;
|
||||||
else if( xPos < 0 )
|
else if( xPos < 0 )
|
||||||
xPos = 0;
|
xPos = 0;
|
||||||
|
|
||||||
@@ -283,19 +279,19 @@ static int CL_AdjustYPos( float y, int height )
|
|||||||
|
|
||||||
if( y == -1 ) // centered?
|
if( y == -1 ) // centered?
|
||||||
{
|
{
|
||||||
yPos = ( refState.height - height ) * 0.5f;
|
yPos = ( clgame.scrInfo.iHeight - height ) * 0.5f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Alight bottom?
|
// Alight bottom?
|
||||||
if( y < 0 )
|
if( y < 0 )
|
||||||
yPos = (1.0f + y) * refState.height - height; // Alight bottom
|
yPos = (1.0f + y) * clgame.scrInfo.iHeight - height; // Alight bottom
|
||||||
else // align top
|
else // align top
|
||||||
yPos = y * refState.height;
|
yPos = y * clgame.scrInfo.iHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( yPos + height > refState.height )
|
if( yPos + height > clgame.scrInfo.iHeight )
|
||||||
yPos = refState.height - height;
|
yPos = clgame.scrInfo.iHeight - height;
|
||||||
else if( yPos < 0 )
|
else if( yPos < 0 )
|
||||||
yPos = 0;
|
yPos = 0;
|
||||||
|
|
||||||
@@ -560,7 +556,19 @@ static void CL_DrawScreenFade( void )
|
|||||||
if( !alpha )
|
if( !alpha )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( FBitSet( sf->fadeFlags, FFADE_MODULATE ))
|
if( !FBitSet( sf->fadeFlags, FFADE_MODULATE ))
|
||||||
|
{
|
||||||
|
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
||||||
|
ref.dllFuncs.Color4ub( sf->fader, sf->fadeg, sf->fadeb, alpha );
|
||||||
|
}
|
||||||
|
else if( Host_IsQuakeCompatible( ))
|
||||||
|
{
|
||||||
|
// Quake Wrapper and Quake Remake use FFADE_MODULATE for item pickups
|
||||||
|
// so hack the check here
|
||||||
|
ref.dllFuncs.GL_SetRenderMode( kRenderTransAdd );
|
||||||
|
ref.dllFuncs.Color4ub( sf->fader, sf->fadeg, sf->fadeb, alpha );
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ref.dllFuncs.GL_SetRenderMode( kRenderScreenFadeModulate );
|
ref.dllFuncs.GL_SetRenderMode( kRenderScreenFadeModulate );
|
||||||
|
|
||||||
@@ -570,11 +578,6 @@ static void CL_DrawScreenFade( void )
|
|||||||
(uint16_t)( sf->fadeb * alpha + ( 255 - alpha ) * 255 ) >> 8,
|
(uint16_t)( sf->fadeb * alpha + ( 255 - alpha ) * 255 ) >> 8,
|
||||||
255 );
|
255 );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
|
||||||
ref.dllFuncs.Color4ub( sf->fader, sf->fadeg, sf->fadeb, alpha );
|
|
||||||
}
|
|
||||||
|
|
||||||
ref.dllFuncs.R_DrawStretchPic( 0, 0, refState.width, refState.height, 0, 0, 1, 1,
|
ref.dllFuncs.R_DrawStretchPic( 0, 0, refState.width, refState.height, 0, 0, 1, 1,
|
||||||
R_GetBuiltinTexture( REF_WHITE_TEXTURE ));
|
R_GetBuiltinTexture( REF_WHITE_TEXTURE ));
|
||||||
@@ -777,14 +780,14 @@ static const char *CL_SoundFromIndex( int index )
|
|||||||
|
|
||||||
if( !hSound )
|
if( !hSound )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "CL_SoundFromIndex: invalid sound index %i\n", index );
|
Con_DPrintf( S_ERROR "%s: invalid sound index %i\n", __func__, index );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfx = S_GetSfxByHandle( hSound );
|
sfx = S_GetSfxByHandle( hSound );
|
||||||
if( !sfx )
|
if( !sfx )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "CL_SoundFromIndex: bad sfx for index %i\n", index );
|
Con_DPrintf( S_ERROR "%s: bad sfx for index %i\n", __func__, index );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1012,7 +1015,8 @@ void CL_DrawHUD( int state )
|
|||||||
CL_DrawCrosshair ();
|
CL_DrawCrosshair ();
|
||||||
CL_DrawCenterPrint ();
|
CL_DrawCenterPrint ();
|
||||||
clgame.dllFuncs.pfnRedraw( cl.time, cl.intermission );
|
clgame.dllFuncs.pfnRedraw( cl.time, cl.intermission );
|
||||||
CL_DrawLoadingOrPaused( cls.pauseIcon );
|
if( showpause.value )
|
||||||
|
CL_DrawLoadingOrPaused( cls.pauseIcon );
|
||||||
break;
|
break;
|
||||||
case CL_LOADING:
|
case CL_LOADING:
|
||||||
CL_DrawLoadingOrPaused( cls.loadingBar );
|
CL_DrawLoadingOrPaused( cls.loadingBar );
|
||||||
@@ -1041,10 +1045,10 @@ void CL_LinkUserMessage( char *pszName, const int svc_num, int iSize )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !pszName || !*pszName )
|
if( !pszName || !*pszName )
|
||||||
Host_Error( "CL_LinkUserMessage: bad message name\n" );
|
Host_Error( "%s: bad message name\n", __func__ );
|
||||||
|
|
||||||
if( svc_num <= svc_lastmsg )
|
if( svc_num <= svc_lastmsg )
|
||||||
Host_Error( "CL_LinkUserMessage: tried to hook a system message \"%s\"\n", svc_strings[svc_num] );
|
Host_Error( "%s: tried to hook a system message \"%s\"\n", __func__, svc_strings[svc_num] );
|
||||||
|
|
||||||
// see if already hooked
|
// see if already hooked
|
||||||
for( i = 0; i < MAX_USER_MESSAGES && clgame.msg[i].name[0]; i++ )
|
for( i = 0; i < MAX_USER_MESSAGES && clgame.msg[i].name[0]; i++ )
|
||||||
@@ -1061,7 +1065,7 @@ void CL_LinkUserMessage( char *pszName, const int svc_num, int iSize )
|
|||||||
|
|
||||||
if( i == MAX_USER_MESSAGES )
|
if( i == MAX_USER_MESSAGES )
|
||||||
{
|
{
|
||||||
Host_Error( "CL_LinkUserMessage: MAX_USER_MESSAGES hit!\n" );
|
Host_Error( "%s: MAX_USER_MESSAGES hit!\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1182,7 +1186,7 @@ static qboolean CL_LoadHudSprite( const char *szSpriteName, model_t *m_pSprite,
|
|||||||
if( type == SPR_CLIENT || type == SPR_HUDSPRITE )
|
if( type == SPR_CLIENT || type == SPR_HUDSPRITE )
|
||||||
SetBits( m_pSprite->flags, MODEL_CLIENT );
|
SetBits( m_pSprite->flags, MODEL_CLIENT );
|
||||||
|
|
||||||
m_pSprite->numtexinfo = texFlags; // store texFlags into numtexinfo
|
m_pSprite->numtexinfo = texFlags; // store texFlags for renderer into numtexinfo
|
||||||
|
|
||||||
if( !FS_FileExists( szSpriteName, false ) )
|
if( !FS_FileExists( szSpriteName, false ) )
|
||||||
{
|
{
|
||||||
@@ -1209,7 +1213,7 @@ static qboolean CL_LoadHudSprite( const char *szSpriteName, model_t *m_pSprite,
|
|||||||
ref.dllFuncs.Mod_LoadMapSprite( m_pSprite, buf, size, &loaded );
|
ref.dllFuncs.Mod_LoadMapSprite( m_pSprite, buf, size, &loaded );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Mod_LoadSpriteModel( m_pSprite, buf, &loaded, texFlags );
|
Mod_LoadSpriteModel( m_pSprite, buf, &loaded );
|
||||||
ref.dllFuncs.Mod_ProcessRenderData( m_pSprite, true, buf );
|
ref.dllFuncs.Mod_ProcessRenderData( m_pSprite, true, buf );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1242,7 +1246,7 @@ static model_t *CL_LoadSpriteModel( const char *filename, uint type, uint texFla
|
|||||||
|
|
||||||
if( !COM_CheckString( filename ))
|
if( !COM_CheckString( filename ))
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "CL_LoadSpriteModel: bad name!\n" );
|
Con_Reportf( S_ERROR "%s: bad name!\n", __func__ );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1503,12 +1507,12 @@ static void GAME_EXPORT pfnSPR_DrawAdditive( int frame, int x, int y, const wrec
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
=========
|
=========
|
||||||
pfnSPR_GetList
|
SPR_GetList
|
||||||
|
|
||||||
for parsing half-life scripts - hud.txt etc
|
for parsing half-life scripts - hud.txt etc
|
||||||
=========
|
=========
|
||||||
*/
|
*/
|
||||||
static client_sprite_t *pfnSPR_GetList( char *psz, int *piCount )
|
static client_sprite_t *SPR_GetList( char *psz, int *piCount )
|
||||||
{
|
{
|
||||||
cached_spritelist_t *pEntry = &clgame.sprlist[0];
|
cached_spritelist_t *pEntry = &clgame.sprlist[0];
|
||||||
int slot, index, numSprites = 0;
|
int slot, index, numSprites = 0;
|
||||||
@@ -1534,7 +1538,7 @@ static client_sprite_t *pfnSPR_GetList( char *psz, int *piCount )
|
|||||||
|
|
||||||
if( slot == MAX_CLIENT_SPRITES )
|
if( slot == MAX_CLIENT_SPRITES )
|
||||||
{
|
{
|
||||||
Con_Printf( S_ERROR "SPR_GetList: overflow cache!\n" );
|
Con_Printf( S_ERROR "%s: overflow cache!\n", __func__ );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1743,7 +1747,7 @@ static int GAME_EXPORT pfnHookUserMsg( const char *pszName, pfnUserMsgHook pfn )
|
|||||||
|
|
||||||
if( i == MAX_USER_MESSAGES )
|
if( i == MAX_USER_MESSAGES )
|
||||||
{
|
{
|
||||||
Host_Error( "HookUserMsg: MAX_USER_MESSAGES hit!\n" );
|
Host_Error( "%s: MAX_USER_MESSAGES hit!\n", __func__ );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2293,7 +2297,7 @@ static void GAME_EXPORT pfnHookEvent( const char *filename, pfnEventHook pfn )
|
|||||||
|
|
||||||
if( !Q_stricmp( name, ev->name ) && ev->func != NULL )
|
if( !Q_stricmp( name, ev->name ) && ev->func != NULL )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_WARN "CL_HookEvent: %s already hooked!\n", name );
|
Con_Reportf( S_WARN "%s: %s already hooked!\n", __func__, name );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2376,7 +2380,7 @@ static int GAME_EXPORT CL_FindModelIndex( const char *m )
|
|||||||
if( lasttimewarn < host.realtime )
|
if( lasttimewarn < host.realtime )
|
||||||
{
|
{
|
||||||
// tell user about problem (but don't spam console)
|
// tell user about problem (but don't spam console)
|
||||||
Con_Printf( S_ERROR "Could not find index for model %s: not precached\n", filepath );
|
Con_DPrintf( S_ERROR "Could not find index for model %s: not precached\n", filepath );
|
||||||
lasttimewarn = host.realtime + 1.0f;
|
lasttimewarn = host.realtime + 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2428,8 +2432,8 @@ static void GAME_EXPORT pfnLocalPlayerBounds( int hull, float *mins, float *maxs
|
|||||||
{
|
{
|
||||||
if( hull >= 0 && hull < 4 )
|
if( hull >= 0 && hull < 4 )
|
||||||
{
|
{
|
||||||
if( mins ) VectorCopy( clgame.pmove->player_mins[hull], mins );
|
if( mins ) VectorCopy( host.player_mins[hull], mins );
|
||||||
if( maxs ) VectorCopy( clgame.pmove->player_maxs[hull], maxs );
|
if( maxs ) VectorCopy( host.player_maxs[hull], maxs );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2497,9 +2501,17 @@ CL_PushTraceBounds
|
|||||||
*/
|
*/
|
||||||
static void GAME_EXPORT CL_PushTraceBounds( int hullnum, const float *mins, const float *maxs )
|
static void GAME_EXPORT CL_PushTraceBounds( int hullnum, const float *mins, const float *maxs )
|
||||||
{
|
{
|
||||||
|
if( !host.trace_bounds_pushed )
|
||||||
|
{
|
||||||
|
memcpy( host.player_mins_backup, host.player_mins, sizeof( host.player_mins_backup ));
|
||||||
|
memcpy( host.player_maxs_backup, host.player_maxs, sizeof( host.player_maxs_backup ));
|
||||||
|
|
||||||
|
host.trace_bounds_pushed = true;
|
||||||
|
}
|
||||||
|
|
||||||
hullnum = bound( 0, hullnum, 3 );
|
hullnum = bound( 0, hullnum, 3 );
|
||||||
VectorCopy( mins, clgame.pmove->player_mins[hullnum] );
|
VectorCopy( mins, host.player_mins[hullnum] );
|
||||||
VectorCopy( maxs, clgame.pmove->player_maxs[hullnum] );
|
VectorCopy( maxs, host.player_maxs[hullnum] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2510,8 +2522,15 @@ CL_PopTraceBounds
|
|||||||
*/
|
*/
|
||||||
static void GAME_EXPORT CL_PopTraceBounds( void )
|
static void GAME_EXPORT CL_PopTraceBounds( void )
|
||||||
{
|
{
|
||||||
memcpy( clgame.pmove->player_mins, host.player_mins, sizeof( host.player_mins ));
|
if( !host.trace_bounds_pushed )
|
||||||
memcpy( clgame.pmove->player_maxs, host.player_maxs, sizeof( host.player_maxs ));
|
{
|
||||||
|
Con_Reportf( S_ERROR "%s called without push!\n", __func__ );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
host.trace_bounds_pushed = false;
|
||||||
|
memcpy( host.player_mins, host.player_mins_backup, sizeof( host.player_mins ));
|
||||||
|
memcpy( host.player_maxs, host.player_maxs_backup, sizeof( host.player_maxs ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2788,10 +2807,10 @@ static void GAME_EXPORT PlayerInfo_SetValueForKey( const char *key, const char *
|
|||||||
{
|
{
|
||||||
Cvar_DirectSet( var, value );
|
Cvar_DirectSet( var, value );
|
||||||
}
|
}
|
||||||
else if( Info_SetValueForStarKey( cls.userinfo, key, value, MAX_INFO_STRING ))
|
else if( Info_SetValueForStarKey( cls.userinfo, key, value, sizeof( cls.userinfo )))
|
||||||
{
|
{
|
||||||
// time to update server copy of userinfo
|
// time to update server copy of userinfo
|
||||||
CL_ServerCommand( true, "setinfo \"%s\" \"%s\"\n", key, value );
|
CL_UpdateInfo( key, value );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3283,7 +3302,7 @@ Heavy legacy of Quake...
|
|||||||
*/
|
*/
|
||||||
void TriColor4fRendermode( float r, float g, float b, float a, int rendermode )
|
void TriColor4fRendermode( float r, float g, float b, float a, int rendermode )
|
||||||
{
|
{
|
||||||
if( clgame.ds.renderMode == kRenderTransAlpha )
|
if( rendermode == kRenderTransAlpha )
|
||||||
{
|
{
|
||||||
clgame.ds.triRGBA[3] = a / 255.0f;
|
clgame.ds.triRGBA[3] = a / 255.0f;
|
||||||
ref.dllFuncs.Color4f( r, g, b, a );
|
ref.dllFuncs.Color4f( r, g, b, a );
|
||||||
@@ -3415,16 +3434,15 @@ NetAPI_SendRequest
|
|||||||
static void GAME_EXPORT NetAPI_SendRequest( int context, int request, int flags, double timeout, netadr_t *remote_address, net_api_response_func_t response )
|
static void GAME_EXPORT NetAPI_SendRequest( int context, int request, int flags, double timeout, netadr_t *remote_address, net_api_response_func_t response )
|
||||||
{
|
{
|
||||||
net_request_t *nr = NULL;
|
net_request_t *nr = NULL;
|
||||||
string req;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !response )
|
if( !response )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "Net_SendRequest: no callbcak specified for request with context %i!\n", context );
|
Con_DPrintf( S_ERROR "%s: no callbcak specified for request with context %i!\n", __func__, context );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( remote_address->type != NA_IPX && remote_address->type != NA_BROADCAST_IPX )
|
if( remote_address->type == NA_IPX || remote_address->type == NA_BROADCAST_IPX )
|
||||||
return; // IPX no longer support
|
return; // IPX no longer support
|
||||||
|
|
||||||
if( request == NETAPI_REQUEST_SERVERLIST )
|
if( request == NETAPI_REQUEST_SERVERLIST )
|
||||||
@@ -3467,8 +3485,7 @@ static void GAME_EXPORT NetAPI_SendRequest( int context, int request, int flags,
|
|||||||
nr->flags = flags;
|
nr->flags = flags;
|
||||||
|
|
||||||
// local servers request
|
// local servers request
|
||||||
Q_snprintf( req, sizeof( req ), "netinfo %i %i %i", PROTOCOL_VERSION, context, request );
|
Netchan_OutOfBandPrint( NS_CLIENT, nr->resp.remote_address, A2A_NETINFO" %i %i %i", FBitSet( flags, FNETAPI_LEGACY_PROTOCOL ) ? PROTOCOL_LEGACY_VERSION : PROTOCOL_VERSION, context, request );
|
||||||
Netchan_OutOfBandPrint( NS_CLIENT, nr->resp.remote_address, "%s", req );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3772,7 +3789,7 @@ static demo_api_t gDemoApi =
|
|||||||
Demo_WriteBuffer,
|
Demo_WriteBuffer,
|
||||||
};
|
};
|
||||||
|
|
||||||
static net_api_t gNetApi =
|
net_api_t gNetApi =
|
||||||
{
|
{
|
||||||
NetAPI_InitNetworking,
|
NetAPI_InitNetworking,
|
||||||
NetAPI_Status,
|
NetAPI_Status,
|
||||||
@@ -3808,7 +3825,7 @@ static cl_enginefunc_t gEngfuncs =
|
|||||||
pfnSPR_DrawAdditive,
|
pfnSPR_DrawAdditive,
|
||||||
SPR_EnableScissor,
|
SPR_EnableScissor,
|
||||||
SPR_DisableScissor,
|
SPR_DisableScissor,
|
||||||
pfnSPR_GetList,
|
SPR_GetList,
|
||||||
CL_FillRGBA,
|
CL_FillRGBA,
|
||||||
CL_GetScreenInfo,
|
CL_GetScreenInfo,
|
||||||
pfnSetCrosshair,
|
pfnSetCrosshair,
|
||||||
@@ -4030,14 +4047,14 @@ qboolean CL_LoadProgs( const char *name )
|
|||||||
// trying to get single export
|
// trying to get single export
|
||||||
if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "GetClientAPI" )) != NULL )
|
if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "GetClientAPI" )) != NULL )
|
||||||
{
|
{
|
||||||
Con_Reportf( "CL_LoadProgs: found single callback export\n" );
|
Con_Reportf( "%s: found single callback export\n", __func__ );
|
||||||
|
|
||||||
// trying to fill interface now
|
// trying to fill interface now
|
||||||
GetClientAPI( &clgame.dllFuncs );
|
GetClientAPI( &clgame.dllFuncs );
|
||||||
}
|
}
|
||||||
else if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "F" )) != NULL )
|
else if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "F" )) != NULL )
|
||||||
{
|
{
|
||||||
Con_Reportf( "CL_LoadProgs: found single callback export (secured client dlls)\n" );
|
Con_Reportf( "%s: found single callback export (secured client dlls)\n", __func__ );
|
||||||
|
|
||||||
// trying to fill interface now
|
// trying to fill interface now
|
||||||
CL_GetSecuredClientAPI( GetClientAPI );
|
CL_GetSecuredClientAPI( GetClientAPI );
|
||||||
@@ -4065,7 +4082,7 @@ qboolean CL_LoadProgs( const char *name )
|
|||||||
// functions are cleared before all the extensions are evaluated
|
// functions are cleared before all the extensions are evaluated
|
||||||
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
|
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
|
||||||
{
|
{
|
||||||
Con_Reportf( "CL_LoadProgs: failed to get address of %s proc\n", func->name );
|
Con_Reportf( "%s: failed to get address of %s proc\n", __func__, func->name );
|
||||||
|
|
||||||
if( critical_exports )
|
if( critical_exports )
|
||||||
{
|
{
|
||||||
@@ -4092,13 +4109,13 @@ qboolean CL_LoadProgs( const char *name )
|
|||||||
// functions are cleared before all the extensions are evaluated
|
// functions are cleared before all the extensions are evaluated
|
||||||
// NOTE: new exports can be missed without stop the engine
|
// NOTE: new exports can be missed without stop the engine
|
||||||
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
|
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
|
||||||
Con_Reportf( "CL_LoadProgs: failed to get address of %s proc\n", func->name );
|
Con_Reportf( "%s: failed to get address of %s proc\n", __func__, func->name );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !clgame.dllFuncs.pfnInitialize( &gEngfuncs, CLDLL_INTERFACE_VERSION ))
|
if( !clgame.dllFuncs.pfnInitialize( &gEngfuncs, CLDLL_INTERFACE_VERSION ))
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( clgame.hInstance );
|
COM_FreeLibrary( clgame.hInstance );
|
||||||
Con_Reportf( "CL_LoadProgs: can't init client API\n" );
|
Con_Reportf( "%s: can't init client API\n", __func__ );
|
||||||
clgame.hInstance = NULL;
|
clgame.hInstance = NULL;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -4115,10 +4132,10 @@ qboolean CL_LoadProgs( const char *name )
|
|||||||
CL_InitTempEnts ();
|
CL_InitTempEnts ();
|
||||||
|
|
||||||
if( !R_InitRenderAPI()) // Xash3D extension
|
if( !R_InitRenderAPI()) // Xash3D extension
|
||||||
Con_Reportf( S_WARN "CL_LoadProgs: couldn't get render API\n" );
|
Con_Reportf( S_WARN "%s: couldn't get render API\n", __func__ );
|
||||||
|
|
||||||
if( !Mobile_Init() ) // Xash3D FWGS extension: mobile interface
|
if( !Mobile_Init() ) // Xash3D FWGS extension: mobile interface
|
||||||
Con_Reportf( S_WARN "CL_LoadProgs: couldn't get mobility API\n" );
|
Con_Reportf( S_WARN "%s: couldn't get mobility API\n", __func__ );
|
||||||
|
|
||||||
CL_InitEdicts( cl.maxclients ); // initailize local player and world
|
CL_InitEdicts( cl.maxclients ); // initailize local player and world
|
||||||
CL_InitClientMove(); // initialize pm_shared
|
CL_InitClientMove(); // initialize pm_shared
|
||||||
|
|||||||
@@ -25,6 +25,14 @@ static void UI_UpdateUserinfo( void );
|
|||||||
|
|
||||||
gameui_static_t gameui;
|
gameui_static_t gameui;
|
||||||
|
|
||||||
|
static void UI_ToggleAllowConsole_f( void )
|
||||||
|
{
|
||||||
|
host.allow_console = host.allow_console_init = true;
|
||||||
|
|
||||||
|
if( gameui.globals )
|
||||||
|
gameui.globals->developer = true;
|
||||||
|
}
|
||||||
|
|
||||||
void UI_UpdateMenu( float realtime )
|
void UI_UpdateMenu( float realtime )
|
||||||
{
|
{
|
||||||
if( !gameui.hInstance ) return;
|
if( !gameui.hInstance ) return;
|
||||||
@@ -216,12 +224,14 @@ UI_ShowConnectionWarning
|
|||||||
show message box
|
show message box
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void UI_ShowMessageBox( const char *text )
|
qboolean UI_ShowMessageBox( const char *text )
|
||||||
{
|
{
|
||||||
if( gameui.dllFuncs2.pfnShowMessageBox )
|
if( gameui.dllFuncs2.pfnShowMessageBox )
|
||||||
{
|
{
|
||||||
gameui.dllFuncs2.pfnShowMessageBox( text );
|
gameui.dllFuncs2.pfnShowMessageBox( text );
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UI_ConnectionProgress_Disconnect( void )
|
void UI_ConnectionProgress_Disconnect( void )
|
||||||
@@ -397,17 +407,21 @@ void Host_Credits( void )
|
|||||||
gameui.dllFuncs.pfnFinalCredits();
|
gameui.dllFuncs.pfnFinalCredits();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UI_ConvertGameInfo( GAMEINFO *out, gameinfo_t *in )
|
static void UI_ConvertGameInfo( gameinfo2_t *out, const gameinfo_t *in )
|
||||||
{
|
{
|
||||||
|
out->gi_version = GAMEINFO_VERSION;
|
||||||
|
|
||||||
Q_strncpy( out->gamefolder, in->gamefolder, sizeof( out->gamefolder ));
|
Q_strncpy( out->gamefolder, in->gamefolder, sizeof( out->gamefolder ));
|
||||||
Q_strncpy( out->startmap, in->startmap, sizeof( out->startmap ));
|
Q_strncpy( out->startmap, in->startmap, sizeof( out->startmap ));
|
||||||
Q_strncpy( out->trainmap, in->trainmap, sizeof( out->trainmap ));
|
Q_strncpy( out->trainmap, in->trainmap, sizeof( out->trainmap ));
|
||||||
|
Q_strncpy( out->demomap, in->demomap, sizeof( out->demomap ));
|
||||||
Q_strncpy( out->title, in->title, sizeof( out->title ));
|
Q_strncpy( out->title, in->title, sizeof( out->title ));
|
||||||
Q_snprintf( out->version, sizeof( out->version ), "%g", in->version );
|
Q_snprintf( out->version, sizeof( out->version ), "%g", in->version );
|
||||||
|
Q_strncpy( out->iconpath, in->iconpath, sizeof( out->iconpath ));
|
||||||
|
|
||||||
Q_strncpy( out->game_url, in->game_url, sizeof( out->game_url ));
|
Q_strncpy( out->game_url, in->game_url, sizeof( out->game_url ));
|
||||||
Q_strncpy( out->update_url, in->update_url, sizeof( out->update_url ));
|
Q_strncpy( out->update_url, in->update_url, sizeof( out->update_url ));
|
||||||
Q_strncpy( out->size, Q_pretifymem( in->size, 0 ), sizeof( out->size ));
|
out->size = in->size;
|
||||||
Q_strncpy( out->type, in->type, sizeof( out->type ));
|
Q_strncpy( out->type, in->type, sizeof( out->type ));
|
||||||
Q_strncpy( out->date, in->date, sizeof( out->date ));
|
Q_strncpy( out->date, in->date, sizeof( out->date ));
|
||||||
|
|
||||||
@@ -425,6 +439,31 @@ static void UI_ConvertGameInfo( GAMEINFO *out, gameinfo_t *in )
|
|||||||
SetBits( out->flags, GFL_ANIMATED_TITLE );
|
SetBits( out->flags, GFL_ANIMATED_TITLE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void UI_ToOldGameInfo( GAMEINFO *out, const gameinfo2_t *in )
|
||||||
|
{
|
||||||
|
Q_strncpy( out->gamefolder, in->gamefolder, sizeof( out->gamefolder ));
|
||||||
|
Q_strncpy( out->startmap, in->startmap, sizeof( out->startmap ));
|
||||||
|
Q_strncpy( out->trainmap, in->trainmap, sizeof( out->trainmap ));
|
||||||
|
Q_strncpy( out->title, in->title, sizeof( out->title ));
|
||||||
|
Q_strncpy( out->version, in->version, sizeof( out->version ));
|
||||||
|
out->flags = in->flags & 0xFFFF;
|
||||||
|
Q_strncpy( out->game_url, in->game_url, sizeof( out->game_url ));
|
||||||
|
Q_strncpy( out->update_url, in->update_url, sizeof( out->update_url ));
|
||||||
|
Q_strncpy( out->size, Q_memprint( in->size ), sizeof( out->size ));
|
||||||
|
Q_strncpy( out->type, in->type, sizeof( out->type ));
|
||||||
|
Q_strncpy( out->date, in->date, sizeof( out->date ));
|
||||||
|
out->gamemode = in->gamemode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UI_GetModsInfo( void )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
gameui.modsInfo = Mem_Calloc( gameui.mempool, sizeof( *gameui.modsInfo ) * FI->numgames );
|
||||||
|
for( i = 0; i < FI->numgames; i++ )
|
||||||
|
UI_ConvertGameInfo( &gameui.modsInfo[i], FI->games[i] );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
PIC_DrawGeneric
|
PIC_DrawGeneric
|
||||||
@@ -492,7 +531,7 @@ static HIMAGE GAME_EXPORT pfnPIC_Load( const char *szPicName, const byte *image_
|
|||||||
|
|
||||||
if( !COM_CheckString( szPicName ))
|
if( !COM_CheckString( szPicName ))
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "CL_LoadImage: refusing to load image with empty name\n" );
|
Con_Reportf( S_ERROR "%s: refusing to load image with empty name\n", __func__ );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -922,11 +961,12 @@ pfnGetGameInfo
|
|||||||
|
|
||||||
=========
|
=========
|
||||||
*/
|
*/
|
||||||
static int GAME_EXPORT pfnGetGameInfo( GAMEINFO *pgameinfo )
|
static int GAME_EXPORT pfnGetOldGameInfo( GAMEINFO *pgameinfo )
|
||||||
{
|
{
|
||||||
if( !pgameinfo ) return 0;
|
if( !pgameinfo )
|
||||||
|
return 0;
|
||||||
|
|
||||||
*pgameinfo = gameui.gameInfo;
|
UI_ToOldGameInfo( pgameinfo, &gameui.gameInfo );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -938,8 +978,26 @@ pfnGetGamesList
|
|||||||
*/
|
*/
|
||||||
static GAMEINFO ** GAME_EXPORT pfnGetGamesList( int *numGames )
|
static GAMEINFO ** GAME_EXPORT pfnGetGamesList( int *numGames )
|
||||||
{
|
{
|
||||||
if( numGames ) *numGames = FI->numgames;
|
if( numGames )
|
||||||
return gameui.modsInfo;
|
*numGames = FI->numgames;
|
||||||
|
|
||||||
|
if( !gameui.oldModsInfo )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( !gameui.modsInfo )
|
||||||
|
UI_GetModsInfo();
|
||||||
|
|
||||||
|
// first allocate array of pointers
|
||||||
|
gameui.oldModsInfo = Mem_Calloc( gameui.mempool, sizeof( *gameui.oldModsInfo ) * FI->numgames );
|
||||||
|
for( i = 0; i < FI->numgames; i++ )
|
||||||
|
{
|
||||||
|
gameui.oldModsInfo[i] = Mem_Calloc( gameui.mempool, sizeof( *gameui.oldModsInfo[i] ));
|
||||||
|
UI_ToOldGameInfo( gameui.oldModsInfo[i], &gameui.modsInfo[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return gameui.oldModsInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1011,7 +1069,7 @@ pfnChangeInstance
|
|||||||
*/
|
*/
|
||||||
static void GAME_EXPORT pfnChangeInstance( const char *newInstance, const char *szFinalMessage )
|
static void GAME_EXPORT pfnChangeInstance( const char *newInstance, const char *szFinalMessage )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "ChangeInstance menu call is deprecated!\n" );
|
Con_Reportf( S_ERROR "%s menu call is deprecated!\n", __func__ );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1097,8 +1155,22 @@ static void GAME_EXPORT pfnCon_DefaultColor( int r, int g, int b )
|
|||||||
Con_DefaultColor( r, g, b, true );
|
Con_DefaultColor( r, g, b, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT pfnSetCursor( void *hCursor )
|
||||||
|
{
|
||||||
|
uintptr_t cursor;
|
||||||
|
|
||||||
|
if( !gameui.use_extended_api )
|
||||||
|
return; // ignore original Xash menus
|
||||||
|
|
||||||
|
cursor = (uintptr_t)hCursor;
|
||||||
|
if( cursor < dc_user || cursor > dc_last )
|
||||||
|
return;
|
||||||
|
|
||||||
|
Platform_SetCursorType( cursor );
|
||||||
|
}
|
||||||
|
|
||||||
// engine callbacks
|
// engine callbacks
|
||||||
static ui_enginefuncs_t gEngfuncs =
|
static const ui_enginefuncs_t gEngfuncs =
|
||||||
{
|
{
|
||||||
pfnPIC_Load,
|
pfnPIC_Load,
|
||||||
GL_FreeImage,
|
GL_FreeImage,
|
||||||
@@ -1162,7 +1234,7 @@ static ui_enginefuncs_t gEngfuncs =
|
|||||||
pfnKeyGetState,
|
pfnKeyGetState,
|
||||||
pfnMemAlloc,
|
pfnMemAlloc,
|
||||||
pfnMemFree,
|
pfnMemFree,
|
||||||
pfnGetGameInfo,
|
pfnGetOldGameInfo,
|
||||||
pfnGetGamesList,
|
pfnGetGamesList,
|
||||||
pfnGetFilesList,
|
pfnGetFilesList,
|
||||||
SV_GetSaveComment,
|
SV_GetSaveComment,
|
||||||
@@ -1176,7 +1248,7 @@ static ui_enginefuncs_t gEngfuncs =
|
|||||||
pfnHostEndGame,
|
pfnHostEndGame,
|
||||||
COM_RandomFloat,
|
COM_RandomFloat,
|
||||||
COM_RandomLong,
|
COM_RandomLong,
|
||||||
IN_SetCursor,
|
pfnSetCursor,
|
||||||
pfnIsMapValid,
|
pfnIsMapValid,
|
||||||
GL_ProcessTexture,
|
GL_ProcessTexture,
|
||||||
COM_CompareFileTime,
|
COM_CompareFileTime,
|
||||||
@@ -1209,6 +1281,38 @@ static char *pfnParseFileSafe( char *data, char *buf, const int size, unsigned i
|
|||||||
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gameinfo2_t *pfnGetGameInfo( int gi_version )
|
||||||
|
{
|
||||||
|
if( gi_version != gameui.gameInfo.gi_version )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &gameui.gameInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gameinfo2_t *pfnGetModInfo( int gi_version, int i )
|
||||||
|
{
|
||||||
|
if( i < 0 || i >= FI->numgames )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if( !gameui.modsInfo )
|
||||||
|
UI_GetModsInfo();
|
||||||
|
|
||||||
|
if( gi_version != gameui.modsInfo[i].gi_version )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &gameui.modsInfo[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pfnIsCvarReadOnly( const char *name )
|
||||||
|
{
|
||||||
|
convar_t *cv = Cvar_FindVar( name );
|
||||||
|
|
||||||
|
if( !cv )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return FBitSet( cv->flags, FCVAR_READ_ONLY ) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
static ui_extendedfuncs_t gExtendedfuncs =
|
static ui_extendedfuncs_t gExtendedfuncs =
|
||||||
{
|
{
|
||||||
pfnEnableTextInput,
|
pfnEnableTextInput,
|
||||||
@@ -1221,6 +1325,10 @@ static ui_extendedfuncs_t gExtendedfuncs =
|
|||||||
NET_AdrToString,
|
NET_AdrToString,
|
||||||
NET_CompareAdrSort,
|
NET_CompareAdrSort,
|
||||||
Sys_GetNativeObject,
|
Sys_GetNativeObject,
|
||||||
|
&gNetApi,
|
||||||
|
pfnGetGameInfo,
|
||||||
|
pfnGetModInfo,
|
||||||
|
pfnIsCvarReadOnly,
|
||||||
};
|
};
|
||||||
|
|
||||||
void UI_UnloadProgs( void )
|
void UI_UnloadProgs( void )
|
||||||
@@ -1230,6 +1338,7 @@ void UI_UnloadProgs( void )
|
|||||||
// deinitialize game
|
// deinitialize game
|
||||||
gameui.dllFuncs.pfnShutdown();
|
gameui.dllFuncs.pfnShutdown();
|
||||||
|
|
||||||
|
Cmd_RemoveCommand( "ui_allowconsole" );
|
||||||
Cvar_FullSet( "host_gameuiloaded", "0", FCVAR_READ_ONLY );
|
Cvar_FullSet( "host_gameuiloaded", "0", FCVAR_READ_ONLY );
|
||||||
|
|
||||||
Cvar_Unlink( FCVAR_GAMEUIDLL );
|
Cvar_Unlink( FCVAR_GAMEUIDLL );
|
||||||
@@ -1280,71 +1389,65 @@ qboolean UI_LoadProgs( void )
|
|||||||
if(( GetMenuAPI = (MENUAPI)COM_GetProcAddress( gameui.hInstance, "GetMenuAPI" )) == NULL )
|
if(( GetMenuAPI = (MENUAPI)COM_GetProcAddress( gameui.hInstance, "GetMenuAPI" )) == NULL )
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( gameui.hInstance );
|
COM_FreeLibrary( gameui.hInstance );
|
||||||
Con_Reportf( "UI_LoadProgs: can't init menu API\n" );
|
Con_Reportf( "%s: can't init menu API\n", __func__ );
|
||||||
gameui.hInstance = NULL;
|
gameui.hInstance = NULL;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gameui.use_text_api = false;
|
gameui.use_extended_api = false;
|
||||||
|
|
||||||
// make local copy of engfuncs to prevent overwrite it with user dll
|
// make local copy of engfuncs to prevent overwrite it with user dll
|
||||||
memcpy( &gpEngfuncs, &gEngfuncs, sizeof( gpEngfuncs ));
|
gpEngfuncs = gEngfuncs;
|
||||||
|
|
||||||
gameui.mempool = Mem_AllocPool( "Menu Pool" );
|
gameui.mempool = Mem_AllocPool( "Menu Pool" );
|
||||||
|
|
||||||
if( !GetMenuAPI( &gameui.dllFuncs, &gpEngfuncs, gameui.globals ))
|
if( !GetMenuAPI( &gameui.dllFuncs, &gpEngfuncs, gameui.globals ))
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( gameui.hInstance );
|
COM_FreeLibrary( gameui.hInstance );
|
||||||
Con_Reportf( "UI_LoadProgs: can't init menu API\n" );
|
Con_Reportf( "%s: can't init menu API\n", __func__ );
|
||||||
Mem_FreePool( &gameui.mempool );
|
Mem_FreePool( &gameui.mempool );
|
||||||
gameui.hInstance = NULL;
|
gameui.hInstance = NULL;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// make local copy of engfuncs to prevent overwrite it with user dll
|
// make local copy of engfuncs to prevent overwrite it with user dll
|
||||||
memcpy( &gpExtendedfuncs, &gExtendedfuncs, sizeof( gExtendedfuncs ));
|
gpExtendedfuncs = gExtendedfuncs;
|
||||||
memset( &gameui.dllFuncs2, 0, sizeof( gameui.dllFuncs2 ));
|
memset( &gameui.dllFuncs2, 0, sizeof( gameui.dllFuncs2 ));
|
||||||
|
|
||||||
// try to initialize new extended API
|
// try to initialize new extended API
|
||||||
if( ( GetExtAPI = (UIEXTENEDEDAPI)COM_GetProcAddress( gameui.hInstance, "GetExtAPI" ) ) )
|
if( ( GetExtAPI = (UIEXTENEDEDAPI)COM_GetProcAddress( gameui.hInstance, "GetExtAPI" ) ) )
|
||||||
{
|
{
|
||||||
Con_Reportf( "UI_LoadProgs: extended Menu API found\n" );
|
Con_Reportf( "%s: extended Menu API found\n", __func__ );
|
||||||
if( GetExtAPI( MENU_EXTENDED_API_VERSION, &gameui.dllFuncs2, &gpExtendedfuncs ) )
|
if( GetExtAPI( MENU_EXTENDED_API_VERSION, &gameui.dllFuncs2, &gpExtendedfuncs ) )
|
||||||
{
|
{
|
||||||
Con_Reportf( "UI_LoadProgs: extended Menu API initialized\n" );
|
Con_Reportf( "%s: extended Menu API initialized\n", __func__ );
|
||||||
gameui.use_text_api = true;
|
gameui.use_extended_api = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // otherwise, fallback to old and deprecated extensions
|
else // otherwise, fallback to old and deprecated extensions
|
||||||
{
|
{
|
||||||
if( ( GiveTextApi = (UITEXTAPI)COM_GetProcAddress( gameui.hInstance, "GiveTextAPI" ) ) )
|
if( ( GiveTextApi = (UITEXTAPI)COM_GetProcAddress( gameui.hInstance, "GiveTextAPI" ) ) )
|
||||||
{
|
{
|
||||||
Con_Reportf( "UI_LoadProgs: extended text API found\n" );
|
Con_Reportf( "%s: extended text API found\n", __func__ );
|
||||||
Con_Reportf( S_WARN "Text API is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
Con_Reportf( S_WARN "Text API is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
||||||
if( GiveTextApi( &gpExtendedfuncs ) ) // they are binary compatible, so we can just pass extended funcs API to menu
|
if( GiveTextApi( &gpExtendedfuncs ) ) // they are binary compatible, so we can just pass extended funcs API to menu
|
||||||
{
|
{
|
||||||
Con_Reportf( "UI_LoadProgs: extended text API initialized\n" );
|
Con_Reportf( "%s: extended text API initialized\n", __func__ );
|
||||||
gameui.use_text_api = true;
|
gameui.use_extended_api = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gameui.dllFuncs2.pfnAddTouchButtonToList = (ADDTOUCHBUTTONTOLIST)COM_GetProcAddress( gameui.hInstance, "AddTouchButtonToList" );
|
gameui.dllFuncs2.pfnAddTouchButtonToList = (ADDTOUCHBUTTONTOLIST)COM_GetProcAddress( gameui.hInstance, "AddTouchButtonToList" );
|
||||||
if( gameui.dllFuncs2.pfnAddTouchButtonToList )
|
if( gameui.dllFuncs2.pfnAddTouchButtonToList )
|
||||||
{
|
{
|
||||||
Con_Reportf( "UI_LoadProgs: AddTouchButtonToList call found\n" );
|
Con_Reportf( "%s: AddTouchButtonToList call found\n", __func__ );
|
||||||
Con_Reportf( S_WARN "AddTouchButtonToList is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
Con_Reportf( S_WARN "AddTouchButtonToList is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Cvar_FullSet( "host_gameuiloaded", "1", FCVAR_READ_ONLY );
|
Cvar_FullSet( "host_gameuiloaded", "1", FCVAR_READ_ONLY );
|
||||||
|
Cmd_AddRestrictedCommand( "ui_allowconsole", UI_ToggleAllowConsole_f, "unlocks developer console" );
|
||||||
// setup gameinfo
|
|
||||||
for( i = 0; i < FI->numgames; i++ )
|
|
||||||
{
|
|
||||||
gameui.modsInfo[i] = Mem_Calloc( gameui.mempool, sizeof( GAMEINFO ));
|
|
||||||
UI_ConvertGameInfo( gameui.modsInfo[i], FI->games[i] );
|
|
||||||
}
|
|
||||||
|
|
||||||
UI_ConvertGameInfo( &gameui.gameInfo, FI->GameInfo ); // current gameinfo
|
UI_ConvertGameInfo( &gameui.gameInfo, FI->GameInfo ); // current gameinfo
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -20,8 +20,6 @@ GNU General Public License for more details.
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "platform/platform.h"
|
#include "platform/platform.h"
|
||||||
|
|
||||||
static mobile_engfuncs_t *gMobileEngfuncs;
|
|
||||||
|
|
||||||
static CVAR_DEFINE_AUTO( vibration_length, "1.0", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "vibration length" );
|
static CVAR_DEFINE_AUTO( vibration_length, "1.0", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "vibration length" );
|
||||||
static CVAR_DEFINE_AUTO( vibration_enable, "1", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "enable vibration" );
|
static CVAR_DEFINE_AUTO( vibration_enable, "1", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "enable vibration" );
|
||||||
|
|
||||||
@@ -30,17 +28,9 @@ static float g_font_scale;
|
|||||||
|
|
||||||
static void pfnVibrate( float life, char flags )
|
static void pfnVibrate( float life, char flags )
|
||||||
{
|
{
|
||||||
if( !vibration_enable.value )
|
if( !vibration_enable.value || life < 0.0f )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( life < 0.0f )
|
|
||||||
{
|
|
||||||
Con_Reportf( S_WARN "Negative vibrate time: %f\n", life );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Con_Reportf( "Vibrate: %f %d\n", life, flags );
|
|
||||||
|
|
||||||
// here goes platform-specific backends
|
// here goes platform-specific backends
|
||||||
Platform_Vibrate( life * vibration_length.value, flags );
|
Platform_Vibrate( life * vibration_length.value, flags );
|
||||||
}
|
}
|
||||||
@@ -53,7 +43,7 @@ static void Vibrate_f( void )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pfnVibrate( Q_atof( Cmd_Argv(1) ), VIBRATE_NORMAL );
|
pfnVibrate( Q_atof( Cmd_Argv( 1 )), VIBRATE_NORMAL );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pfnEnableTextInput( int enable )
|
static void pfnEnableTextInput( int enable )
|
||||||
@@ -102,7 +92,7 @@ static char *pfnParseFileSafe( char *data, char *buf, const int size, unsigned i
|
|||||||
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
static mobile_engfuncs_t gpMobileEngfuncs =
|
static const mobile_engfuncs_t gMobileEngfuncs =
|
||||||
{
|
{
|
||||||
MOBILITY_API_VERSION,
|
MOBILITY_API_VERSION,
|
||||||
pfnVibrate,
|
pfnVibrate,
|
||||||
@@ -122,21 +112,38 @@ static mobile_engfuncs_t gpMobileEngfuncs =
|
|||||||
|
|
||||||
qboolean Mobile_Init( void )
|
qboolean Mobile_Init( void )
|
||||||
{
|
{
|
||||||
qboolean success = false;
|
|
||||||
pfnMobilityInterface ExportToClient;
|
pfnMobilityInterface ExportToClient;
|
||||||
|
|
||||||
// find a mobility interface
|
Cmd_AddCommand( "vibrate", Vibrate_f, "Vibrate for specified time");
|
||||||
ExportToClient = COM_GetProcAddress( clgame.hInstance, MOBILITY_CLIENT_EXPORT );
|
|
||||||
gMobileEngfuncs = &gpMobileEngfuncs;
|
|
||||||
|
|
||||||
if( ExportToClient && !ExportToClient( gMobileEngfuncs ) )
|
|
||||||
success = true;
|
|
||||||
|
|
||||||
Cmd_AddCommand( "vibrate", (xcommand_t)Vibrate_f, "Vibrate for specified time");
|
|
||||||
Cvar_RegisterVariable( &vibration_length );
|
Cvar_RegisterVariable( &vibration_length );
|
||||||
Cvar_RegisterVariable( &vibration_enable );
|
Cvar_RegisterVariable( &vibration_enable );
|
||||||
|
|
||||||
return success;
|
// find mobility interface
|
||||||
|
if(( ExportToClient = COM_GetProcAddress( clgame.hInstance, MOBILITY_CLIENT_EXPORT )))
|
||||||
|
{
|
||||||
|
static mobile_engfuncs_t mobile_engfuncs; // keep a copy, don't let user change engine pointers
|
||||||
|
|
||||||
|
mobile_engfuncs = gMobileEngfuncs;
|
||||||
|
|
||||||
|
if( !ExportToClient( &mobile_engfuncs ))
|
||||||
|
{
|
||||||
|
Con_Reportf( "%s: ^2initailized extended MobilityAPI ^7ver. %i\n", __func__, MOBILITY_API_VERSION );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure that mobile functions are cleared
|
||||||
|
#if 1
|
||||||
|
// some SDKs define export as returning void, breaking the contract
|
||||||
|
// ignore result for now...
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
memset( &mobile_engfuncs, 0, sizeof( mobile_engfuncs ));
|
||||||
|
|
||||||
|
return false; // just tell user about problems
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return true; // mobile interface is missed
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mobile_Shutdown( void )
|
void Mobile_Shutdown( void )
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ static byte netcolors[NETGRAPH_NET_COLORS+NETGRAPH_LERP_HEIGHT][4] =
|
|||||||
// other will be generated through NetGraph_InitColors()
|
// other will be generated through NetGraph_InitColors()
|
||||||
};
|
};
|
||||||
|
|
||||||
static byte sendcolor[4] = { 88, 29, 130, 255 };
|
static const byte sendcolor[4] = { 88, 29, 130, 255 };
|
||||||
static byte holdcolor[4] = { 255, 0, 0, 200 };
|
static const byte holdcolor[4] = { 255, 0, 0, 200 };
|
||||||
static byte extrap_base_color[4] = { 255, 255, 255, 255 };
|
static const byte extrap_base_color[4] = { 255, 255, 255, 255 };
|
||||||
static netbandwidthgraph_t netstat_graph[NET_TIMINGS];
|
static netbandwidthgraph_t netstat_graph[NET_TIMINGS];
|
||||||
static float packet_loss;
|
static float packet_loss;
|
||||||
static float packet_choke;
|
static float packet_choke;
|
||||||
@@ -79,7 +79,7 @@ NetGraph_DrawRect
|
|||||||
NetGraph_FillRGBA shortcut
|
NetGraph_FillRGBA shortcut
|
||||||
==========
|
==========
|
||||||
*/
|
*/
|
||||||
static void NetGraph_DrawRect( wrect_t *rect, byte colors[4] )
|
static void NetGraph_DrawRect( const wrect_t *rect, const byte colors[4] )
|
||||||
{
|
{
|
||||||
ref.dllFuncs.Color4ub( colors[0], colors[1], colors[2], colors[3] ); // color for this quad
|
ref.dllFuncs.Color4ub( colors[0], colors[1], colors[2], colors[3] ); // color for this quad
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -137,12 +137,7 @@ static void CL_LegacyParseSoundPacket( sizebuf_t *msg, qboolean is_ambient )
|
|||||||
if( FBitSet( flags, SND_SENTENCE ))
|
if( FBitSet( flags, SND_SENTENCE ))
|
||||||
{
|
{
|
||||||
char sentenceName[32];
|
char sentenceName[32];
|
||||||
|
|
||||||
//if( FBitSet( flags, SND_SEQUENCE ))
|
|
||||||
//Q_snprintf( sentenceName, sizeof( sentenceName ), "!#%i", sound + MAX_SOUNDS );
|
|
||||||
//else
|
|
||||||
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
||||||
|
|
||||||
handle = S_RegisterSound( sentenceName );
|
handle = S_RegisterSound( sentenceName );
|
||||||
}
|
}
|
||||||
else handle = cl.sound_index[sound]; // see precached sound
|
else handle = cl.sound_index[sound]; // see precached sound
|
||||||
@@ -174,7 +169,7 @@ static void CL_LegacyPrecacheSound( sizebuf_t *msg )
|
|||||||
soundIndex = MSG_ReadUBitLong( msg, MAX_SOUND_BITS );
|
soundIndex = MSG_ReadUBitLong( msg, MAX_SOUND_BITS );
|
||||||
|
|
||||||
if( soundIndex < 0 || soundIndex >= MAX_SOUNDS )
|
if( soundIndex < 0 || soundIndex >= MAX_SOUNDS )
|
||||||
Host_Error( "CL_PrecacheSound: bad soundindex %i\n", soundIndex );
|
Host_Error( "%s: bad soundindex %i\n", __func__, soundIndex );
|
||||||
|
|
||||||
Q_strncpy( cl.sound_precache[soundIndex], MSG_ReadString( msg ), sizeof( cl.sound_precache[0] ));
|
Q_strncpy( cl.sound_precache[soundIndex], MSG_ReadString( msg ), sizeof( cl.sound_precache[0] ));
|
||||||
|
|
||||||
@@ -192,9 +187,9 @@ static void CL_LegacyPrecacheModel( sizebuf_t *msg )
|
|||||||
modelIndex = MSG_ReadUBitLong( msg, MAX_LEGACY_MODEL_BITS );
|
modelIndex = MSG_ReadUBitLong( msg, MAX_LEGACY_MODEL_BITS );
|
||||||
|
|
||||||
if( modelIndex < 0 || modelIndex >= MAX_MODELS )
|
if( modelIndex < 0 || modelIndex >= MAX_MODELS )
|
||||||
Host_Error( "CL_PrecacheModel: bad modelindex %i\n", modelIndex );
|
Host_Error( "%s: bad modelindex %i\n", __func__, modelIndex );
|
||||||
|
|
||||||
Q_strncpy( model, MSG_ReadString( msg ), MAX_STRING );
|
Q_strncpy( model, MSG_ReadString( msg ), sizeof( model ));
|
||||||
//Q_strncpy( cl.model_precache[modelIndex], BF_ReadString( msg ), sizeof( cl.model_precache[0] ));
|
//Q_strncpy( cl.model_precache[modelIndex], BF_ReadString( msg ), sizeof( cl.model_precache[0] ));
|
||||||
|
|
||||||
// when we loading map all resources is precached sequentially
|
// when we loading map all resources is precached sequentially
|
||||||
@@ -221,7 +216,7 @@ static void CL_LegacyPrecacheEvent( sizebuf_t *msg )
|
|||||||
eventIndex = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
eventIndex = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
||||||
|
|
||||||
if( eventIndex < 0 || eventIndex >= MAX_EVENTS )
|
if( eventIndex < 0 || eventIndex >= MAX_EVENTS )
|
||||||
Host_Error( "CL_PrecacheEvent: bad eventindex %i\n", eventIndex );
|
Host_Error( "%s: bad eventindex %i\n", __func__, eventIndex );
|
||||||
|
|
||||||
Q_strncpy( cl.event_precache[eventIndex], MSG_ReadString( msg ), sizeof( cl.event_precache[0] ));
|
Q_strncpy( cl.event_precache[eventIndex], MSG_ReadString( msg ), sizeof( cl.event_precache[0] ));
|
||||||
|
|
||||||
@@ -256,20 +251,20 @@ static void CL_LegacyParseResourceList( sizebuf_t *msg )
|
|||||||
reslist.rescount = MSG_ReadWord( msg ) - 1;
|
reslist.rescount = MSG_ReadWord( msg ) - 1;
|
||||||
|
|
||||||
if( reslist.rescount > MAX_LEGACY_RESOURCES )
|
if( reslist.rescount > MAX_LEGACY_RESOURCES )
|
||||||
Host_Error("MAX_RESOURCES reached\n");
|
Host_Error( "MAX_RESOURCES reached\n" );
|
||||||
|
|
||||||
for( i = 0; i < reslist.rescount; i++ )
|
for( i = 0; i < reslist.rescount; i++ )
|
||||||
{
|
{
|
||||||
reslist.restype[i] = MSG_ReadWord( msg );
|
reslist.restype[i] = MSG_ReadWord( msg );
|
||||||
Q_strncpy( reslist.resnames[i], MSG_ReadString( msg ), MAX_QPATH );
|
Q_strncpy( reslist.resnames[i], MSG_ReadString( msg ), sizeof( reslist.resnames[i] ));
|
||||||
}
|
}
|
||||||
|
|
||||||
if( CL_IsPlaybackDemo() )
|
if( cls.demoplayback )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( !cl_allow_download.value )
|
if( !cl_allow_download.value )
|
||||||
{
|
{
|
||||||
Con_DPrintf( "Refusing new resource, cl_allow_download set to 0\n" );
|
Con_DPrintf( "Refusing new resource, cl_allowdownload set to 0\n" );
|
||||||
reslist.rescount = 0;
|
reslist.rescount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,7 +295,7 @@ static void CL_LegacyParseResourceList( sizebuf_t *msg )
|
|||||||
continue; // already exists
|
continue; // already exists
|
||||||
|
|
||||||
host.downloadcount++;
|
host.downloadcount++;
|
||||||
HTTP_AddDownload( path, -1, true );
|
HTTP_AddDownload( path, -1, true, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !host.downloadcount )
|
if( !host.downloadcount )
|
||||||
@@ -317,36 +312,19 @@ CL_ParseLegacyServerMessage
|
|||||||
dispatch messages
|
dispatch messages
|
||||||
=====================
|
=====================
|
||||||
*/
|
*/
|
||||||
void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
size_t bufStart, playerbytes;
|
size_t bufStart, playerbytes;
|
||||||
int cmd, param1, param2;
|
int cmd;
|
||||||
int old_background;
|
int old_background;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
|
|
||||||
CL_Parse_Debug( true ); // begin parsing
|
|
||||||
|
|
||||||
if( normal_message )
|
|
||||||
{
|
|
||||||
// assume no entity/player update this packet
|
|
||||||
if( cls.state == ca_active )
|
|
||||||
{
|
|
||||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
|
|
||||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse the message
|
// parse the message
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
{
|
{
|
||||||
Host_Error( "CL_ParseServerMessage: overflow!\n" );
|
Host_Error( "%s: overflow!\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,6 +340,9 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
// record command for debugging spew on parse problem
|
// record command for debugging spew on parse problem
|
||||||
CL_Parse_RecordCommand( cmd, bufStart );
|
CL_Parse_RecordCommand( cmd, bufStart );
|
||||||
|
|
||||||
|
if( CL_ParseCommonDLLMessage( msg, PROTO_LEGACY, cmd, bufStart ))
|
||||||
|
continue;
|
||||||
|
|
||||||
// other commands
|
// other commands
|
||||||
switch( cmd )
|
switch( cmd )
|
||||||
{
|
{
|
||||||
@@ -376,7 +357,7 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
Host_AbortCurrentFrame ();
|
Host_AbortCurrentFrame ();
|
||||||
break;
|
break;
|
||||||
case svc_legacy_event:
|
case svc_legacy_event:
|
||||||
CL_ParseEvent( msg );
|
CL_ParseEvent( msg, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
break;
|
break;
|
||||||
case svc_legacy_changing:
|
case svc_legacy_changing:
|
||||||
@@ -385,7 +366,9 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
{
|
{
|
||||||
int maxclients = cl.maxclients;
|
int maxclients = cl.maxclients;
|
||||||
|
|
||||||
cls.changelevel = true;
|
// we can only changelevel in singleplayer
|
||||||
|
// and singleplayer always runs in current protocol
|
||||||
|
// cls.changelevel = true;
|
||||||
S_StopAllSounds( true );
|
S_StopAllSounds( true );
|
||||||
|
|
||||||
Con_Printf( "Server changing, reconnecting\n" );
|
Con_Printf( "Server changing, reconnecting\n" );
|
||||||
@@ -436,7 +419,7 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case svc_time:
|
case svc_time:
|
||||||
CL_ParseServerTime( msg );
|
CL_ParseServerTime( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_print:
|
case svc_print:
|
||||||
Con_Printf( "%s", MSG_ReadString( msg ));
|
Con_Printf( "%s", MSG_ReadString( msg ));
|
||||||
@@ -461,19 +444,19 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
break;
|
break;
|
||||||
case svc_serverdata:
|
case svc_serverdata:
|
||||||
Cbuf_Execute(); // make sure any stuffed commands are done
|
Cbuf_Execute(); // make sure any stuffed commands are done
|
||||||
CL_ParseServerData( msg, true );
|
CL_ParseServerData( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_lightstyle:
|
case svc_lightstyle:
|
||||||
CL_ParseLightStyle( msg );
|
CL_ParseLightStyle( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_updateuserinfo:
|
case svc_updateuserinfo:
|
||||||
CL_UpdateUserinfo( msg, true );
|
CL_UpdateUserinfo( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_deltatable:
|
case svc_deltatable:
|
||||||
Delta_ParseTableField( msg );
|
Delta_ParseTableField( msg );
|
||||||
break;
|
break;
|
||||||
case svc_clientdata:
|
case svc_clientdata:
|
||||||
CL_ParseClientData( msg );
|
CL_ParseClientData( msg, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.client += MSG_GetNumBytesRead( msg ) - bufStart;
|
cl.frames[cl.parsecountmod].graphdata.client += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
break;
|
break;
|
||||||
case svc_resource:
|
case svc_resource:
|
||||||
@@ -483,82 +466,58 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
CL_UpdateUserPings( msg );
|
CL_UpdateUserPings( msg );
|
||||||
break;
|
break;
|
||||||
case svc_particle:
|
case svc_particle:
|
||||||
CL_ParseParticles( msg );
|
CL_ParseParticles( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_restoresound:
|
case svc_restoresound:
|
||||||
CL_ParseRestoreSoundPacket( msg );
|
Con_Printf( S_ERROR "%s: svc_restoresound: implement me!\n", __func__ );
|
||||||
cl.frames[cl.parsecountmod].graphdata.sound += MSG_GetNumBytesRead( msg ) - bufStart;
|
|
||||||
break;
|
break;
|
||||||
case svc_spawnstatic:
|
case svc_spawnstatic:
|
||||||
CL_LegacyParseStaticEntity( msg );
|
CL_LegacyParseStaticEntity( msg );
|
||||||
break;
|
break;
|
||||||
case svc_event_reliable:
|
case svc_event_reliable:
|
||||||
CL_ParseReliableEvent( msg );
|
CL_ParseReliableEvent( msg, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
break;
|
break;
|
||||||
case svc_spawnbaseline:
|
case svc_spawnbaseline:
|
||||||
CL_ParseBaseline( msg, true );
|
CL_ParseBaseline( msg, PROTO_LEGACY );
|
||||||
break;
|
|
||||||
case svc_temp_entity:
|
|
||||||
CL_ParseTempEntity( msg );
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.tentities += MSG_GetNumBytesRead( msg ) - bufStart;
|
|
||||||
break;
|
break;
|
||||||
case svc_setpause:
|
case svc_setpause:
|
||||||
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
||||||
break;
|
break;
|
||||||
case svc_signonnum:
|
case svc_signonnum:
|
||||||
CL_ParseSignon( msg );
|
CL_ParseSignon( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_centerprint:
|
case svc_centerprint:
|
||||||
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
||||||
break;
|
break;
|
||||||
case svc_intermission:
|
|
||||||
cl.intermission = 1;
|
|
||||||
break;
|
|
||||||
case svc_legacy_modelindex:
|
case svc_legacy_modelindex:
|
||||||
CL_LegacyPrecacheModel( msg );
|
CL_LegacyPrecacheModel( msg );
|
||||||
break;
|
break;
|
||||||
case svc_legacy_soundindex:
|
case svc_legacy_soundindex:
|
||||||
CL_LegacyPrecacheSound( msg );
|
CL_LegacyPrecacheSound( msg );
|
||||||
break;
|
break;
|
||||||
case svc_cdtrack:
|
|
||||||
param1 = MSG_ReadByte( msg );
|
|
||||||
param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum
|
|
||||||
param2 = MSG_ReadByte( msg );
|
|
||||||
param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum
|
|
||||||
S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0, false );
|
|
||||||
break;
|
|
||||||
case svc_restore:
|
case svc_restore:
|
||||||
CL_ParseRestore( msg );
|
CL_ParseRestore( msg );
|
||||||
break;
|
break;
|
||||||
case svc_legacy_eventindex:
|
case svc_legacy_eventindex:
|
||||||
CL_LegacyPrecacheEvent(msg);
|
CL_LegacyPrecacheEvent(msg);
|
||||||
break;
|
break;
|
||||||
case svc_weaponanim:
|
|
||||||
param1 = MSG_ReadByte( msg ); // iAnim
|
|
||||||
param2 = MSG_ReadByte( msg ); // body
|
|
||||||
CL_WeaponAnim( param1, param2 );
|
|
||||||
break;
|
|
||||||
case svc_bspdecal:
|
case svc_bspdecal:
|
||||||
CL_ParseStaticDecal( msg );
|
CL_ParseStaticDecal( msg );
|
||||||
break;
|
break;
|
||||||
case svc_roomtype:
|
|
||||||
param1 = MSG_ReadShort( msg );
|
|
||||||
Cvar_SetValue( "room_type", param1 );
|
|
||||||
break;
|
|
||||||
case svc_addangle:
|
case svc_addangle:
|
||||||
CL_ParseAddAngle( msg );
|
CL_ParseAddAngle( msg );
|
||||||
break;
|
break;
|
||||||
case svc_usermessage:
|
case svc_usermessage:
|
||||||
CL_RegisterUserMessage( msg );
|
CL_RegisterUserMessage( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_packetentities:
|
case svc_packetentities:
|
||||||
playerbytes = CL_ParsePacketEntities( msg, false );
|
playerbytes = CL_ParsePacketEntities( msg, false, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
||||||
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
||||||
break;
|
break;
|
||||||
case svc_deltapacketentities:
|
case svc_deltapacketentities:
|
||||||
playerbytes = CL_ParsePacketEntities( msg, true );
|
playerbytes = CL_ParsePacketEntities( msg, true, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
||||||
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
||||||
break;
|
break;
|
||||||
@@ -605,41 +564,21 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
case svc_hltv:
|
case svc_hltv:
|
||||||
CL_ParseHLTV( msg );
|
CL_ParseHLTV( msg );
|
||||||
break;
|
break;
|
||||||
case svc_director:
|
|
||||||
CL_ParseDirector( msg );
|
|
||||||
break;
|
|
||||||
case svc_resourcelocation:
|
case svc_resourcelocation:
|
||||||
CL_ParseResLocation( msg );
|
CL_ParseResLocation( msg );
|
||||||
break;
|
break;
|
||||||
case svc_querycvarvalue:
|
case svc_querycvarvalue:
|
||||||
CL_ParseCvarValue( msg, false );
|
CL_ParseCvarValue( msg, false, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_querycvarvalue2:
|
case svc_querycvarvalue2:
|
||||||
CL_ParseCvarValue( msg, true );
|
CL_ParseCvarValue( msg, true, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CL_ParseUserMessage( msg, cmd );
|
CL_ParseUserMessage( msg, cmd, PROTO_LEGACY );
|
||||||
cl.frames[cl.parsecountmod].graphdata.usr += MSG_GetNumBytesRead( msg ) - bufStart;
|
cl.frames[cl.parsecountmod].graphdata.usr += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
|
|
||||||
CL_Parse_Debug( false ); // done
|
|
||||||
|
|
||||||
// we don't know if it is ok to save a demo message until
|
|
||||||
// after we have parsed the frame
|
|
||||||
if( !cls.demoplayback )
|
|
||||||
{
|
|
||||||
if( cls.demorecording && !cls.demowaiting )
|
|
||||||
{
|
|
||||||
CL_WriteDemoMessage( false, cls.starting_count, msg );
|
|
||||||
}
|
|
||||||
else if( cls.state != ca_active )
|
|
||||||
{
|
|
||||||
CL_WriteDemoMessage( true, cls.starting_count, msg );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_LegacyPrecache_f( void )
|
void CL_LegacyPrecache_f( void )
|
||||||
@@ -647,7 +586,7 @@ void CL_LegacyPrecache_f( void )
|
|||||||
int spawncount, i;
|
int spawncount, i;
|
||||||
model_t *mod;
|
model_t *mod;
|
||||||
|
|
||||||
if( !cls.legacymode )
|
if( cls.legacymode != PROTO_LEGACY )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spawncount = Q_atoi( Cmd_Argv( 1 ));
|
spawncount = Q_atoi( Cmd_Argv( 1 ));
|
||||||
@@ -664,6 +603,9 @@ void CL_LegacyPrecache_f( void )
|
|||||||
if( clgame.entities )
|
if( clgame.entities )
|
||||||
clgame.entities->model = cl.worldmodel;
|
clgame.entities->model = cl.worldmodel;
|
||||||
|
|
||||||
|
// load skybox
|
||||||
|
R_SetupSky( clgame.movevars.skyName );
|
||||||
|
|
||||||
// tell rendering system we have a new set of models.
|
// tell rendering system we have a new set of models.
|
||||||
ref.dllFuncs.R_NewMap ();
|
ref.dllFuncs.R_NewMap ();
|
||||||
|
|
||||||
@@ -685,22 +627,5 @@ void CL_LegacyPrecache_f( void )
|
|||||||
// Include server count in case server disconnects and changes level during d/l
|
// Include server count in case server disconnects and changes level during d/l
|
||||||
MSG_BeginClientCmd( &cls.netchan.message, clc_stringcmd );
|
MSG_BeginClientCmd( &cls.netchan.message, clc_stringcmd );
|
||||||
MSG_WriteStringf( &cls.netchan.message, "begin %i", spawncount );
|
MSG_WriteStringf( &cls.netchan.message, "begin %i", spawncount );
|
||||||
cls.signon = SIGNONS;
|
cls.signon = SIGNONS - 1;
|
||||||
}
|
|
||||||
|
|
||||||
void CL_LegacyUpdateInfo( void )
|
|
||||||
{
|
|
||||||
if( !cls.legacymode )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( cls.state != ca_active )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MSG_BeginClientCmd( &cls.netchan.message, clc_legacy_userinfo );
|
|
||||||
MSG_WriteString( &cls.netchan.message, cls.userinfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
qboolean CL_LegacyMode( void )
|
|
||||||
{
|
|
||||||
return cls.legacymode;
|
|
||||||
}
|
}
|
||||||
|
|||||||
762
engine/client/cl_parse_gs.c
Normal file
762
engine/client/cl_parse_gs.c
Normal file
@@ -0,0 +1,762 @@
|
|||||||
|
/*
|
||||||
|
cl_parse.c - parse a message received from the server (GoldSrc 48 protocol)
|
||||||
|
Copyright (C) 2008 Uncle Mike
|
||||||
|
|
||||||
|
This program 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "client.h"
|
||||||
|
#include "net_encode.h"
|
||||||
|
#include "particledef.h"
|
||||||
|
#include "cl_tent.h"
|
||||||
|
#include "shake.h"
|
||||||
|
#include "hltv.h"
|
||||||
|
#include "input.h"
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
|
static void CL_ParseExtraInfo( sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
string clientfallback;
|
||||||
|
|
||||||
|
Q_strncpy( clientfallback, MSG_ReadString( msg ), sizeof( clientfallback ));
|
||||||
|
if( COM_CheckStringEmpty( clientfallback ))
|
||||||
|
Con_Reportf( S_ERROR "%s: TODO: add fallback directory %s!\n", __func__, clientfallback );
|
||||||
|
|
||||||
|
if( MSG_ReadByte( msg ))
|
||||||
|
{
|
||||||
|
Cvar_FullSet( "sv_cheats", "1", FCVAR_READ_ONLY | FCVAR_SERVER );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cvar_SetCheatState();
|
||||||
|
Cvar_FullSet( "sv_cheats", "0", FCVAR_READ_ONLY | FCVAR_SERVER );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_ParseNewMovevars( sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
Delta_InitClient(); // finalize client delta's
|
||||||
|
|
||||||
|
clgame.movevars.gravity = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.stopspeed = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.maxspeed = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.spectatormaxspeed = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.accelerate = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.airaccelerate = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.wateraccelerate = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.friction = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.edgefriction = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.waterfriction = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.entgravity = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.bounce = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.stepsize = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.maxvelocity = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.zmax = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.waveHeight = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.footsteps = MSG_ReadByte( msg );
|
||||||
|
clgame.movevars.rollangle = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.rollspeed = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skycolor_r = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skycolor_g = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skycolor_b = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skyvec_x = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skyvec_y = MSG_ReadFloat( msg );
|
||||||
|
clgame.movevars.skyvec_z = MSG_ReadFloat( msg );
|
||||||
|
|
||||||
|
Q_strncpy( clgame.movevars.skyName, MSG_ReadString( msg ), sizeof( clgame.movevars.skyName ));
|
||||||
|
|
||||||
|
// water alpha is not allowed
|
||||||
|
if( !FBitSet( world.flags, FWORLD_WATERALPHA ))
|
||||||
|
clgame.movevars.wateralpha = 1.0f;
|
||||||
|
|
||||||
|
// update sky if changed
|
||||||
|
if( Q_strcmp( clgame.oldmovevars.skyName, clgame.movevars.skyName ) && cl.video_prepped )
|
||||||
|
R_SetupSky( clgame.movevars.skyName );
|
||||||
|
|
||||||
|
clgame.oldmovevars = clgame.movevars;
|
||||||
|
clgame.entities->curstate.scale = clgame.movevars.waveHeight;
|
||||||
|
|
||||||
|
// keep features an actual!
|
||||||
|
clgame.oldmovevars.features = clgame.movevars.features = host.features;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct delta_header_t
|
||||||
|
{
|
||||||
|
qboolean remove : 1;
|
||||||
|
qboolean custom : 1;
|
||||||
|
qboolean instanced : 1;
|
||||||
|
uint instanced_baseline_index : 6;
|
||||||
|
uint offset : 6;
|
||||||
|
} delta_header_t;
|
||||||
|
|
||||||
|
static int CL_ParseDeltaHeader( sizebuf_t *msg, qboolean delta, int oldnum, struct delta_header_t *hdr )
|
||||||
|
{
|
||||||
|
int entnum = oldnum;
|
||||||
|
memset( hdr, 0, sizeof( *hdr ));
|
||||||
|
|
||||||
|
if( !delta )
|
||||||
|
{
|
||||||
|
// if we have one bit set, then it's a next entity in line
|
||||||
|
// if we have next bit NON set, then it's a one of next 64 entities
|
||||||
|
// if not, it's a new entity
|
||||||
|
if( MSG_ReadOneBit( msg ))
|
||||||
|
entnum++;
|
||||||
|
else if( MSG_ReadOneBit( msg ) == 0 )
|
||||||
|
entnum += MSG_ReadUBitLong( msg, 6 );
|
||||||
|
else
|
||||||
|
entnum = MSG_ReadUBitLong( msg, MAX_GOLDSRC_ENTITY_BITS );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// does this packet encode entity deletion?
|
||||||
|
hdr->remove = MSG_ReadOneBit( msg );
|
||||||
|
|
||||||
|
// same logic as above
|
||||||
|
if( MSG_ReadOneBit( msg ) == 0 )
|
||||||
|
entnum += MSG_ReadUBitLong( msg, 6 );
|
||||||
|
else entnum = MSG_ReadUBitLong( msg, MAX_GOLDSRC_ENTITY_BITS );
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are not removing this entity
|
||||||
|
if( !hdr->remove )
|
||||||
|
{
|
||||||
|
hdr->custom = MSG_ReadOneBit( msg );
|
||||||
|
|
||||||
|
// do we got instanced baselines in svc_spawnbaselines?
|
||||||
|
if( cl.instanced_baseline_count )
|
||||||
|
{
|
||||||
|
hdr->instanced = MSG_ReadOneBit( msg );
|
||||||
|
if( hdr->instanced )
|
||||||
|
hdr->instanced_baseline_index = MSG_ReadUBitLong( msg, 6 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !delta && !hdr->instanced )
|
||||||
|
{
|
||||||
|
if( MSG_ReadOneBit( msg ))
|
||||||
|
hdr->offset = MSG_ReadUBitLong( msg, 6 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CL_GetEntityDelta( const struct delta_header_t *hdr, int entnum )
|
||||||
|
{
|
||||||
|
if( hdr->custom )
|
||||||
|
return DT_CUSTOM_ENTITY_STATE_T;
|
||||||
|
|
||||||
|
if( CL_IsPlayerIndex( entnum ))
|
||||||
|
return DT_ENTITY_STATE_PLAYER_T;
|
||||||
|
|
||||||
|
return DT_ENTITY_STATE_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_FlushEntityPacketGS( frame_t *frame, sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
frame->valid = false;
|
||||||
|
cl.validsequence = 0; // can't render a frame
|
||||||
|
|
||||||
|
// read it all but ignore it
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
int num = 0;
|
||||||
|
entity_state_t from = { 0 }, to;
|
||||||
|
delta_header_t hdr;
|
||||||
|
|
||||||
|
if( MSG_ReadWord( msg ) != 0 )
|
||||||
|
{
|
||||||
|
MSG_SeekToBit( msg, -16, SEEK_CUR );
|
||||||
|
num = CL_ParseDeltaHeader( msg, false, num, &hdr );
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
|
||||||
|
if( MSG_CheckOverflow( msg ))
|
||||||
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
|
|
||||||
|
if( hdr.remove )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Delta_ReadGSFields( msg, CL_GetEntityDelta( &hdr, num ), &from, &to, cl.mtime[0] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_DeltaEntityGS( const delta_header_t *hdr, sizebuf_t *msg, frame_t *frame, int newnum, const entity_state_t *from )
|
||||||
|
{
|
||||||
|
cl_entity_t *ent;
|
||||||
|
entity_state_t *to;
|
||||||
|
qboolean newent = from == NULL;
|
||||||
|
int pack = frame->num_entities;
|
||||||
|
qboolean has_update = msg != NULL;
|
||||||
|
|
||||||
|
// alloc next slot to store update
|
||||||
|
to = &cls.packet_entities[cls.next_client_entities % cls.num_client_entities];
|
||||||
|
|
||||||
|
if(( newnum < 0 ) || ( newnum >= clgame.maxEntities ))
|
||||||
|
{
|
||||||
|
Con_DPrintf( S_ERROR "CL_DeltaEntity: invalid newnum: %d\n", newnum );
|
||||||
|
Host_Error( "%s: bad delta entity number: %i", __func__, newnum );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ent = CL_EDICT_NUM( newnum );
|
||||||
|
if( hdr->remove )
|
||||||
|
{
|
||||||
|
if( !newent )
|
||||||
|
CL_KillDeadBeams( ent );
|
||||||
|
else
|
||||||
|
Con_Printf( S_WARN "%s: entity remove on non-delta update (%d)\n", __func__, newnum );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ent->index = newnum; // enumerate entity index
|
||||||
|
if( newent )
|
||||||
|
{
|
||||||
|
if( hdr->instanced )
|
||||||
|
from = &cl.instanced_baseline[hdr->instanced_baseline_index];
|
||||||
|
else if( hdr->offset != 0 )
|
||||||
|
from = &cls.packet_entities[(cls.next_client_entities - hdr->offset) % cls.num_client_entities];
|
||||||
|
else
|
||||||
|
from = &ent->baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( has_update )
|
||||||
|
Delta_ReadGSFields( msg, CL_GetEntityDelta( hdr, newnum ), from, to, cl.mtime[0] );
|
||||||
|
else memcpy( to, from, sizeof( entity_state_t ));
|
||||||
|
|
||||||
|
to->entityType = hdr->custom ? ENTITY_BEAM : ENTITY_NORMAL;
|
||||||
|
to->number = newnum;
|
||||||
|
|
||||||
|
if( newent )
|
||||||
|
{
|
||||||
|
// interpolation must be reset
|
||||||
|
SETVISBIT( frame->flags, pack );
|
||||||
|
|
||||||
|
// release beams from previous entity
|
||||||
|
CL_KillDeadBeams( ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add entity to packet
|
||||||
|
cls.next_client_entities++;
|
||||||
|
frame->num_entities++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_CopyPacketEntity( frame_t *frame, int num, const entity_state_t *from )
|
||||||
|
{
|
||||||
|
delta_header_t fakehdr =
|
||||||
|
{
|
||||||
|
.custom = FBitSet( from->entityType, ENTITY_BEAM ) == ENTITY_BEAM,
|
||||||
|
};
|
||||||
|
CL_DeltaEntityGS( &fakehdr, NULL, frame, num, from );
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CL_ParsePacketEntitiesGS( sizebuf_t *msg, qboolean delta )
|
||||||
|
{
|
||||||
|
frame_t *frame, *oldframe;
|
||||||
|
int oldindex, newnum, oldnum, numbase = 0;
|
||||||
|
entity_state_t *oldent;
|
||||||
|
int count;
|
||||||
|
int playerbytes = 0;
|
||||||
|
|
||||||
|
// save first uncompressed packet as timestamp
|
||||||
|
if( cls.changelevel && !delta && cls.demorecording )
|
||||||
|
CL_WriteDemoJumpTime();
|
||||||
|
|
||||||
|
count = MSG_ReadWord( msg );
|
||||||
|
|
||||||
|
frame = &cl.frames[cl.parsecountmod];
|
||||||
|
memset( frame->flags, 0, sizeof( frame->flags ));
|
||||||
|
frame->first_entity = cls.next_client_entities;
|
||||||
|
frame->num_entities = 0;
|
||||||
|
frame->valid = true;
|
||||||
|
|
||||||
|
if( delta )
|
||||||
|
{
|
||||||
|
uint oldpacket = MSG_ReadByte( msg );
|
||||||
|
oldframe = &cl.frames[oldpacket & CL_UPDATE_MASK];
|
||||||
|
|
||||||
|
if( !CL_ValidateDeltaPacket( oldpacket, oldframe ))
|
||||||
|
{
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_FlushEntityPacketGS( frame, msg );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
return playerbytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
oldframe = NULL;
|
||||||
|
cl.send_reply = true;
|
||||||
|
cls.demowaiting = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl.validsequence = cls.netchan.incoming_sequence;
|
||||||
|
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
|
||||||
|
oldent = NULL;
|
||||||
|
oldindex = 0;
|
||||||
|
oldnum = CL_UpdateOldEntNum( oldindex, oldframe, &oldent );
|
||||||
|
|
||||||
|
// read it all but ignore it
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
int bufstart;
|
||||||
|
qboolean player;
|
||||||
|
delta_header_t hdr;
|
||||||
|
int val = MSG_ReadWord( msg );
|
||||||
|
|
||||||
|
if( val )
|
||||||
|
{
|
||||||
|
MSG_SeekToBit( msg, -16, SEEK_CUR );
|
||||||
|
numbase = newnum = CL_ParseDeltaHeader( msg, delta, numbase, &hdr );
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
|
||||||
|
if( MSG_CheckOverflow( msg ))
|
||||||
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
|
|
||||||
|
player = CL_IsPlayerIndex( newnum );
|
||||||
|
|
||||||
|
while( oldnum < newnum )
|
||||||
|
{
|
||||||
|
if( !delta )
|
||||||
|
Con_Printf( S_WARN "%s: old frame copy on non-delta update (%d < %d)\n", __func__, oldnum, newnum );
|
||||||
|
|
||||||
|
// one or more entities from the old packet are unchanged
|
||||||
|
CL_CopyPacketEntity( frame, oldnum, oldent );
|
||||||
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
}
|
||||||
|
|
||||||
|
bufstart = MSG_GetNumBytesRead( msg );
|
||||||
|
|
||||||
|
if( oldnum == newnum )
|
||||||
|
{
|
||||||
|
if( !delta )
|
||||||
|
Con_Printf( S_WARN "%s: delta entity on non-delta update (%d)\n", __func__, oldnum );
|
||||||
|
|
||||||
|
// from delta
|
||||||
|
CL_DeltaEntityGS( &hdr, msg, frame, newnum, oldent );
|
||||||
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
}
|
||||||
|
else if( oldnum > newnum )
|
||||||
|
{
|
||||||
|
// from baseline
|
||||||
|
CL_DeltaEntityGS( &hdr, msg, frame, newnum, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( player ) playerbytes += MSG_GetNumBytesRead( msg ) - bufstart;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( MSG_CheckOverflow( msg ))
|
||||||
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
|
|
||||||
|
// any remaining entities in the old frame are copied over
|
||||||
|
while( oldnum != MAX_ENTNUMBER )
|
||||||
|
{
|
||||||
|
// one or more entities from the old packet are unchanged
|
||||||
|
CL_CopyPacketEntity( frame, oldnum, oldent );
|
||||||
|
oldnum = CL_UpdateOldEntNum( ++oldindex, oldframe, &oldent );
|
||||||
|
}
|
||||||
|
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
|
||||||
|
if( frame->num_entities != count )
|
||||||
|
Con_Reportf( S_WARN "CL_Parse%sPacketEntitiesGS: (%i should be %i)\n", delta ? "Delta" : "", frame->num_entities, count );
|
||||||
|
|
||||||
|
if( !frame->valid )
|
||||||
|
return playerbytes;
|
||||||
|
|
||||||
|
CL_ProcessPacket( frame );
|
||||||
|
CL_SetSolidEntities();
|
||||||
|
|
||||||
|
// first update, received world, remove loading plaque
|
||||||
|
if( cls.signon == ( SIGNONS - 1 ))
|
||||||
|
{
|
||||||
|
cls.signon = SIGNONS;
|
||||||
|
CL_SignonReply( PROTO_GOLDSRC );
|
||||||
|
}
|
||||||
|
|
||||||
|
return playerbytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float MSG_ReadGSBitCoord( sizebuf_t *sb )
|
||||||
|
{
|
||||||
|
float value = 0;
|
||||||
|
int ival, fval;
|
||||||
|
|
||||||
|
ival = MSG_ReadOneBit( sb );
|
||||||
|
fval = MSG_ReadOneBit( sb );
|
||||||
|
|
||||||
|
if( ival || fval )
|
||||||
|
{
|
||||||
|
int sign = MSG_ReadOneBit( sb );
|
||||||
|
|
||||||
|
if( ival )
|
||||||
|
ival = MSG_ReadUBitLong( sb, 12 );
|
||||||
|
if( fval )
|
||||||
|
fval = MSG_ReadUBitLong( sb, 3 );
|
||||||
|
|
||||||
|
value = (float)( fval / 8.0 + ival );
|
||||||
|
if( sign )
|
||||||
|
value = -value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MSG_ReadGSBitVec3Coord( sizebuf_t *sb, vec3_t fa )
|
||||||
|
{
|
||||||
|
qboolean x, y, z;
|
||||||
|
|
||||||
|
VectorClear( fa );
|
||||||
|
|
||||||
|
x = MSG_ReadOneBit( sb );
|
||||||
|
y = MSG_ReadOneBit( sb );
|
||||||
|
z = MSG_ReadOneBit( sb );
|
||||||
|
if( x )
|
||||||
|
fa[0] = MSG_ReadGSBitCoord( sb );
|
||||||
|
if( y )
|
||||||
|
fa[1] = MSG_ReadGSBitCoord( sb );
|
||||||
|
if( z )
|
||||||
|
fa[2] = MSG_ReadGSBitCoord( sb );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_ParseSoundPacketGS( sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
vec3_t pos;
|
||||||
|
int chan, sound;
|
||||||
|
float volume, attn;
|
||||||
|
int flags, pitch, entnum;
|
||||||
|
sound_t handle = 0;
|
||||||
|
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
|
||||||
|
flags = MSG_ReadUBitLong( msg, 9 );
|
||||||
|
|
||||||
|
if( FBitSet( flags, SND_VOLUME ))
|
||||||
|
volume = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
|
else volume = VOL_NORM;
|
||||||
|
|
||||||
|
if( FBitSet( flags, SND_ATTENUATION ))
|
||||||
|
attn = (float)MSG_ReadByte( msg ) / 64.0f;
|
||||||
|
else attn = ATTN_NONE;
|
||||||
|
|
||||||
|
chan = MSG_ReadUBitLong( msg, 3 );
|
||||||
|
entnum = MSG_ReadUBitLong( msg, MAX_GOLDSRC_ENTITY_BITS );
|
||||||
|
if( FBitSet( flags, SND_LEGACY_LARGE_INDEX ))
|
||||||
|
sound = MSG_ReadWord( msg );
|
||||||
|
else sound = MSG_ReadByte( msg );
|
||||||
|
MSG_ReadGSBitVec3Coord( msg, pos );
|
||||||
|
|
||||||
|
if( FBitSet( flags, SND_PITCH ))
|
||||||
|
pitch = MSG_ReadByte( msg );
|
||||||
|
else pitch = PITCH_NORM;
|
||||||
|
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
|
||||||
|
ClearBits( flags, SND_LEGACY_LARGE_INDEX );
|
||||||
|
|
||||||
|
if( FBitSet( flags, SND_SENTENCE ))
|
||||||
|
{
|
||||||
|
char sentenceName[32];
|
||||||
|
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
||||||
|
handle = S_RegisterSound( sentenceName );
|
||||||
|
}
|
||||||
|
else handle = cl.sound_index[sound]; // see precached sound
|
||||||
|
|
||||||
|
if( !cl.audio_prepped )
|
||||||
|
return; // too early
|
||||||
|
|
||||||
|
// g-cont. sound and ambient sound have only difference with channel
|
||||||
|
if( chan == CHAN_STATIC )
|
||||||
|
{
|
||||||
|
S_AmbientSound( pos, entnum, handle, volume, attn, pitch, flags );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
S_StartSound( pos, entnum, chan, handle, volume, attn, pitch, flags );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CL_ParseSpawnStaticSound( sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
vec3_t pos;
|
||||||
|
int handle, entnum, pitch, flags;
|
||||||
|
float volume, attn;
|
||||||
|
|
||||||
|
MSG_ReadVec3Coord( msg, pos );
|
||||||
|
handle = MSG_ReadShort( msg );
|
||||||
|
volume = MSG_ReadByte( msg ) * ( 1.0f / 255.0f );
|
||||||
|
attn = MSG_ReadByte( msg ) * ( 1.0f / 64.0f );
|
||||||
|
entnum = MSG_ReadShort( msg );
|
||||||
|
pitch = MSG_ReadByte( msg );
|
||||||
|
flags = MSG_ReadByte( msg );
|
||||||
|
|
||||||
|
S_AmbientSound( pos, entnum, handle, volume, attn, pitch, flags );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=====================================================================
|
||||||
|
|
||||||
|
ACTION MESSAGES
|
||||||
|
|
||||||
|
=====================================================================
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
=====================
|
||||||
|
CL_ParseGoldSrcServerMessage
|
||||||
|
|
||||||
|
dispatch messages
|
||||||
|
=====================
|
||||||
|
*/
|
||||||
|
void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
|
{
|
||||||
|
size_t bufStart, playerbytes;
|
||||||
|
int cmd, param1;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
// parse the message
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
if( MSG_CheckOverflow( msg ))
|
||||||
|
{
|
||||||
|
Host_Error( "CL_ParseServerMessage: overflow!\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark start position
|
||||||
|
bufStart = MSG_GetNumBytesRead( msg );
|
||||||
|
|
||||||
|
// end of message (align bits)
|
||||||
|
if( MSG_GetNumBitsLeft( msg ) < 8 )
|
||||||
|
break;
|
||||||
|
|
||||||
|
cmd = MSG_ReadServerCmd( msg );
|
||||||
|
|
||||||
|
// record command for debugging spew on parse problem
|
||||||
|
CL_Parse_RecordCommand( cmd, bufStart );
|
||||||
|
|
||||||
|
if( CL_ParseCommonDLLMessage( msg, PROTO_GOLDSRC, cmd, bufStart ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// other commands
|
||||||
|
switch( cmd )
|
||||||
|
{
|
||||||
|
case svc_bad:
|
||||||
|
Host_Error( "svc_bad\n" );
|
||||||
|
break;
|
||||||
|
case svc_nop:
|
||||||
|
case svc_spawnstatic:
|
||||||
|
case svc_goldsrc_damage:
|
||||||
|
case svc_goldsrc_killedmonster:
|
||||||
|
case svc_goldsrc_foundsecret:
|
||||||
|
// this does nothing
|
||||||
|
break;
|
||||||
|
case svc_disconnect:
|
||||||
|
s = MSG_ReadString( msg );
|
||||||
|
if( COM_CheckStringEmpty( s ))
|
||||||
|
Con_Printf( "Server issued disconnect. Reason: %s\n", s );
|
||||||
|
CL_Drop ();
|
||||||
|
Host_AbortCurrentFrame ();
|
||||||
|
break;
|
||||||
|
case svc_event:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_ParseEvent( msg, PROTO_GOLDSRC );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_version:
|
||||||
|
param1 = MSG_ReadLong( msg );
|
||||||
|
if( param1 != PROTOCOL_GOLDSRC_VERSION )
|
||||||
|
Host_Error( "Server use invalid protocol (%i should be %i)\n", param1, PROTOCOL_GOLDSRC_VERSION );
|
||||||
|
break;
|
||||||
|
case svc_setview:
|
||||||
|
CL_ParseViewEntity( msg );
|
||||||
|
break;
|
||||||
|
case svc_sound:
|
||||||
|
CL_ParseSoundPacketGS( msg );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.sound += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_time:
|
||||||
|
CL_ParseServerTime( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_print:
|
||||||
|
Con_Printf( "%s", MSG_ReadString( msg ));
|
||||||
|
break;
|
||||||
|
case svc_stufftext:
|
||||||
|
s = MSG_ReadString( msg );
|
||||||
|
if( cl_trace_stufftext.value )
|
||||||
|
{
|
||||||
|
size_t len = Q_strlen( s );
|
||||||
|
Con_Printf( "Stufftext: %s%c", s, len && s[len-1] == '\n' ? '\0' : '\n' );
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HACKS_RELATED_HLMODS
|
||||||
|
// disable Cry Of Fear antisave protection
|
||||||
|
if( !Q_strnicmp( s, "disconnect", 10 ) && cls.signon != SIGNONS )
|
||||||
|
break; // too early
|
||||||
|
#endif
|
||||||
|
Cbuf_AddFilteredText( s );
|
||||||
|
break;
|
||||||
|
case svc_setangle:
|
||||||
|
CL_ParseSetAngle( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_serverinfo:
|
||||||
|
Cbuf_Execute(); // make sure any stuffed commands are done
|
||||||
|
CL_ParseServerData( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_lightstyle:
|
||||||
|
CL_ParseLightStyle( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_updateuserinfo:
|
||||||
|
CL_UpdateUserinfo( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_deltadescription:
|
||||||
|
Delta_ParseTableField_GS( msg );
|
||||||
|
break;
|
||||||
|
case svc_clientdata:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_ParseClientData( msg, PROTO_GOLDSRC );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.client += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_stopsound:
|
||||||
|
param1 = MSG_ReadWord( msg );
|
||||||
|
S_StopSound( param1 >> 3, param1 & 7, NULL );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.sound += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_pings:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_UpdateUserPings( msg );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
break;
|
||||||
|
case svc_particle:
|
||||||
|
CL_ParseParticles( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_event_reliable:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_ParseReliableEvent( msg, PROTO_GOLDSRC );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.event += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_spawnbaseline:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_ParseBaseline( msg, PROTO_GOLDSRC );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
break;
|
||||||
|
case svc_setpause:
|
||||||
|
cl.paused = ( MSG_ReadByte( msg ) != 0 );
|
||||||
|
break;
|
||||||
|
case svc_signonnum:
|
||||||
|
CL_ParseSignon( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_centerprint:
|
||||||
|
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_spawnstaticsound:
|
||||||
|
CL_ParseSpawnStaticSound( msg );
|
||||||
|
break;
|
||||||
|
case svc_finale:
|
||||||
|
CL_ParseFinaleCutscene( msg, 2 );
|
||||||
|
break;
|
||||||
|
case svc_restore:
|
||||||
|
CL_ParseRestore( msg );
|
||||||
|
break;
|
||||||
|
case svc_cutscene:
|
||||||
|
CL_ParseFinaleCutscene( msg, 3 );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_decalname:
|
||||||
|
param1 = MSG_ReadByte( msg );
|
||||||
|
s = MSG_ReadString( msg );
|
||||||
|
Q_strncpy( host.draw_decals[param1], s, sizeof( host.draw_decals[param1] ));
|
||||||
|
break;
|
||||||
|
case svc_addangle:
|
||||||
|
CL_ParseAddAngle( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_newusermsg:
|
||||||
|
CL_RegisterUserMessage( msg, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_packetentities:
|
||||||
|
playerbytes = CL_ParsePacketEntitiesGS( msg, false );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
||||||
|
break;
|
||||||
|
case svc_deltapacketentities:
|
||||||
|
playerbytes = CL_ParsePacketEntitiesGS( msg, true );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.players += playerbytes;
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.entities += MSG_GetNumBytesRead( msg ) - bufStart - playerbytes;
|
||||||
|
break;
|
||||||
|
case svc_choke:
|
||||||
|
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = true;
|
||||||
|
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].receivedtime = -2.0;
|
||||||
|
break;
|
||||||
|
case svc_resourcelist:
|
||||||
|
MSG_StartBitWriting( msg );
|
||||||
|
CL_ParseResourceList( msg, PROTO_GOLDSRC );
|
||||||
|
MSG_EndBitWriting( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_newmovevars:
|
||||||
|
CL_ParseNewMovevars( msg );
|
||||||
|
break;
|
||||||
|
case svc_resourcerequest:
|
||||||
|
CL_ParseResourceRequest( msg );
|
||||||
|
break;
|
||||||
|
case svc_customization:
|
||||||
|
CL_ParseCustomization( msg );
|
||||||
|
break;
|
||||||
|
case svc_crosshairangle:
|
||||||
|
CL_ParseCrosshairAngle( msg );
|
||||||
|
break;
|
||||||
|
case svc_soundfade:
|
||||||
|
CL_ParseSoundFade( msg );
|
||||||
|
break;
|
||||||
|
case svc_filetxferfailed:
|
||||||
|
CL_ParseFileTransferFailed( msg );
|
||||||
|
break;
|
||||||
|
case svc_hltv:
|
||||||
|
CL_ParseHLTV( msg );
|
||||||
|
break;
|
||||||
|
case svc_voiceinit:
|
||||||
|
CL_ParseVoiceInit( msg );
|
||||||
|
break;
|
||||||
|
case svc_voicedata:
|
||||||
|
CL_ParseVoiceData( msg, PROTO_GOLDSRC );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.voicebytes += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
case svc_resourcelocation:
|
||||||
|
CL_ParseResLocation( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_sendextrainfo:
|
||||||
|
CL_ParseExtraInfo( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_timescale:
|
||||||
|
// we can set sys_timescale to anything we want but in GoldSrc it's locked for
|
||||||
|
// HLTV and demoplayback. Do we really want to have it then if both are out of scope?
|
||||||
|
Con_Reportf( S_ERROR "%s: svc_goldsrc_timescale: implement me!\n", __func__ );
|
||||||
|
MSG_ReadFloat( msg );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_sendcvarvalue:
|
||||||
|
CL_ParseCvarValue( msg, false, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_goldsrc_sendcvarvalue2:
|
||||||
|
CL_ParseCvarValue( msg, true, PROTO_GOLDSRC );
|
||||||
|
break;
|
||||||
|
case svc_exec:
|
||||||
|
CL_ParseExec( msg );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CL_ParseUserMessage( msg, cmd, PROTO_LEGACY );
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.usr += MSG_GetNumBytesRead( msg ) - bufStart;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,7 +59,7 @@ void GAME_EXPORT CL_PopPMStates( void )
|
|||||||
CL_IsPredicted
|
CL_IsPredicted
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
qboolean CL_IsPredicted( void )
|
static qboolean CL_IsPredicted( void )
|
||||||
{
|
{
|
||||||
if( cl_nopred.value || cl.intermission )
|
if( cl_nopred.value || cl.intermission )
|
||||||
return false;
|
return false;
|
||||||
@@ -544,8 +544,8 @@ void GAME_EXPORT CL_SetSolidPlayers( int playernum )
|
|||||||
// some fields needs to be override from cls.predicted_players
|
// some fields needs to be override from cls.predicted_players
|
||||||
VectorCopy( player->origin, pe->origin );
|
VectorCopy( player->origin, pe->origin );
|
||||||
VectorCopy( player->angles, pe->angles );
|
VectorCopy( player->angles, pe->angles );
|
||||||
VectorCopy( clgame.pmove->player_mins[player->usehull], pe->mins );
|
VectorCopy( host.player_mins[player->usehull], pe->mins );
|
||||||
VectorCopy( clgame.pmove->player_maxs[player->usehull], pe->maxs );
|
VectorCopy( host.player_maxs[player->usehull], pe->maxs );
|
||||||
pe->movetype = player->movetype;
|
pe->movetype = player->movetype;
|
||||||
pe->solid = player->solid;
|
pe->solid = player->solid;
|
||||||
}
|
}
|
||||||
@@ -853,7 +853,7 @@ static void CL_SetupPMove( playermove_t *pmove, const local_state_t *from, const
|
|||||||
VectorCopy( cd->vuser4, pmove->vuser4 );
|
VectorCopy( cd->vuser4, pmove->vuser4 );
|
||||||
pmove->cmd = *ucmd; // copy current cmds
|
pmove->cmd = *ucmd; // copy current cmds
|
||||||
|
|
||||||
Q_strncpy( pmove->physinfo, cls.physinfo, MAX_INFO_STRING );
|
Q_strncpy( pmove->physinfo, cls.physinfo, sizeof( pmove->physinfo ));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const void CL_FinishPMove( const playermove_t *pmove, local_state_t *to )
|
static const void CL_FinishPMove( const playermove_t *pmove, local_state_t *to )
|
||||||
|
|||||||
@@ -22,22 +22,24 @@ GNU General Public License for more details.
|
|||||||
#include "hltv.h"
|
#include "hltv.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
|
||||||
#define STAT_HEALTH 0
|
enum {
|
||||||
#define STAT_FRAGS 1
|
STAT_HEALTH = 0,
|
||||||
#define STAT_WEAPON 2
|
STAT_FRAGS,
|
||||||
#define STAT_AMMO 3
|
STAT_WEAPON,
|
||||||
#define STAT_ARMOR 4
|
STAT_AMMO,
|
||||||
#define STAT_WEAPONFRAME 5
|
STAT_ARMOR,
|
||||||
#define STAT_SHELLS 6
|
STAT_WEAPONFRAME,
|
||||||
#define STAT_NAILS 7
|
STAT_SHELLS,
|
||||||
#define STAT_ROCKETS 8
|
STAT_NAILS,
|
||||||
#define STAT_CELLS 9
|
STAT_ROCKETS,
|
||||||
#define STAT_ACTIVEWEAPON 10
|
STAT_CELLS,
|
||||||
#define STAT_TOTALSECRETS 11
|
STAT_ACTIVEWEAPON,
|
||||||
#define STAT_TOTALMONSTERS 12
|
STAT_TOTALSECRETS,
|
||||||
#define STAT_SECRETS 13 // bumped on client side by svc_foundsecret
|
STAT_TOTALMONSTERS,
|
||||||
#define STAT_MONSTERS 14 // bumped by svc_killedmonster
|
STAT_SECRETS, // bumped on client side by svc_foundsecret
|
||||||
#define MAX_STATS 32
|
STAT_MONSTERS, // bumped by svc_killedmonster
|
||||||
|
MAX_STATS = 32,
|
||||||
|
};
|
||||||
|
|
||||||
static char cmd_buf[8192];
|
static char cmd_buf[8192];
|
||||||
static char msg_buf[8192];
|
static char msg_buf[8192];
|
||||||
@@ -211,7 +213,7 @@ static void CL_ParseQuakeServerInfo( sizebuf_t *msg )
|
|||||||
clgame.maxEntities = GI->max_edicts;
|
clgame.maxEntities = GI->max_edicts;
|
||||||
clgame.maxEntities = bound( 600, clgame.maxEntities, MAX_EDICTS );
|
clgame.maxEntities = bound( 600, clgame.maxEntities, MAX_EDICTS );
|
||||||
clgame.maxModels = MAX_MODELS;
|
clgame.maxModels = MAX_MODELS;
|
||||||
Q_strncpy( clgame.maptitle, MSG_ReadString( msg ), MAX_STRING );
|
Q_strncpy( clgame.maptitle, MSG_ReadString( msg ), sizeof( clgame.maptitle ));
|
||||||
|
|
||||||
// Re-init hud video, especially if we changed game directories
|
// Re-init hud video, especially if we changed game directories
|
||||||
clgame.dllFuncs.pfnVidInit();
|
clgame.dllFuncs.pfnVidInit();
|
||||||
@@ -328,7 +330,7 @@ static void CL_ParseQuakeServerInfo( sizebuf_t *msg )
|
|||||||
clgame.movevars.gravity = 800.0f; // quake doesn't write gravity in demos
|
clgame.movevars.gravity = 800.0f; // quake doesn't write gravity in demos
|
||||||
clgame.movevars.maxvelocity = 2000.0f;
|
clgame.movevars.maxvelocity = 2000.0f;
|
||||||
|
|
||||||
memcpy( &clgame.oldmovevars, &clgame.movevars, sizeof( movevars_t ));
|
clgame.oldmovevars = clgame.movevars;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -429,7 +431,7 @@ static void CL_ParseQuakeEntityData( sizebuf_t *msg, int bits )
|
|||||||
cls.signon = SIGNONS;
|
cls.signon = SIGNONS;
|
||||||
|
|
||||||
// Clear loading plaque.
|
// Clear loading plaque.
|
||||||
CL_SignonReply ();
|
CL_SignonReply( PROTO_QUAKE );
|
||||||
}
|
}
|
||||||
|
|
||||||
// alloc next slot to store update
|
// alloc next slot to store update
|
||||||
@@ -620,7 +622,7 @@ static void CL_ParseQuakeDamage( sizebuf_t *msg )
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
===================
|
===================
|
||||||
CL_ParseQuakeStaticEntity
|
CL_ParseStaticEntity
|
||||||
|
|
||||||
===================
|
===================
|
||||||
*/
|
*/
|
||||||
@@ -646,7 +648,7 @@ static void CL_ParseQuakeStaticEntity( sizebuf_t *msg )
|
|||||||
i = clgame.numStatics;
|
i = clgame.numStatics;
|
||||||
if( i >= MAX_STATIC_ENTITIES )
|
if( i >= MAX_STATIC_ENTITIES )
|
||||||
{
|
{
|
||||||
Con_Printf( S_ERROR "CL_ParseStaticEntity: static entities limit exceeded!\n" );
|
Con_Printf( S_ERROR "%s: static entities limit exceeded!\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,7 +699,7 @@ static void CL_ParseQuakeBaseline( sizebuf_t *msg )
|
|||||||
newnum = MSG_ReadWord( msg ); // entnum
|
newnum = MSG_ReadWord( msg ); // entnum
|
||||||
|
|
||||||
if( newnum >= clgame.maxEntities )
|
if( newnum >= clgame.maxEntities )
|
||||||
Host_Error( "CL_AllocEdict: no free edicts\n" );
|
Host_Error( "%s: no free edicts\n", __func__ );
|
||||||
|
|
||||||
// parse baseline
|
// parse baseline
|
||||||
memset( &state, 0, sizeof( state ));
|
memset( &state, 0, sizeof( state ));
|
||||||
@@ -715,8 +717,7 @@ static void CL_ParseQuakeBaseline( sizebuf_t *msg )
|
|||||||
ent = CL_EDICT_NUM( newnum );
|
ent = CL_EDICT_NUM( newnum );
|
||||||
ent->index = newnum;
|
ent->index = newnum;
|
||||||
ent->player = CL_IsPlayerIndex( newnum );
|
ent->player = CL_IsPlayerIndex( newnum );
|
||||||
memcpy( &ent->baseline, &state, sizeof( entity_state_t ));
|
ent->prevstate = ent->baseline = state;
|
||||||
memcpy( &ent->prevstate, &state, sizeof( entity_state_t ));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -778,7 +779,7 @@ static void CL_ParseQuakeSignon( sizebuf_t *msg )
|
|||||||
int i = MSG_ReadByte( msg );
|
int i = MSG_ReadByte( msg );
|
||||||
|
|
||||||
if( i == 3 ) cls.signon = SIGNONS - 1;
|
if( i == 3 ) cls.signon = SIGNONS - 1;
|
||||||
Con_Reportf( "CL_Signon: %d\n", i );
|
Con_Reportf( "%s: %d\n", __func__, i );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -844,7 +845,7 @@ static void CL_QuakeExecStuff( void )
|
|||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
// skip whitespace up to a /n
|
// skip whitespace up to a /n
|
||||||
while( *text && ((byte)*text) <= ' ' && *text != '\r' && *text != '\n' )
|
while( *text && ((byte)*text ) <= ' ' && *text != '\r' && *text != '\n' )
|
||||||
text++;
|
text++;
|
||||||
|
|
||||||
if( *text == '\n' || *text == '\r' )
|
if( *text == '\n' || *text == '\r' )
|
||||||
@@ -886,38 +887,21 @@ CL_ParseQuakeMessage
|
|||||||
|
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
void CL_ParseQuakeMessage( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
int cmd, param1, param2;
|
int cmd, param1, param2;
|
||||||
size_t bufStart;
|
size_t bufStart;
|
||||||
const char *str;
|
const char *str;
|
||||||
|
|
||||||
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
|
|
||||||
CL_Parse_Debug( true ); // begin parsing
|
|
||||||
|
|
||||||
// init excise buffer
|
// init excise buffer
|
||||||
MSG_Init( &msg_demo, "UserMsg", msg_buf, sizeof( msg_buf ));
|
MSG_Init( &msg_demo, "UserMsg", msg_buf, sizeof( msg_buf ));
|
||||||
|
|
||||||
if( normal_message )
|
|
||||||
{
|
|
||||||
// assume no entity/player update this packet
|
|
||||||
if( cls.state == ca_active )
|
|
||||||
{
|
|
||||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
|
|
||||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse the message
|
// parse the message
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
{
|
{
|
||||||
Host_Error( "CL_ParseServerMessage: overflow!\n" );
|
Host_Error( "%s: overflow!\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -966,7 +950,7 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
break;
|
break;
|
||||||
case svc_time:
|
case svc_time:
|
||||||
Cbuf_AddText( "\n" ); // new frame was started
|
Cbuf_AddText( "\n" ); // new frame was started
|
||||||
CL_ParseServerTime( msg );
|
CL_ParseServerTime( msg, PROTO_QUAKE );
|
||||||
break;
|
break;
|
||||||
case svc_print:
|
case svc_print:
|
||||||
str = MSG_ReadString( msg );
|
str = MSG_ReadString( msg );
|
||||||
@@ -1108,14 +1092,11 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Host_Error( "CL_ParseServerMessage: Illegible server message\n" );
|
Host_Error( "%s: Illegible server message\n", __func__ );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
|
|
||||||
CL_Parse_Debug( false ); // done
|
|
||||||
|
|
||||||
// now process packet.
|
// now process packet.
|
||||||
CL_ProcessPacket( &cl.frames[cl.parsecountmod] );
|
CL_ProcessPacket( &cl.frames[cl.parsecountmod] );
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
int R_FatPVS( const vec3_t org, float radius, byte *visbuffer, qboolean merge, qboolean fullvis )
|
int R_FatPVS( const vec3_t org, float radius, byte *visbuffer, qboolean merge, qboolean fullvis )
|
||||||
{
|
{
|
||||||
return Mod_FatPVS( org, radius, visbuffer, world.visbytes, merge, fullvis );
|
return Mod_FatPVS( org, radius, visbuffer, world.visbytes, merge, fullvis, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
lightstyle_t *CL_GetLightStyle( int number )
|
lightstyle_t *CL_GetLightStyle( int number )
|
||||||
@@ -170,6 +170,12 @@ intptr_t CL_RenderGetParm( const int parm, const int arg, const qboolean checkRe
|
|||||||
return refState.width;
|
return refState.width;
|
||||||
case PARM_SCREEN_HEIGHT:
|
case PARM_SCREEN_HEIGHT:
|
||||||
return refState.height;
|
return refState.height;
|
||||||
|
case PARM_SKY_SPHERE:
|
||||||
|
return FBitSet( world.flags, FWORLD_SKYSPHERE ) && !FBitSet( world.flags, FWORLD_CUSTOM_SKYBOX );
|
||||||
|
case PARM_SURF_SAMPLESIZE:
|
||||||
|
if( arg >= 0 && arg < cl.worldmodel->numsurfaces )
|
||||||
|
return Mod_SampleSizeForFace( &cl.worldmodel->surfaces[arg] );
|
||||||
|
return LM_SAMPLE_SIZE;
|
||||||
default:
|
default:
|
||||||
// indicates call from client.dll
|
// indicates call from client.dll
|
||||||
if( checkRef )
|
if( checkRef )
|
||||||
@@ -341,7 +347,7 @@ qboolean R_InitRenderAPI( void )
|
|||||||
{
|
{
|
||||||
if( clgame.dllFuncs.pfnGetRenderInterface( CL_RENDER_INTERFACE_VERSION, &gRenderAPI, &clgame.drawFuncs ))
|
if( clgame.dllFuncs.pfnGetRenderInterface( CL_RENDER_INTERFACE_VERSION, &gRenderAPI, &clgame.drawFuncs ))
|
||||||
{
|
{
|
||||||
Con_Reportf( "CL_LoadProgs: ^2initailized extended RenderAPI ^7ver. %i\n", CL_RENDER_INTERFACE_VERSION );
|
Con_Reportf( "%s: ^2initailized extended RenderAPI ^7ver. %i\n", __func__, CL_RENDER_INTERFACE_VERSION );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ CVAR_DEFINE_AUTO( scr_centertime, "2.5", 0, "centerprint hold time" );
|
|||||||
CVAR_DEFINE_AUTO( scr_loading, "0", 0, "loading bar progress" );
|
CVAR_DEFINE_AUTO( scr_loading, "0", 0, "loading bar progress" );
|
||||||
CVAR_DEFINE_AUTO( scr_download, "-1", 0, "downloading bar progress" );
|
CVAR_DEFINE_AUTO( scr_download, "-1", 0, "downloading bar progress" );
|
||||||
CVAR_DEFINE( scr_viewsize, "viewsize", "120", FCVAR_ARCHIVE, "screen size (quake only)" );
|
CVAR_DEFINE( scr_viewsize, "viewsize", "120", FCVAR_ARCHIVE, "screen size (quake only)" );
|
||||||
CVAR_DEFINE_AUTO( cl_testlights, "0", 0, "test dynamic lights" );
|
CVAR_DEFINE_AUTO( cl_testlights, "0", FCVAR_CHEAT, "test dynamic lights" );
|
||||||
CVAR_DEFINE( cl_allow_levelshots, "allow_levelshots", "0", FCVAR_ARCHIVE, "allow engine to use indivdual levelshots instead of 'loading' image" );
|
CVAR_DEFINE( cl_allow_levelshots, "allow_levelshots", "0", FCVAR_ARCHIVE, "allow engine to use indivdual levelshots instead of 'loading' image" );
|
||||||
CVAR_DEFINE_AUTO( cl_levelshot_name, "*black", 0, "contains path to current levelshot" );
|
CVAR_DEFINE_AUTO( cl_levelshot_name, "*black", 0, "contains path to current levelshot" );
|
||||||
static CVAR_DEFINE_AUTO( cl_envshot_size, "256", FCVAR_ARCHIVE, "envshot size of cube side" );
|
static CVAR_DEFINE_AUTO( cl_envshot_size, "256", FCVAR_ARCHIVE, "envshot size of cube side" );
|
||||||
@@ -32,6 +32,7 @@ CVAR_DEFINE_AUTO( v_dark, "0", 0, "starts level from dark screen" );
|
|||||||
static CVAR_DEFINE_AUTO( net_speeds, "0", FCVAR_ARCHIVE, "show network packets" );
|
static CVAR_DEFINE_AUTO( net_speeds, "0", FCVAR_ARCHIVE, "show network packets" );
|
||||||
static CVAR_DEFINE_AUTO( cl_showfps, "0", FCVAR_ARCHIVE, "show client fps" );
|
static CVAR_DEFINE_AUTO( cl_showfps, "0", FCVAR_ARCHIVE, "show client fps" );
|
||||||
static CVAR_DEFINE_AUTO( cl_showpos, "0", FCVAR_ARCHIVE, "show local player position and velocity" );
|
static CVAR_DEFINE_AUTO( cl_showpos, "0", FCVAR_ARCHIVE, "show local player position and velocity" );
|
||||||
|
static CVAR_DEFINE_AUTO( cl_showents, "0", FCVAR_ARCHIVE | FCVAR_CHEAT, "show entities information (largely undone)" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -122,7 +123,7 @@ void SCR_DrawPos( void )
|
|||||||
if( cls.state != ca_active || !cl_showpos.value || cl.background )
|
if( cls.state != ca_active || !cl_showpos.value || cl.background )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ent = CL_GetLocalPlayer();
|
ent = CL_EDICT_NUM( cl.playernum + 1 );
|
||||||
speed = VectorLength( cl.simvel );
|
speed = VectorLength( cl.simvel );
|
||||||
|
|
||||||
Q_snprintf( msg, MAX_SYSPATH,
|
Q_snprintf( msg, MAX_SYSPATH,
|
||||||
@@ -140,6 +141,68 @@ void SCR_DrawPos( void )
|
|||||||
Con_DrawString( refState.width / 2, 4, msg, color );
|
Con_DrawString( refState.width / 2, 4, msg, color );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============
|
||||||
|
SCR_DrawEnts
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
void SCR_DrawEnts( void )
|
||||||
|
{
|
||||||
|
rgba_t color = { 255, 255, 255, 255 };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( cls.state != ca_active || !cl_showents.value || ( cl.maxclients > 1 && !cls.demoplayback ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// this probably better hook CL_AddVisibleEntities
|
||||||
|
// as entities might get added by client.dll
|
||||||
|
for( i = 0; i < clgame.maxEntities; i++ )
|
||||||
|
{
|
||||||
|
const cl_entity_t *ent = &clgame.entities[i];
|
||||||
|
string msg;
|
||||||
|
vec3_t screen, pos;
|
||||||
|
|
||||||
|
if( ent->curstate.messagenum != cl.parsecount )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
VectorCopy( ent->origin, pos );
|
||||||
|
|
||||||
|
if( ent->model != NULL )
|
||||||
|
{
|
||||||
|
vec3_t v;
|
||||||
|
|
||||||
|
// simple model type filter
|
||||||
|
if( cl_showents.value > 1 )
|
||||||
|
{
|
||||||
|
if( ent->model->type != (modtype_t)( cl_showents.value - 2 ))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
VectorAverage( ent->model->mins, ent->model->maxs, v );
|
||||||
|
VectorAdd( pos, v, pos );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !ref.dllFuncs.WorldToScreen( pos, screen ))
|
||||||
|
{
|
||||||
|
Q_snprintf( msg, sizeof( msg ),
|
||||||
|
"entity %d\n"
|
||||||
|
"model %s\n"
|
||||||
|
"movetype %d\n",
|
||||||
|
ent->index,
|
||||||
|
ent->model ? ent->model->name : "(null)",
|
||||||
|
ent->curstate.movetype );
|
||||||
|
|
||||||
|
screen[0] = 0.5f * screen[0] * refState.width;
|
||||||
|
screen[1] = -0.5f * screen[1] * refState.height;
|
||||||
|
screen[0] += 0.5f * refState.width;
|
||||||
|
screen[1] += 0.5f * refState.height;
|
||||||
|
|
||||||
|
|
||||||
|
Con_DrawString( screen[0], screen[1], msg, color );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============
|
==============
|
||||||
SCR_NetSpeeds
|
SCR_NetSpeeds
|
||||||
@@ -345,7 +408,7 @@ void SCR_MakeScreenShot( void )
|
|||||||
SCR_DrawPlaque
|
SCR_DrawPlaque
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
static void SCR_DrawPlaque( void )
|
static qboolean SCR_DrawPlaque( void )
|
||||||
{
|
{
|
||||||
if(( cl_allow_levelshots.value && !cls.changelevel ) || cl.background )
|
if(( cl_allow_levelshots.value && !cls.changelevel ) || cl.background )
|
||||||
{
|
{
|
||||||
@@ -353,7 +416,11 @@ static void SCR_DrawPlaque( void )
|
|||||||
ref.dllFuncs.GL_SetRenderMode( kRenderNormal );
|
ref.dllFuncs.GL_SetRenderMode( kRenderNormal );
|
||||||
ref.dllFuncs.R_DrawStretchPic( 0, 0, refState.width, refState.height, 0, 0, 1, 1, levelshot );
|
ref.dllFuncs.R_DrawStretchPic( 0, 0, refState.width, refState.height, 0, 0, 1, 1, levelshot );
|
||||||
if( !cl.background ) CL_DrawHUD( CL_LOADING );
|
if( !cl.background ) CL_DrawHUD( CL_LOADING );
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -363,15 +430,10 @@ SCR_BeginLoadingPlaque
|
|||||||
*/
|
*/
|
||||||
void SCR_BeginLoadingPlaque( qboolean is_background )
|
void SCR_BeginLoadingPlaque( qboolean is_background )
|
||||||
{
|
{
|
||||||
float oldclear = 0;;
|
|
||||||
S_StopAllSounds( true );
|
S_StopAllSounds( true );
|
||||||
cl.audio_prepped = false; // don't play ambients
|
cl.audio_prepped = false; // don't play ambients
|
||||||
cl.video_prepped = false;
|
|
||||||
|
|
||||||
if( !Host_IsDedicated() )
|
if( cls.key_dest == key_menu && !cls.changedemo && !is_background )
|
||||||
oldclear = gl_clear.value;
|
|
||||||
|
|
||||||
if( CL_IsInMenu( ) && !cls.changedemo && !is_background )
|
|
||||||
{
|
{
|
||||||
UI_SetActiveMenu( false );
|
UI_SetActiveMenu( false );
|
||||||
if( cls.state == ca_disconnected && !(GameState->curstate == STATE_RUNFRAME && GameState->nextstate != STATE_RUNFRAME) )
|
if( cls.state == ca_disconnected && !(GameState->curstate == STATE_RUNFRAME && GameState->nextstate != STATE_RUNFRAME) )
|
||||||
@@ -384,18 +446,15 @@ void SCR_BeginLoadingPlaque( qboolean is_background )
|
|||||||
if( cls.key_dest == key_console )
|
if( cls.key_dest == key_console )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( !Host_IsDedicated() )
|
|
||||||
gl_clear.value = 0.0f;
|
|
||||||
|
|
||||||
if( is_background ) IN_MouseSavePos( );
|
if( is_background ) IN_MouseSavePos( );
|
||||||
cls.draw_changelevel = !is_background;
|
cls.draw_changelevel = !is_background;
|
||||||
SCR_UpdateScreen();
|
SCR_UpdateScreen();
|
||||||
|
|
||||||
|
// set video_prepped after update screen, so engine can draw last remaining frame
|
||||||
|
cl.video_prepped = false;
|
||||||
cls.disable_screen = host.realtime;
|
cls.disable_screen = host.realtime;
|
||||||
cl.background = is_background; // set right state before svc_serverdata is came
|
cl.background = is_background; // set right state before svc_serverdata is came
|
||||||
|
|
||||||
if( !Host_IsDedicated() )
|
|
||||||
gl_clear.value = oldclear;
|
|
||||||
|
|
||||||
// SNDDMA_LockSound();
|
// SNDDMA_LockSound();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +504,7 @@ void SCR_TileClear( void )
|
|||||||
int i, top, bottom, left, right;
|
int i, top, bottom, left, right;
|
||||||
dirty_t clear;
|
dirty_t clear;
|
||||||
|
|
||||||
if( scr_viewsize.value >= 120 )
|
if( likely( scr_viewsize.value >= 120 ))
|
||||||
return; // full screen rendering
|
return; // full screen rendering
|
||||||
|
|
||||||
// erase rect will be the union of the past three frames
|
// erase rect will be the union of the past three frames
|
||||||
@@ -523,6 +582,8 @@ text to the screen.
|
|||||||
*/
|
*/
|
||||||
void SCR_UpdateScreen( void )
|
void SCR_UpdateScreen( void )
|
||||||
{
|
{
|
||||||
|
qboolean screen_redraw = true; // assume screen has been redrawn
|
||||||
|
|
||||||
if( !V_PreRender( )) return;
|
if( !V_PreRender( )) return;
|
||||||
|
|
||||||
switch( cls.state )
|
switch( cls.state )
|
||||||
@@ -533,7 +594,7 @@ void SCR_UpdateScreen( void )
|
|||||||
case ca_connecting:
|
case ca_connecting:
|
||||||
case ca_connected:
|
case ca_connected:
|
||||||
case ca_validate:
|
case ca_validate:
|
||||||
SCR_DrawPlaque();
|
screen_redraw = SCR_DrawPlaque();
|
||||||
break;
|
break;
|
||||||
case ca_active:
|
case ca_active:
|
||||||
Con_RunConsole ();
|
Con_RunConsole ();
|
||||||
@@ -543,11 +604,15 @@ void SCR_UpdateScreen( void )
|
|||||||
SCR_DrawCinematic();
|
SCR_DrawCinematic();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Host_Error( "SCR_UpdateScreen: bad cls.state\n" );
|
Host_Error( "%s: bad cls.state\n", __func__ );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
V_PostRender();
|
// during changelevel we might have a few frames when we have nothing to draw
|
||||||
|
// (assuming levelshots are off) and drawing 2d on top of nothing or cleared screen
|
||||||
|
// is ugly, specifically with Adreno and ImgTec GPUs
|
||||||
|
if( screen_redraw || !cls.changelevel || !cls.changedemo )
|
||||||
|
V_PostRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -753,6 +818,9 @@ void SCR_Init( void )
|
|||||||
Cvar_RegisterVariable( &net_speeds );
|
Cvar_RegisterVariable( &net_speeds );
|
||||||
Cvar_RegisterVariable( &cl_showfps );
|
Cvar_RegisterVariable( &cl_showfps );
|
||||||
Cvar_RegisterVariable( &cl_showpos );
|
Cvar_RegisterVariable( &cl_showpos );
|
||||||
|
#ifdef _DEBUG
|
||||||
|
Cvar_RegisterVariable( &cl_showents );
|
||||||
|
#endif // NDEBUG
|
||||||
|
|
||||||
// register our commands
|
// register our commands
|
||||||
Cmd_AddCommand( "skyname", CL_SetSky_f, "set new skybox by basename" );
|
Cmd_AddCommand( "skyname", CL_SetSky_f, "set new skybox by basename" );
|
||||||
@@ -785,7 +853,6 @@ void SCR_Shutdown( void )
|
|||||||
{
|
{
|
||||||
if( !scr_init ) return;
|
if( !scr_init ) return;
|
||||||
|
|
||||||
Cmd_RemoveCommand( "timerefresh" );
|
|
||||||
Cmd_RemoveCommand( "skyname" );
|
Cmd_RemoveCommand( "skyname" );
|
||||||
Cmd_RemoveCommand( "viewpos" );
|
Cmd_RemoveCommand( "viewpos" );
|
||||||
UI_SetActiveMenu( false );
|
UI_SetActiveMenu( false );
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -77,7 +77,6 @@ void R_MultiGunshot( const vec3_t org, const vec3_t dir, const vec3_t noise, int
|
|||||||
void R_FireField( float *org, int radius, int modelIndex, int count, int flags, float life );
|
void R_FireField( float *org, int radius, int modelIndex, int count, int flags, float life );
|
||||||
void R_PlayerSprites( int client, int modelIndex, int count, int size );
|
void R_PlayerSprites( int client, int modelIndex, int count, int size );
|
||||||
void R_Sprite_WallPuff( struct tempent_s *pTemp, float scale );
|
void R_Sprite_WallPuff( struct tempent_s *pTemp, float scale );
|
||||||
void R_DebugParticle( const vec3_t pos, byte r, byte g, byte b );
|
|
||||||
void R_RicochetSound( const vec3_t pos );
|
void R_RicochetSound( const vec3_t pos );
|
||||||
struct dlight_s *CL_AllocDlight( int key );
|
struct dlight_s *CL_AllocDlight( int key );
|
||||||
struct dlight_s *CL_AllocElight( int key );
|
struct dlight_s *CL_AllocElight( int key );
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static void V_CalcViewRect( void )
|
|||||||
int sb_lines;
|
int sb_lines;
|
||||||
float size;
|
float size;
|
||||||
|
|
||||||
if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE ))
|
if( Host_IsQuakeCompatible( ))
|
||||||
{
|
{
|
||||||
// intermission is always full screen
|
// intermission is always full screen
|
||||||
if( cl.intermission ) size = 120.0f;
|
if( cl.intermission ) size = 120.0f;
|
||||||
@@ -144,7 +144,9 @@ static void V_SetRefParams( ref_params_t *fd )
|
|||||||
VectorCopy( cl.viewangles, fd->cl_viewangles );
|
VectorCopy( cl.viewangles, fd->cl_viewangles );
|
||||||
fd->health = cl.local.health;
|
fd->health = cl.local.health;
|
||||||
VectorCopy( cl.crosshairangle, fd->crosshairangle );
|
VectorCopy( cl.crosshairangle, fd->crosshairangle );
|
||||||
fd->viewsize = scr_viewsize.value;
|
if( Host_IsQuakeCompatible( ))
|
||||||
|
fd->viewsize = scr_viewsize.value;
|
||||||
|
else fd->viewsize = 120.0f;
|
||||||
|
|
||||||
VectorCopy( cl.punchangle, fd->punchangle );
|
VectorCopy( cl.punchangle, fd->punchangle );
|
||||||
fd->maxclients = cl.maxclients;
|
fd->maxclients = cl.maxclients;
|
||||||
@@ -341,7 +343,7 @@ qboolean V_PreRender( void )
|
|||||||
{
|
{
|
||||||
if(( host.realtime - cls.disable_screen ) > cl_timeout.value )
|
if(( host.realtime - cls.disable_screen ) > cl_timeout.value )
|
||||||
{
|
{
|
||||||
Con_Reportf( "V_PreRender: loading plaque timed out\n" );
|
Con_Reportf( "%s: loading plaque timed out\n", __func__ );
|
||||||
cls.disable_screen = 0.0f;
|
cls.disable_screen = 0.0f;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -506,7 +508,6 @@ V_PostRender
|
|||||||
*/
|
*/
|
||||||
void V_PostRender( void )
|
void V_PostRender( void )
|
||||||
{
|
{
|
||||||
static double oldtime;
|
|
||||||
qboolean draw_2d = false;
|
qboolean draw_2d = false;
|
||||||
|
|
||||||
ref.dllFuncs.R_AllowFog( false );
|
ref.dllFuncs.R_AllowFog( false );
|
||||||
@@ -533,6 +534,7 @@ void V_PostRender( void )
|
|||||||
SCR_RSpeeds();
|
SCR_RSpeeds();
|
||||||
SCR_NetSpeeds();
|
SCR_NetSpeeds();
|
||||||
SCR_DrawPos();
|
SCR_DrawPos();
|
||||||
|
SCR_DrawEnts();
|
||||||
SCR_DrawNetGraph();
|
SCR_DrawNetGraph();
|
||||||
SV_DrawOrthoTriangles();
|
SV_DrawOrthoTriangles();
|
||||||
CL_DrawDemoRecording();
|
CL_DrawDemoRecording();
|
||||||
|
|||||||
@@ -129,7 +129,6 @@ typedef struct
|
|||||||
|
|
||||||
// misc local info
|
// misc local info
|
||||||
qboolean repredicting; // repredicting in progress
|
qboolean repredicting; // repredicting in progress
|
||||||
qboolean thirdperson;
|
|
||||||
qboolean apply_effects; // local player will not added but we should apply their effects: flashlight etc
|
qboolean apply_effects; // local player will not added but we should apply their effects: flashlight etc
|
||||||
float idealpitch;
|
float idealpitch;
|
||||||
int viewmodel;
|
int viewmodel;
|
||||||
@@ -229,7 +228,7 @@ typedef struct
|
|||||||
char serverinfo[MAX_SERVERINFO_STRING];
|
char serverinfo[MAX_SERVERINFO_STRING];
|
||||||
player_info_t players[MAX_CLIENTS]; // collected info about all other players include himself
|
player_info_t players[MAX_CLIENTS]; // collected info about all other players include himself
|
||||||
double lastresourcecheck;
|
double lastresourcecheck;
|
||||||
string downloadUrl;
|
qboolean http_download;
|
||||||
event_state_t events;
|
event_state_t events;
|
||||||
|
|
||||||
// predicting stuff but not only...
|
// predicting stuff but not only...
|
||||||
@@ -276,6 +275,10 @@ typedef struct
|
|||||||
model_t *worldmodel; // pointer to world
|
model_t *worldmodel; // pointer to world
|
||||||
|
|
||||||
int lostpackets; // count lost packets and show dialog in menu
|
int lostpackets; // count lost packets and show dialog in menu
|
||||||
|
|
||||||
|
double frametime_remainder;
|
||||||
|
|
||||||
|
uint worldmapCRC;
|
||||||
} client_t;
|
} client_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -491,7 +494,6 @@ typedef struct
|
|||||||
|
|
||||||
net_request_t net_requests[MAX_REQUESTS]; // no reason to keep more
|
net_request_t net_requests[MAX_REQUESTS]; // no reason to keep more
|
||||||
|
|
||||||
efrag_t *free_efrags; // linked efrags
|
|
||||||
cl_entity_t viewent; // viewmodel
|
cl_entity_t viewent; // viewmodel
|
||||||
|
|
||||||
qboolean client_dll_uses_sdl;
|
qboolean client_dll_uses_sdl;
|
||||||
@@ -508,8 +510,9 @@ typedef struct
|
|||||||
player_info_t playerinfo; // local playerinfo
|
player_info_t playerinfo; // local playerinfo
|
||||||
|
|
||||||
gameui_draw_t ds; // draw2d stuff (menu images)
|
gameui_draw_t ds; // draw2d stuff (menu images)
|
||||||
GAMEINFO gameInfo; // current gameInfo
|
gameinfo2_t gameInfo; // current gameInfo
|
||||||
GAMEINFO *modsInfo[MAX_MODS]; // simplified gameInfo for MainUI
|
gameinfo2_t *modsInfo; // simplified gameInfo for MainUI, allocated by demand
|
||||||
|
GAMEINFO **oldModsInfo; // simplified gameInfo for older MainUI, allocated by demand
|
||||||
|
|
||||||
ui_globalvars_t *globals;
|
ui_globalvars_t *globals;
|
||||||
|
|
||||||
@@ -518,7 +521,7 @@ typedef struct
|
|||||||
int logo_yres;
|
int logo_yres;
|
||||||
float logo_length;
|
float logo_length;
|
||||||
|
|
||||||
qboolean use_text_api;
|
qboolean use_extended_api;
|
||||||
} gameui_static_t;
|
} gameui_static_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -539,12 +542,8 @@ typedef struct
|
|||||||
|
|
||||||
poolhandle_t mempool; // client premamnent pool: edicts etc
|
poolhandle_t mempool; // client premamnent pool: edicts etc
|
||||||
|
|
||||||
netadr_t hltv_listen_address;
|
|
||||||
|
|
||||||
int signon; // 0 to SIGNONS, for the signon sequence.
|
int signon; // 0 to SIGNONS, for the signon sequence.
|
||||||
int quakePort; // a 16 bit value that allows quake servers
|
|
||||||
// to work around address translating routers
|
|
||||||
// g-cont. this port allow many copies of engine in multiplayer game
|
|
||||||
// connection information
|
// connection information
|
||||||
char servername[MAX_QPATH]; // name of server from original connect
|
char servername[MAX_QPATH]; // name of server from original connect
|
||||||
double connect_time; // for connection retransmits
|
double connect_time; // for connection retransmits
|
||||||
@@ -561,7 +560,6 @@ typedef struct
|
|||||||
byte datagram_buf[MAX_DATAGRAM];
|
byte datagram_buf[MAX_DATAGRAM];
|
||||||
|
|
||||||
netchan_t netchan;
|
netchan_t netchan;
|
||||||
int challenge; // from the server to use for connecting
|
|
||||||
|
|
||||||
float packet_loss;
|
float packet_loss;
|
||||||
double packet_loss_recalc_time;
|
double packet_loss_recalc_time;
|
||||||
@@ -628,12 +626,14 @@ typedef struct
|
|||||||
char internetservers_query[512]; // cached query
|
char internetservers_query[512]; // cached query
|
||||||
uint32_t internetservers_query_len;
|
uint32_t internetservers_query_len;
|
||||||
|
|
||||||
// legacy mode support
|
// multiprotocol support
|
||||||
qboolean legacymode; // one-way 48 protocol compatibility
|
connprotocol_t legacymode;
|
||||||
netadr_t legacyserver;
|
|
||||||
int extensions;
|
int extensions;
|
||||||
|
|
||||||
netadr_t serveradr;
|
netadr_t serveradr;
|
||||||
|
|
||||||
|
// do we accept utf8 as input
|
||||||
|
qboolean accept_utf8;
|
||||||
} client_static_t;
|
} client_static_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -652,15 +652,13 @@ extern gameui_static_t gameui;
|
|||||||
//
|
//
|
||||||
// cvars
|
// cvars
|
||||||
//
|
//
|
||||||
|
extern convar_t showpause;
|
||||||
extern convar_t mp_decals;
|
extern convar_t mp_decals;
|
||||||
extern convar_t cl_logofile;
|
extern convar_t cl_logomaxdim;
|
||||||
extern convar_t cl_logocolor;
|
|
||||||
extern convar_t cl_allow_download;
|
extern convar_t cl_allow_download;
|
||||||
extern convar_t cl_allow_upload;
|
|
||||||
extern convar_t cl_download_ingame;
|
extern convar_t cl_download_ingame;
|
||||||
extern convar_t cl_nopred;
|
extern convar_t cl_nopred;
|
||||||
extern convar_t cl_timeout;
|
extern convar_t cl_timeout;
|
||||||
extern convar_t cl_nodelta;
|
|
||||||
extern convar_t cl_interp;
|
extern convar_t cl_interp;
|
||||||
extern convar_t cl_nointerp;
|
extern convar_t cl_nointerp;
|
||||||
extern convar_t cl_showerror;
|
extern convar_t cl_showerror;
|
||||||
@@ -673,13 +671,11 @@ extern convar_t cl_updaterate;
|
|||||||
extern convar_t cl_solid_players;
|
extern convar_t cl_solid_players;
|
||||||
extern convar_t cl_idealpitchscale;
|
extern convar_t cl_idealpitchscale;
|
||||||
extern convar_t cl_allow_levelshots;
|
extern convar_t cl_allow_levelshots;
|
||||||
extern convar_t cl_lightstyle_lerping;
|
|
||||||
extern convar_t cl_draw_particles;
|
extern convar_t cl_draw_particles;
|
||||||
extern convar_t cl_draw_tracers;
|
extern convar_t cl_draw_tracers;
|
||||||
extern convar_t cl_levelshot_name;
|
extern convar_t cl_levelshot_name;
|
||||||
extern convar_t cl_draw_beams;
|
extern convar_t cl_draw_beams;
|
||||||
extern convar_t cl_clockreset;
|
extern convar_t cl_clockreset;
|
||||||
extern convar_t cl_fixtimerate;
|
|
||||||
extern convar_t hud_fontscale;
|
extern convar_t hud_fontscale;
|
||||||
extern convar_t hud_fontrender;
|
extern convar_t hud_fontrender;
|
||||||
extern convar_t hud_scale;
|
extern convar_t hud_scale;
|
||||||
@@ -751,13 +747,13 @@ void CL_Particle( const vec3_t org, int color, float life, int zpos, int zvel );
|
|||||||
void CL_Init( void );
|
void CL_Init( void );
|
||||||
void CL_Disconnect_f( void );
|
void CL_Disconnect_f( void );
|
||||||
void CL_ProcessFile( qboolean successfully_received, const char *filename );
|
void CL_ProcessFile( qboolean successfully_received, const char *filename );
|
||||||
void CL_WriteUsercmd( sizebuf_t *msg, int from, int to );
|
void CL_WriteUsercmd( connprotocol_t proto, sizebuf_t *msg, int from, int to );
|
||||||
int CL_GetFragmentSize( void *unused , fragsize_t mode );
|
void CL_SetupNetchanForProtocol( connprotocol_t proto );
|
||||||
qboolean CL_PrecacheResources( void );
|
qboolean CL_PrecacheResources( void );
|
||||||
void CL_SetupOverviewParams( void );
|
void CL_SetupOverviewParams( void );
|
||||||
void CL_UpdateFrameLerp( void );
|
void CL_UpdateFrameLerp( void );
|
||||||
int CL_IsDevOverviewMode( void );
|
int CL_IsDevOverviewMode( void );
|
||||||
void CL_SignonReply( void );
|
void CL_SignonReply( connprotocol_t proto );
|
||||||
void CL_ClearState( void );
|
void CL_ClearState( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -781,13 +777,14 @@ void CL_Demos_f( void );
|
|||||||
void CL_DeleteDemo_f( void );
|
void CL_DeleteDemo_f( void );
|
||||||
void CL_Record_f( void );
|
void CL_Record_f( void );
|
||||||
void CL_Stop_f( void );
|
void CL_Stop_f( void );
|
||||||
|
void CL_ListDemo_f( void );
|
||||||
int CL_GetDemoComment( const char *demoname, char *comment );
|
int CL_GetDemoComment( const char *demoname, char *comment );
|
||||||
|
|
||||||
//
|
//
|
||||||
// cl_events.c
|
// cl_events.c
|
||||||
//
|
//
|
||||||
void CL_ParseEvent( sizebuf_t *msg );
|
void CL_ParseEvent( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseReliableEvent( sizebuf_t *msg );
|
void CL_ParseReliableEvent( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_SetEventIndex( const char *szEvName, int ev_index );
|
void CL_SetEventIndex( const char *szEvName, int ev_index );
|
||||||
void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, float delay, float *origin,
|
void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, float delay, float *origin,
|
||||||
float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||||
@@ -849,14 +846,14 @@ _inline cl_entity_t *CL_EDICT_NUM( int n )
|
|||||||
{
|
{
|
||||||
if( !clgame.entities )
|
if( !clgame.entities )
|
||||||
{
|
{
|
||||||
Host_Error( "CL_EDICT_NUM: clgame.entities is NULL\n");
|
Host_Error( "%s: clgame.entities is NULL\n", __func__ );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(( n >= 0 ) && ( n < clgame.maxEntities ))
|
if(( n >= 0 ) && ( n < clgame.maxEntities ))
|
||||||
return clgame.entities + n;
|
return clgame.entities + n;
|
||||||
|
|
||||||
Host_Error( "CL_EDICT_NUM: bad number %i\n", n );
|
Host_Error( "%s: bad number %i\n", __func__, n );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -864,20 +861,21 @@ _inline cl_entity_t *CL_EDICT_NUM( int n )
|
|||||||
// cl_parse.c
|
// cl_parse.c
|
||||||
//
|
//
|
||||||
void CL_ParseSetAngle( sizebuf_t *msg );
|
void CL_ParseSetAngle( sizebuf_t *msg );
|
||||||
void CL_ParseServerData( sizebuf_t *msg, qboolean legacy );
|
void CL_ParseServerData( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseLightStyle( sizebuf_t *msg );
|
void CL_ParseLightStyle( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_UpdateUserinfo( sizebuf_t *msg, qboolean legacy );
|
void CL_UpdateUserinfo( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseResource( sizebuf_t *msg );
|
void CL_ParseResource( sizebuf_t *msg );
|
||||||
void CL_ParseClientData( sizebuf_t *msg );
|
void CL_ParseClientData( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_UpdateUserPings( sizebuf_t *msg );
|
void CL_UpdateUserPings( sizebuf_t *msg );
|
||||||
void CL_ParseParticles( sizebuf_t *msg );
|
void CL_ParseParticles( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseRestoreSoundPacket( sizebuf_t *msg );
|
void CL_ParseRestoreSoundPacket( sizebuf_t *msg );
|
||||||
void CL_ParseBaseline( sizebuf_t *msg, qboolean legacy );
|
void CL_ParseBaseline( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseSignon( sizebuf_t *msg );
|
void CL_ParseSignon( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseRestore( sizebuf_t *msg );
|
void CL_ParseRestore( sizebuf_t *msg );
|
||||||
void CL_ParseStaticDecal( sizebuf_t *msg );
|
void CL_ParseStaticDecal( sizebuf_t *msg );
|
||||||
void CL_ParseAddAngle( sizebuf_t *msg );
|
void CL_ParseAddAngle( sizebuf_t *msg );
|
||||||
void CL_RegisterUserMessage( sizebuf_t *msg );
|
void CL_RegisterUserMessage( sizebuf_t *msg, connprotocol_t proto );
|
||||||
|
void CL_ParseResourceList( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseMovevars( sizebuf_t *msg );
|
void CL_ParseMovevars( sizebuf_t *msg );
|
||||||
void CL_ParseResourceRequest( sizebuf_t *msg );
|
void CL_ParseResourceRequest( sizebuf_t *msg );
|
||||||
void CL_ParseCustomization( sizebuf_t *msg );
|
void CL_ParseCustomization( sizebuf_t *msg );
|
||||||
@@ -886,27 +884,36 @@ void CL_ParseSoundFade( sizebuf_t *msg );
|
|||||||
void CL_ParseFileTransferFailed( sizebuf_t *msg );
|
void CL_ParseFileTransferFailed( sizebuf_t *msg );
|
||||||
void CL_ParseHLTV( sizebuf_t *msg );
|
void CL_ParseHLTV( sizebuf_t *msg );
|
||||||
void CL_ParseDirector( sizebuf_t *msg );
|
void CL_ParseDirector( sizebuf_t *msg );
|
||||||
|
void CL_ParseVoiceInit( sizebuf_t *msg );
|
||||||
|
void CL_ParseVoiceData( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseResLocation( sizebuf_t *msg );
|
void CL_ParseResLocation( sizebuf_t *msg );
|
||||||
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext );
|
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext, const connprotocol_t proto );
|
||||||
void CL_ParseServerMessage( sizebuf_t *msg, qboolean normal_message );
|
void CL_ParseServerMessage( sizebuf_t *msg );
|
||||||
void CL_ParseTempEntity( sizebuf_t *msg );
|
qboolean CL_ParseCommonDLLMessage( sizebuf_t *msg, connprotocol_t proto, int svc_num, int startoffset );
|
||||||
|
void CL_ParseTempEntity( sizebuf_t *msg, connprotocol_t proto );
|
||||||
qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf );
|
qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf );
|
||||||
qboolean CL_RequestMissingResources( void );
|
qboolean CL_RequestMissingResources( void );
|
||||||
void CL_RegisterResources ( sizebuf_t *msg );
|
void CL_RegisterResources( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseViewEntity( sizebuf_t *msg );
|
void CL_ParseViewEntity( sizebuf_t *msg );
|
||||||
void CL_ParseServerTime( sizebuf_t *msg );
|
void CL_ParseServerTime( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseUserMessage( sizebuf_t *msg, int svc_num );
|
void CL_ParseUserMessage( sizebuf_t *msg, int svc_num, connprotocol_t proto );
|
||||||
void CL_ParseFinaleCutscene( sizebuf_t *msg, int level );
|
void CL_ParseFinaleCutscene( sizebuf_t *msg, int level );
|
||||||
void CL_ParseTextMessage( sizebuf_t *msg );
|
void CL_ParseTextMessage( sizebuf_t *msg );
|
||||||
|
void CL_ParseExec( sizebuf_t *msg );
|
||||||
void CL_BatchResourceRequest( qboolean initialize );
|
void CL_BatchResourceRequest( qboolean initialize );
|
||||||
int CL_EstimateNeededResources( void );
|
int CL_EstimateNeededResources( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
// cl_parse_48.c
|
// cl_parse_48.c
|
||||||
//
|
//
|
||||||
void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message );
|
void CL_ParseLegacyServerMessage( sizebuf_t *msg );
|
||||||
void CL_LegacyPrecache_f( void );
|
void CL_LegacyPrecache_f( void );
|
||||||
|
|
||||||
|
//
|
||||||
|
// cl_parse_gs.c
|
||||||
|
//
|
||||||
|
void CL_ParseGoldSrcServerMessage( sizebuf_t *msg );
|
||||||
|
|
||||||
//
|
//
|
||||||
// cl_scrn.c
|
// cl_scrn.c
|
||||||
//
|
//
|
||||||
@@ -922,6 +929,7 @@ void SCR_NetSpeeds( void );
|
|||||||
void SCR_RSpeeds( void );
|
void SCR_RSpeeds( void );
|
||||||
void SCR_DrawFPS( int height );
|
void SCR_DrawFPS( int height );
|
||||||
void SCR_DrawPos( void );
|
void SCR_DrawPos( void );
|
||||||
|
void SCR_DrawEnts( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
// cl_netgraph.c
|
// cl_netgraph.c
|
||||||
@@ -947,7 +955,6 @@ void CL_SetSolidPlayers( int playernum );
|
|||||||
void CL_InitClientMove( void );
|
void CL_InitClientMove( void );
|
||||||
void CL_PredictMovement( qboolean repredicting );
|
void CL_PredictMovement( qboolean repredicting );
|
||||||
void CL_CheckPredictionError( void );
|
void CL_CheckPredictionError( void );
|
||||||
qboolean CL_IsPredicted( void );
|
|
||||||
int CL_WaterEntity( const float *rgflPos );
|
int CL_WaterEntity( const float *rgflPos );
|
||||||
cl_entity_t *CL_GetWaterEntity( const float *rgflPos );
|
cl_entity_t *CL_GetWaterEntity( const float *rgflPos );
|
||||||
pmtrace_t *CL_VisTraceLine( vec3_t start, vec3_t end, int flags );
|
pmtrace_t *CL_VisTraceLine( vec3_t start, vec3_t end, int flags );
|
||||||
@@ -963,14 +970,16 @@ void CL_SetIdealPitch( void );
|
|||||||
//
|
//
|
||||||
// cl_qparse.c
|
// cl_qparse.c
|
||||||
//
|
//
|
||||||
void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message );
|
void CL_ParseQuakeMessage( sizebuf_t *msg );
|
||||||
|
|
||||||
//
|
//
|
||||||
// cl_frame.c
|
// cl_frame.c
|
||||||
//
|
//
|
||||||
struct channel_s;
|
struct channel_s;
|
||||||
struct rawchan_s;
|
struct rawchan_s;
|
||||||
int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta );
|
qboolean CL_ValidateDeltaPacket( uint oldpacket, frame_t *oldframe );
|
||||||
|
int CL_UpdateOldEntNum( int oldindex, frame_t *oldframe, entity_state_t **oldent );
|
||||||
|
int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta, connprotocol_t proto );
|
||||||
qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType );
|
qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType );
|
||||||
void CL_ResetLatchedVars( cl_entity_t *ent, qboolean full_reset );
|
void CL_ResetLatchedVars( cl_entity_t *ent, qboolean full_reset );
|
||||||
qboolean CL_GetEntitySpatialization( struct channel_s *ch );
|
qboolean CL_GetEntitySpatialization( struct channel_s *ch );
|
||||||
@@ -1020,7 +1029,6 @@ void CL_InitParticles( void );
|
|||||||
void CL_ClearParticles( void );
|
void CL_ClearParticles( void );
|
||||||
void CL_FreeParticles( void );
|
void CL_FreeParticles( void );
|
||||||
void CL_InitTempEnts( void );
|
void CL_InitTempEnts( void );
|
||||||
void CL_ClearTempEnts( void );
|
|
||||||
void CL_FreeTempEnts( void );
|
void CL_FreeTempEnts( void );
|
||||||
void CL_TempEntUpdate( void );
|
void CL_TempEntUpdate( void );
|
||||||
void CL_InitViewBeams( void );
|
void CL_InitViewBeams( void );
|
||||||
@@ -1056,7 +1064,6 @@ int Con_UtfMoveRight( char *str, int pos, int length );
|
|||||||
void Con_DefaultColor( int r, int g, int b, qboolean gameui );
|
void Con_DefaultColor( int r, int g, int b, qboolean gameui );
|
||||||
cl_font_t *Con_GetCurFont( void );
|
cl_font_t *Con_GetCurFont( void );
|
||||||
cl_font_t *Con_GetFont( int num );
|
cl_font_t *Con_GetFont( int num );
|
||||||
void Con_DrawCharacterLen( int number, int *width, int *height );
|
|
||||||
int Con_DrawString( int x, int y, const char *string, rgba_t setColor ); // legacy, use cl_font.c
|
int Con_DrawString( int x, int y, const char *string, rgba_t setColor ); // legacy, use cl_font.c
|
||||||
void GAME_EXPORT Con_DrawStringLen( const char *pText, int *length, int *height ); // legacy, use cl_font.c
|
void GAME_EXPORT Con_DrawStringLen( const char *pText, int *length, int *height ); // legacy, use cl_font.c
|
||||||
void Con_CharEvent( int key );
|
void Con_CharEvent( int key );
|
||||||
@@ -1107,7 +1114,7 @@ qboolean UI_MouseInRect( void );
|
|||||||
qboolean UI_IsVisible( void );
|
qboolean UI_IsVisible( void );
|
||||||
void UI_ResetPing( void );
|
void UI_ResetPing( void );
|
||||||
void UI_ShowUpdateDialog( qboolean preferStore );
|
void UI_ShowUpdateDialog( qboolean preferStore );
|
||||||
void UI_ShowMessageBox( const char *text );
|
qboolean UI_ShowMessageBox( const char *text );
|
||||||
void UI_AddTouchButtonToList( const char *name, const char *texture, const char *command, unsigned char *color, int flags );
|
void UI_AddTouchButtonToList( const char *name, const char *texture, const char *command, unsigned char *color, int flags );
|
||||||
void UI_ConnectionProgress_Disconnect( void );
|
void UI_ConnectionProgress_Disconnect( void );
|
||||||
void UI_ConnectionProgress_Download( const char *pszFileName, const char *pszServerName, const char *pszServerPath, int iCurrent, int iTotal, const char *comment );
|
void UI_ConnectionProgress_Download( const char *pszFileName, const char *pszServerName, const char *pszServerPath, int iCurrent, int iTotal, const char *comment );
|
||||||
@@ -1161,5 +1168,7 @@ int Key_ToUpper( int key );
|
|||||||
void OSK_Draw( void );
|
void OSK_Draw( void );
|
||||||
|
|
||||||
extern rgba_t g_color_table[8];
|
extern rgba_t g_color_table[8];
|
||||||
|
extern triangleapi_t gTriApi;
|
||||||
|
extern net_api_t gNetApi;
|
||||||
|
|
||||||
#endif//CLIENT_H
|
#endif//CLIENT_H
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ GNU General Public License for more details.
|
|||||||
#include "qfont.h"
|
#include "qfont.h"
|
||||||
#include "wadfile.h"
|
#include "wadfile.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
#include "utflib.h"
|
||||||
|
|
||||||
static CVAR_DEFINE_AUTO( scr_conspeed, "600", FCVAR_ARCHIVE, "console moving speed" );
|
static CVAR_DEFINE_AUTO( scr_conspeed, "600", FCVAR_ARCHIVE, "console moving speed" );
|
||||||
static CVAR_DEFINE_AUTO( con_notifytime, "3", FCVAR_ARCHIVE, "notify time to live" );
|
static CVAR_DEFINE_AUTO( con_notifytime, "3", FCVAR_ARCHIVE, "notify time to live" );
|
||||||
@@ -34,7 +35,6 @@ static CVAR_DEFINE_AUTO( scr_drawversion, "1", FCVAR_ARCHIVE, "draw version in m
|
|||||||
static CVAR_DEFINE_AUTO( con_oldfont, "0", 0, "use legacy font from gfx.wad, might be missing or broken" );
|
static CVAR_DEFINE_AUTO( con_oldfont, "0", 0, "use legacy font from gfx.wad, might be missing or broken" );
|
||||||
|
|
||||||
static int g_codepage = 0;
|
static int g_codepage = 0;
|
||||||
static qboolean g_utf8 = false;
|
|
||||||
|
|
||||||
static qboolean g_messagemode_privileged = true;
|
static qboolean g_messagemode_privileged = true;
|
||||||
|
|
||||||
@@ -610,19 +610,6 @@ static void Con_LoadConchars( void )
|
|||||||
con.curFont = &con.chars[fontSize];
|
con.curFont = &con.chars[fontSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
// CP1251 table
|
|
||||||
|
|
||||||
int table_cp1251[64] = {
|
|
||||||
0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
|
|
||||||
0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
|
|
||||||
0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
|
|
||||||
0x007F, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
|
|
||||||
0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
|
|
||||||
0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
|
|
||||||
0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
|
|
||||||
0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============================
|
============================
|
||||||
Con_UtfProcessChar
|
Con_UtfProcessChar
|
||||||
@@ -632,84 +619,28 @@ Convert utf char to current font's single-byte encoding
|
|||||||
*/
|
*/
|
||||||
int Con_UtfProcessCharForce( int in )
|
int Con_UtfProcessCharForce( int in )
|
||||||
{
|
{
|
||||||
static int m = -1, k = 0; //multibyte state
|
// TODO: get rid of global state where possible
|
||||||
static int uc = 0; //unicode char
|
static utfstate_t state = { 0 };
|
||||||
|
|
||||||
if( !in )
|
int ch = Q_DecodeUTF8( &state, in );
|
||||||
{
|
|
||||||
m = -1;
|
|
||||||
k = 0;
|
|
||||||
uc = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get character length
|
if( g_codepage == 1251 )
|
||||||
if(m == -1)
|
return Q_UnicodeToCP1251( ch );
|
||||||
{
|
if( g_codepage == 1252 )
|
||||||
uc = 0;
|
return Q_UnicodeToCP1252( ch );
|
||||||
if( in >= 0xF8 )
|
|
||||||
return 0;
|
|
||||||
else if( in >= 0xF0 )
|
|
||||||
uc = in & 0x07, m = 3;
|
|
||||||
else if( in >= 0xE0 )
|
|
||||||
uc = in & 0x0F, m = 2;
|
|
||||||
else if( in >= 0xC0 )
|
|
||||||
uc = in & 0x1F, m = 1;
|
|
||||||
else if( in <= 0x7F)
|
|
||||||
return in; //ascii
|
|
||||||
// return 0 if we need more chars to decode one
|
|
||||||
k=0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// get more chars
|
|
||||||
else if( k <= m )
|
|
||||||
{
|
|
||||||
uc <<= 6;
|
|
||||||
uc += in & 0x3F;
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
if( in > 0xBF || m < 0 )
|
|
||||||
{
|
|
||||||
m = -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if( k == m )
|
|
||||||
{
|
|
||||||
k = m = -1;
|
|
||||||
if( g_codepage == 1251 )
|
|
||||||
{
|
|
||||||
// cp1251 now
|
|
||||||
if( uc >= 0x0410 && uc <= 0x042F )
|
|
||||||
return uc - 0x410 + 0xC0;
|
|
||||||
if( uc >= 0x0430 && uc <= 0x044F )
|
|
||||||
return uc - 0x430 + 0xE0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for( i = 0; i < 64; i++ )
|
|
||||||
if( table_cp1251[i] == uc )
|
|
||||||
return i + 0x80;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( g_codepage == 1252 )
|
|
||||||
{
|
|
||||||
if( uc < 255 )
|
|
||||||
return uc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// not implemented yet
|
return '?'; // not implemented yet
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int GAME_EXPORT Con_UtfProcessChar( int in )
|
int GAME_EXPORT Con_UtfProcessChar( int in )
|
||||||
{
|
{
|
||||||
if( !g_utf8 )
|
if( !cls.accept_utf8 ) // incoming character is not a UTF-8 sequence
|
||||||
return in;
|
return in;
|
||||||
else
|
|
||||||
return Con_UtfProcessCharForce( in );
|
// otherwise, decode it and convert to selected codepage
|
||||||
|
return Con_UtfProcessCharForce( in );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
Con_UtfMoveLeft
|
Con_UtfMoveLeft
|
||||||
@@ -719,16 +650,22 @@ get position of previous printful char
|
|||||||
*/
|
*/
|
||||||
int Con_UtfMoveLeft( char *str, int pos )
|
int Con_UtfMoveLeft( char *str, int pos )
|
||||||
{
|
{
|
||||||
int i, k = 0;
|
utfstate_t state = { 0 };
|
||||||
// int j;
|
int k = 0;
|
||||||
if( !g_utf8 )
|
int i;
|
||||||
|
|
||||||
|
if( !cls.accept_utf8 ) // incoming character is not a UTF-8 sequence
|
||||||
return pos - 1;
|
return pos - 1;
|
||||||
Con_UtfProcessChar( 0 );
|
|
||||||
if(pos == 1) return 0;
|
if( pos == 1 )
|
||||||
for( i = 0; i < pos-1; i++ )
|
return 0;
|
||||||
if( Con_UtfProcessChar( (unsigned char)str[i] ) )
|
|
||||||
k = i+1;
|
for( i = 0; i < pos - 1; i++ )
|
||||||
Con_UtfProcessChar( 0 );
|
{
|
||||||
|
if( Q_DecodeUTF8( &state, (byte)str[i] ))
|
||||||
|
k = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,17 +678,19 @@ get next of previous printful char
|
|||||||
*/
|
*/
|
||||||
int Con_UtfMoveRight( char *str, int pos, int length )
|
int Con_UtfMoveRight( char *str, int pos, int length )
|
||||||
{
|
{
|
||||||
|
utfstate_t state = { 0 };
|
||||||
int i;
|
int i;
|
||||||
if( !g_utf8 )
|
|
||||||
|
if( !cls.accept_utf8 ) // incoming character is not a UTF-8 sequence
|
||||||
return pos + 1;
|
return pos + 1;
|
||||||
Con_UtfProcessChar( 0 );
|
|
||||||
for( i = pos; i <= length; i++ )
|
for( i = pos; i <= length; i++ )
|
||||||
{
|
{
|
||||||
if( Con_UtfProcessChar( (unsigned char)str[i] ) )
|
if( Q_DecodeUTF8( &state, (byte)str[i] ))
|
||||||
return i+1;
|
return i + 1;
|
||||||
}
|
}
|
||||||
Con_UtfProcessChar( 0 );
|
|
||||||
return pos+1;
|
return pos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Con_DrawCharToConback( int num, const byte *conchars, byte *dest )
|
static void Con_DrawCharToConback( int num, const byte *conchars, byte *dest )
|
||||||
@@ -908,7 +847,6 @@ void Con_Print( const char *txt )
|
|||||||
static char buf[MAX_PRINT_MSG];
|
static char buf[MAX_PRINT_MSG];
|
||||||
qboolean norefresh = false;
|
qboolean norefresh = false;
|
||||||
static int lastlength = 0;
|
static int lastlength = 0;
|
||||||
static qboolean inupdate;
|
|
||||||
static int bufpos = 0;
|
static int bufpos = 0;
|
||||||
int c, mask = 0;
|
int c, mask = 0;
|
||||||
|
|
||||||
@@ -937,7 +875,6 @@ void Con_Print( const char *txt )
|
|||||||
Con_DeleteLastLine();
|
Con_DeleteLastLine();
|
||||||
cr_pending = 0;
|
cr_pending = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = *txt;
|
c = *txt;
|
||||||
|
|
||||||
switch( c )
|
switch( c )
|
||||||
@@ -945,10 +882,13 @@ void Con_Print( const char *txt )
|
|||||||
case '\0':
|
case '\0':
|
||||||
break;
|
break;
|
||||||
case '\r':
|
case '\r':
|
||||||
Con_AddLine( buf, bufpos, true );
|
if( txt[1] != '\n' )
|
||||||
lastlength = CON_LINES_LAST().length;
|
{
|
||||||
cr_pending = 1;
|
Con_AddLine( buf, bufpos, true );
|
||||||
bufpos = 0;
|
lastlength = CON_LINES_LAST().length;
|
||||||
|
cr_pending = 1;
|
||||||
|
bufpos = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
Con_AddLine( buf, bufpos, true );
|
Con_AddLine( buf, bufpos, true );
|
||||||
@@ -956,6 +896,7 @@ void Con_Print( const char *txt )
|
|||||||
bufpos = 0;
|
bufpos = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
||||||
buf[bufpos++] = c | mask;
|
buf[bufpos++] = c | mask;
|
||||||
if(( bufpos >= sizeof( buf ) - 1 ) || bufpos >= ( con.linewidth - 1 ))
|
if(( bufpos >= sizeof( buf ) - 1 ) || bufpos >= ( con.linewidth - 1 ))
|
||||||
{
|
{
|
||||||
@@ -999,6 +940,27 @@ void Con_Print( const char *txt )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Con_NXPrintfv
|
||||||
|
|
||||||
|
Draw a single debug line with specified height, color and time to live
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
static void Con_NXPrintfv( keydest_t key_dest, const con_nprint_t *info, const char *fmt, va_list va )
|
||||||
|
{
|
||||||
|
if( info->index < 0 || info->index >= ARRAYSIZE( con.notify ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Q_vsnprintf( con.notify[info->index].szNotify, sizeof( con.notify[info->index].szNotify ), fmt, va );
|
||||||
|
|
||||||
|
// setup values
|
||||||
|
con.notify[info->index].key_dest = key_dest;
|
||||||
|
con.notify[info->index].expire = host.realtime + info->time_to_live;
|
||||||
|
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
|
||||||
|
con.draw_notify = true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
Con_NPrint
|
Con_NPrint
|
||||||
@@ -1009,21 +971,16 @@ Draw a single debug line with specified height
|
|||||||
void GAME_EXPORT Con_NPrintf( int idx, const char *fmt, ... )
|
void GAME_EXPORT Con_NPrintf( int idx, const char *fmt, ... )
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
con_nprint_t info =
|
||||||
if( idx < 0 || idx >= MAX_DBG_NOTIFY )
|
{
|
||||||
return;
|
.index = idx,
|
||||||
|
.time_to_live = 4.0f,
|
||||||
memset( con.notify[idx].szNotify, 0, MAX_STRING );
|
.color = { 1.0f, 1.0f, 1.0f },
|
||||||
|
};
|
||||||
|
|
||||||
va_start( args, fmt );
|
va_start( args, fmt );
|
||||||
Q_vsnprintf( con.notify[idx].szNotify, MAX_STRING, fmt, args );
|
Con_NXPrintfv( key_game, &info, fmt, args );
|
||||||
va_end( args );
|
va_end( args );
|
||||||
|
|
||||||
// reset values
|
|
||||||
con.notify[idx].key_dest = key_game;
|
|
||||||
con.notify[idx].expire = host.realtime + 4.0f;
|
|
||||||
MakeRGBA( con.notify[idx].color, 255, 255, 255, 255 );
|
|
||||||
con.draw_notify = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1039,20 +996,9 @@ void GAME_EXPORT Con_NXPrintf( con_nprint_t *info, const char *fmt, ... )
|
|||||||
|
|
||||||
if( !info ) return;
|
if( !info ) return;
|
||||||
|
|
||||||
if( info->index < 0 || info->index >= MAX_DBG_NOTIFY )
|
|
||||||
return;
|
|
||||||
|
|
||||||
memset( con.notify[info->index].szNotify, 0, MAX_STRING );
|
|
||||||
|
|
||||||
va_start( args, fmt );
|
va_start( args, fmt );
|
||||||
Q_vsnprintf( con.notify[info->index].szNotify, MAX_STRING, fmt, args );
|
Con_NXPrintfv( key_game, info, fmt, args );
|
||||||
va_end( args );
|
va_end( args );
|
||||||
|
|
||||||
// setup values
|
|
||||||
con.notify[info->index].key_dest = key_game;
|
|
||||||
con.notify[info->index].expire = host.realtime + info->time_to_live;
|
|
||||||
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
|
|
||||||
con.draw_notify = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1065,21 +1011,16 @@ Draw a single debug line with specified height (menu version)
|
|||||||
void GAME_EXPORT UI_NPrintf( int idx, const char *fmt, ... )
|
void GAME_EXPORT UI_NPrintf( int idx, const char *fmt, ... )
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
con_nprint_t info =
|
||||||
if( idx < 0 || idx >= MAX_DBG_NOTIFY )
|
{
|
||||||
return;
|
.index = idx,
|
||||||
|
.time_to_live = 4.0f,
|
||||||
memset( con.notify[idx].szNotify, 0, MAX_STRING );
|
.color = { 1.0f, 1.0f, 1.0f },
|
||||||
|
};
|
||||||
|
|
||||||
va_start( args, fmt );
|
va_start( args, fmt );
|
||||||
Q_vsnprintf( con.notify[idx].szNotify, MAX_STRING, fmt, args );
|
Con_NXPrintfv( key_menu, &info, fmt, args );
|
||||||
va_end( args );
|
va_end( args );
|
||||||
|
|
||||||
// reset values
|
|
||||||
con.notify[idx].key_dest = key_menu;
|
|
||||||
con.notify[idx].expire = host.realtime + 4.0f;
|
|
||||||
MakeRGBA( con.notify[idx].color, 255, 255, 255, 255 );
|
|
||||||
con.draw_notify = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1095,20 +1036,9 @@ void GAME_EXPORT UI_NXPrintf( con_nprint_t *info, const char *fmt, ... )
|
|||||||
|
|
||||||
if( !info ) return;
|
if( !info ) return;
|
||||||
|
|
||||||
if( info->index < 0 || info->index >= MAX_DBG_NOTIFY )
|
|
||||||
return;
|
|
||||||
|
|
||||||
memset( con.notify[info->index].szNotify, 0, MAX_STRING );
|
|
||||||
|
|
||||||
va_start( args, fmt );
|
va_start( args, fmt );
|
||||||
Q_vsnprintf( con.notify[info->index].szNotify, MAX_STRING, fmt, args );
|
Con_NXPrintfv( key_menu, info, fmt, args );
|
||||||
va_end( args );
|
va_end( args );
|
||||||
|
|
||||||
// setup values
|
|
||||||
con.notify[info->index].key_dest = key_menu;
|
|
||||||
con.notify[info->index].expire = host.realtime + info->time_to_live;
|
|
||||||
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
|
|
||||||
con.draw_notify = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1138,7 +1068,7 @@ Field_Set
|
|||||||
static void Field_Set( field_t *f, const char *string )
|
static void Field_Set( field_t *f, const char *string )
|
||||||
{
|
{
|
||||||
f->scroll = 0;
|
f->scroll = 0;
|
||||||
f->cursor = Q_strncpy( f->buffer, string, MAX_STRING );
|
f->cursor = Q_strncpy( f->buffer, string, sizeof( f->buffer ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1507,7 +1437,15 @@ static void Con_SaveHistory( con_history_t *self )
|
|||||||
f = FS_Open( "console_history.txt", "wb", true );
|
f = FS_Open( "console_history.txt", "wb", true );
|
||||||
|
|
||||||
for( i = historyStart; i < self->next; i++ )
|
for( i = historyStart; i < self->next; i++ )
|
||||||
FS_Printf( f, "%s\n", self->lines[i % CON_HISTORY].buffer );
|
{
|
||||||
|
const char *s = self->lines[i % CON_HISTORY].buffer;
|
||||||
|
|
||||||
|
// HACKHACK: don't save lines that have something that looks like a password
|
||||||
|
if( Q_stristr( s, "password" ) || Q_stristr( s, "_pw" ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
FS_Printf( f, "%s\n", s );
|
||||||
|
}
|
||||||
|
|
||||||
FS_Close( f );
|
FS_Close( f );
|
||||||
}
|
}
|
||||||
@@ -1549,6 +1487,9 @@ void Key_Console( int key )
|
|||||||
Con_Printf( ">%s\n", con.input.buffer );
|
Con_Printf( ">%s\n", con.input.buffer );
|
||||||
|
|
||||||
// copy line to history buffer
|
// copy line to history buffer
|
||||||
|
// just in case, remove all CR and LF characters pushing it to the history
|
||||||
|
// not sure how they get even added in the first place
|
||||||
|
COM_RemoveLineFeed( con.input.buffer, sizeof( con.input.buffer ));
|
||||||
Con_HistoryAppend( &con.history, &con.input );
|
Con_HistoryAppend( &con.history, &con.input );
|
||||||
|
|
||||||
Con_ClearField( &con.input );
|
Con_ClearField( &con.input );
|
||||||
@@ -1815,7 +1756,7 @@ static void Con_DrawNotify( void )
|
|||||||
|
|
||||||
if( host.allow_console && ( !Cvar_VariableInteger( "cl_background" ) && !Cvar_VariableInteger( "sv_background" )))
|
if( host.allow_console && ( !Cvar_VariableInteger( "cl_background" ) && !Cvar_VariableInteger( "sv_background" )))
|
||||||
{
|
{
|
||||||
for( i = CON_LINES_COUNT - con.num_times; i < CON_LINES_COUNT; i++ )
|
for( i = Q_max( 0, CON_LINES_COUNT - con.num_times ); i < CON_LINES_COUNT; i++ )
|
||||||
{
|
{
|
||||||
con_lineinfo_t *l = &CON_LINES( i );
|
con_lineinfo_t *l = &CON_LINES( i );
|
||||||
|
|
||||||
@@ -2003,7 +1944,7 @@ void Con_DrawConsole( void )
|
|||||||
{
|
{
|
||||||
if( !cl_allow_levelshots.value && !cls.timedemo )
|
if( !cl_allow_levelshots.value && !cls.timedemo )
|
||||||
{
|
{
|
||||||
if(( Cvar_VariableInteger( "cl_background" ) || Cvar_VariableInteger( "sv_background" )) && cls.key_dest != key_console )
|
if( cls.key_dest != key_console && ( Cvar_VariableInteger( "cl_background" ) || Cvar_VariableInteger( "sv_background" )))
|
||||||
con.vislines = con.showlines = 0;
|
con.vislines = con.showlines = 0;
|
||||||
else con.vislines = con.showlines = refState.height;
|
else con.vislines = con.showlines = refState.height;
|
||||||
}
|
}
|
||||||
@@ -2157,7 +2098,7 @@ void Con_RunConsole( void )
|
|||||||
g_codepage = 1252;
|
g_codepage = 1252;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_utf8 = !Q_stricmp( cl_charset.string, "utf-8" );
|
cls.accept_utf8 = !Q_stricmp( cl_charset.string, "utf-8" );
|
||||||
Con_InvalidateFonts();
|
Con_InvalidateFonts();
|
||||||
Con_LoadConchars();
|
Con_LoadConchars();
|
||||||
ClearBits( con_charset.flags, FCVAR_CHANGED );
|
ClearBits( con_charset.flags, FCVAR_CHANGED );
|
||||||
@@ -2195,6 +2136,34 @@ void Con_CharEvent( int key )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int Con_LoadSimpleConback( const char *name, int flags )
|
||||||
|
{
|
||||||
|
const char *paths[] = {
|
||||||
|
"gfx/shell/%s.dds",
|
||||||
|
"gfx/shell/%s.bmp",
|
||||||
|
"gfx/shell/%s.tga",
|
||||||
|
"cached/%s640",
|
||||||
|
"cached/%s",
|
||||||
|
};
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for( i = 0; i < ARRAYSIZE( paths ); i++ )
|
||||||
|
{
|
||||||
|
string path;
|
||||||
|
|
||||||
|
Q_snprintf( path, sizeof( path ), paths[i], name );
|
||||||
|
if( g_fsapi.FileExists( path, false ))
|
||||||
|
{
|
||||||
|
int gl_texturenum = ref.dllFuncs.GL_LoadTexture( path, NULL, 0, flags );
|
||||||
|
|
||||||
|
if( gl_texturenum )
|
||||||
|
return gl_texturenum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=========
|
=========
|
||||||
Con_VidInit
|
Con_VidInit
|
||||||
@@ -2217,38 +2186,12 @@ void Con_VidInit( void )
|
|||||||
|
|
||||||
Con_LoadConchars();
|
Con_LoadConchars();
|
||||||
Con_CheckResize();
|
Con_CheckResize();
|
||||||
|
|
||||||
#if XASH_LOW_MEMORY
|
#if XASH_LOW_MEMORY
|
||||||
con.background = R_GetBuiltinTexture( REF_BLACK_TEXTURE );
|
con.background = R_GetBuiltinTexture( REF_GRAY_TEXTURE );
|
||||||
#else
|
#else
|
||||||
// loading console image
|
// loading console image
|
||||||
if( host.allow_console )
|
con.background = Con_LoadSimpleConback( host.allow_console ? "conback" : "loading", flags );
|
||||||
{
|
|
||||||
// trying to load truecolor image first
|
|
||||||
if( FS_FileExists( "gfx/shell/conback.bmp", false ) || FS_FileExists( "gfx/shell/conback.tga", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "gfx/shell/conback", NULL, 0, flags );
|
|
||||||
|
|
||||||
if( !con.background )
|
|
||||||
{
|
|
||||||
if( FS_FileExists( "cached/conback640", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "cached/conback640", NULL, 0, flags );
|
|
||||||
else if( FS_FileExists( "cached/conback", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "cached/conback", NULL, 0, flags );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// trying to load truecolor image first
|
|
||||||
if( FS_FileExists( "gfx/shell/loading.bmp", false ) || FS_FileExists( "gfx/shell/loading.tga", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "gfx/shell/loading", NULL, 0, flags );
|
|
||||||
|
|
||||||
if( !con.background )
|
|
||||||
{
|
|
||||||
if( FS_FileExists( "cached/loading640", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "cached/loading640", NULL, 0, flags );
|
|
||||||
else if( FS_FileExists( "cached/loading", false ))
|
|
||||||
con.background = ref.dllFuncs.GL_LoadTexture( "cached/loading", NULL, 0, flags );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !con.background ) // last chance - quake conback image
|
if( !con.background ) // last chance - quake conback image
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ static void Joy_ProcessTrigger( const engineAxis_t engineAxis, short value )
|
|||||||
trigThreshold = joy_lt_threshold.value;
|
trigThreshold = joy_lt_threshold.value;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Con_Reportf( S_ERROR "Joy_ProcessTrigger: invalid axis = %i", engineAxis );
|
Con_Reportf( S_ERROR "%s: invalid axis = %i\n", __func__, engineAxis );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ static void Joy_ProcessStick( const engineAxis_t engineAxis, short value )
|
|||||||
case JOY_AXIS_PITCH: deadzone = joy_pitch_deadzone.value; break;
|
case JOY_AXIS_PITCH: deadzone = joy_pitch_deadzone.value; break;
|
||||||
case JOY_AXIS_YAW: deadzone = joy_yaw_deadzone.value; break;
|
case JOY_AXIS_YAW: deadzone = joy_yaw_deadzone.value; break;
|
||||||
default:
|
default:
|
||||||
Con_Reportf( S_ERROR "Joy_ProcessStick: invalid axis = %i", engineAxis );
|
Con_Reportf( S_ERROR "%s: invalid axis = %i\n", __func__, engineAxis );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ static void Joy_ProcessStick( const engineAxis_t engineAxis, short value )
|
|||||||
|
|
||||||
// fwd/side axis simulate hat movement
|
// fwd/side axis simulate hat movement
|
||||||
if( ( engineAxis == JOY_AXIS_SIDE || engineAxis == JOY_AXIS_FWD ) &&
|
if( ( engineAxis == JOY_AXIS_SIDE || engineAxis == JOY_AXIS_FWD ) &&
|
||||||
( CL_IsInMenu() || CL_IsInConsole() ) )
|
( cls.key_dest == key_menu || cls.key_dest == key_console ))
|
||||||
{
|
{
|
||||||
int val = 0;
|
int val = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ static struct touch_s
|
|||||||
touchdefaultbutton_t g_DefaultButtons[256];
|
touchdefaultbutton_t g_DefaultButtons[256];
|
||||||
int g_LastDefaultButton;
|
int g_LastDefaultButton;
|
||||||
|
|
||||||
static CVAR_DEFINE_AUTO( touch_in_menu, "0", FCVAR_FILTERABLE, "draw touch in menu (for internal use only)" );
|
static CVAR_DEFINE_AUTO( touch_in_menu, "0", FCVAR_PRIVILEGED, "draw touch in menu (for internal use only)" );
|
||||||
static CVAR_DEFINE_AUTO( touch_forwardzone, "0.06", FCVAR_FILTERABLE, "forward touch zone" );
|
static CVAR_DEFINE_AUTO( touch_forwardzone, "0.06", FCVAR_FILTERABLE, "forward touch zone" );
|
||||||
static CVAR_DEFINE_AUTO( touch_sidezone, "0.06", FCVAR_FILTERABLE, "side touch zone" );
|
static CVAR_DEFINE_AUTO( touch_sidezone, "0.06", FCVAR_FILTERABLE, "side touch zone" );
|
||||||
static CVAR_DEFINE_AUTO( touch_pitch, "90", FCVAR_FILTERABLE, "touch pitch sensitivity" );
|
static CVAR_DEFINE_AUTO( touch_pitch, "90", FCVAR_FILTERABLE, "touch pitch sensitivity" );
|
||||||
@@ -163,8 +163,8 @@ static CVAR_DEFINE_AUTO( touch_dpad_radius, "1.0", FCVAR_FILTERABLE, "dpad radiu
|
|||||||
static CVAR_DEFINE_AUTO( touch_joy_radius, "1.0", FCVAR_FILTERABLE, "joy radius multiplier" );
|
static CVAR_DEFINE_AUTO( touch_joy_radius, "1.0", FCVAR_FILTERABLE, "joy radius multiplier" );
|
||||||
static CVAR_DEFINE_AUTO( touch_move_indicator, "0.0", FCVAR_FILTERABLE, "indicate move events (0 to disable)" );
|
static CVAR_DEFINE_AUTO( touch_move_indicator, "0.0", FCVAR_FILTERABLE, "indicate move events (0 to disable)" );
|
||||||
static CVAR_DEFINE_AUTO( touch_joy_texture, "touch_default/joy", FCVAR_FILTERABLE, "texture for move indicator");
|
static CVAR_DEFINE_AUTO( touch_joy_texture, "touch_default/joy", FCVAR_FILTERABLE, "texture for move indicator");
|
||||||
|
static CVAR_DEFINE_AUTO( touch_emulate, "0", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "emulate touch with mouse" );
|
||||||
CVAR_DEFINE_AUTO( touch_enable, DEFAULT_TOUCH_ENABLE, FCVAR_ARCHIVE | FCVAR_FILTERABLE, "enable touch controls" );
|
CVAR_DEFINE_AUTO( touch_enable, DEFAULT_TOUCH_ENABLE, FCVAR_ARCHIVE | FCVAR_FILTERABLE, "enable touch controls" );
|
||||||
CVAR_DEFINE_AUTO( touch_emulate, "0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "emulate touch with mouse" );
|
|
||||||
|
|
||||||
// code looks smaller with it
|
// code looks smaller with it
|
||||||
#define B(x) (button->x)
|
#define B(x) (button->x)
|
||||||
@@ -333,7 +333,7 @@ void Touch_WriteConfig( void )
|
|||||||
if( Sys_CheckParm( "-nowriteconfig" ) || !touch.configchanged || !touch.config_loaded )
|
if( Sys_CheckParm( "-nowriteconfig" ) || !touch.configchanged || !touch.config_loaded )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Con_DPrintf( "Touch_WriteConfig(): %s\n", touch_config_file.string );
|
Con_DPrintf( "%s: %s\n", __func__, touch_config_file.string );
|
||||||
|
|
||||||
Q_snprintf( newconfigfile, sizeof( newconfigfile ), "%s.new", touch_config_file.string );
|
Q_snprintf( newconfigfile, sizeof( newconfigfile ), "%s.new", touch_config_file.string );
|
||||||
Q_snprintf( oldconfigfile, sizeof( oldconfigfile ), "%s.bak", touch_config_file.string );
|
Q_snprintf( oldconfigfile, sizeof( oldconfigfile ), "%s.bak", touch_config_file.string );
|
||||||
@@ -767,14 +767,18 @@ static void Touch_ReloadConfig_f( void )
|
|||||||
touch.state = state_none;
|
touch.state = state_none;
|
||||||
if( touch.edit )
|
if( touch.edit )
|
||||||
touch.edit->finger = -1;
|
touch.edit->finger = -1;
|
||||||
|
|
||||||
if( touch.selection )
|
if( touch.selection )
|
||||||
touch.selection->finger = -1;
|
touch.selection->finger = -1;
|
||||||
|
|
||||||
touch.edit = touch.selection = NULL;
|
touch.edit = touch.selection = NULL;
|
||||||
touch.resize_finger = touch.move_finger = touch.look_finger = touch.wheel_finger = -1;
|
touch.resize_finger = touch.move_finger = touch.look_finger = touch.wheel_finger = -1;
|
||||||
if( FS_FileExists( touch_config_file.string, true ) )
|
|
||||||
{
|
if( touch_in_menu.value )
|
||||||
|
Cvar_DirectSet( &touch_in_menu, "0" );
|
||||||
|
|
||||||
|
if( FS_FileExists( touch_config_file.string, true ))
|
||||||
Cbuf_AddTextf( "exec \"%s\"\n", touch_config_file.string );
|
Cbuf_AddTextf( "exec \"%s\"\n", touch_config_file.string );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Touch_LoadDefaults_f();
|
Touch_LoadDefaults_f();
|
||||||
@@ -1010,7 +1014,7 @@ static void Touch_DisableEdit_f( void )
|
|||||||
{
|
{
|
||||||
Cvar_Set( "touch_in_menu", "0" );
|
Cvar_Set( "touch_in_menu", "0" );
|
||||||
}
|
}
|
||||||
else if( cls.key_dest == key_game )
|
else if( cls.key_dest == key_game )
|
||||||
Touch_WriteConfig();
|
Touch_WriteConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1064,7 +1068,7 @@ void Touch_Init( void )
|
|||||||
return;
|
return;
|
||||||
touch.mempool = Mem_AllocPool( "Touch" );
|
touch.mempool = Mem_AllocPool( "Touch" );
|
||||||
//touch.first = touch.last = NULL;
|
//touch.first = touch.last = NULL;
|
||||||
Con_Printf( "IN_TouchInit()\n");
|
Con_Printf( "%s()\n", __func__ );
|
||||||
touch.move_finger = touch.resize_finger = touch.look_finger = touch.wheel_finger = -1;
|
touch.move_finger = touch.resize_finger = touch.look_finger = touch.wheel_finger = -1;
|
||||||
touch.state = state_none;
|
touch.state = state_none;
|
||||||
touch.showeditbuttons = true;
|
touch.showeditbuttons = true;
|
||||||
@@ -1087,18 +1091,19 @@ void Touch_Init( void )
|
|||||||
Touch_AddDefaultButton( "jump", "touch_default/jump", "+jump", 0.880000, 0.227228, 1.000000, 0.454457, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "jump", "touch_default/jump", "+jump", 0.880000, 0.227228, 1.000000, 0.454457, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "attack", "touch_default/shoot", "+attack", 0.760000, 0.530200, 0.880000, 0.757428, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "attack", "touch_default/shoot", "+attack", 0.760000, 0.530200, 0.880000, 0.757428, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "attack2", "touch_default/shoot_alt", "+attack2", 0.760000, 0.302971, 0.880000, 0.530200, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "attack2", "touch_default/shoot_alt", "+attack2", 0.760000, 0.302971, 0.880000, 0.530200, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "loadquick", "touch_default/load", "loadquick", 0.680000, 0.000000, 0.760000, 0.151486, color, 2, 1, 16 );
|
Touch_AddDefaultButton( "loadquick", "touch_default/load", "loadquick", 0.760000, 0.000000, 0.840000, 0.142222, color, 2, 1, 16 );
|
||||||
Touch_AddDefaultButton( "savequick", "touch_default/save", "savequick", 0.760000, 0.000000, 0.840000, 0.151486, color, 2, 1, 16 );
|
Touch_AddDefaultButton( "savequick", "touch_default/save", "savequick", 0.840000, 0.000000, 0.920000, 0.142222, color, 2, 1, 16 );
|
||||||
Touch_AddDefaultButton( "messagemode", "touch_default/keyboard", "messagemode", 0.760000, 0.000000, 0.840000, 0.151486, color, 2, 1, 8 );
|
Touch_AddDefaultButton( "messagemode", "touch_default/keyboard", "messagemode", 0.840000, 0.000000, 0.920000, 0.142222, color, 2, 1, 8 );
|
||||||
Touch_AddDefaultButton( "reload", "touch_default/reload", "+reload", 0.000000, 0.302971, 0.120000, 0.530200, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "reload", "touch_default/reload", "+reload", 0.000000, 0.302971, 0.120000, 0.530200, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "flashlight", "touch_default/flash_light_filled", "impulse 100", 0.920000, 0.000000, 1.000000, 0.151486, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "flashlight", "touch_default/flash_light_filled", "impulse 100", 0.920000, 0.000000, 1.000000, 0.151486, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "scores", "touch_default/map", "+showscores", 0.680000, 0.000000, 0.760000, 0.151486, color, 2, 1, 8 );
|
Touch_AddDefaultButton( "scores", "touch_default/map", "+showscores", 0.760000, 0.000000, 0.840000, 0.142222, color, 2, 1, 8 );
|
||||||
Touch_AddDefaultButton( "show_numbers", "touch_default/show_weapons", "exec touch_default/numbers.cfg", 0.440000, 0.833171, 0.520000, 0.984656, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "show_numbers", "touch_default/show_weapons", "exec touch_default/numbers.cfg", 0.440000, 0.833171, 0.520000, 0.984656, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "duck", "touch_default/crouch", "+duck", 0.880000, 0.757428, 1.000000, 0.984656, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "duck", "touch_default/crouch", "+duck", 0.880000, 0.757428, 1.000000, 0.984656, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "tduck", "touch_default/tduck", ";+duck", 0.560000, 0.833171, 0.620000, 0.946785, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "tduck", "touch_default/tduck", ";+duck", 0.560000, 0.833171, 0.620000, 0.946785, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "edit", "touch_default/settings", "touch_enableedit", 0.420000, 0.000000, 0.500000, 0.151486, color, 2, 1, 32 );
|
Touch_AddDefaultButton( "edit", "touch_default/settings", "touch_enableedit", 0.420000, 0.000000, 0.500000, 0.151486, color, 2, 1, 32 );
|
||||||
Touch_AddDefaultButton( "menu", "touch_default/menu", "escape", 0.000000, 0.833171, 0.080000, 0.984656, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "menu", "touch_default/menu", "escape", 0.000000, 0.833171, 0.080000, 0.984656, color, 2, 1, 0 );
|
||||||
Touch_AddDefaultButton( "spray", "touch_default/spray", "impulse 201", 0.840000, 0.000000, 0.920000, 0.151486, color, 2, 1, 0 );
|
Touch_AddDefaultButton( "spray", "touch_default/spray", "impulse 201", 0.680000, 0.000000, 0.760000, 0.142222, color, 2, 1, 8 );
|
||||||
|
Touch_AddDefaultButton( "voicechat", "touch_default/microphone", "+voicerecord", 0.780000, 0.817778, 0.860000, 0.960000, color, 2, 1, 8 );
|
||||||
|
|
||||||
Cmd_AddCommand( "touch_addbutton", Touch_AddButton_f, "add native touch button" );
|
Cmd_AddCommand( "touch_addbutton", Touch_AddButton_f, "add native touch button" );
|
||||||
Cmd_AddCommand( "touch_removebutton", IN_TouchRemoveButton_f, "remove native touch button" );
|
Cmd_AddCommand( "touch_removebutton", IN_TouchRemoveButton_f, "remove native touch button" );
|
||||||
@@ -1217,10 +1222,10 @@ static qboolean Touch_IsVisible( touch_button_t *button )
|
|||||||
if( FBitSet( button->flags, TOUCH_FL_HIDE ))
|
if( FBitSet( button->flags, TOUCH_FL_HIDE ))
|
||||||
return false; // skip hidden
|
return false; // skip hidden
|
||||||
|
|
||||||
if( FBitSet( button->flags, TOUCH_FL_SP ) && CL_GetMaxClients() != 1 )
|
if( FBitSet( button->flags, TOUCH_FL_SP ) && cl.maxclients != 1 )
|
||||||
return false; // skip singleplayer(load, save) buttons in multiplayer
|
return false; // skip singleplayer(load, save) buttons in multiplayer
|
||||||
|
|
||||||
if( FBitSet( button->flags, TOUCH_FL_MP ) && CL_GetMaxClients() == 1 )
|
if( FBitSet( button->flags, TOUCH_FL_MP ) && cl.maxclients == 1 )
|
||||||
return false; // skip multiplayer buttons in singleplayer
|
return false; // skip multiplayer buttons in singleplayer
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -2122,7 +2127,7 @@ void Touch_KeyEvent( int key, int down )
|
|||||||
float x, y;
|
float x, y;
|
||||||
int finger, xi, yi;
|
int finger, xi, yi;
|
||||||
|
|
||||||
if( !touch_emulate.value )
|
if( !Touch_Emulated( ))
|
||||||
{
|
{
|
||||||
if( touch_enable.value )
|
if( touch_enable.value )
|
||||||
return;
|
return;
|
||||||
@@ -2163,8 +2168,7 @@ void Touch_KeyEvent( int key, int down )
|
|||||||
x = xi / SCR_W;
|
x = xi / SCR_W;
|
||||||
y = yi / SCR_H;
|
y = yi / SCR_H;
|
||||||
|
|
||||||
Con_DPrintf( "event %d %.2f %.2f %.2f %.2f\n",
|
// Con_DPrintf( "event %d %.2f %.2f %.2f %.2f\n", event, x, y, x - lx, y - ly );
|
||||||
event, x, y, x - lx, y - ly );
|
|
||||||
|
|
||||||
IN_TouchEvent( event, finger, x, y, x - lx, y - ly );
|
IN_TouchEvent( event, finger, x, y, x - lx, y - ly );
|
||||||
|
|
||||||
@@ -2177,6 +2181,11 @@ qboolean Touch_WantVisibleCursor( void )
|
|||||||
return ( touch_enable.value && touch_emulate.value ) || touch.clientonly;
|
return ( touch_enable.value && touch_emulate.value ) || touch.clientonly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean Touch_Emulated( void )
|
||||||
|
{
|
||||||
|
return touch_emulate.value || touch_in_menu.value;
|
||||||
|
}
|
||||||
|
|
||||||
void Touch_Shutdown( void )
|
void Touch_Shutdown( void )
|
||||||
{
|
{
|
||||||
if( !touch.initialized )
|
if( !touch.initialized )
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ GNU General Public License for more details.
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "vgui_draw.h"
|
#include "vgui_draw.h"
|
||||||
|
#include "cursor_type.h"
|
||||||
|
|
||||||
#if XASH_SDL
|
#if XASH_SDL
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
@@ -46,6 +47,8 @@ static CVAR_DEFINE_AUTO( cl_forwardspeed, "400", FCVAR_ARCHIVE | FCVAR_CLIENTDLL
|
|||||||
static CVAR_DEFINE_AUTO( cl_backspeed, "400", FCVAR_ARCHIVE | FCVAR_CLIENTDLL | FCVAR_FILTERABLE, "Default back move speed" );
|
static CVAR_DEFINE_AUTO( cl_backspeed, "400", FCVAR_ARCHIVE | FCVAR_CLIENTDLL | FCVAR_FILTERABLE, "Default back move speed" );
|
||||||
static CVAR_DEFINE_AUTO( cl_sidespeed, "400", FCVAR_ARCHIVE | FCVAR_CLIENTDLL | FCVAR_FILTERABLE, "Default side move speed" );
|
static CVAR_DEFINE_AUTO( cl_sidespeed, "400", FCVAR_ARCHIVE | FCVAR_CLIENTDLL | FCVAR_FILTERABLE, "Default side move speed" );
|
||||||
|
|
||||||
|
static CVAR_DEFINE_AUTO( m_grab_debug, "0", FCVAR_PRIVILEGED, "show debug messages on mouse state change" );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
IN_CollectInputDevices
|
IN_CollectInputDevices
|
||||||
@@ -115,6 +118,7 @@ static void IN_StartupMouse( void )
|
|||||||
Cvar_RegisterVariable( &m_yaw );
|
Cvar_RegisterVariable( &m_yaw );
|
||||||
Cvar_RegisterVariable( &look_filter );
|
Cvar_RegisterVariable( &look_filter );
|
||||||
Cvar_RegisterVariable( &m_rawinput );
|
Cvar_RegisterVariable( &m_rawinput );
|
||||||
|
Cvar_RegisterVariable( &m_grab_debug );
|
||||||
|
|
||||||
// You can use -nomouse argument to prevent using mouse from client
|
// You can use -nomouse argument to prevent using mouse from client
|
||||||
// -noenginemouse will disable all mouse input
|
// -noenginemouse will disable all mouse input
|
||||||
@@ -123,11 +127,6 @@ static void IN_StartupMouse( void )
|
|||||||
in_mouseinitialized = true;
|
in_mouseinitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GAME_EXPORT IN_SetCursor( void *hCursor )
|
|
||||||
{
|
|
||||||
// stub
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===========
|
===========
|
||||||
IN_MouseSavePos
|
IN_MouseSavePos
|
||||||
@@ -206,68 +205,81 @@ void IN_ToggleClientMouse( int newstate, int oldstate )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void IN_SetRelativeMouseMode( qboolean set, qboolean verbose )
|
||||||
|
{
|
||||||
|
static qboolean s_bRawInput;
|
||||||
|
|
||||||
|
if( set && !s_bRawInput )
|
||||||
|
{
|
||||||
|
#if XASH_SDL == 2
|
||||||
|
SDL_GetRelativeMouseState( NULL, NULL );
|
||||||
|
SDL_SetRelativeMouseMode( SDL_TRUE );
|
||||||
|
#endif
|
||||||
|
s_bRawInput = true;
|
||||||
|
if( verbose )
|
||||||
|
Con_Printf( "%s: true\n", __func__ );
|
||||||
|
}
|
||||||
|
else if( !set && s_bRawInput )
|
||||||
|
{
|
||||||
|
#if XASH_SDL == 2
|
||||||
|
SDL_GetRelativeMouseState( NULL, NULL );
|
||||||
|
SDL_SetRelativeMouseMode( SDL_FALSE );
|
||||||
|
#endif
|
||||||
|
s_bRawInput = false;
|
||||||
|
if( verbose )
|
||||||
|
Con_Printf( "%s: false\n", __func__ );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void IN_SetMouseGrab( qboolean set, qboolean verbose )
|
||||||
|
{
|
||||||
|
static qboolean s_bMouseGrab;
|
||||||
|
|
||||||
|
if( set && !s_bMouseGrab )
|
||||||
|
{
|
||||||
|
#if XASH_SDL
|
||||||
|
SDL_SetWindowGrab( host.hWnd, SDL_TRUE );
|
||||||
|
#endif
|
||||||
|
s_bMouseGrab = true;
|
||||||
|
if( verbose )
|
||||||
|
Con_Printf( "%s: true\n", __func__ );
|
||||||
|
}
|
||||||
|
else if( !set && s_bMouseGrab )
|
||||||
|
{
|
||||||
|
#if XASH_SDL
|
||||||
|
SDL_SetWindowGrab( host.hWnd, SDL_FALSE );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_bMouseGrab = false;
|
||||||
|
if( verbose )
|
||||||
|
Con_Printf( "%s: false\n", __func__ );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void IN_CheckMouseState( qboolean active )
|
static void IN_CheckMouseState( qboolean active )
|
||||||
{
|
{
|
||||||
static qboolean s_bRawInput, s_bMouseGrab;
|
qboolean use_raw_input, verbose;
|
||||||
|
|
||||||
#if XASH_WIN32
|
#if XASH_WIN32
|
||||||
qboolean useRawInput = ( m_rawinput.value && clgame.client_dll_uses_sdl ) || clgame.dllFuncs.pfnLookEvent != NULL;
|
use_raw_input = ( m_rawinput.value && clgame.client_dll_uses_sdl ) || clgame.dllFuncs.pfnLookEvent != NULL;
|
||||||
#else
|
#else
|
||||||
qboolean useRawInput = true; // always use SDL code
|
use_raw_input = true; // always use SDL code
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
verbose = m_grab_debug.value ? true : false;
|
||||||
|
|
||||||
if( m_ignore.value )
|
if( m_ignore.value )
|
||||||
return;
|
active = false;
|
||||||
|
|
||||||
if( active && useRawInput && !host.mouse_visible && cls.state == ca_active )
|
if( active && use_raw_input && !host.mouse_visible && cls.state == ca_active )
|
||||||
{
|
IN_SetRelativeMouseMode( true, verbose );
|
||||||
if( !s_bRawInput )
|
|
||||||
{
|
|
||||||
#if XASH_SDL == 2
|
|
||||||
SDL_GetRelativeMouseState( NULL, NULL );
|
|
||||||
SDL_SetRelativeMouseMode( SDL_TRUE );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Con_Printf( "Enable relative mode\n" );
|
|
||||||
s_bRawInput = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
IN_SetRelativeMouseMode( false, verbose );
|
||||||
if( s_bRawInput )
|
|
||||||
{
|
|
||||||
#if XASH_SDL == 2
|
|
||||||
SDL_GetRelativeMouseState( NULL, NULL );
|
|
||||||
SDL_SetRelativeMouseMode( SDL_FALSE );
|
|
||||||
#endif
|
|
||||||
// Con_Printf( "Disable relative mode\n" );
|
|
||||||
s_bRawInput = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( active && !host.mouse_visible && cls.state == ca_active )
|
if( active && !host.mouse_visible && cls.state == ca_active )
|
||||||
{
|
IN_SetMouseGrab( true, verbose );
|
||||||
if( !s_bMouseGrab )
|
|
||||||
{
|
|
||||||
#if XASH_SDL
|
|
||||||
SDL_SetWindowGrab( host.hWnd, SDL_TRUE );
|
|
||||||
#endif
|
|
||||||
// Con_Printf( "Enable grab\n" );
|
|
||||||
s_bMouseGrab = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
IN_SetMouseGrab( false, verbose );
|
||||||
if( s_bMouseGrab )
|
|
||||||
{
|
|
||||||
#if XASH_SDL
|
|
||||||
SDL_SetWindowGrab( host.hWnd, SDL_FALSE );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Con_Printf( "Disable grab\n" );
|
|
||||||
s_bMouseGrab = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -320,7 +332,7 @@ static void IN_MouseMove( void )
|
|||||||
if( !in_mouseinitialized )
|
if( !in_mouseinitialized )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( touch_emulate.value )
|
if( Touch_Emulated( ))
|
||||||
{
|
{
|
||||||
// touch emulation overrides all input
|
// touch emulation overrides all input
|
||||||
Touch_KeyEvent( 0, 0 );
|
Touch_KeyEvent( 0, 0 );
|
||||||
@@ -351,7 +363,7 @@ void IN_MouseEvent( int key, int down )
|
|||||||
else ClearBits( in_mstate, BIT( key ));
|
else ClearBits( in_mstate, BIT( key ));
|
||||||
|
|
||||||
// touch emulation overrides all input
|
// touch emulation overrides all input
|
||||||
if( touch_emulate.value )
|
if( Touch_Emulated( ))
|
||||||
{
|
{
|
||||||
Touch_KeyEvent( K_MOUSE1 + key, down );
|
Touch_KeyEvent( K_MOUSE1 + key, down );
|
||||||
}
|
}
|
||||||
@@ -557,10 +569,9 @@ IN_EngineAppendMove
|
|||||||
Called from cl_main.c after generating command in client
|
Called from cl_main.c after generating command in client
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void IN_EngineAppendMove( float frametime, void *cmd1, qboolean active )
|
void IN_EngineAppendMove( float frametime, usercmd_t *cmd, qboolean active )
|
||||||
{
|
{
|
||||||
float forward, side, pitch, yaw;
|
float forward, side, pitch, yaw;
|
||||||
usercmd_t *cmd = cmd1;
|
|
||||||
|
|
||||||
if( clgame.dllFuncs.pfnLookEvent )
|
if( clgame.dllFuncs.pfnLookEvent )
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ INPUT
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "keydefs.h"
|
#include "keydefs.h"
|
||||||
|
#include "usercmd.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// input.c
|
// input.c
|
||||||
@@ -40,11 +41,10 @@ void IN_DeactivateMouse( void );
|
|||||||
void IN_MouseSavePos( void );
|
void IN_MouseSavePos( void );
|
||||||
void IN_MouseRestorePos( void );
|
void IN_MouseRestorePos( void );
|
||||||
void IN_ToggleClientMouse( int newstate, int oldstate );
|
void IN_ToggleClientMouse( int newstate, int oldstate );
|
||||||
void IN_SetCursor( void *hCursor );
|
|
||||||
|
|
||||||
uint IN_CollectInputDevices( void );
|
uint IN_CollectInputDevices( void );
|
||||||
void IN_LockInputDevices( qboolean lock );
|
void IN_LockInputDevices( qboolean lock );
|
||||||
void IN_EngineAppendMove( float frametime, void *cmd, qboolean active );
|
void IN_EngineAppendMove( float frametime, usercmd_t *cmd, qboolean active );
|
||||||
|
|
||||||
extern convar_t m_yaw;
|
extern convar_t m_yaw;
|
||||||
extern convar_t m_pitch;
|
extern convar_t m_pitch;
|
||||||
@@ -59,7 +59,6 @@ typedef enum
|
|||||||
} touchEventType;
|
} touchEventType;
|
||||||
|
|
||||||
extern convar_t touch_enable;
|
extern convar_t touch_enable;
|
||||||
extern convar_t touch_emulate;
|
|
||||||
|
|
||||||
void Touch_Draw( void );
|
void Touch_Draw( void );
|
||||||
void Touch_SetClientOnly( byte state );
|
void Touch_SetClientOnly( byte state );
|
||||||
@@ -75,6 +74,7 @@ void Touch_ResetDefaultButtons( void );
|
|||||||
int IN_TouchEvent( touchEventType type, int fingerID, float x, float y, float dx, float dy );
|
int IN_TouchEvent( touchEventType type, int fingerID, float x, float y, float dx, float dy );
|
||||||
void Touch_KeyEvent( int key, int down );
|
void Touch_KeyEvent( int key, int down );
|
||||||
qboolean Touch_WantVisibleCursor( void );
|
qboolean Touch_WantVisibleCursor( void );
|
||||||
|
qboolean Touch_Emulated( void );
|
||||||
void Touch_NotifyResize( void );
|
void Touch_NotifyResize( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -553,7 +553,7 @@ static void Key_AddKeyCommands( int key, const char *kb, qboolean down )
|
|||||||
}
|
}
|
||||||
|
|
||||||
buttonPtr = button;
|
buttonPtr = button;
|
||||||
while(( kb[i] <= ' ' || kb[i] == ';' ) && kb[i] != 0 )
|
while((((byte)kb[i]) <= ' ' || kb[i] == ';' ) && kb[i] != 0 )
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -749,10 +749,10 @@ void GAME_EXPORT Key_Event( int key, int down )
|
|||||||
if( cls.key_dest == key_menu )
|
if( cls.key_dest == key_menu )
|
||||||
{
|
{
|
||||||
// only non printable keys passed
|
// only non printable keys passed
|
||||||
if( !gameui.use_text_api )
|
if( !gameui.use_extended_api )
|
||||||
Key_EnableTextInput( true, false );
|
Key_EnableTextInput( true, false );
|
||||||
//pass printable chars for old menus
|
//pass printable chars for old menus
|
||||||
if( !gameui.use_text_api && !host.textmode && down && ( key >= 32 ) && ( key <= 'z' ) )
|
if( !gameui.use_extended_api && !host.textmode && down && ( key >= 32 ) && ( key <= 'z' ) )
|
||||||
{
|
{
|
||||||
if( Key_IsDown( K_SHIFT ) )
|
if( Key_IsDown( K_SHIFT ) )
|
||||||
{
|
{
|
||||||
@@ -840,7 +840,7 @@ void GAME_EXPORT Key_SetKeyDest( int key_dest )
|
|||||||
cls.key_dest = key_message;
|
cls.key_dest = key_message;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Host_Error( "Key_SetKeyDest: wrong destination (%i)\n", key_dest );
|
Host_Error( "%s: wrong destination (%i)\n", __func__, key_dest );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1055,18 +1055,16 @@ static qboolean OSK_KeyEvent( int key, int down )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !Q_stricmp( cl_charset.string, "utf-8" ) )
|
ch = (byte)osk.curbutton.val;
|
||||||
ch = (unsigned char)osk.curbutton.val;
|
|
||||||
else
|
// do not pass UTF-8 sequence into the engine, convert it here
|
||||||
ch = Con_UtfProcessCharForce( (unsigned char)osk.curbutton.val );
|
if( !cls.accept_utf8 )
|
||||||
|
ch = Con_UtfProcessCharForce( ch );
|
||||||
|
|
||||||
if( !ch )
|
if( !ch )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
Con_CharEvent( ch );
|
CL_CharEvent( ch );
|
||||||
if( cls.key_dest == key_menu )
|
|
||||||
UI_CharEvent ( ch );
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1119,6 @@ static void OSK_EnableTextInput( qboolean enable, qboolean force )
|
|||||||
{
|
{
|
||||||
osk.curlayout = 0;
|
osk.curlayout = 0;
|
||||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ static void free_winding( winding_t *w )
|
|||||||
{
|
{
|
||||||
// simple sentinel by Carmack
|
// simple sentinel by Carmack
|
||||||
if( *(unsigned *)w == 0xDEADC0DE )
|
if( *(unsigned *)w == 0xDEADC0DE )
|
||||||
Host_Error( "free_winding: freed a freed winding\n" );
|
Host_Error( "%s: freed a freed winding\n", __func__ );
|
||||||
*(unsigned *)w = 0xDEADC0DE;
|
*(unsigned *)w = 0xDEADC0DE;
|
||||||
free( w );
|
free( w );
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ static winding_t *winding_for_plane( const mplane_t *p )
|
|||||||
vup[0] = 1;
|
vup[0] = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Host_Error( "BaseWindingForPlane: no axis found\n" );
|
Host_Error( "%s: no axis found\n", __func__ );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,6 +685,9 @@ void Mod_CreatePolygonsForHull( int hullnum )
|
|||||||
if( hullnum < 1 || hullnum > 3 )
|
if( hullnum < 1 || hullnum > 3 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if( !world.num_hull_models )
|
||||||
|
Mod_InitDebugHulls( mod ); // FIXME: build hulls for separate bmodels (shells, medkits etc)
|
||||||
|
|
||||||
Con_Printf( "generating polygons for hull %u...\n", hullnum );
|
Con_Printf( "generating polygons for hull %u...\n", hullnum );
|
||||||
start = Sys_DoubleTime();
|
start = Sys_DoubleTime();
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
struct ref_state_s ref;
|
struct ref_state_s ref;
|
||||||
ref_globals_t refState;
|
ref_globals_t refState;
|
||||||
|
|
||||||
CVAR_DEFINE_AUTO( gl_vsync, "0", FCVAR_ARCHIVE, "enable vertical syncronization" );
|
static const char* r_skyBoxSuffix[SKYBOX_MAX_SIDES] = { "rt", "bk", "lf", "ft", "up", "dn" };
|
||||||
|
|
||||||
|
CVAR_DEFINE_AUTO( gl_vsync, "1", FCVAR_ARCHIVE, "enable vertical syncronization" );
|
||||||
CVAR_DEFINE_AUTO( r_showtextures, "0", FCVAR_CHEAT, "show all uploaded textures" );
|
CVAR_DEFINE_AUTO( r_showtextures, "0", FCVAR_CHEAT, "show all uploaded textures" );
|
||||||
CVAR_DEFINE_AUTO( r_adjust_fov, "1", FCVAR_ARCHIVE, "making FOV adjustment for wide-screens" );
|
CVAR_DEFINE_AUTO( r_adjust_fov, "1", FCVAR_ARCHIVE, "making FOV adjustment for wide-screens" );
|
||||||
CVAR_DEFINE_AUTO( r_decals, "4096", FCVAR_ARCHIVE, "sets the maximum number of decals" );
|
CVAR_DEFINE_AUTO( r_decals, "4096", FCVAR_ARCHIVE, "sets the maximum number of decals" );
|
||||||
@@ -49,13 +51,102 @@ void R_GetTextureParms( int *w, int *h, int texnum )
|
|||||||
if( h ) *h = REF_GET_PARM( PARM_TEX_HEIGHT, texnum );
|
if( h ) *h = REF_GET_PARM( PARM_TEX_HEIGHT, texnum );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static qboolean CheckSkybox( const char *name, char out[SKYBOX_MAX_SIDES][MAX_STRING] )
|
||||||
================
|
{
|
||||||
GL_FreeImage
|
static const char *skybox_ext[3] = { "dds", "tga", "bmp" };
|
||||||
|
static const char *skybox_delim[2] = { "", "_" }; // no space for HL style, underscore for Q1 style
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// search for skybox images
|
||||||
|
for( i = 0; i < ARRAYSIZE( skybox_ext ); i++ )
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for( j = 0; j < ARRAYSIZE( skybox_delim ); j++ )
|
||||||
|
{
|
||||||
|
int k, num_checked_sides = 0;
|
||||||
|
|
||||||
|
for( k = 0; k < SKYBOX_MAX_SIDES; k++ )
|
||||||
|
{
|
||||||
|
char sidename[MAX_VA_STRING];
|
||||||
|
|
||||||
|
Q_snprintf( sidename, sizeof( sidename ), "%s%s%s.%s", name, skybox_delim[j], r_skyBoxSuffix[k], skybox_ext[i] );
|
||||||
|
if( g_fsapi.FileExists( sidename, false ))
|
||||||
|
{
|
||||||
|
Q_strncpy( out[k], sidename, sizeof( out[k] ));
|
||||||
|
num_checked_sides++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( num_checked_sides == SKYBOX_MAX_SIDES )
|
||||||
|
return true; // image exists
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void R_SetupSky( const char *name )
|
||||||
|
{
|
||||||
|
string loadname;
|
||||||
|
char sidenames[SKYBOX_MAX_SIDES][MAX_STRING];
|
||||||
|
int skyboxTextures[SKYBOX_MAX_SIDES] = { 0 };
|
||||||
|
int i, len;
|
||||||
|
qboolean result;
|
||||||
|
|
||||||
|
if( !COM_CheckString( name ))
|
||||||
|
{
|
||||||
|
ref.dllFuncs.R_SetupSky( NULL ); // unload skybox
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_snprintf( loadname, sizeof( loadname ), "gfx/env/%s", name );
|
||||||
|
COM_StripExtension( loadname );
|
||||||
|
|
||||||
|
// kill the underline suffix to find them manually later
|
||||||
|
len = Q_strlen( loadname );
|
||||||
|
|
||||||
|
if( loadname[len - 1] == '_' )
|
||||||
|
loadname[len - 1] = '\0';
|
||||||
|
result = CheckSkybox( loadname, sidenames );
|
||||||
|
|
||||||
|
// to prevent infinite recursion if default skybox was missed
|
||||||
|
if( !result && Q_stricmp( name, DEFAULT_SKYBOX_NAME ))
|
||||||
|
{
|
||||||
|
Con_Reportf( S_WARN "missed or incomplete skybox '%s'\n", name );
|
||||||
|
R_SetupSky( DEFAULT_SKYBOX_NAME ); // force to default
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref.dllFuncs.R_SetupSky( NULL ); // unload skybox
|
||||||
|
Con_DPrintf( "SKY: " );
|
||||||
|
|
||||||
|
for( i = 0; i < SKYBOX_MAX_SIDES; i++ )
|
||||||
|
{
|
||||||
|
skyboxTextures[i] = ref.dllFuncs.GL_LoadTexture( sidenames[i], NULL, 0, TF_CLAMP|TF_SKY );
|
||||||
|
|
||||||
|
if( !skyboxTextures[i] )
|
||||||
|
break;
|
||||||
|
|
||||||
|
Con_DPrintf( "%s%s%s", name, r_skyBoxSuffix[i], i != 5 ? ", " : ". " );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( i == SKYBOX_MAX_SIDES )
|
||||||
|
{
|
||||||
|
SetBits( world.flags, FWORLD_CUSTOM_SKYBOX );
|
||||||
|
Con_DPrintf( "done\n" );
|
||||||
|
ref.dllFuncs.R_SetupSky( skyboxTextures );
|
||||||
|
return; // loaded
|
||||||
|
}
|
||||||
|
|
||||||
|
Con_DPrintf( "^2failed\n" );
|
||||||
|
for( i = 0; i < SKYBOX_MAX_SIDES; i++ )
|
||||||
|
{
|
||||||
|
if( skyboxTextures[i] )
|
||||||
|
ref.dllFuncs.GL_FreeTexture( skyboxTextures[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Frees image by name
|
|
||||||
================
|
|
||||||
*/
|
|
||||||
void GAME_EXPORT GL_FreeImage( const char *name )
|
void GAME_EXPORT GL_FreeImage( const char *name )
|
||||||
{
|
{
|
||||||
int texnum;
|
int texnum;
|
||||||
@@ -80,6 +171,22 @@ static intptr_t pfnEngineGetParm( int parm, int arg )
|
|||||||
return CL_RenderGetParm( parm, arg, false ); // prevent recursion
|
return CL_RenderGetParm( parm, arg, false ); // prevent recursion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cvar_t *pfnCvar_Get( const char *szName, const char *szValue, int flags, const char *description )
|
||||||
|
{
|
||||||
|
return (cvar_t *)Cvar_Get( szName, szValue, flags | FCVAR_REFDLL, description );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pfnCvar_RegisterVariable( convar_t *var )
|
||||||
|
{
|
||||||
|
SetBits( var->flags, FCVAR_REFDLL );
|
||||||
|
Cvar_RegisterVariable( var );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pfnCvar_FullSet( const char *var_name, const char *value, int flags )
|
||||||
|
{
|
||||||
|
Cvar_FullSet( var_name, value, flags | FCVAR_REFDLL );
|
||||||
|
}
|
||||||
|
|
||||||
static void pfnStudioEvent( const mstudioevent_t *event, const cl_entity_t *e )
|
static void pfnStudioEvent( const mstudioevent_t *event, const cl_entity_t *e )
|
||||||
{
|
{
|
||||||
clgame.dllFuncs.pfnStudioEvent( event, e );
|
clgame.dllFuncs.pfnStudioEvent( event, e );
|
||||||
@@ -91,7 +198,7 @@ static model_t *pfnGetDefaultSprite( enum ref_defaultsprite_e spr )
|
|||||||
{
|
{
|
||||||
case REF_DOT_SPRITE: return cl_sprite_dot;
|
case REF_DOT_SPRITE: return cl_sprite_dot;
|
||||||
case REF_CHROME_SPRITE: return cl_sprite_shell;
|
case REF_CHROME_SPRITE: return cl_sprite_shell;
|
||||||
default: Host_Error( "GetDefaultSprite: unknown sprite %d\n", spr );
|
default: Host_Error( "%s: unknown sprite %d\n", __func__, spr );
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -104,7 +211,7 @@ static void *pfnMod_Extradata( int type, model_t *m )
|
|||||||
case mod_studio: return Mod_StudioExtradata( m );
|
case mod_studio: return Mod_StudioExtradata( m );
|
||||||
case mod_sprite: // fallthrough
|
case mod_sprite: // fallthrough
|
||||||
case mod_brush: return NULL;
|
case mod_brush: return NULL;
|
||||||
default: Host_Error( "Mod_Extradata: unknown type %d\n", type );
|
default: Host_Error( "%s: unknown type %d\n", __func__, type );
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -194,18 +301,18 @@ static qboolean R_Init_Video_( const int type )
|
|||||||
return R_Init_Video( type );
|
return R_Init_Video( type );
|
||||||
}
|
}
|
||||||
|
|
||||||
static ref_api_t gEngfuncs =
|
static const ref_api_t gEngfuncs =
|
||||||
{
|
{
|
||||||
pfnEngineGetParm,
|
pfnEngineGetParm,
|
||||||
|
|
||||||
(void*)Cvar_Get,
|
pfnCvar_Get,
|
||||||
(void*)Cvar_FindVarExt,
|
(void*)Cvar_FindVarExt,
|
||||||
Cvar_VariableValue,
|
Cvar_VariableValue,
|
||||||
Cvar_VariableString,
|
Cvar_VariableString,
|
||||||
Cvar_SetValue,
|
Cvar_SetValue,
|
||||||
Cvar_Set,
|
Cvar_Set,
|
||||||
Cvar_RegisterVariable,
|
pfnCvar_RegisterVariable,
|
||||||
Cvar_FullSet,
|
pfnCvar_FullSet,
|
||||||
|
|
||||||
Cmd_AddRefCommand,
|
Cmd_AddRefCommand,
|
||||||
Cmd_RemoveCommand,
|
Cmd_RemoveCommand,
|
||||||
@@ -340,7 +447,7 @@ static void R_UnloadProgs( void )
|
|||||||
|
|
||||||
Cvar_FullSet( "host_refloaded", "0", FCVAR_READ_ONLY );
|
Cvar_FullSet( "host_refloaded", "0", FCVAR_READ_ONLY );
|
||||||
|
|
||||||
Cvar_Unlink( FCVAR_RENDERINFO | FCVAR_GLCONFIG );
|
Cvar_Unlink( FCVAR_RENDERINFO | FCVAR_GLCONFIG | FCVAR_REFDLL );
|
||||||
Cmd_Unlink( CMD_REFDLL );
|
Cmd_Unlink( CMD_REFDLL );
|
||||||
|
|
||||||
COM_FreeLibrary( ref.hInstance );
|
COM_FreeLibrary( ref.hInstance );
|
||||||
@@ -376,48 +483,41 @@ static void CL_FillTriAPIFromRef( triangleapi_t *dst, const ref_interface_t *src
|
|||||||
|
|
||||||
static qboolean R_LoadProgs( const char *name )
|
static qboolean R_LoadProgs( const char *name )
|
||||||
{
|
{
|
||||||
extern triangleapi_t gTriApi;
|
|
||||||
static ref_api_t gpEngfuncs;
|
static ref_api_t gpEngfuncs;
|
||||||
REFAPI GetRefAPI; // single export
|
REFAPI GetRefAPI; // single export
|
||||||
|
|
||||||
if( ref.hInstance ) R_UnloadProgs();
|
if( ref.hInstance ) R_UnloadProgs();
|
||||||
|
|
||||||
FS_AllowDirectPaths( true );
|
FS_AllowDirectPaths( true );
|
||||||
if( !(ref.hInstance = COM_LoadLibrary( name, false, true ) ))
|
if( !( ref.hInstance = COM_LoadLibrary( name, false, true )))
|
||||||
{
|
{
|
||||||
FS_AllowDirectPaths( false );
|
FS_AllowDirectPaths( false );
|
||||||
Con_Reportf( "R_LoadProgs: can't load renderer library %s: %s\n", name, COM_GetLibraryError() );
|
Con_Reportf( "%s: can't load renderer library %s: %s\n", __func__, name, COM_GetLibraryError() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FS_AllowDirectPaths( false );
|
FS_AllowDirectPaths( false );
|
||||||
|
|
||||||
if( !( GetRefAPI = (REFAPI)COM_GetProcAddress( ref.hInstance, GET_REF_API )) )
|
if( !( GetRefAPI = (REFAPI)COM_GetProcAddress( ref.hInstance, GET_REF_API )))
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( ref.hInstance );
|
Con_Reportf( "%s: can't find GetRefAPI entry point in %s\n", __func__, name );
|
||||||
Con_Reportf( "R_LoadProgs: can't find GetRefAPI entry point in %s\n", name );
|
|
||||||
ref.hInstance = NULL;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// make local copy of engfuncs to prevent overwrite it with user dll
|
// make local copy of engfuncs to prevent overwrite it with user dll
|
||||||
memcpy( &gpEngfuncs, &gEngfuncs, sizeof( gpEngfuncs ));
|
gpEngfuncs = gEngfuncs;
|
||||||
|
|
||||||
if( GetRefAPI( REF_API_VERSION, &ref.dllFuncs, &gpEngfuncs, &refState ) != REF_API_VERSION )
|
if( GetRefAPI( REF_API_VERSION, &ref.dllFuncs, &gpEngfuncs, &refState ) != REF_API_VERSION )
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( ref.hInstance );
|
Con_Reportf( "%s: can't init renderer API: wrong version\n", __func__ );
|
||||||
Con_Reportf( "R_LoadProgs: can't init renderer API: wrong version\n" );
|
|
||||||
ref.hInstance = NULL;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
refState.developer = host_developer.value;
|
refState.developer = host_developer.value;
|
||||||
|
|
||||||
if( !ref.dllFuncs.R_Init( ) )
|
if( !ref.dllFuncs.R_Init( ))
|
||||||
{
|
{
|
||||||
COM_FreeLibrary( ref.hInstance );
|
Con_Reportf( "%s: can't init renderer!\n", __func__ ); //, ref.dllFuncs.R_GetInitError() );
|
||||||
Con_Reportf( "R_LoadProgs: can't init renderer!\n" ); //, ref.dllFuncs.R_GetInitError() );
|
|
||||||
ref.hInstance = NULL;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,21 +554,19 @@ static void R_GetRendererName( char *dest, size_t size, const char *opt )
|
|||||||
{
|
{
|
||||||
if( !Q_strstr( opt, "." OS_LIB_EXT ))
|
if( !Q_strstr( opt, "." OS_LIB_EXT ))
|
||||||
{
|
{
|
||||||
const char *format;
|
|
||||||
|
|
||||||
#ifdef XASH_INTERNAL_GAMELIBS
|
#ifdef XASH_INTERNAL_GAMELIBS
|
||||||
if( !Q_strcmp( opt, "ref_" ))
|
#define FMT1 "%s"
|
||||||
format = "%s";
|
#define FMT2 "ref_%s"
|
||||||
else
|
|
||||||
format = "ref_%s";
|
|
||||||
#else
|
#else
|
||||||
if( !Q_strcmp( opt, "ref_" ))
|
#define FMT1 OS_LIB_PREFIX "%s." OS_LIB_EXT
|
||||||
format = OS_LIB_PREFIX "%s." OS_LIB_EXT;
|
#define FMT2 OS_LIB_PREFIX "ref_%s." OS_LIB_EXT
|
||||||
else
|
|
||||||
format = OS_LIB_PREFIX "ref_%s." OS_LIB_EXT;
|
|
||||||
#endif
|
#endif
|
||||||
Q_snprintf( dest, size, format, opt );
|
if( !Q_strncmp( opt, "ref_", 4 ))
|
||||||
|
Q_snprintf( dest, size, FMT1, opt );
|
||||||
|
else
|
||||||
|
Q_snprintf( dest, size, FMT2, opt );
|
||||||
|
#undef FMT1
|
||||||
|
#undef FMT2
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -580,7 +678,8 @@ static void R_CollectRendererNames( void )
|
|||||||
qboolean R_Init( void )
|
qboolean R_Init( void )
|
||||||
{
|
{
|
||||||
qboolean success = false;
|
qboolean success = false;
|
||||||
string requested;
|
string requested_cmdline;
|
||||||
|
string requested_cvar;
|
||||||
|
|
||||||
Cvar_RegisterVariable( &gl_vsync );
|
Cvar_RegisterVariable( &gl_vsync );
|
||||||
Cvar_RegisterVariable( &r_showtextures );
|
Cvar_RegisterVariable( &r_showtextures );
|
||||||
@@ -630,15 +729,16 @@ qboolean R_Init( void )
|
|||||||
// 1. Command line `-ref` argument.
|
// 1. Command line `-ref` argument.
|
||||||
// 2. `ref_dll` cvar.
|
// 2. `ref_dll` cvar.
|
||||||
// 3. Detected renderers in `DEFAULT_RENDERERS` order.
|
// 3. Detected renderers in `DEFAULT_RENDERERS` order.
|
||||||
requested[0] = 0;
|
requested_cmdline[0] = 0;
|
||||||
|
requested_cvar[0] = 0;
|
||||||
|
|
||||||
if( !success && Sys_GetParmFromCmdLine( "-ref", requested ))
|
if( Sys_GetParmFromCmdLine( "-ref", requested_cmdline ))
|
||||||
success = R_LoadRenderer( requested );
|
success = R_LoadRenderer( requested_cmdline );
|
||||||
|
|
||||||
if( !success && COM_CheckString( r_refdll.string ))
|
if( !success && COM_CheckString( r_refdll.string ) && Q_stricmp( requested_cmdline, r_refdll.string ))
|
||||||
{
|
{
|
||||||
Q_strncpy( requested, r_refdll.string, sizeof( requested ));
|
Q_strncpy( requested_cvar, r_refdll.string, sizeof( requested_cvar ));
|
||||||
success = R_LoadRenderer( requested );
|
success = R_LoadRenderer( requested_cvar );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !success )
|
if( !success )
|
||||||
@@ -648,7 +748,10 @@ qboolean R_Init( void )
|
|||||||
for( i = 0; i < ref.numRenderers && !success; i++ )
|
for( i = 0; i < ref.numRenderers && !success; i++ )
|
||||||
{
|
{
|
||||||
// skip renderer that was requested but failed to load
|
// skip renderer that was requested but failed to load
|
||||||
if( !Q_strcmp( requested, ref.shortNames[i] ))
|
if( !Q_strcmp( requested_cmdline, ref.shortNames[i] ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( !Q_strcmp( requested_cvar, ref.shortNames[i] ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
success = R_LoadRenderer( ref.shortNames[i] );
|
success = R_LoadRenderer( ref.shortNames[i] );
|
||||||
@@ -657,7 +760,7 @@ qboolean R_Init( void )
|
|||||||
|
|
||||||
if( !success )
|
if( !success )
|
||||||
{
|
{
|
||||||
Host_Error( "Can't initialize any renderer. Check your video drivers!\n" );
|
Sys_Error( "Can't initialize any renderer. Check your video drivers!\n" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,19 +18,18 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#include "ref_api.h"
|
#include "ref_api.h"
|
||||||
|
|
||||||
#define RP_LOCALCLIENT( e ) ((e) != NULL && (e)->index == ( cl.playernum + 1 ) && e->player )
|
#define RP_LOCALCLIENT( e ) ((e) != NULL && (e)->index == ( cl.playernum + 1 ) && e->player )
|
||||||
|
|
||||||
struct ref_state_s
|
struct ref_state_s
|
||||||
{
|
{
|
||||||
qboolean initialized;
|
HINSTANCE hInstance;
|
||||||
|
qboolean initialized;
|
||||||
HINSTANCE hInstance;
|
int numRenderers;
|
||||||
ref_interface_t dllFuncs;
|
ref_interface_t dllFuncs;
|
||||||
|
|
||||||
// depends on build configuration
|
// depends on build configuration
|
||||||
int numRenderers;
|
const char **shortNames;
|
||||||
const char **shortNames;
|
const char **readableNames;
|
||||||
const char **readableNames;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct ref_state_s ref;
|
extern struct ref_state_s ref;
|
||||||
@@ -45,14 +44,14 @@ void R_GetTextureParms( int *w, int *h, int texnum );
|
|||||||
|
|
||||||
void GL_RenderFrame( const struct ref_viewpass_s *rvp );
|
void GL_RenderFrame( const struct ref_viewpass_s *rvp );
|
||||||
|
|
||||||
|
void R_SetupSky( const char *name );
|
||||||
|
|
||||||
// common engine and renderer cvars
|
// common engine and renderer cvars
|
||||||
extern convar_t r_decals;
|
extern convar_t r_decals;
|
||||||
extern convar_t r_adjust_fov;
|
extern convar_t r_adjust_fov;
|
||||||
extern convar_t gl_clear;
|
extern convar_t gl_clear;
|
||||||
|
|
||||||
qboolean R_Init( void );
|
qboolean R_Init( void );
|
||||||
void R_Shutdown( void );
|
void R_Shutdown( void );
|
||||||
|
|
||||||
extern triangleapi_t gTriApi;
|
|
||||||
|
|
||||||
#endif // REF_COMMON_H
|
#endif // REF_COMMON_H
|
||||||
|
|||||||
@@ -154,7 +154,8 @@ static const sx_preset_t rgsxpre_hlalpha052[] =
|
|||||||
static const sx_preset_t *ptable = rgsxpre;
|
static const sx_preset_t *ptable = rgsxpre;
|
||||||
|
|
||||||
// cvars
|
// cvars
|
||||||
static CVAR_DEFINE_AUTO( dsp_off, "0", FCVAR_ARCHIVE, "disable DSP processing" );
|
static CVAR_DEFINE_AUTO( dsp_off, "0", FCVAR_ARCHIVE, "disable DSP processing (deprecated)" );
|
||||||
|
static CVAR_DEFINE_AUTO( room_off, "0", FCVAR_ARCHIVE, "disable DSP processing (GoldSrc compatible cvar)" );
|
||||||
static CVAR_DEFINE_AUTO( dsp_coeff_table, "0", FCVAR_ARCHIVE, "select DSP coefficient table: 0 for release or 1 for alpha 0.52" );
|
static CVAR_DEFINE_AUTO( dsp_coeff_table, "0", FCVAR_ARCHIVE, "select DSP coefficient table: 0 for release or 1 for alpha 0.52" );
|
||||||
static CVAR_DEFINE_AUTO( room_type, "0", 0, "current room type preset" );
|
static CVAR_DEFINE_AUTO( room_type, "0", 0, "current room type preset" );
|
||||||
|
|
||||||
@@ -232,6 +233,7 @@ void SX_Init( void )
|
|||||||
sxmod2cur = sxmod2 = 450 * ( idsp_dma_speed / SOUND_11k );
|
sxmod2cur = sxmod2 = 450 * ( idsp_dma_speed / SOUND_11k );
|
||||||
|
|
||||||
Cvar_RegisterVariable( &dsp_off );
|
Cvar_RegisterVariable( &dsp_off );
|
||||||
|
Cvar_RegisterVariable( &room_off );
|
||||||
Cvar_RegisterVariable( &dsp_coeff_table );
|
Cvar_RegisterVariable( &dsp_coeff_table );
|
||||||
|
|
||||||
Cvar_RegisterVariable( &roomwater_type );
|
Cvar_RegisterVariable( &roomwater_type );
|
||||||
@@ -809,7 +811,7 @@ DSP_Process
|
|||||||
*/
|
*/
|
||||||
void DSP_Process( portable_samplepair_t *pbfront, int sampleCount )
|
void DSP_Process( portable_samplepair_t *pbfront, int sampleCount )
|
||||||
{
|
{
|
||||||
if( dsp_off.value || !sampleCount )
|
if( dsp_off.value || room_off.value || !sampleCount )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// preset is already installed by CheckNewDspPresets
|
// preset is already installed by CheckNewDspPresets
|
||||||
@@ -843,7 +845,7 @@ CheckNewDspPresets
|
|||||||
*/
|
*/
|
||||||
void CheckNewDspPresets( void )
|
void CheckNewDspPresets( void )
|
||||||
{
|
{
|
||||||
if( dsp_off.value != 0.0f )
|
if( dsp_off.value || room_off.value )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( FBitSet( dsp_coeff_table.flags, FCVAR_CHANGED ))
|
if( FBitSet( dsp_coeff_table.flags, FCVAR_CHANGED ))
|
||||||
|
|||||||
@@ -52,8 +52,11 @@ void S_SoundList_f( void )
|
|||||||
{
|
{
|
||||||
totalSize += sc->size;
|
totalSize += sc->size;
|
||||||
|
|
||||||
if( sc->loopStart >= 0 ) Con_Printf( "L" );
|
if( FBitSet( sc->flags, SOUND_LOOPED ))
|
||||||
else Con_Printf( " " );
|
Con_Printf( "L" );
|
||||||
|
else
|
||||||
|
Con_Printf( " " );
|
||||||
|
|
||||||
if( sfx->name[0] == '*' || !Q_strncmp( sfx->name, DEFAULT_SOUNDPATH, sizeof( DEFAULT_SOUNDPATH ) - 1 ))
|
if( sfx->name[0] == '*' || !Q_strncmp( sfx->name, DEFAULT_SOUNDPATH, sizeof( DEFAULT_SOUNDPATH ) - 1 ))
|
||||||
Con_Printf( " (%2db) %s : %s\n", sc->width * 8, Q_memprint( sc->size ), sfx->name );
|
Con_Printf( " (%2db) %s : %s\n", sc->width * 8, Q_memprint( sc->size ), sfx->name );
|
||||||
else Con_Printf( " (%2db) %s : " DEFAULT_SOUNDPATH "%s\n", sc->width * 8, Q_memprint( sc->size ), sfx->name );
|
else Con_Printf( " (%2db) %s : " DEFAULT_SOUNDPATH "%s\n", sc->width * 8, Q_memprint( sc->size ), sfx->name );
|
||||||
@@ -110,7 +113,7 @@ static wavdata_t *S_CreateDefaultSound( void )
|
|||||||
|
|
||||||
sc->width = 2;
|
sc->width = 2;
|
||||||
sc->channels = 1;
|
sc->channels = 1;
|
||||||
sc->loopStart = -1;
|
sc->loopStart = 0;
|
||||||
sc->rate = SOUND_DMA_SPEED;
|
sc->rate = SOUND_DMA_SPEED;
|
||||||
sc->samples = SOUND_DMA_SPEED;
|
sc->samples = SOUND_DMA_SPEED;
|
||||||
sc->size = sc->samples * sc->width * sc->channels;
|
sc->size = sc->samples * sc->width * sc->channels;
|
||||||
@@ -141,8 +144,8 @@ wavdata_t *S_LoadSound( sfx_t *sfx )
|
|||||||
if( Q_stricmp( sfx->name, "*default" ))
|
if( Q_stricmp( sfx->name, "*default" ))
|
||||||
{
|
{
|
||||||
// load it from disk
|
// load it from disk
|
||||||
if( s_warn_late_precache.value > 0 && CL_Active() )
|
if( s_warn_late_precache.value > 0 && cls.state == ca_active )
|
||||||
Con_Printf( S_WARN "S_LoadSound: late precache of %s\n", sfx->name );
|
Con_Printf( S_WARN "%s: late precache of %s\n", __func__, sfx->name );
|
||||||
|
|
||||||
if( sfx->name[0] == '*' )
|
if( sfx->name[0] == '*' )
|
||||||
sc = FS_LoadSound( sfx->name + 1, NULL, 0 );
|
sc = FS_LoadSound( sfx->name + 1, NULL, 0 );
|
||||||
@@ -152,11 +155,11 @@ wavdata_t *S_LoadSound( sfx_t *sfx )
|
|||||||
if( !sc ) sc = S_CreateDefaultSound();
|
if( !sc ) sc = S_CreateDefaultSound();
|
||||||
|
|
||||||
if( sc->rate < SOUND_11k ) // some bad sounds
|
if( sc->rate < SOUND_11k ) // some bad sounds
|
||||||
Sound_Process( &sc, SOUND_11k, sc->width, SOUND_RESAMPLE );
|
Sound_Process( &sc, SOUND_11k, sc->width, sc->channels, SOUND_RESAMPLE );
|
||||||
else if( sc->rate > SOUND_11k && sc->rate < SOUND_22k ) // some bad sounds
|
else if( sc->rate > SOUND_11k && sc->rate < SOUND_22k ) // some bad sounds
|
||||||
Sound_Process( &sc, SOUND_22k, sc->width, SOUND_RESAMPLE );
|
Sound_Process( &sc, SOUND_22k, sc->width, sc->channels, SOUND_RESAMPLE );
|
||||||
else if( sc->rate > SOUND_22k && sc->rate <= SOUND_32k ) // some bad sounds
|
else if( sc->rate > SOUND_22k && sc->rate < SOUND_44k ) // some bad sounds
|
||||||
Sound_Process( &sc, SOUND_44k, sc->width, SOUND_RESAMPLE );
|
Sound_Process( &sc, SOUND_44k, sc->width, sc->channels, SOUND_RESAMPLE );
|
||||||
|
|
||||||
sfx->cache = sc;
|
sfx->cache = sc;
|
||||||
|
|
||||||
@@ -218,7 +221,7 @@ sfx_t *S_FindName( const char *pname, int *pfInCache )
|
|||||||
sfx = &s_knownSfx[i];
|
sfx = &s_knownSfx[i];
|
||||||
memset( sfx, 0, sizeof( *sfx ));
|
memset( sfx, 0, sizeof( *sfx ));
|
||||||
if( pfInCache ) *pfInCache = false;
|
if( pfInCache ) *pfInCache = false;
|
||||||
Q_strncpy( sfx->name, name, MAX_STRING );
|
Q_strncpy( sfx->name, name, sizeof( sfx->name ));
|
||||||
sfx->servercount = cl.servercount;
|
sfx->servercount = cl.servercount;
|
||||||
sfx->hashValue = COM_HashKey( sfx->name, MAX_SFX_HASH );
|
sfx->hashValue = COM_HashKey( sfx->name, MAX_SFX_HASH );
|
||||||
|
|
||||||
@@ -377,7 +380,7 @@ S_InitSounds
|
|||||||
void S_InitSounds( void )
|
void S_InitSounds( void )
|
||||||
{
|
{
|
||||||
// create unused 0-entry
|
// create unused 0-entry
|
||||||
Q_strncpy( s_knownSfx->name, "*default", MAX_QPATH );
|
Q_strncpy( s_knownSfx->name, "*default", sizeof( s_knownSfx->name ));
|
||||||
s_knownSfx->hashValue = COM_HashKey( s_knownSfx->name, MAX_SFX_HASH );
|
s_knownSfx->hashValue = COM_HashKey( s_knownSfx->name, MAX_SFX_HASH );
|
||||||
s_knownSfx->hashNext = s_sfxHashList[s_knownSfx->hashValue];
|
s_knownSfx->hashNext = s_sfxHashList[s_knownSfx->hashValue];
|
||||||
s_sfxHashList[s_knownSfx->hashValue] = s_knownSfx;
|
s_sfxHashList[s_knownSfx->hashValue] = s_knownSfx;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ CVAR_DEFINE_AUTO( s_lerping, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "apply interpo
|
|||||||
static CVAR_DEFINE( s_ambient_level, "ambient_level", "0.3", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "volume of environment noises (water and wind)" );
|
static CVAR_DEFINE( s_ambient_level, "ambient_level", "0.3", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "volume of environment noises (water and wind)" );
|
||||||
static CVAR_DEFINE( s_ambient_fade, "ambient_fade", "1000", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "rate of volume fading when client is moving" );
|
static CVAR_DEFINE( s_ambient_fade, "ambient_fade", "1000", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "rate of volume fading when client is moving" );
|
||||||
static CVAR_DEFINE_AUTO( s_combine_sounds, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "combine channels with same sounds" );
|
static CVAR_DEFINE_AUTO( s_combine_sounds, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "combine channels with same sounds" );
|
||||||
static CVAR_DEFINE_AUTO( snd_mute_losefocus, "1", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "silence the audio when game window loses focus" );
|
CVAR_DEFINE_AUTO( snd_mute_losefocus, "1", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "silence the audio when game window loses focus" );
|
||||||
CVAR_DEFINE_AUTO( s_test, "0", 0, "engine developer cvar for quick testing new features" );
|
CVAR_DEFINE_AUTO( s_test, "0", 0, "engine developer cvar for quick testing new features" );
|
||||||
CVAR_DEFINE_AUTO( s_samplecount, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "sample count (0 for default value)" );
|
CVAR_DEFINE_AUTO( s_samplecount, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "sample count (0 for default value)" );
|
||||||
CVAR_DEFINE_AUTO( s_warn_late_precache, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "warn about late precached sounds on client-side" );
|
CVAR_DEFINE_AUTO( s_warn_late_precache, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "warn about late precached sounds on client-side" );
|
||||||
@@ -328,7 +328,7 @@ channel_t *SND_PickDynamicChannel( int entnum, int channel, sfx_t *sfx, qboolean
|
|||||||
// don't restart looping sounds for the same entity
|
// don't restart looping sounds for the same entity
|
||||||
wavdata_t *sc = channels[first_to_die].sfx->cache;
|
wavdata_t *sc = channels[first_to_die].sfx->cache;
|
||||||
|
|
||||||
if( sc && sc->loopStart != -1 )
|
if( sc && FBitSet( sc->flags, SOUND_LOOPED ))
|
||||||
{
|
{
|
||||||
channel_t *ch = &channels[first_to_die];
|
channel_t *ch = &channels[first_to_die];
|
||||||
|
|
||||||
@@ -382,7 +382,7 @@ channel_t *SND_PickStaticChannel( const vec3_t pos, sfx_t *sfx )
|
|||||||
// no empty slots, alloc a new static sound channel
|
// no empty slots, alloc a new static sound channel
|
||||||
if( total_channels == MAX_CHANNELS )
|
if( total_channels == MAX_CHANNELS )
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "S_PickStaticChannel: no free channels\n" );
|
Con_DPrintf( S_ERROR "%s: no free channels\n", __func__ );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,7 +503,7 @@ static void SND_Spatialize( channel_t *ch )
|
|||||||
|
|
||||||
pSource = ch->sfx->cache;
|
pSource = ch->sfx->cache;
|
||||||
|
|
||||||
if( ch->use_loop && pSource && pSource->loopStart != -1 )
|
if( ch->use_loop && pSource && FBitSet( pSource->flags, SOUND_LOOPED ))
|
||||||
looping = true;
|
looping = true;
|
||||||
|
|
||||||
if( !ch->staticsound )
|
if( !ch->staticsound )
|
||||||
@@ -524,8 +524,11 @@ static void SND_Spatialize( channel_t *ch )
|
|||||||
dist = VectorNormalizeLength( source_vec );
|
dist = VectorNormalizeLength( source_vec );
|
||||||
dot = DotProduct( s_listener.right, source_vec );
|
dot = DotProduct( s_listener.right, source_vec );
|
||||||
|
|
||||||
// don't pan sounds with no attenuation
|
if( !FBitSet( host.bugcomp, BUGCOMP_SPATIALIZE_SOUND_WITH_ATTN_NONE ))
|
||||||
if( ch->dist_mult <= 0.0f ) dot = 0.0f;
|
{
|
||||||
|
// don't pan sounds with no attenuation
|
||||||
|
if( ch->dist_mult <= 0.0f ) dot = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
// fill out channel volumes for single location
|
// fill out channel volumes for single location
|
||||||
S_SpatializeChannel( &ch->leftvol, &ch->rightvol, ch->master_vol, gain, dot, dist * ch->dist_mult );
|
S_SpatializeChannel( &ch->leftvol, &ch->rightvol, ch->master_vol, gain, dot, dist * ch->dist_mult );
|
||||||
@@ -641,7 +644,7 @@ void S_StartSound( const vec3_t pos, int ent, int chan, sound_t handle, float fv
|
|||||||
if( !target_chan->leftvol && !target_chan->rightvol )
|
if( !target_chan->leftvol && !target_chan->rightvol )
|
||||||
{
|
{
|
||||||
// looping sounds don't use this optimization because they should stick around until they're killed.
|
// looping sounds don't use this optimization because they should stick around until they're killed.
|
||||||
if( !sfx->cache || sfx->cache->loopStart == -1 )
|
if( !sfx->cache || !FBitSet( sfx->cache->flags, SOUND_LOOPED ))
|
||||||
{
|
{
|
||||||
// if this is a streaming sound, play the whole thing.
|
// if this is a streaming sound, play the whole thing.
|
||||||
if( chan != CHAN_STREAM )
|
if( chan != CHAN_STREAM )
|
||||||
@@ -893,7 +896,7 @@ int S_GetCurrentStaticSounds( soundlist_t *pout, int size )
|
|||||||
VectorCopy( channels[i].origin, pout->origin );
|
VectorCopy( channels[i].origin, pout->origin );
|
||||||
pout->volume = (float)channels[i].master_vol / 255.0f;
|
pout->volume = (float)channels[i].master_vol / 255.0f;
|
||||||
pout->attenuation = channels[i].dist_mult * SND_CLIP_DISTANCE;
|
pout->attenuation = channels[i].dist_mult * SND_CLIP_DISTANCE;
|
||||||
pout->looping = ( channels[i].use_loop && channels[i].sfx->cache->loopStart != -1 );
|
pout->looping = ( channels[i].use_loop && FBitSet( channels[i].sfx->cache->flags, SOUND_LOOPED ));
|
||||||
pout->pitch = channels[i].basePitch;
|
pout->pitch = channels[i].basePitch;
|
||||||
pout->channel = channels[i].entchannel;
|
pout->channel = channels[i].entchannel;
|
||||||
pout->wordIndex = channels[i].wordIndex;
|
pout->wordIndex = channels[i].wordIndex;
|
||||||
@@ -928,7 +931,7 @@ int S_GetCurrentDynamicSounds( soundlist_t *pout, int size )
|
|||||||
if( !channels[i].sfx || !channels[i].sfx->name[0] || !Q_stricmp( channels[i].sfx->name, "*default" ))
|
if( !channels[i].sfx || !channels[i].sfx->name[0] || !Q_stricmp( channels[i].sfx->name, "*default" ))
|
||||||
continue; // don't serialize default sounds
|
continue; // don't serialize default sounds
|
||||||
|
|
||||||
looped = ( channels[i].use_loop && channels[i].sfx->cache->loopStart != -1 );
|
looped = ( channels[i].use_loop && FBitSet( channels[i].sfx->cache->flags, SOUND_LOOPED ));
|
||||||
|
|
||||||
if( channels[i].entchannel == CHAN_STATIC && looped && !Host_IsQuakeCompatible())
|
if( channels[i].entchannel == CHAN_STATIC && looped && !Host_IsQuakeCompatible())
|
||||||
continue; // never serialize static looped sounds. It will be restoring in game code
|
continue; // never serialize static looped sounds. It will be restoring in game code
|
||||||
@@ -1092,7 +1095,7 @@ rawchan_t *S_FindRawChannel( int entnum, qboolean create )
|
|||||||
if( !raw_channels[best] )
|
if( !raw_channels[best] )
|
||||||
{
|
{
|
||||||
raw_samples = MAX_RAW_SAMPLES;
|
raw_samples = MAX_RAW_SAMPLES;
|
||||||
raw_channels[best] = Mem_Calloc( sndpool, sizeof( *ch ) + sizeof( portable_samplepair_t ) * ( raw_samples - 1 ));
|
raw_channels[best] = Mem_Calloc( sndpool, sizeof( *ch ) + sizeof( portable_samplepair_t ) * raw_samples );
|
||||||
}
|
}
|
||||||
|
|
||||||
ch = raw_channels[best];
|
ch = raw_channels[best];
|
||||||
@@ -1599,11 +1602,10 @@ void SND_UpdateSound( void )
|
|||||||
// release raw-channels that no longer used more than 10 secs
|
// release raw-channels that no longer used more than 10 secs
|
||||||
S_FreeIdleRawChannels();
|
S_FreeIdleRawChannels();
|
||||||
|
|
||||||
VectorCopy( cl.simvel, s_listener.velocity );
|
|
||||||
s_listener.frametime = (cl.time - cl.oldtime);
|
s_listener.frametime = (cl.time - cl.oldtime);
|
||||||
s_listener.waterlevel = cl.local.waterlevel;
|
s_listener.waterlevel = cl.local.waterlevel;
|
||||||
s_listener.active = CL_IsInGame();
|
s_listener.active = CL_IsInGame();
|
||||||
s_listener.inmenu = CL_IsInMenu();
|
s_listener.inmenu = cls.key_dest == key_menu;
|
||||||
s_listener.paused = cl.paused;
|
s_listener.paused = cl.paused;
|
||||||
|
|
||||||
// update general area ambient sound sources
|
// update general area ambient sound sources
|
||||||
@@ -1892,7 +1894,7 @@ S_VoiceRecordStart_f
|
|||||||
*/
|
*/
|
||||||
static void S_VoiceRecordStart_f( void )
|
static void S_VoiceRecordStart_f( void )
|
||||||
{
|
{
|
||||||
if( cls.state != ca_active || cls.legacymode )
|
if( cls.state != ca_active )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Voice_RecordStart();
|
Voice_RecordStart();
|
||||||
|
|||||||
@@ -17,30 +17,56 @@ GNU General Public License for more details.
|
|||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
#define IPAINTBUFFER 0
|
enum
|
||||||
#define IROOMBUFFER 1
|
{
|
||||||
#define ISTREAMBUFFER 2
|
IPAINTBUFFER = 0,
|
||||||
|
IROOMBUFFER,
|
||||||
|
ISTREAMBUFFER,
|
||||||
|
CPAINTBUFFERS,
|
||||||
|
};
|
||||||
|
|
||||||
#define FILTERTYPE_NONE 0
|
enum
|
||||||
#define FILTERTYPE_LINEAR 1
|
{
|
||||||
#define FILTERTYPE_CUBIC 2
|
FILTERTYPE_NONE = 0,
|
||||||
|
FILTERTYPE_LINEAR,
|
||||||
|
FILTERTYPE_CUBIC,
|
||||||
|
};
|
||||||
|
|
||||||
#define CCHANVOLUMES 2
|
#define CCHANVOLUMES 2
|
||||||
|
|
||||||
#define SND_SCALE_BITS 7
|
#define SND_SCALE_BITS 7
|
||||||
#define SND_SCALE_SHIFT (8 - SND_SCALE_BITS)
|
#define SND_SCALE_SHIFT ( 8 - SND_SCALE_BITS )
|
||||||
#define SND_SCALE_LEVELS (1 << SND_SCALE_BITS)
|
#define SND_SCALE_LEVELS ( 1 << SND_SCALE_BITS )
|
||||||
|
|
||||||
portable_samplepair_t *g_curpaintbuffer;
|
// sound mixing buffer
|
||||||
portable_samplepair_t streambuffer[(PAINTBUFFER_SIZE+1)];
|
#define CPAINTFILTERMEM 3
|
||||||
portable_samplepair_t paintbuffer[(PAINTBUFFER_SIZE+1)];
|
#define CPAINTFILTERS 4 // maximum number of consecutive upsample passes per paintbuffer
|
||||||
portable_samplepair_t roombuffer[(PAINTBUFFER_SIZE+1)];
|
|
||||||
portable_samplepair_t facingbuffer[(PAINTBUFFER_SIZE+1)];
|
|
||||||
portable_samplepair_t temppaintbuffer[(PAINTBUFFER_SIZE+1)];
|
|
||||||
paintbuffer_t paintbuffers[CPAINTBUFFERS];
|
|
||||||
|
|
||||||
int snd_scaletable[SND_SCALE_LEVELS][256];
|
// fixed point stuff for real-time resampling
|
||||||
|
#define FIX_BITS 28
|
||||||
|
#define FIX_SCALE ( 1 << FIX_BITS )
|
||||||
|
#define FIX_MASK (( 1 << FIX_BITS ) - 1 )
|
||||||
|
#define FIX_FLOAT( a ) ((int)(( a ) * FIX_SCALE ))
|
||||||
|
#define FIX( a ) (((int)( a )) << FIX_BITS )
|
||||||
|
#define FIX_INTPART( a ) (((int)( a )) >> FIX_BITS )
|
||||||
|
#define FIX_FRACPART( a ) (( a ) & FIX_MASK )
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
qboolean factive; // if true, mix to this paintbuffer using flags
|
||||||
|
portable_samplepair_t *pbuf; // front stereo mix buffer, for 2 or 4 channel mixing
|
||||||
|
int ifilter; // current filter memory buffer to use for upsampling pass
|
||||||
|
portable_samplepair_t fltmem[CPAINTFILTERS][CPAINTFILTERMEM];
|
||||||
|
} paintbuffer_t;
|
||||||
|
|
||||||
|
static portable_samplepair_t *g_curpaintbuffer;
|
||||||
|
static portable_samplepair_t streambuffer[(PAINTBUFFER_SIZE+1)];
|
||||||
|
static portable_samplepair_t paintbuffer[(PAINTBUFFER_SIZE+1)];
|
||||||
|
static portable_samplepair_t roombuffer[(PAINTBUFFER_SIZE+1)];
|
||||||
|
static portable_samplepair_t temppaintbuffer[(PAINTBUFFER_SIZE+1)];
|
||||||
|
static paintbuffer_t paintbuffers[CPAINTBUFFERS];
|
||||||
|
|
||||||
|
static int snd_scaletable[SND_SCALE_LEVELS][256];
|
||||||
void S_InitScaletable( void )
|
void S_InitScaletable( void )
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
@@ -67,7 +93,7 @@ static void S_TransferPaintBuffer( int endtime )
|
|||||||
dword *pbuf;
|
dword *pbuf;
|
||||||
|
|
||||||
pbuf = (dword *)dma.buffer;
|
pbuf = (dword *)dma.buffer;
|
||||||
snd_p = (int *)PAINTBUFFER;
|
snd_p = (int *)g_curpaintbuffer;
|
||||||
lpaintedtime = paintedtime;
|
lpaintedtime = paintedtime;
|
||||||
sampleMask = ((dma.samples >> 1) - 1);
|
sampleMask = ((dma.samples >> 1) - 1);
|
||||||
|
|
||||||
@@ -111,20 +137,20 @@ static void S_TransferPaintBuffer( int endtime )
|
|||||||
//===============================================================================
|
//===============================================================================
|
||||||
// Activate a paintbuffer. All active paintbuffers are mixed in parallel within
|
// Activate a paintbuffer. All active paintbuffers are mixed in parallel within
|
||||||
// MIX_MixChannelsToPaintbuffer, according to flags
|
// MIX_MixChannelsToPaintbuffer, according to flags
|
||||||
_inline void MIX_ActivatePaintbuffer( int ipaintbuffer )
|
static void MIX_ActivatePaintbuffer( int ipaintbuffer )
|
||||||
{
|
{
|
||||||
Assert( ipaintbuffer < CPAINTBUFFERS );
|
Assert( ipaintbuffer < CPAINTBUFFERS );
|
||||||
paintbuffers[ipaintbuffer].factive = true;
|
paintbuffers[ipaintbuffer].factive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline void MIX_SetCurrentPaintbuffer( int ipaintbuffer )
|
static void MIX_SetCurrentPaintbuffer( int ipaintbuffer )
|
||||||
{
|
{
|
||||||
Assert( ipaintbuffer < CPAINTBUFFERS );
|
Assert( ipaintbuffer < CPAINTBUFFERS );
|
||||||
g_curpaintbuffer = paintbuffers[ipaintbuffer].pbuf;
|
g_curpaintbuffer = paintbuffers[ipaintbuffer].pbuf;
|
||||||
Assert( g_curpaintbuffer != NULL );
|
Assert( g_curpaintbuffer != NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline int MIX_GetCurrentPaintbufferIndex( void )
|
static int MIX_GetCurrentPaintbufferIndex( void )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -136,7 +162,7 @@ _inline int MIX_GetCurrentPaintbufferIndex( void )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline paintbuffer_t *MIX_GetCurrentPaintbufferPtr( void )
|
static paintbuffer_t *MIX_GetCurrentPaintbufferPtr( void )
|
||||||
{
|
{
|
||||||
int ipaint = MIX_GetCurrentPaintbufferIndex();
|
int ipaint = MIX_GetCurrentPaintbufferIndex();
|
||||||
|
|
||||||
@@ -145,7 +171,7 @@ _inline paintbuffer_t *MIX_GetCurrentPaintbufferPtr( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't mix into any paintbuffers
|
// Don't mix into any paintbuffers
|
||||||
_inline void MIX_DeactivateAllPaintbuffers( void )
|
static void MIX_DeactivateAllPaintbuffers( void )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -154,7 +180,7 @@ _inline void MIX_DeactivateAllPaintbuffers( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set upsampling filter indexes back to 0
|
// set upsampling filter indexes back to 0
|
||||||
_inline void MIX_ResetPaintbufferFilterCounters( void )
|
static void MIX_ResetPaintbufferFilterCounters( void )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -163,13 +189,13 @@ _inline void MIX_ResetPaintbufferFilterCounters( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// return pointer to front paintbuffer pbuf, given index
|
// return pointer to front paintbuffer pbuf, given index
|
||||||
_inline portable_samplepair_t *MIX_GetPFrontFromIPaint( int ipaintbuffer )
|
static portable_samplepair_t *MIX_GetPFrontFromIPaint( int ipaintbuffer )
|
||||||
{
|
{
|
||||||
Assert( ipaintbuffer < CPAINTBUFFERS );
|
Assert( ipaintbuffer < CPAINTBUFFERS );
|
||||||
return paintbuffers[ipaintbuffer].pbuf;
|
return paintbuffers[ipaintbuffer].pbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline paintbuffer_t *MIX_GetPPaintFromIPaint( int ipaint )
|
static paintbuffer_t *MIX_GetPPaintFromIPaint( int ipaint )
|
||||||
{
|
{
|
||||||
Assert( ipaint < CPAINTBUFFERS );
|
Assert( ipaint < CPAINTBUFFERS );
|
||||||
return &paintbuffers[ipaint];
|
return &paintbuffers[ipaint];
|
||||||
@@ -523,6 +549,7 @@ static void MIX_MixChannelsToPaintbuffer( int endtime, int rate, int outputRate
|
|||||||
wavdata_t *pSource;
|
wavdata_t *pSource;
|
||||||
int i, sampleCount;
|
int i, sampleCount;
|
||||||
qboolean bZeroVolume;
|
qboolean bZeroVolume;
|
||||||
|
qboolean local = Host_IsLocalGame();
|
||||||
|
|
||||||
// mix each channel into paintbuffer
|
// mix each channel into paintbuffer
|
||||||
ch = channels;
|
ch = channels;
|
||||||
@@ -549,7 +576,7 @@ static void MIX_MixChannelsToPaintbuffer( int endtime, int rate, int outputRate
|
|||||||
{
|
{
|
||||||
// play, playvol
|
// play, playvol
|
||||||
}
|
}
|
||||||
else if(( s_listener.inmenu || s_listener.paused ) && !ch->localsound )
|
else if(( s_listener.inmenu || s_listener.paused ) && !ch->localsound && local )
|
||||||
{
|
{
|
||||||
// play only local sounds, keep pause for other
|
// play only local sounds, keep pause for other
|
||||||
continue;
|
continue;
|
||||||
@@ -567,6 +594,7 @@ static void MIX_MixChannelsToPaintbuffer( int endtime, int rate, int outputRate
|
|||||||
|
|
||||||
// Don't mix sound data for sounds with zero volume. If it's a non-looping sound,
|
// Don't mix sound data for sounds with zero volume. If it's a non-looping sound,
|
||||||
// just remove the sound when its volume goes to zero.
|
// just remove the sound when its volume goes to zero.
|
||||||
|
|
||||||
bZeroVolume = !ch->leftvol && !ch->rightvol;
|
bZeroVolume = !ch->leftvol && !ch->rightvol;
|
||||||
|
|
||||||
if( !bZeroVolume )
|
if( !bZeroVolume )
|
||||||
@@ -576,7 +604,7 @@ static void MIX_MixChannelsToPaintbuffer( int endtime, int rate, int outputRate
|
|||||||
bZeroVolume = true;
|
bZeroVolume = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !pSource || ( bZeroVolume && pSource->loopStart == -1 ))
|
if( !pSource || ( bZeroVolume && !FBitSet( pSource->flags, SOUND_LOOPED )))
|
||||||
{
|
{
|
||||||
if( !pSource )
|
if( !pSource )
|
||||||
{
|
{
|
||||||
@@ -629,7 +657,7 @@ static void MIX_MixChannelsToPaintbuffer( int endtime, int rate, int outputRate
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pass in index -1...count+2, return pointer to source sample in either paintbuffer or delay buffer
|
// pass in index -1...count+2, return pointer to source sample in either paintbuffer or delay buffer
|
||||||
_inline portable_samplepair_t *S_GetNextpFilter( int i, portable_samplepair_t *pbuffer, portable_samplepair_t *pfiltermem )
|
static portable_samplepair_t *S_GetNextpFilter( int i, portable_samplepair_t *pbuffer, portable_samplepair_t *pfiltermem )
|
||||||
{
|
{
|
||||||
// The delay buffer is assumed to precede the paintbuffer by 6 duplicated samples
|
// The delay buffer is assumed to precede the paintbuffer by 6 duplicated samples
|
||||||
if( i == -1 ) return (&(pfiltermem[0]));
|
if( i == -1 ) return (&(pfiltermem[0]));
|
||||||
@@ -838,6 +866,14 @@ static void MIX_MixPaintbuffers( int ibuf1, int ibuf2, int ibuf3, int count, flo
|
|||||||
pbuf2 = paintbuffers[ibuf2].pbuf;
|
pbuf2 = paintbuffers[ibuf2].pbuf;
|
||||||
pbuf3 = paintbuffers[ibuf3].pbuf;
|
pbuf3 = paintbuffers[ibuf3].pbuf;
|
||||||
|
|
||||||
|
if( !gain )
|
||||||
|
{
|
||||||
|
// do not mix buf2 into buf3, just copy
|
||||||
|
if( pbuf1 != pbuf3 )
|
||||||
|
memcpy( pbuf3, pbuf1, sizeof( *pbuf1 ) * count );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// destination buffer stereo - average n chans down to stereo
|
// destination buffer stereo - average n chans down to stereo
|
||||||
|
|
||||||
// destination 2ch:
|
// destination 2ch:
|
||||||
@@ -887,7 +923,7 @@ static void S_MixUpsample( int sampleCount, int filtertype )
|
|||||||
static void MIX_MixRawSamplesBuffer( int end )
|
static void MIX_MixRawSamplesBuffer( int end )
|
||||||
{
|
{
|
||||||
portable_samplepair_t *pbuf, *roombuf, *streambuf;
|
portable_samplepair_t *pbuf, *roombuf, *streambuf;
|
||||||
uint i, j, stop;
|
uint i, j, stop;
|
||||||
|
|
||||||
roombuf = MIX_GetPFrontFromIPaint( IROOMBUFFER );
|
roombuf = MIX_GetPFrontFromIPaint( IROOMBUFFER );
|
||||||
streambuf = MIX_GetPFrontFromIPaint( ISTREAMBUFFER );
|
streambuf = MIX_GetPFrontFromIPaint( ISTREAMBUFFER );
|
||||||
@@ -920,7 +956,11 @@ static void MIX_MixRawSamplesBuffer( int end )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( ch->entnum > 0 )
|
if( ch->entnum > 0 )
|
||||||
SND_MoveMouthRaw( ch, &ch->rawsamples[paintedtime & ( ch->max_samples - 1 )], stop - paintedtime );
|
{
|
||||||
|
int pos = paintedtime & ( ch->max_samples - 1 );
|
||||||
|
|
||||||
|
SND_MoveMouthRaw( ch, &ch->rawsamples[pos], bound( 0, ch->max_samples - pos, stop - paintedtime ));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,12 @@ float S_GetMusicVolume( void )
|
|||||||
{
|
{
|
||||||
float scale = 1.0f;
|
float scale = 1.0f;
|
||||||
|
|
||||||
|
if( host.status == HOST_NOFOCUS && snd_mute_losefocus.value != 0.0f )
|
||||||
|
{
|
||||||
|
// we return zero volume to keep sounds running
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if( !s_listener.inmenu && musicfade.percent != 0 )
|
if( !s_listener.inmenu && musicfade.percent != 0 )
|
||||||
{
|
{
|
||||||
scale = bound( 0.0f, musicfade.percent / 100.0f, 1.0f );
|
scale = bound( 0.0f, musicfade.percent / 100.0f, 1.0f );
|
||||||
@@ -142,7 +148,7 @@ S_StreamGetCurrentState
|
|||||||
save\restore code
|
save\restore code
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position )
|
qboolean S_StreamGetCurrentState( char *currentTrack, size_t currentTrackSize, char *loopTrack, size_t loopTrackSize, int *position )
|
||||||
{
|
{
|
||||||
if( !s_bgTrack.stream )
|
if( !s_bgTrack.stream )
|
||||||
return false; // not active
|
return false; // not active
|
||||||
@@ -150,15 +156,15 @@ qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *posi
|
|||||||
if( currentTrack )
|
if( currentTrack )
|
||||||
{
|
{
|
||||||
if( s_bgTrack.current[0] )
|
if( s_bgTrack.current[0] )
|
||||||
Q_strncpy( currentTrack, s_bgTrack.current, MAX_STRING );
|
Q_strncpy( currentTrack, s_bgTrack.current, currentTrackSize );
|
||||||
else Q_strncpy( currentTrack, "*", MAX_STRING ); // no track
|
else Q_strncpy( currentTrack, "*", currentTrackSize ); // no track
|
||||||
}
|
}
|
||||||
|
|
||||||
if( loopTrack )
|
if( loopTrack )
|
||||||
{
|
{
|
||||||
if( s_bgTrack.loopName[0] )
|
if( s_bgTrack.loopName[0] )
|
||||||
Q_strncpy( loopTrack, s_bgTrack.loopName, MAX_STRING );
|
Q_strncpy( loopTrack, s_bgTrack.loopName, loopTrackSize );
|
||||||
else Q_strncpy( loopTrack, "*", MAX_STRING ); // no track
|
else Q_strncpy( loopTrack, "*", loopTrackSize ); // no track
|
||||||
}
|
}
|
||||||
|
|
||||||
if( position )
|
if( position )
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ int S_ConvertLoopedPosition( wavdata_t *pSource, int samplePosition, qboolean us
|
|||||||
// convert to a position within the loop
|
// convert to a position within the loop
|
||||||
// At the end of the loop, we return a short buffer, and subsequent call
|
// At the end of the loop, we return a short buffer, and subsequent call
|
||||||
// will loop back and get the rest of the buffer
|
// will loop back and get the rest of the buffer
|
||||||
if( pSource->loopStart >= 0 && samplePosition >= pSource->samples && use_loop )
|
if( FBitSet( pSource->flags, SOUND_LOOPED ) && samplePosition >= pSource->samples && use_loop )
|
||||||
{
|
{
|
||||||
// size of loop
|
// size of loop
|
||||||
int loopSize = pSource->samples - pSource->loopStart;
|
int loopSize = pSource->samples - pSource->loopStart;
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ static int S_TrimEnd( const wavdata_t *wav, int end )
|
|||||||
|
|
||||||
if( width == 1 )
|
if( width == 1 )
|
||||||
{
|
{
|
||||||
const int8_t *data = (const int8_t *)&wav->buffer[channels * width * end];
|
const int8_t *data = (const int8_t *)&wav->buffer[channels * width * ( end - 1 )];
|
||||||
|
|
||||||
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
||||||
{
|
{
|
||||||
@@ -109,7 +109,7 @@ static int S_TrimEnd( const wavdata_t *wav, int end )
|
|||||||
}
|
}
|
||||||
else if( width == 2 )
|
else if( width == 2 )
|
||||||
{
|
{
|
||||||
const int16_t *data = (const int16_t *)&wav->buffer[channels * width * end];
|
const int16_t *data = (const int16_t *)&wav->buffer[channels * width * ( end - 1 )];
|
||||||
|
|
||||||
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
||||||
{
|
{
|
||||||
@@ -248,6 +248,12 @@ static const char *VOX_GetDirectory( char *szpath, const char *psz, int nsize )
|
|||||||
const char *p;
|
const char *p;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
// HACKHACK: some modders send strings like "/fvox/_period four"
|
||||||
|
// which should get parsed as "_period four" said by fvox
|
||||||
|
// it might be incorrect but ignore first slash here for now
|
||||||
|
if( psz[0] == '/' )
|
||||||
|
psz++;
|
||||||
|
|
||||||
// search / backwards
|
// search / backwards
|
||||||
p = Q_strrchr( psz, '/' );
|
p = Q_strrchr( psz, '/' );
|
||||||
|
|
||||||
@@ -261,7 +267,7 @@ static const char *VOX_GetDirectory( char *szpath, const char *psz, int nsize )
|
|||||||
|
|
||||||
if( len > nsize )
|
if( len > nsize )
|
||||||
{
|
{
|
||||||
Con_Printf( "VOX_GetDirectory: invalid directory in: %s\n", psz );
|
Con_Printf( "%s: invalid directory in: %s\n", __func__, psz );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -467,7 +473,7 @@ void VOX_LoadSound( channel_t *ch, const char *pszin )
|
|||||||
|
|
||||||
if( !psz )
|
if( !psz )
|
||||||
{
|
{
|
||||||
Con_Printf( "VOX_LoadSound: no sentence named %s\n", pszin );
|
Con_Printf( "%s: no sentence named %s\n", __func__, pszin );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -475,13 +481,13 @@ void VOX_LoadSound( channel_t *ch, const char *pszin )
|
|||||||
|
|
||||||
if( !psz )
|
if( !psz )
|
||||||
{
|
{
|
||||||
Con_Printf( "VOX_LoadSound: failed getting directory for %s\n", pszin );
|
Con_Printf( "%s: failed getting directory for %s\n", __func__, pszin );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( Q_strlen( psz ) >= sizeof( buffer ) )
|
if( Q_strlen( psz ) >= sizeof( buffer ) )
|
||||||
{
|
{
|
||||||
Con_Printf( "VOX_LoadSound: sentence is too long %s", psz );
|
Con_Printf( "%s: sentence is too long %s", __func__, psz );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -595,8 +601,8 @@ static void Test_VOX_GetDirectory( void )
|
|||||||
{
|
{
|
||||||
"", "", "vox/",
|
"", "", "vox/",
|
||||||
"bark bark", "bark bark", "vox/",
|
"bark bark", "bark bark", "vox/",
|
||||||
"barney/meow", "meow", "barney/"
|
"barney/meow", "meow", "barney/",
|
||||||
|
"/fvox/_period", "_period", "fvox/",
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|||||||
@@ -20,208 +20,181 @@ extern poolhandle_t sndpool;
|
|||||||
|
|
||||||
#include "xash3d_mathlib.h"
|
#include "xash3d_mathlib.h"
|
||||||
|
|
||||||
// sound engine rate defines
|
#define XASH_AUDIO_CD_QUALITY 1 // some platforms might need this
|
||||||
#define SOUND_DMA_SPEED 44100 // hardware playback rate
|
|
||||||
#define SOUND_11k 11025 // 11khz sample rate
|
|
||||||
#define SOUND_16k 16000 // 16khz sample rate
|
|
||||||
#define SOUND_22k 22050 // 22khz sample rate
|
|
||||||
#define SOUND_32k 32000 // 32khz sample rate
|
|
||||||
#define SOUND_44k 44100 // 44khz sample rate
|
|
||||||
#define DMA_MSEC_PER_SAMPLE ((float)(1000.0 / SOUND_DMA_SPEED))
|
|
||||||
|
|
||||||
// fixed point stuff for real-time resampling
|
// sound engine rate defines
|
||||||
#define FIX_BITS 28
|
#if XASH_AUDIO_CD_QUALITY
|
||||||
#define FIX_SCALE (1 << FIX_BITS)
|
#define SOUND_11k 11025 // 11khz sample rate
|
||||||
#define FIX_MASK ((1 << FIX_BITS)-1)
|
#define SOUND_22k 22050 // 22khz sample rate
|
||||||
#define FIX_FLOAT(a) ((int)((a) * FIX_SCALE))
|
#define SOUND_44k 44100 // 44khz sample rate
|
||||||
#define FIX(a) (((int)(a)) << FIX_BITS)
|
#else // XASH_AUDIO_CD_QUALITY
|
||||||
#define FIX_INTPART(a) (((int)(a)) >> FIX_BITS)
|
#define SOUND_11k 12000 // 11khz sample rate
|
||||||
#define FIX_FRACTION(a,b) (FIX(a)/(b))
|
#define SOUND_22k 24000 // 22khz sample rate
|
||||||
#define FIX_FRACPART(a) ((a) & FIX_MASK)
|
#define SOUND_44k 48000 // 44khz sample rate
|
||||||
|
#endif // XASH_AUDIO_CD_QUALITY
|
||||||
|
|
||||||
|
#define SOUND_DMA_SPEED SOUND_44k // hardware playback rate
|
||||||
|
|
||||||
// NOTE: clipped sound at 32760 to avoid overload
|
// NOTE: clipped sound at 32760 to avoid overload
|
||||||
#define CLIP( x ) (( x ) > 32760 ? 32760 : (( x ) < -32760 ? -32760 : ( x )))
|
#define CLIP( x ) (( x ) > 32760 ? 32760 : (( x ) < -32760 ? -32760 : ( x )))
|
||||||
|
|
||||||
#define PAINTBUFFER_SIZE 1024 // 44k: was 512
|
#define PAINTBUFFER_SIZE 1024 // 44k: was 512
|
||||||
#define PAINTBUFFER (g_curpaintbuffer)
|
|
||||||
#define CPAINTBUFFERS 3
|
|
||||||
|
|
||||||
// sound mixing buffer
|
#define S_RAW_SOUND_IDLE_SEC 10 // time interval for idling raw sound before it's freed
|
||||||
#define CPAINTFILTERMEM 3
|
#define S_RAW_SOUND_BACKGROUNDTRACK -2
|
||||||
#define CPAINTFILTERS 4 // maximum number of consecutive upsample passes per paintbuffer
|
#define S_RAW_SOUND_SOUNDTRACK -1
|
||||||
|
#define S_RAW_SAMPLES_PRECISION_BITS 14
|
||||||
#define S_RAW_SOUND_IDLE_SEC 10 // time interval for idling raw sound before it's freed
|
|
||||||
#define S_RAW_SOUND_BACKGROUNDTRACK -2
|
|
||||||
#define S_RAW_SOUND_SOUNDTRACK -1
|
|
||||||
#define S_RAW_SAMPLES_PRECISION_BITS 14
|
|
||||||
|
|
||||||
#define CIN_FRAMETIME (1.0f / 30.0f)
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int left;
|
int left;
|
||||||
int right;
|
int right;
|
||||||
} portable_samplepair_t;
|
} portable_samplepair_t;
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
qboolean factive; // if true, mix to this paintbuffer using flags
|
|
||||||
portable_samplepair_t *pbuf; // front stereo mix buffer, for 2 or 4 channel mixing
|
|
||||||
int ifilter; // current filter memory buffer to use for upsampling pass
|
|
||||||
portable_samplepair_t fltmem[CPAINTFILTERS][CPAINTFILTERMEM];
|
|
||||||
} paintbuffer_t;
|
|
||||||
|
|
||||||
typedef struct sfx_s
|
typedef struct sfx_s
|
||||||
{
|
{
|
||||||
char name[MAX_QPATH];
|
char name[MAX_QPATH];
|
||||||
wavdata_t *cache;
|
wavdata_t *cache;
|
||||||
|
|
||||||
int servercount;
|
int servercount;
|
||||||
uint hashValue;
|
uint hashValue;
|
||||||
struct sfx_s *hashNext;
|
struct sfx_s *hashNext;
|
||||||
} sfx_t;
|
} sfx_t;
|
||||||
|
|
||||||
extern portable_samplepair_t paintbuffer[];
|
|
||||||
extern portable_samplepair_t roombuffer[];
|
|
||||||
extern portable_samplepair_t temppaintbuffer[];
|
|
||||||
extern portable_samplepair_t *g_curpaintbuffer;
|
|
||||||
extern paintbuffer_t paintbuffers[];
|
|
||||||
|
|
||||||
// structure used for fading in and out client sound volume.
|
// structure used for fading in and out client sound volume.
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float initial_percent;
|
float initial_percent;
|
||||||
float percent; // how far to adjust client's volume down by.
|
float percent; // how far to adjust client's volume down by.
|
||||||
float starttime; // GetHostTime() when we started adjusting volume
|
float starttime; // GetHostTime() when we started adjusting volume
|
||||||
float fadeouttime; // # of seconds to get to faded out state
|
float fadeouttime; // # of seconds to get to faded out state
|
||||||
float holdtime; // # of seconds to hold
|
float holdtime; // # of seconds to hold
|
||||||
float fadeintime; // # of seconds to restore
|
float fadeintime; // # of seconds to restore
|
||||||
} soundfade_t;
|
} soundfade_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float percent;
|
float percent;
|
||||||
} musicfade_t;
|
} musicfade_t;
|
||||||
|
|
||||||
typedef struct snd_format_s
|
typedef struct snd_format_s
|
||||||
{
|
{
|
||||||
unsigned int speed;
|
uint speed;
|
||||||
unsigned int width;
|
byte width;
|
||||||
unsigned int channels;
|
byte channels;
|
||||||
} snd_format_t;
|
} snd_format_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
snd_format_t format;
|
snd_format_t format;
|
||||||
int samples; // mono samples in buffer
|
int samples; // mono samples in buffer
|
||||||
int samplepos; // in mono samples
|
int samplepos; // in mono samples
|
||||||
byte *buffer;
|
qboolean initialized; // sound engine is active
|
||||||
qboolean initialized; // sound engine is active
|
byte *buffer;
|
||||||
const char *backendName;
|
const char *backendName;
|
||||||
} dma_t;
|
} dma_t;
|
||||||
|
|
||||||
#include "vox.h"
|
#include "vox.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
double sample;
|
double sample;
|
||||||
|
wavdata_t *pData;
|
||||||
wavdata_t *pData;
|
double forcedEndSample;
|
||||||
double forcedEndSample;
|
qboolean finished;
|
||||||
qboolean finished;
|
|
||||||
} mixer_t;
|
} mixer_t;
|
||||||
|
|
||||||
typedef struct rawchan_s
|
typedef struct rawchan_s
|
||||||
{
|
{
|
||||||
int entnum;
|
int entnum;
|
||||||
int master_vol;
|
int master_vol;
|
||||||
int leftvol; // 0-255 left volume
|
int leftvol; // 0-255 left volume
|
||||||
int rightvol; // 0-255 right volume
|
int rightvol; // 0-255 right volume
|
||||||
float dist_mult; // distance multiplier (attenuation/clipK)
|
float dist_mult; // distance multiplier (attenuation/clipK)
|
||||||
vec3_t origin; // only use if fixed_origin is set
|
vec3_t origin; // only use if fixed_origin is set
|
||||||
volatile uint s_rawend;
|
volatile uint s_rawend;
|
||||||
wavdata_t sound_info; // advance play position
|
float oldtime; // catch time jumps
|
||||||
float oldtime; // catch time jumps
|
wavdata_t sound_info; // advance play position
|
||||||
size_t max_samples; // buffer length
|
size_t max_samples; // buffer length
|
||||||
portable_samplepair_t rawsamples[1]; // variable sized
|
portable_samplepair_t rawsamples[]; // variable sized
|
||||||
} rawchan_t;
|
} rawchan_t;
|
||||||
|
|
||||||
typedef struct channel_s
|
typedef struct channel_s
|
||||||
{
|
{
|
||||||
char name[16]; // keept sentence name
|
char name[16]; // keep sentence name
|
||||||
sfx_t *sfx; // sfx number
|
sfx_t *sfx; // sfx number
|
||||||
|
|
||||||
int leftvol; // 0-255 left volume
|
int leftvol; // 0-255 left volume
|
||||||
int rightvol; // 0-255 right volume
|
int rightvol; // 0-255 right volume
|
||||||
|
|
||||||
int entnum; // entity soundsource
|
int entnum; // entity soundsource
|
||||||
int entchannel; // sound channel (CHAN_STREAM, CHAN_VOICE, etc.)
|
int entchannel; // sound channel (CHAN_STREAM, CHAN_VOICE, etc.)
|
||||||
vec3_t origin; // only use if fixed_origin is set
|
vec3_t origin; // only use if fixed_origin is set
|
||||||
float dist_mult; // distance multiplier (attenuation/clipK)
|
float dist_mult; // distance multiplier (attenuation/clipK)
|
||||||
int master_vol; // 0-255 master volume
|
int master_vol; // 0-255 master volume
|
||||||
qboolean isSentence; // bit who indicated sentence
|
int basePitch; // base pitch percent (100% is normal pitch playback)
|
||||||
int basePitch; // base pitch percent (100% is normal pitch playback)
|
float pitch; // real-time pitch after any modulation or shift by dynamic data
|
||||||
float pitch; // real-time pitch after any modulation or shift by dynamic data
|
qboolean use_loop; // don't loop default and local sounds
|
||||||
qboolean use_loop; // don't loop default and local sounds
|
qboolean staticsound; // use origin instead of fetching entnum's origin
|
||||||
qboolean staticsound; // use origin instead of fetching entnum's origin
|
qboolean localsound; // it's a local menu sound (not looped, not paused)
|
||||||
qboolean localsound; // it's a local menu sound (not looped, not paused)
|
mixer_t pMixer;
|
||||||
mixer_t pMixer;
|
|
||||||
|
|
||||||
// sentence mixer
|
// sentence mixer
|
||||||
int wordIndex;
|
qboolean isSentence; // bit indicating sentence
|
||||||
mixer_t *currentWord; // NULL if sentence is finished
|
int wordIndex;
|
||||||
voxword_t words[CVOXWORDMAX];
|
mixer_t *currentWord; // NULL if sentence is finished
|
||||||
|
voxword_t words[CVOXWORDMAX];
|
||||||
} channel_t;
|
} channel_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
vec3_t origin; // simorg + view_ofs
|
vec3_t origin; // simorg + view_ofs
|
||||||
vec3_t velocity;
|
vec3_t forward;
|
||||||
vec3_t forward;
|
vec3_t right;
|
||||||
vec3_t right;
|
vec3_t up;
|
||||||
vec3_t up;
|
|
||||||
|
|
||||||
int entnum;
|
int entnum;
|
||||||
int waterlevel;
|
int waterlevel;
|
||||||
float frametime; // used for sound fade
|
float frametime; // used for sound fade
|
||||||
qboolean active;
|
qboolean active;
|
||||||
qboolean inmenu; // listener in-menu ?
|
qboolean inmenu; // listener in-menu ?
|
||||||
qboolean paused;
|
qboolean paused;
|
||||||
qboolean streaming; // playing AVI-file
|
qboolean streaming; // playing AVI-file
|
||||||
qboolean stream_paused; // pause only background track
|
qboolean stream_paused; // pause only background track
|
||||||
} listener_t;
|
} listener_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
string current; // a currently playing track
|
string current; // a currently playing track
|
||||||
string loopName; // may be empty
|
string loopName; // may be empty
|
||||||
stream_t *stream;
|
stream_t *stream;
|
||||||
int source; // may be game, menu, etc
|
int source; // may be game, menu, etc
|
||||||
} bg_track_t;
|
} bg_track_t;
|
||||||
|
|
||||||
//====================================================================
|
//====================================================================
|
||||||
|
|
||||||
#define MAX_DYNAMIC_CHANNELS (60 + NUM_AMBIENTS)
|
#define MAX_DYNAMIC_CHANNELS (60 + NUM_AMBIENTS)
|
||||||
#define MAX_CHANNELS (256 + MAX_DYNAMIC_CHANNELS) // Scourge Of Armagon has too many static sounds on hip2m4.bsp
|
#define MAX_CHANNELS (256 + MAX_DYNAMIC_CHANNELS) // Scourge Of Armagon has too many static sounds on hip2m4.bsp
|
||||||
#define MAX_RAW_CHANNELS 48
|
#define MAX_RAW_CHANNELS 48
|
||||||
#define MAX_RAW_SAMPLES 8192
|
#define MAX_RAW_SAMPLES 8192
|
||||||
|
|
||||||
extern sound_t ambient_sfx[NUM_AMBIENTS];
|
extern sound_t ambient_sfx[NUM_AMBIENTS];
|
||||||
extern qboolean snd_ambient;
|
extern qboolean snd_ambient;
|
||||||
extern channel_t channels[MAX_CHANNELS];
|
extern channel_t channels[MAX_CHANNELS];
|
||||||
extern rawchan_t *raw_channels[MAX_RAW_CHANNELS];
|
extern rawchan_t *raw_channels[MAX_RAW_CHANNELS];
|
||||||
extern int total_channels;
|
extern int total_channels;
|
||||||
extern int paintedtime;
|
extern int paintedtime;
|
||||||
extern int soundtime;
|
extern int soundtime;
|
||||||
extern listener_t s_listener;
|
extern listener_t s_listener;
|
||||||
extern int idsp_room;
|
extern int idsp_room;
|
||||||
extern dma_t dma;
|
extern dma_t dma;
|
||||||
|
|
||||||
extern convar_t s_musicvolume;
|
extern convar_t s_musicvolume;
|
||||||
extern convar_t s_lerping;
|
extern convar_t s_lerping;
|
||||||
extern convar_t s_test; // cvar to testify new effects
|
extern convar_t s_test; // cvar to test new effects
|
||||||
extern convar_t s_samplecount;
|
extern convar_t s_samplecount;
|
||||||
extern convar_t s_warn_late_precache;
|
extern convar_t s_warn_late_precache;
|
||||||
|
extern convar_t snd_mute_losefocus;
|
||||||
|
|
||||||
void S_InitScaletable( void );
|
void S_InitScaletable( void );
|
||||||
wavdata_t *S_LoadSound( sfx_t *sfx );
|
wavdata_t *S_LoadSound( sfx_t *sfx );
|
||||||
@@ -292,7 +265,6 @@ void SND_ForceCloseMouth( int entnum );
|
|||||||
//
|
//
|
||||||
void S_StreamSoundTrack( void );
|
void S_StreamSoundTrack( void );
|
||||||
void S_StreamBackgroundTrack( void );
|
void S_StreamBackgroundTrack( void );
|
||||||
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position );
|
|
||||||
void S_PrintBackgroundTrackState( void );
|
void S_PrintBackgroundTrackState( void );
|
||||||
void S_FadeMusicVolume( float fadePercent );
|
void S_FadeMusicVolume( float fadePercent );
|
||||||
|
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
|
|||||||
|
|
||||||
if( IsEndOfText( trim ))
|
if( IsEndOfText( trim ))
|
||||||
{
|
{
|
||||||
Con_Reportf( "TextMessage: unexpected '}' found, line %d\n", lineNumber );
|
Con_Reportf( "%s: unexpected '}' found, line %d\n", __func__, lineNumber );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Q_strncpy( currentName, trim, sizeof( currentName ));
|
Q_strncpy( currentName, trim, sizeof( currentName ));
|
||||||
@@ -263,7 +263,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
|
|||||||
// save name on name heap
|
// save name on name heap
|
||||||
if( lastNamePos + length > 32768 )
|
if( lastNamePos + length > 32768 )
|
||||||
{
|
{
|
||||||
Con_Reportf( "TextMessage: error while parsing!\n" );
|
Con_Reportf( "%s: error while parsing!\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,7 +286,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
|
|||||||
}
|
}
|
||||||
if( IsStartOfText( trim ))
|
if( IsStartOfText( trim ))
|
||||||
{
|
{
|
||||||
Con_Reportf( "TextMessage: unexpected '{' found, line %d\n", lineNumber );
|
Con_Reportf( "%s: unexpected '{' found, line %d\n", __func__, lineNumber );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -302,7 +302,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Con_Reportf( "TextMessage: parsed %d text messages\n", messageCount );
|
Con_Reportf( "%s: parsed %d text messages\n", __func__, messageCount );
|
||||||
nameHeapSize = lastNamePos;
|
nameHeapSize = lastNamePos;
|
||||||
textHeapSize = 0;
|
textHeapSize = 0;
|
||||||
|
|
||||||
@@ -347,7 +347,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(( pCurrentText - (char *)clgame.titles ) != ( textHeapSize + nameHeapSize + messageSize ))
|
if(( pCurrentText - (char *)clgame.titles ) != ( textHeapSize + nameHeapSize + messageSize ))
|
||||||
Con_DPrintf( S_ERROR "TextMessage: overflow text message buffer!\n" );
|
Con_DPrintf( S_ERROR "%s: overflow text message buffer!\n", __func__ );
|
||||||
|
|
||||||
clgame.numTitles = messageCount;
|
clgame.numTitles = messageCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,55 +23,182 @@ GNU General Public License for more details.
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "platform/platform.h"
|
#include "platform/platform.h"
|
||||||
|
|
||||||
CVAR_DEFINE_AUTO( vgui_utf8, "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" );
|
#define VGUI_MAX_TEXTURES 1024
|
||||||
|
|
||||||
static void GAME_EXPORT *VGUI_EngineMalloc( size_t size );
|
typedef struct vgui_static_s
|
||||||
static void GAME_EXPORT VGUI_GetMousePos( int *, int * );
|
|
||||||
static void GAME_EXPORT VGUI_CursorSelect( VGUI_DefaultCursor );
|
|
||||||
static byte GAME_EXPORT VGUI_GetColor( int, int );
|
|
||||||
static int GAME_EXPORT VGUI_UtfProcessChar( int in );
|
|
||||||
static qboolean GAME_EXPORT VGUI_IsInGame( void );
|
|
||||||
|
|
||||||
static struct
|
|
||||||
{
|
{
|
||||||
qboolean initialized;
|
qboolean initialized;
|
||||||
vguiapi_t dllFuncs;
|
|
||||||
VGUI_DefaultCursor cursor;
|
VGUI_DefaultCursor cursor;
|
||||||
|
vguiapi_t dllFuncs;
|
||||||
|
|
||||||
|
int textures[VGUI_MAX_TEXTURES];
|
||||||
|
int texture_id;
|
||||||
|
int bound_texture;
|
||||||
|
byte color[4];
|
||||||
|
qboolean enable_texture;
|
||||||
|
|
||||||
HINSTANCE hInstance;
|
HINSTANCE hInstance;
|
||||||
|
|
||||||
enum VGUI_KeyCode virtualKeyTrans[256];
|
enum VGUI_KeyCode virtualKeyTrans[256];
|
||||||
} vgui =
|
} vgui_static_t;
|
||||||
{
|
|
||||||
false,
|
static vgui_static_t vgui = {
|
||||||
{
|
false, -1
|
||||||
false, // Not initialized yet
|
|
||||||
NULL, // VGUI_DrawInit,
|
|
||||||
NULL, // VGUI_DrawShutdown,
|
|
||||||
NULL, // VGUI_SetupDrawingText,
|
|
||||||
NULL, // VGUI_SetupDrawingRect,
|
|
||||||
NULL, // VGUI_SetupDrawingImage,
|
|
||||||
NULL, // VGUI_BindTexture,
|
|
||||||
NULL, // VGUI_EnableTexture,
|
|
||||||
NULL, // VGUI_CreateTexture,
|
|
||||||
NULL, // VGUI_UploadTexture,
|
|
||||||
NULL, // VGUI_UploadTextureBlock,
|
|
||||||
NULL, // VGUI_DrawQuad,
|
|
||||||
NULL, // VGUI_GetTextureSizes,
|
|
||||||
NULL, // VGUI_GenerateTexture,
|
|
||||||
VGUI_EngineMalloc,
|
|
||||||
VGUI_CursorSelect,
|
|
||||||
VGUI_GetColor,
|
|
||||||
VGUI_IsInGame,
|
|
||||||
Key_EnableTextInput,
|
|
||||||
VGUI_GetMousePos,
|
|
||||||
VGUI_UtfProcessChar,
|
|
||||||
Platform_GetClipboardText,
|
|
||||||
Platform_SetClipboardText,
|
|
||||||
Platform_GetKeyModifiers,
|
|
||||||
},
|
|
||||||
-1
|
|
||||||
};
|
};
|
||||||
|
static CVAR_DEFINE_AUTO( vgui_utf8, "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" );
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_DrawInit( void )
|
||||||
|
{
|
||||||
|
memset( vgui.textures, 0, sizeof( vgui.textures ));
|
||||||
|
memset( vgui.color, 0, sizeof( vgui.color ));
|
||||||
|
vgui.texture_id = vgui.bound_texture = 0;
|
||||||
|
vgui.enable_texture = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_DrawShutdown( void )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 1; i < vgui.texture_id; i++ )
|
||||||
|
ref.dllFuncs.GL_FreeTexture( vgui.textures[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GAME_EXPORT VGUI_GenerateTexture( void )
|
||||||
|
{
|
||||||
|
if( ++vgui.texture_id >= VGUI_MAX_TEXTURES )
|
||||||
|
Host_Error( "%s: VGUI_MAX_TEXTURES limit exceeded\n", __func__ );
|
||||||
|
|
||||||
|
return vgui.texture_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_UploadTexture( int id, const char *buffer, int width, int height )
|
||||||
|
{
|
||||||
|
rgbdata_t r_image = { 0 };
|
||||||
|
char texName[32];
|
||||||
|
|
||||||
|
if( id <= 0 || id >= VGUI_MAX_TEXTURES )
|
||||||
|
{
|
||||||
|
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_snprintf( texName, sizeof( texName ), "*vgui%i", id );
|
||||||
|
|
||||||
|
r_image.width = width;
|
||||||
|
r_image.height = height;
|
||||||
|
r_image.type = PF_RGBA_32;
|
||||||
|
r_image.size = width * height * 4;
|
||||||
|
r_image.flags = IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA;
|
||||||
|
r_image.buffer = (byte*)buffer;
|
||||||
|
|
||||||
|
vgui.textures[id] = GL_LoadTextureInternal( texName, &r_image, TF_IMAGE );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_CreateTexture( int id, int width, int height )
|
||||||
|
{
|
||||||
|
rgbdata_t r_image = { 0 };
|
||||||
|
char texName[32];
|
||||||
|
|
||||||
|
if( id <= 0 || id >= VGUI_MAX_TEXTURES )
|
||||||
|
{
|
||||||
|
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_snprintf( texName, sizeof( texName ), "*vgui%i", id );
|
||||||
|
|
||||||
|
r_image.width = width;
|
||||||
|
r_image.height = height;
|
||||||
|
r_image.type = PF_RGBA_32;
|
||||||
|
r_image.size = width * height * 4;
|
||||||
|
r_image.flags = IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA;
|
||||||
|
r_image.buffer = NULL;
|
||||||
|
|
||||||
|
vgui.textures[id] = GL_LoadTextureInternal( texName, &r_image, TF_IMAGE );
|
||||||
|
vgui.bound_texture = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_UploadTextureBlock( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight )
|
||||||
|
{
|
||||||
|
if( id <= 0 || id >= VGUI_MAX_TEXTURES || vgui.textures[id] == 0 )
|
||||||
|
{
|
||||||
|
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref.dllFuncs.VGUI_UploadTextureBlock( drawX, drawY, rgba, blockWidth, blockHeight );
|
||||||
|
vgui.bound_texture = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_BindTexture( int id )
|
||||||
|
{
|
||||||
|
if( id <= 0 || id >= VGUI_MAX_TEXTURES || !vgui.textures[id] )
|
||||||
|
id = 1; // NOTE: same as bogus index 2700 in GoldSrc
|
||||||
|
|
||||||
|
ref.dllFuncs.GL_Bind( XASH_TEXTURE0, vgui.textures[id] );
|
||||||
|
vgui.bound_texture = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_GetTextureSizes( int *w, int *h )
|
||||||
|
{
|
||||||
|
int texnum;
|
||||||
|
|
||||||
|
if( vgui.bound_texture )
|
||||||
|
texnum = vgui.textures[vgui.bound_texture];
|
||||||
|
else
|
||||||
|
texnum = R_GetBuiltinTexture( REF_DEFAULT_TEXTURE );
|
||||||
|
|
||||||
|
R_GetTextureParms( w, h, texnum );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_SetupDrawingRect( int *pColor )
|
||||||
|
{
|
||||||
|
ref.dllFuncs.VGUI_SetupDrawing( true );
|
||||||
|
Vector4Set( vgui.color, pColor[0], pColor[1], pColor[2], 255 - pColor[3] );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_SetupDrawingText( int *pColor )
|
||||||
|
{
|
||||||
|
ref.dllFuncs.VGUI_SetupDrawing( false );
|
||||||
|
Vector4Set( vgui.color, pColor[0], pColor[1], pColor[2], 255 - pColor[3] );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_DrawQuad( const vpoint_t *ul, const vpoint_t *lr )
|
||||||
|
{
|
||||||
|
float x, y, w, h;
|
||||||
|
|
||||||
|
if( !ul || !lr )
|
||||||
|
return;
|
||||||
|
|
||||||
|
x = ul->point[0];
|
||||||
|
y = ul->point[1];
|
||||||
|
w = lr->point[0] - x;
|
||||||
|
h = lr->point[1] - y;
|
||||||
|
|
||||||
|
SPR_AdjustSize( &x, &y, &w, &h );
|
||||||
|
|
||||||
|
if( vgui.enable_texture )
|
||||||
|
{
|
||||||
|
float s1, s2, t1, t2;
|
||||||
|
|
||||||
|
s1 = ul->coord[0];
|
||||||
|
t1 = ul->coord[1];
|
||||||
|
s2 = lr->coord[0];
|
||||||
|
t2 = lr->coord[1];
|
||||||
|
|
||||||
|
ref.dllFuncs.Color4ub( vgui.color[0], vgui.color[1], vgui.color[2], vgui.color[3] );
|
||||||
|
ref.dllFuncs.R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, vgui.textures[vgui.bound_texture] );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ref.dllFuncs.FillRGBABlend( x, y, w, h, vgui.color[0], vgui.color[1], vgui.color[2], vgui.color[3] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GAME_EXPORT VGUI_EnableTexture( qboolean enable )
|
||||||
|
{
|
||||||
|
vgui.enable_texture = enable;
|
||||||
|
}
|
||||||
|
|
||||||
static void GAME_EXPORT *VGUI_EngineMalloc( size_t size )
|
static void GAME_EXPORT *VGUI_EngineMalloc( size_t size )
|
||||||
{
|
{
|
||||||
@@ -117,33 +244,46 @@ qboolean VGui_IsActive( void )
|
|||||||
return vgui.initialized;
|
return vgui.initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VGui_FillAPIFromRef( vguiapi_t *to, const ref_interface_t *from )
|
|
||||||
{
|
|
||||||
to->DrawInit = from->VGUI_DrawInit;
|
|
||||||
to->DrawShutdown = from->VGUI_DrawShutdown;
|
|
||||||
to->SetupDrawingText = from->VGUI_SetupDrawingText;
|
|
||||||
to->SetupDrawingRect = from->VGUI_SetupDrawingRect;
|
|
||||||
to->SetupDrawingImage = from->VGUI_SetupDrawingImage;
|
|
||||||
to->BindTexture = from->VGUI_BindTexture;
|
|
||||||
to->EnableTexture = from->VGUI_EnableTexture;
|
|
||||||
to->CreateTexture = from->VGUI_CreateTexture;
|
|
||||||
to->UploadTexture = from->VGUI_UploadTexture;
|
|
||||||
to->UploadTextureBlock = from->VGUI_UploadTextureBlock;
|
|
||||||
to->DrawQuad = from->VGUI_DrawQuad;
|
|
||||||
to->GetTextureSizes = from->VGUI_GetTextureSizes;
|
|
||||||
to->GenerateTexture = from->VGUI_GenerateTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VGui_RegisterCvars( void )
|
void VGui_RegisterCvars( void )
|
||||||
{
|
{
|
||||||
Cvar_RegisterVariable( &vgui_utf8 );
|
Cvar_RegisterVariable( &vgui_utf8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const vguiapi_t gEngfuncs =
|
||||||
|
{
|
||||||
|
false, // Not initialized yet
|
||||||
|
VGUI_DrawInit, // VGUI_DrawInit,
|
||||||
|
VGUI_DrawShutdown, // VGUI_DrawShutdown,
|
||||||
|
VGUI_SetupDrawingText, // VGUI_SetupDrawingText,
|
||||||
|
VGUI_SetupDrawingRect, // VGUI_SetupDrawingRect,
|
||||||
|
VGUI_SetupDrawingText, // VGUI_SetupDrawingImage, (same as text)
|
||||||
|
VGUI_BindTexture, // VGUI_BindTexture,
|
||||||
|
VGUI_EnableTexture, // VGUI_EnableTexture,
|
||||||
|
VGUI_CreateTexture, // VGUI_CreateTexture,
|
||||||
|
VGUI_UploadTexture, // VGUI_UploadTexture,
|
||||||
|
VGUI_UploadTextureBlock, // VGUI_UploadTextureBlock,
|
||||||
|
VGUI_DrawQuad, // VGUI_DrawQuad,
|
||||||
|
VGUI_GetTextureSizes, // VGUI_GetTextureSizes,
|
||||||
|
VGUI_GenerateTexture, // VGUI_GenerateTexture,
|
||||||
|
VGUI_EngineMalloc,
|
||||||
|
VGUI_CursorSelect,
|
||||||
|
VGUI_GetColor,
|
||||||
|
VGUI_IsInGame,
|
||||||
|
Key_EnableTextInput,
|
||||||
|
VGUI_GetMousePos,
|
||||||
|
VGUI_UtfProcessChar,
|
||||||
|
Platform_GetClipboardText,
|
||||||
|
Platform_SetClipboardText,
|
||||||
|
Platform_GetKeyModifiers,
|
||||||
|
};
|
||||||
|
|
||||||
qboolean VGui_LoadProgs( HINSTANCE hInstance )
|
qboolean VGui_LoadProgs( HINSTANCE hInstance )
|
||||||
{
|
{
|
||||||
void (*F)( vguiapi_t* );
|
void (*F)( vguiapi_t* );
|
||||||
qboolean client = hInstance != NULL;
|
qboolean client = hInstance != NULL;
|
||||||
|
|
||||||
|
vgui.dllFuncs = gEngfuncs;
|
||||||
|
|
||||||
// not loading interface from client.dll, load vgui_support.dll instead
|
// not loading interface from client.dll, load vgui_support.dll instead
|
||||||
if( !client )
|
if( !client )
|
||||||
{
|
{
|
||||||
@@ -167,7 +307,7 @@ qboolean VGui_LoadProgs( HINSTANCE hInstance )
|
|||||||
{
|
{
|
||||||
if( FS_FileExists( vguiloader, false ))
|
if( FS_FileExists( vguiloader, false ))
|
||||||
Con_Reportf( S_ERROR "Failed to load vgui_support library: %s\n", COM_GetLibraryError() );
|
Con_Reportf( S_ERROR "Failed to load vgui_support library: %s\n", COM_GetLibraryError() );
|
||||||
else Con_Reportf( "vgui_support: not found\n" );
|
else Con_Reportf( "%s: not found\n", __func__ );
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -178,16 +318,15 @@ qboolean VGui_LoadProgs( HINSTANCE hInstance )
|
|||||||
|
|
||||||
if( F )
|
if( F )
|
||||||
{
|
{
|
||||||
VGui_FillAPIFromRef( &vgui.dllFuncs, &ref.dllFuncs );
|
|
||||||
F( &vgui.dllFuncs );
|
F( &vgui.dllFuncs );
|
||||||
|
|
||||||
vgui.initialized = vgui.dllFuncs.initialized = true;
|
vgui.initialized = vgui.dllFuncs.initialized = true;
|
||||||
Con_Reportf( "vgui_support: initialized legacy API in %s module\n", client ? "client" : "support" );
|
Con_Reportf( "%s: initialized legacy API in %s module\n", __func__, client ? "client" : "support" );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Con_Reportf( S_ERROR "Failed to find VGUI support API entry point in %s module\n", client ? "client" : "support" );
|
Con_Reportf( S_ERROR "%s: Failed to find VGUI support API entry point in %s module\n", __func__, client ? "client" : "support" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,8 +372,9 @@ void VGui_Shutdown( void )
|
|||||||
if( vgui.hInstance )
|
if( vgui.hInstance )
|
||||||
COM_FreeLibrary( vgui.hInstance );
|
COM_FreeLibrary( vgui.hInstance );
|
||||||
|
|
||||||
|
// drop pointers to now unloaded vgui_support
|
||||||
|
vgui.dllFuncs = gEngfuncs;
|
||||||
vgui.hInstance = NULL;
|
vgui.hInstance = NULL;
|
||||||
vgui.initialized = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ static CVAR_DEFINE_AUTO( vid_scale, "1.0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "p
|
|||||||
|
|
||||||
CVAR_DEFINE_AUTO( vid_highdpi, "1", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "enable High-DPI mode" );
|
CVAR_DEFINE_AUTO( vid_highdpi, "1", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "enable High-DPI mode" );
|
||||||
CVAR_DEFINE_AUTO( vid_maximized, "0", FCVAR_RENDERINFO, "window maximized state, read-only" );
|
CVAR_DEFINE_AUTO( vid_maximized, "0", FCVAR_RENDERINFO, "window maximized state, read-only" );
|
||||||
CVAR_DEFINE( vid_fullscreen, "fullscreen", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "fullscreen state (0 windowed, 1 fullscreen, 2 borderless)" );
|
CVAR_DEFINE( vid_fullscreen, "fullscreen", DEFAULT_FULLSCREEN, FCVAR_RENDERINFO|FCVAR_VIDRESTART, "fullscreen state (0 windowed, 1 fullscreen, 2 borderless)" );
|
||||||
CVAR_DEFINE( window_width, "width", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen width" );
|
CVAR_DEFINE( window_width, "width", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen width" );
|
||||||
CVAR_DEFINE( window_height, "height", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen height" );
|
CVAR_DEFINE( window_height, "height", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen height" );
|
||||||
CVAR_DEFINE( window_xpos, "_window_xpos", "-1", FCVAR_RENDERINFO, "window position by horizontal" );
|
CVAR_DEFINE( window_xpos, "_window_xpos", "-1", FCVAR_RENDERINFO, "window position by horizontal" );
|
||||||
@@ -175,7 +175,7 @@ static void VID_Mode_f( void )
|
|||||||
vidmode = R_GetVideoMode( Q_atoi( Cmd_Argv( 1 )) );
|
vidmode = R_GetVideoMode( Q_atoi( Cmd_Argv( 1 )) );
|
||||||
if( !vidmode )
|
if( !vidmode )
|
||||||
{
|
{
|
||||||
Con_Print( S_ERROR "unable to set mode, backend returned null" );
|
Con_Printf( S_ERROR "unable to set mode, backend returned null" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ CVAR_DEFINE_AUTO( voice_inputfromfile, "0", FCVAR_PRIVILEGED, "input voice from
|
|||||||
|
|
||||||
static void Voice_ApplyGainAdjust( int16_t *samples, int count, float scale );
|
static void Voice_ApplyGainAdjust( int16_t *samples, int count, float scale );
|
||||||
|
|
||||||
|
// in case user enabled voice after connection
|
||||||
|
// can't keep in `voice` struct because it gets zeroed on shutdown
|
||||||
|
static string voice_codec_init;
|
||||||
|
static int voice_quality_init;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============================================================================
|
===============================================================================
|
||||||
|
|
||||||
@@ -391,13 +396,16 @@ void Voice_RecordStart( void )
|
|||||||
{
|
{
|
||||||
Voice_RecordStop();
|
Voice_RecordStop();
|
||||||
|
|
||||||
|
if( !voice.initialized )
|
||||||
|
return;
|
||||||
|
|
||||||
if( voice_inputfromfile.value )
|
if( voice_inputfromfile.value )
|
||||||
{
|
{
|
||||||
voice.input_file = FS_LoadSound( "voice_input.wav", NULL, 0 );
|
voice.input_file = FS_LoadSound( "voice_input.wav", NULL, 0 );
|
||||||
|
|
||||||
if( voice.input_file )
|
if( voice.input_file )
|
||||||
{
|
{
|
||||||
Sound_Process( &voice.input_file, voice.samplerate, voice.width, SOUND_RESAMPLE );
|
Sound_Process( &voice.input_file, voice.samplerate, voice.width, VOICE_PCM_CHANNELS, SOUND_RESAMPLE );
|
||||||
voice.input_file_pos = 0;
|
voice.input_file_pos = 0;
|
||||||
|
|
||||||
voice.start_time = Sys_DoubleTime();
|
voice.start_time = Sys_DoubleTime();
|
||||||
@@ -410,7 +418,7 @@ void Voice_RecordStart( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !Voice_IsRecording() )
|
if( !Voice_IsRecording( ) && voice.device_opened )
|
||||||
voice.is_recording = VoiceCapture_Activate( true );
|
voice.is_recording = VoiceCapture_Activate( true );
|
||||||
|
|
||||||
if( Voice_IsRecording() )
|
if( Voice_IsRecording() )
|
||||||
@@ -591,10 +599,17 @@ void Voice_Idle( double frametime )
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( FBitSet( voice_enable.flags, FCVAR_CHANGED ) && !voice_enable.value )
|
if( FBitSet( voice_enable.flags, FCVAR_CHANGED ))
|
||||||
{
|
{
|
||||||
Voice_Shutdown();
|
ClearBits( voice_enable.flags, FCVAR_CHANGED );
|
||||||
return;
|
|
||||||
|
if( voice_enable.value )
|
||||||
|
{
|
||||||
|
if( cls.state == ca_active && COM_CheckString( voice_codec_init ) && voice_quality_init != 0 )
|
||||||
|
Voice_Init( voice_codec_init, voice_quality_init, false );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Voice_Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
// update local player status first
|
// update local player status first
|
||||||
@@ -613,6 +628,20 @@ Initialize the voice subsystem
|
|||||||
*/
|
*/
|
||||||
qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit )
|
qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit )
|
||||||
{
|
{
|
||||||
|
if( Q_strcmp( pszCodecName, VOICE_OPUS_CUSTOM_CODEC ))
|
||||||
|
{
|
||||||
|
if( COM_CheckStringEmpty( pszCodecName ))
|
||||||
|
Con_Printf( S_ERROR "Server requested unsupported codec: %s\n", pszCodecName );
|
||||||
|
|
||||||
|
// reset saved codec name, we won't enable voice for this connection
|
||||||
|
voice_codec_init[0] = 0;
|
||||||
|
voice_quality_init = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_strncpy( voice_codec_init, pszCodecName, sizeof( voice_codec_init ));
|
||||||
|
voice_quality_init = quality;
|
||||||
|
|
||||||
if( !voice_enable.value )
|
if( !voice_enable.value )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -620,13 +649,6 @@ qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit )
|
|||||||
if( Q_strcmp( pszCodecName, voice.codec ) || voice.quality != quality )
|
if( Q_strcmp( pszCodecName, voice.codec ) || voice.quality != quality )
|
||||||
{
|
{
|
||||||
Voice_Shutdown();
|
Voice_Shutdown();
|
||||||
|
|
||||||
if( Q_strcmp( pszCodecName, VOICE_OPUS_CUSTOM_CODEC ))
|
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "Server requested unsupported codec: %s\n", pszCodecName );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice.autogain.block_size = 128;
|
voice.autogain.block_size = 128;
|
||||||
|
|
||||||
if( !Voice_InitCustomMode( ))
|
if( !Voice_InitCustomMode( ))
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ typedef struct OpusCustomMode OpusCustomMode;
|
|||||||
#define VOICE_PCM_CHANNELS 1 // always mono
|
#define VOICE_PCM_CHANNELS 1 // always mono
|
||||||
|
|
||||||
// never change these parameters when using opuscustom
|
// never change these parameters when using opuscustom
|
||||||
#define VOICE_OPUS_CUSTOM_SAMPLERATE SOUND_44k
|
#define VOICE_OPUS_CUSTOM_SAMPLERATE 44100
|
||||||
// must follow opus custom requirements
|
// must follow opus custom requirements
|
||||||
// also be divisible with MAX_RAW_SAMPLES
|
// also be divisible with MAX_RAW_SAMPLES
|
||||||
#define VOICE_OPUS_CUSTOM_FRAME_SIZE 1024
|
#define VOICE_OPUS_CUSTOM_FRAME_SIZE 1024
|
||||||
|
|||||||
@@ -16,21 +16,20 @@ GNU General Public License for more details.
|
|||||||
#ifndef VOX_H
|
#ifndef VOX_H
|
||||||
#define VOX_H
|
#define VOX_H
|
||||||
|
|
||||||
#define CVOXWORDMAX 64
|
#define CVOXWORDMAX 64
|
||||||
|
#define SENTENCE_INDEX -99999 // unique sentence index
|
||||||
#define SENTENCE_INDEX -99999 // unique sentence index
|
|
||||||
|
|
||||||
typedef struct voxword_s
|
typedef struct voxword_s
|
||||||
{
|
{
|
||||||
int volume; // increase percent, ie: 125 = 125% increase
|
int volume; // increase percent, ie: 125 = 125% increase
|
||||||
int pitch; // pitch shift up percent
|
int pitch; // pitch shift up percent
|
||||||
int start; // offset start of wave percent
|
int start; // offset start of wave percent
|
||||||
int end; // offset end of wave percent
|
int end; // offset end of wave percent
|
||||||
int cbtrim; // end of wave after being trimmed to 'end'
|
int cbtrim; // end of wave after being trimmed to 'end'
|
||||||
int fKeepCached; // 1 if this word was already in cache before sentence referenced it
|
int fKeepCached; // 1 if this word was already in cache before sentence referenced it
|
||||||
int samplefrac; // if pitch shifting, this is position into wav * 256
|
int samplefrac; // if pitch shifting, this is position into wav * 256
|
||||||
int timecompress; // % of wave to skip during playback (causes no pitch shift)
|
int timecompress; // % of wave to skip during playback (causes no pitch shift)
|
||||||
sfx_t *sfx; // name and cache pointer
|
sfx_t *sfx; // name and cache pointer
|
||||||
} voxword_t;
|
} voxword_t;
|
||||||
|
|
||||||
struct channel_s;
|
struct channel_s;
|
||||||
|
|||||||
@@ -19,13 +19,15 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#define HASH_SIZE 128 // 128 * 4 * 4 == 2048 bytes
|
#define HASH_SIZE 128 // 128 * 4 * 4 == 2048 bytes
|
||||||
|
|
||||||
typedef struct base_command_hashmap_s
|
typedef struct base_command_hashmap_s base_command_hashmap_t;
|
||||||
|
|
||||||
|
struct base_command_hashmap_s
|
||||||
{
|
{
|
||||||
base_command_t *basecmd; // base command: cvar, alias or command
|
base_command_t *basecmd; // base command: cvar, alias or command
|
||||||
const char *name; // key for searching
|
base_command_hashmap_t *next;
|
||||||
base_command_type_e type; // type for faster searching
|
base_command_type_e type; // type for faster searching
|
||||||
struct base_command_hashmap_s *next;
|
char name[1]; // key for searching
|
||||||
} base_command_hashmap_t;
|
};
|
||||||
|
|
||||||
static base_command_hashmap_t *hashed_cmds[HASH_SIZE];
|
static base_command_hashmap_t *hashed_cmds[HASH_SIZE];
|
||||||
|
|
||||||
@@ -124,11 +126,12 @@ void BaseCmd_Insert( base_command_type_e type, base_command_t *basecmd, const ch
|
|||||||
{
|
{
|
||||||
base_command_hashmap_t *elem, *cur, *find;
|
base_command_hashmap_t *elem, *cur, *find;
|
||||||
uint hash = BaseCmd_HashKey( name );
|
uint hash = BaseCmd_HashKey( name );
|
||||||
|
size_t len = Q_strlen( name );
|
||||||
|
|
||||||
elem = Z_Malloc( sizeof( base_command_hashmap_t ) );
|
elem = Z_Malloc( sizeof( base_command_hashmap_t ) + len );
|
||||||
elem->basecmd = basecmd;
|
elem->basecmd = basecmd;
|
||||||
elem->type = type;
|
elem->type = type;
|
||||||
elem->name = name;
|
Q_strncpy( elem->name, name, len + 1 );
|
||||||
|
|
||||||
// link the variable in alphanumerical order
|
// link the variable in alphanumerical order
|
||||||
for( cur = NULL, find = hashed_cmds[hash];
|
for( cur = NULL, find = hashed_cmds[hash];
|
||||||
@@ -159,7 +162,7 @@ void BaseCmd_Remove( base_command_type_e type, const char *name )
|
|||||||
|
|
||||||
if( !i )
|
if( !i )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "Couldn't find %s in buckets\n", name );
|
Con_Reportf( S_ERROR "%s: Couldn't find %s in buckets\n", __func__, name );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ typedef enum base_command_type
|
|||||||
|
|
||||||
typedef void base_command_t;
|
typedef void base_command_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void BaseCmd_Init( void );
|
void BaseCmd_Init( void );
|
||||||
base_command_t *BaseCmd_Find( base_command_type_e type, const char *name );
|
base_command_t *BaseCmd_Find( base_command_type_e type, const char *name );
|
||||||
void BaseCmd_FindAll( const char *name,
|
void BaseCmd_FindAll( const char *name,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ typedef enum
|
|||||||
T_COUNT
|
T_COUNT
|
||||||
} cvartype_t;
|
} cvartype_t;
|
||||||
|
|
||||||
const char *cvartypes[] = { NULL, "BOOL", "NUMBER", "LIST", "STRING" };
|
static const char *const cvartypes[] = { NULL, "BOOL", "NUMBER", "LIST", "STRING" };
|
||||||
|
|
||||||
typedef struct parserstate_s
|
typedef struct parserstate_s
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,18 +24,27 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
byte *data;
|
byte *const data;
|
||||||
int cursize;
|
const int maxsize;
|
||||||
int maxsize;
|
int cursize;
|
||||||
} cmdbuf_t;
|
} cmdbuf_t;
|
||||||
|
|
||||||
qboolean cmd_wait;
|
static qboolean cmd_wait;
|
||||||
cmdbuf_t cmd_text, filteredcmd_text;
|
static byte cmd_text_buf[MAX_CMD_BUFFER];
|
||||||
byte cmd_text_buf[MAX_CMD_BUFFER];
|
static byte filteredcmd_text_buf[MAX_CMD_BUFFER];
|
||||||
byte filteredcmd_text_buf[MAX_CMD_BUFFER];
|
static cmdbuf_t cmd_text =
|
||||||
cmdalias_t *cmd_alias;
|
{
|
||||||
uint cmd_condition;
|
.data = cmd_text_buf,
|
||||||
int cmd_condlevel;
|
.maxsize = ARRAYSIZE( cmd_text_buf ),
|
||||||
|
};
|
||||||
|
static cmdbuf_t filteredcmd_text =
|
||||||
|
{
|
||||||
|
.data = filteredcmd_text_buf,
|
||||||
|
.maxsize = ARRAYSIZE( filteredcmd_text_buf ),
|
||||||
|
};
|
||||||
|
static cmdalias_t *cmd_alias;
|
||||||
|
static uint cmd_condition;
|
||||||
|
static int cmd_condlevel;
|
||||||
static qboolean cmd_currentCommandIsPrivileged;
|
static qboolean cmd_currentCommandIsPrivileged;
|
||||||
|
|
||||||
static void Cmd_ExecuteStringWithPrivilegeCheck( const char *text, qboolean isPrivileged );
|
static void Cmd_ExecuteStringWithPrivilegeCheck( const char *text, qboolean isPrivileged );
|
||||||
@@ -48,20 +57,6 @@ static void Cmd_ExecuteStringWithPrivilegeCheck( const char *text, qboolean isPr
|
|||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
============
|
|
||||||
Cbuf_Init
|
|
||||||
============
|
|
||||||
*/
|
|
||||||
static void Cbuf_Init( void )
|
|
||||||
{
|
|
||||||
cmd_text.data = cmd_text_buf;
|
|
||||||
filteredcmd_text.data = filteredcmd_text_buf;
|
|
||||||
|
|
||||||
filteredcmd_text.maxsize = cmd_text.maxsize = MAX_CMD_BUFFER;
|
|
||||||
filteredcmd_text.cursize = cmd_text.cursize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cbuf_Clear
|
Cbuf_Clear
|
||||||
@@ -86,7 +81,7 @@ static void *Cbuf_GetSpace( cmdbuf_t *buf, int length )
|
|||||||
if(( buf->cursize + length ) > buf->maxsize )
|
if(( buf->cursize + length ) > buf->maxsize )
|
||||||
{
|
{
|
||||||
buf->cursize = 0;
|
buf->cursize = 0;
|
||||||
Host_Error( "Cbuf_GetSpace: overflow\n" );
|
Host_Error( "%s: overflow\n", __func__ );
|
||||||
}
|
}
|
||||||
|
|
||||||
data = buf->data + buf->cursize;
|
data = buf->data + buf->cursize;
|
||||||
@@ -156,7 +151,7 @@ static void Cbuf_InsertTextToBuffer( cmdbuf_t *buf, const char *text )
|
|||||||
|
|
||||||
if(( buf->cursize + l ) >= buf->maxsize )
|
if(( buf->cursize + l ) >= buf->maxsize )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_WARN "Cbuf_InsertText: overflow\n" );
|
Con_Reportf( S_WARN "%s: overflow\n", __func__ );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -224,7 +219,7 @@ static void Cbuf_ExecuteCommandsFromBuffer( cmdbuf_t *buf, qboolean isPrivileged
|
|||||||
|
|
||||||
if( i >= ( MAX_CMD_LINE - 1 ))
|
if( i >= ( MAX_CMD_LINE - 1 ))
|
||||||
{
|
{
|
||||||
Con_DPrintf( S_ERROR "Cbuf_Execute: command string owerflow\n" );
|
Con_DPrintf( S_ERROR "%s: command string owerflow\n", __func__ );
|
||||||
line[0] = 0;
|
line[0] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -387,7 +382,7 @@ static void Cmd_Echo_f( void )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for( i = 1; i < Cmd_Argc(); i++ )
|
for( i = 1; i < Cmd_Argc(); i++ )
|
||||||
Con_Printf( "%s", Cmd_Argv( i ));
|
Con_Printf( "%s ", Cmd_Argv( i ));
|
||||||
Con_Printf( "\n" );
|
Con_Printf( "\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -640,7 +635,7 @@ void Cmd_TokenizeString( const char *text )
|
|||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
// skip whitespace up to a /n
|
// skip whitespace up to a /n
|
||||||
while( *text && *text <= ' ' && *text != '\r' && *text != '\n' )
|
while( *text && ((byte)*text ) <= ' ' && *text != '\r' && *text != '\n' )
|
||||||
text++;
|
text++;
|
||||||
|
|
||||||
if( *text == '\n' || *text == '\r' )
|
if( *text == '\n' || *text == '\r' )
|
||||||
@@ -682,7 +677,7 @@ static int Cmd_AddCommandEx( const char *funcname, const char *cmd_name, xcomman
|
|||||||
|
|
||||||
if( !COM_CheckString( cmd_name ))
|
if( !COM_CheckString( cmd_name ))
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "%s: NULL name\n", funcname );
|
Con_Reportf( S_ERROR "%s: NULL name\n", funcname );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,7 +723,7 @@ Cmd_AddCommand
|
|||||||
*/
|
*/
|
||||||
void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
|
void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
|
||||||
{
|
{
|
||||||
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, cmd_desc, 0 );
|
Cmd_AddCommandEx( __func__, cmd_name, function, cmd_desc, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -739,7 +734,7 @@ Cmd_AddRestrictedCommand
|
|||||||
*/
|
*/
|
||||||
void Cmd_AddRestrictedCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
|
void Cmd_AddRestrictedCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
|
||||||
{
|
{
|
||||||
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, cmd_desc, CMD_PRIVILEGED );
|
Cmd_AddCommandEx( __func__, cmd_name, function, cmd_desc, CMD_PRIVILEGED );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -749,7 +744,7 @@ Cmd_AddServerCommand
|
|||||||
*/
|
*/
|
||||||
void GAME_EXPORT Cmd_AddServerCommand( const char *cmd_name, xcommand_t function )
|
void GAME_EXPORT Cmd_AddServerCommand( const char *cmd_name, xcommand_t function )
|
||||||
{
|
{
|
||||||
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "server command", CMD_SERVERDLL );
|
Cmd_AddCommandEx( __func__, cmd_name, function, "server command", CMD_SERVERDLL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -767,7 +762,7 @@ int GAME_EXPORT Cmd_AddClientCommand( const char *cmd_name, xcommand_t function
|
|||||||
flags |= CMD_PRIVILEGED;
|
flags |= CMD_PRIVILEGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "client command", flags );
|
return Cmd_AddCommandEx( __func__, cmd_name, function, "client command", flags );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -777,7 +772,7 @@ Cmd_AddGameUICommand
|
|||||||
*/
|
*/
|
||||||
int GAME_EXPORT Cmd_AddGameUICommand( const char *cmd_name, xcommand_t function )
|
int GAME_EXPORT Cmd_AddGameUICommand( const char *cmd_name, xcommand_t function )
|
||||||
{
|
{
|
||||||
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "gameui command", CMD_GAMEUIDLL );
|
return Cmd_AddCommandEx( __func__, cmd_name, function, "gameui command", CMD_GAMEUIDLL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -787,7 +782,7 @@ Cmd_AddRefCommand
|
|||||||
*/
|
*/
|
||||||
int Cmd_AddRefCommand( const char *cmd_name, xcommand_t function, const char *description )
|
int Cmd_AddRefCommand( const char *cmd_name, xcommand_t function, const char *description )
|
||||||
{
|
{
|
||||||
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, description, CMD_REFDLL );
|
return Cmd_AddCommandEx( __func__, cmd_name, function, description, CMD_REFDLL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -949,7 +944,7 @@ static void Cmd_Else_f( void )
|
|||||||
|
|
||||||
static qboolean Cmd_ShouldAllowCommand( cmd_t *cmd, qboolean isPrivileged )
|
static qboolean Cmd_ShouldAllowCommand( cmd_t *cmd, qboolean isPrivileged )
|
||||||
{
|
{
|
||||||
const char *prefixes[] = { "cl_", "gl_", "r_", "m_", "hud_", "joy_" };
|
const char *prefixes[] = { "cl_", "gl_", "r_", "m_", "hud_", "joy_", "con_", "scr_" };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// always allow local commands
|
// always allow local commands
|
||||||
@@ -1015,7 +1010,7 @@ static void Cmd_ExecuteStringWithPrivilegeCheck( const char *text, qboolean isPr
|
|||||||
*ptoken++ = *text++;
|
*ptoken++ = *text++;
|
||||||
*ptoken = 0;
|
*ptoken = 0;
|
||||||
|
|
||||||
len += Q_strncpy( pcmd, Cvar_VariableString( token ), MAX_CMD_LINE - len );
|
len += Q_strncpy( pcmd, Cvar_VariableString( token ), sizeof( token ) - len );
|
||||||
pcmd = command + len;
|
pcmd = command + len;
|
||||||
|
|
||||||
if( !*text ) break;
|
if( !*text ) break;
|
||||||
@@ -1219,13 +1214,13 @@ void Cmd_Unlink( int group )
|
|||||||
cmd_t **prev;
|
cmd_t **prev;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_gameloaded" ) && FBitSet( group, CMD_SERVERDLL ))
|
if( FBitSet( group, CMD_SERVERDLL ) && Cvar_VariableInteger( "host_gameloaded" ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_clientloaded" ) && FBitSet( group, CMD_CLIENTDLL ))
|
if( FBitSet( group, CMD_CLIENTDLL ) && Cvar_VariableInteger( "host_clientloaded" ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_gameuiloaded" ) && FBitSet( group, CMD_GAMEUIDLL ))
|
if( FBitSet( group, CMD_GAMEUIDLL ) && Cvar_VariableInteger( "host_gameuiloaded" ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
prev = &cmd_functions;
|
prev = &cmd_functions;
|
||||||
@@ -1387,8 +1382,6 @@ Cmd_Init
|
|||||||
*/
|
*/
|
||||||
void Cmd_Init( void )
|
void Cmd_Init( void )
|
||||||
{
|
{
|
||||||
Cbuf_Init();
|
|
||||||
|
|
||||||
cmd_functions = NULL;
|
cmd_functions = NULL;
|
||||||
cmd_condition = 0;
|
cmd_condition = 0;
|
||||||
cmd_alias = NULL;
|
cmd_alias = NULL;
|
||||||
|
|||||||
@@ -39,9 +39,6 @@ GNU General Public License for more details.
|
|||||||
// end game final default message
|
// end game final default message
|
||||||
#define DEFAULT_ENDGAME_MESSAGE "The End"
|
#define DEFAULT_ENDGAME_MESSAGE "The End"
|
||||||
|
|
||||||
// path to the hash-pak that contain custom player decals
|
|
||||||
#define CUSTOM_RES_PATH "custom.hpk"
|
|
||||||
|
|
||||||
// path to default playermodel in GoldSrc
|
// path to default playermodel in GoldSrc
|
||||||
#define DEFAULT_PLAYER_PATH_HALFLIFE "models/player.mdl"
|
#define DEFAULT_PLAYER_PATH_HALFLIFE "models/player.mdl"
|
||||||
|
|
||||||
@@ -55,14 +52,20 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#define DEFAULT_EXTERNAL_PALETTE "gfx/palette.pal"
|
#define DEFAULT_EXTERNAL_PALETTE "gfx/palette.pal"
|
||||||
|
|
||||||
// path to folders where placed all sounds
|
// path to sound files
|
||||||
#define DEFAULT_SOUNDPATH "sound/"
|
#define DEFAULT_SOUNDPATH "sound/"
|
||||||
|
|
||||||
// path store saved games
|
// path to saved games
|
||||||
#define DEFAULT_SAVE_DIRECTORY "save/"
|
#define DEFAULT_SAVE_DIRECTORY "save/"
|
||||||
|
|
||||||
|
// path to download games
|
||||||
|
#define DEFAULT_DOWNLOADED_DIRECTORY "downloaded/"
|
||||||
|
|
||||||
|
// path to user mod directory
|
||||||
|
#define DEFAULT_CUSTOM_DIRECTORY "custom/"
|
||||||
|
|
||||||
// fallback to this skybox
|
// fallback to this skybox
|
||||||
#define DEFAULT_SKYBOX_PATH "gfx/env/desert"
|
#define DEFAULT_SKYBOX_NAME "desert"
|
||||||
|
|
||||||
// playlist for startup videos
|
// playlist for startup videos
|
||||||
#define DEFAULT_VIDEOLIST_PATH "media/StartupVids.txt"
|
#define DEFAULT_VIDEOLIST_PATH "media/StartupVids.txt"
|
||||||
@@ -75,7 +78,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#define XASH_ENGINE_NAME "Xash3D FWGS"
|
#define XASH_ENGINE_NAME "Xash3D FWGS"
|
||||||
#define XASH_DEDICATED_SERVER_NAME "XashDS"
|
#define XASH_DEDICATED_SERVER_NAME "XashDS"
|
||||||
#define XASH_VERSION "0.20" // engine current version
|
#define XASH_VERSION "0.21" // engine current version
|
||||||
#define XASH_COMPAT_VERSION "0.99" // version we are based on
|
#define XASH_COMPAT_VERSION "0.99" // version we are based on
|
||||||
|
|
||||||
#endif//COM_STRINGS_H
|
#endif//COM_STRINGS_H
|
||||||
|
|||||||
@@ -23,18 +23,21 @@ GNU General Public License for more details.
|
|||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "library.h"
|
#include "library.h"
|
||||||
|
|
||||||
static const char *file_exts[] =
|
static const char *const file_exts[] =
|
||||||
{
|
{
|
||||||
"cfg",
|
// ban text files that don't make sense as resource
|
||||||
"lst",
|
"cfg", "lst", "ini", "log",
|
||||||
"exe",
|
|
||||||
"vbs",
|
// ban Windows code
|
||||||
"com",
|
"exe", "vbs", "com", "bat",
|
||||||
"bat",
|
"dll", "sys", "ps1",
|
||||||
"dll",
|
|
||||||
"ini",
|
// ban common unix code
|
||||||
"log",
|
// NOTE: in unix anything can be executed as long it has access flag
|
||||||
"sys",
|
"so", "sh", "dylib",
|
||||||
|
|
||||||
|
// ban mobile archives
|
||||||
|
"apk", "ipa",
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@@ -756,25 +759,6 @@ void GAME_EXPORT COM_FreeFile( void *buffer )
|
|||||||
free( buffer );
|
free( buffer );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
=============
|
|
||||||
COM_NormalizeAngles
|
|
||||||
|
|
||||||
=============
|
|
||||||
*/
|
|
||||||
void COM_NormalizeAngles( vec3_t angles )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for( i = 0; i < 3; i++ )
|
|
||||||
{
|
|
||||||
if( angles[i] > 180.0f )
|
|
||||||
angles[i] -= 360.0f;
|
|
||||||
else if( angles[i] < -180.0f )
|
|
||||||
angles[i] += 360.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=============
|
=============
|
||||||
pfnGetModelType
|
pfnGetModelType
|
||||||
@@ -840,7 +824,7 @@ int GAME_EXPORT COM_CompareFileTime( const char *filename1, const char *filename
|
|||||||
if( ft1 == -1 || ft2 == -1 )
|
if( ft1 == -1 || ft2 == -1 )
|
||||||
return bRet;
|
return bRet;
|
||||||
|
|
||||||
*iCompare = Host_CompareFileTime( ft1, ft2 );
|
*iCompare = ft1 < ft2 ? -1 : ( ft1 > ft2 ? 1 : 0 );
|
||||||
bRet = 1;
|
bRet = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -895,15 +879,40 @@ qboolean COM_IsSafeFileToDownload( const char *filename )
|
|||||||
char lwrfilename[4096];
|
char lwrfilename[4096];
|
||||||
const char *first, *last;
|
const char *first, *last;
|
||||||
const char *ext;
|
const char *ext;
|
||||||
|
size_t len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !COM_CheckString( filename ))
|
if( !COM_CheckString( filename ))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
ext = COM_FileExtension( filename );
|
||||||
|
len = Q_strlen( filename );
|
||||||
|
|
||||||
|
// only allow extensionless files that start with !MD5
|
||||||
if( !Q_strncmp( filename, "!MD5", 4 ))
|
if( !Q_strncmp( filename, "!MD5", 4 ))
|
||||||
|
{
|
||||||
|
if( COM_CheckStringEmpty( ext ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
len = Q_strlen( filename );
|
||||||
|
|
||||||
|
if( len != 36 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for( i = 4; i < len; i++ )
|
||||||
|
{
|
||||||
|
if(( filename[i] >= '0' && filename[i] <= '9' ) ||
|
||||||
|
( filename[i] >= 'A' && filename[i] <= 'F' ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Q_strnlwr( filename, lwrfilename, sizeof( lwrfilename ));
|
Q_strnlwr( filename, lwrfilename, sizeof( lwrfilename ));
|
||||||
|
ext = COM_FileExtension( lwrfilename );
|
||||||
|
|
||||||
if( Q_strpbrk( lwrfilename, "\\:~" ) || Q_strstr( lwrfilename, ".." ) )
|
if( Q_strpbrk( lwrfilename, "\\:~" ) || Q_strstr( lwrfilename, ".." ) )
|
||||||
return false;
|
return false;
|
||||||
@@ -923,8 +932,6 @@ qboolean COM_IsSafeFileToDownload( const char *filename )
|
|||||||
if( Q_strlen( first ) != 4 )
|
if( Q_strlen( first ) != 4 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ext = COM_FileExtension( lwrfilename );
|
|
||||||
|
|
||||||
for( i = 0; i < ARRAYSIZE( file_exts ); i++ )
|
for( i = 0; i < ARRAYSIZE( file_exts ); i++ )
|
||||||
{
|
{
|
||||||
if( !Q_stricmp( ext, file_exts[i] ))
|
if( !Q_stricmp( ext, file_exts[i] ))
|
||||||
@@ -967,7 +974,7 @@ used by CS:CZ
|
|||||||
*/
|
*/
|
||||||
void *GAME_EXPORT pfnSequenceGet( const char *fileName, const char *entryName )
|
void *GAME_EXPORT pfnSequenceGet( const char *fileName, const char *entryName )
|
||||||
{
|
{
|
||||||
Msg( "Sequence_Get: file %s, entry %s\n", fileName, entryName );
|
Msg( "%s: file %s, entry %s\n", __func__, fileName, entryName );
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -981,7 +988,7 @@ used by CS:CZ
|
|||||||
*/
|
*/
|
||||||
void *GAME_EXPORT pfnSequencePickSentence( const char *groupName, int pickMethod, int *picked )
|
void *GAME_EXPORT pfnSequencePickSentence( const char *groupName, int pickMethod, int *picked )
|
||||||
{
|
{
|
||||||
Msg( "Sequence_PickSentence: group %s, pickMethod %i\n", groupName, pickMethod );
|
Msg( "%s: group %s, pickMethod %i\n", __func__, groupName, pickMethod );
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -1038,28 +1045,13 @@ void GAME_EXPORT pfnResetTutorMessageDecayData( void )
|
|||||||
|
|
||||||
void Test_RunCommon( void )
|
void Test_RunCommon( void )
|
||||||
{
|
{
|
||||||
char *file = (char *)"q asdf \"qwerty\" \"f \\\"f\" meowmeow\n// comment \"stuff ignored\"\nbark";
|
Msg( "Checking COM_IsSafeFileToDownload...\n" );
|
||||||
int len;
|
|
||||||
char buf[5];
|
|
||||||
|
|
||||||
Msg( "Checking COM_ParseFile...\n" );
|
TASSERT_EQi( COM_IsSafeFileToDownload( "!MD5AAB5E8B307672DA86FBD10AC302BC732" ), true );
|
||||||
|
TASSERT_EQi( COM_IsSafeFileToDownload( "!MD56f1ffd8c96bd64c9c27955309f6ecfe6" ), false );
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
TASSERT_EQi( COM_IsSafeFileToDownload( "!MD5AAB5E8B307672DA86FBD10AC302B.exe" ), false );
|
||||||
TASSERT( !Q_strcmp( buf, "q" ) && len == 1);
|
TASSERT_EQi( COM_IsSafeFileToDownload( "!MD5/../../valve/resource/GameMenu.res" ), false );
|
||||||
|
TASSERT_EQi( COM_IsSafeFileToDownload( "not-a-virus-trust-me.bat" ), false );
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
TASSERT_EQi( COM_IsSafeFileToDownload( "a-texture.png" ), true );
|
||||||
TASSERT( !Q_strcmp( buf, "asdf" ) && len == 4);
|
|
||||||
|
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
|
||||||
TASSERT( !Q_strcmp( buf, "qwer" ) && len == -1);
|
|
||||||
|
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
|
||||||
TASSERT( !Q_strcmp( buf, "f \"f" ) && len == 4);
|
|
||||||
|
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
|
||||||
TASSERT( !Q_strcmp( buf, "meow" ) && len == -1);
|
|
||||||
|
|
||||||
file = COM_ParseFileSafe( file, buf, sizeof( buf ), 0, &len, NULL );
|
|
||||||
TASSERT( !Q_strcmp( buf, "bark" ) && len == 4);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -112,6 +112,9 @@ typedef enum
|
|||||||
#include "con_nprint.h"
|
#include "con_nprint.h"
|
||||||
#include "crclib.h"
|
#include "crclib.h"
|
||||||
#include "ref_api.h"
|
#include "ref_api.h"
|
||||||
|
#define FSCALLBACK_OVERRIDE_OPEN
|
||||||
|
#define FSCALLBACK_OVERRIDE_LOADFILE
|
||||||
|
#define FSCALLBACK_OVERRIDE_MALLOC_LIKE
|
||||||
#include "fscallback.h"
|
#include "fscallback.h"
|
||||||
|
|
||||||
// PERFORMANCE INFO
|
// PERFORMANCE INFO
|
||||||
@@ -157,13 +160,17 @@ extern convar_t gl_vsync;
|
|||||||
extern convar_t scr_loading;
|
extern convar_t scr_loading;
|
||||||
extern convar_t scr_download;
|
extern convar_t scr_download;
|
||||||
extern convar_t cmd_scripting;
|
extern convar_t cmd_scripting;
|
||||||
extern convar_t cl_allow_levelshots;
|
extern convar_t host_allow_materials;
|
||||||
extern convar_t host_developer;
|
extern convar_t host_developer;
|
||||||
extern convar_t host_limitlocal;
|
extern convar_t host_limitlocal;
|
||||||
extern convar_t host_maxfps;
|
extern convar_t host_maxfps;
|
||||||
extern convar_t sys_timescale;
|
extern convar_t sys_timescale;
|
||||||
extern convar_t cl_filterstuffcmd;
|
extern convar_t cl_filterstuffcmd;
|
||||||
extern convar_t rcon_password;
|
extern convar_t rcon_password;
|
||||||
|
extern convar_t hpk_custom_file;
|
||||||
|
extern convar_t con_gamemaps;
|
||||||
|
|
||||||
|
#define Mod_AllowMaterials() ( host_allow_materials.value != 0.0f && !FBitSet( host.features, ENGINE_DISABLE_HDTEXTURES ))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================
|
==============================================================
|
||||||
@@ -180,15 +187,6 @@ GAMEINFO stuff
|
|||||||
internal shared gameinfo structure (readonly for engine parts)
|
internal shared gameinfo structure (readonly for engine parts)
|
||||||
========================================================================
|
========================================================================
|
||||||
*/
|
*/
|
||||||
typedef struct sysinfo_s
|
|
||||||
{
|
|
||||||
string exeName; // exe.filename
|
|
||||||
string rcName; // .rc script name
|
|
||||||
string basedirName; // name of base directory
|
|
||||||
string gamedll;
|
|
||||||
string clientlib;
|
|
||||||
} sysinfo_t;
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
HOST_INIT = 0, // initalize operations
|
HOST_INIT = 0, // initalize operations
|
||||||
@@ -275,94 +273,89 @@ typedef enum bugcomp_e
|
|||||||
{
|
{
|
||||||
// reverts fix for pfnPEntityOfEntIndex for bug compatibility with GoldSrc
|
// reverts fix for pfnPEntityOfEntIndex for bug compatibility with GoldSrc
|
||||||
BUGCOMP_PENTITYOFENTINDEX_FLAG = BIT( 0 ),
|
BUGCOMP_PENTITYOFENTINDEX_FLAG = BIT( 0 ),
|
||||||
|
|
||||||
|
// rewrites mod's attempts to write GoldSrc-specific messages into Xash protocol
|
||||||
|
// (new wrappers are added by request)
|
||||||
|
BUGCOMP_MESSAGE_REWRITE_FACILITY_FLAG = BIT( 1 ),
|
||||||
|
|
||||||
|
// makes sound with no attenuation spatialized, like in GoldSrc
|
||||||
|
BUGCOMP_SPATIALIZE_SOUND_WITH_ATTN_NONE = BIT( 2 ),
|
||||||
} bugcomp_t;
|
} bugcomp_t;
|
||||||
|
|
||||||
typedef struct host_parm_s
|
typedef struct host_parm_s
|
||||||
{
|
{
|
||||||
HINSTANCE hInst;
|
// ==== shared through RefAPI's ref_host_t
|
||||||
HANDLE hMutex;
|
double realtime; // host.curtime
|
||||||
|
double frametime; // time between engine frames
|
||||||
|
uint features; // custom features that enables by mod-maker request
|
||||||
|
// ==== shared through RefAPI's ref_host_t
|
||||||
|
|
||||||
host_status_t status; // global host state
|
host_status_t status; // global host state
|
||||||
game_status_t game; // game manager
|
game_status_t game; // game manager
|
||||||
uint type; // running at
|
uint type; // running at
|
||||||
jmp_buf abortframe; // abort current frame
|
poolhandle_t mempool; // static mempool for misc allocations
|
||||||
dword errorframe; // to prevent multiple host error
|
poolhandle_t imagepool; // imagelib mempool
|
||||||
poolhandle_t mempool; // static mempool for misc allocations
|
poolhandle_t soundpool; // soundlib mempool
|
||||||
string finalmsg; // server shutdown final message
|
string finalmsg; // server shutdown final message
|
||||||
string downloadfile; // filename to be downloading
|
string downloadfile; // filename to be downloading
|
||||||
int downloadcount; // how many files remain to downloading
|
int downloadcount; // how many files remain to downloading
|
||||||
char deferred_cmd[128]; // deferred commands
|
char deferred_cmd[128];// deferred commands
|
||||||
host_redirect_t rd; // remote console
|
|
||||||
|
host_redirect_t rd; // remote console
|
||||||
|
|
||||||
|
void *hWnd; // main window
|
||||||
|
|
||||||
// command line parms
|
// command line parms
|
||||||
int argc;
|
char **argv;
|
||||||
char **argv;
|
int argc;
|
||||||
|
|
||||||
// ==== shared through RefAPI's ref_host_t
|
uint framecount; // global framecount
|
||||||
double realtime; // host.curtime
|
uint errorframe; // to prevent multiple host error
|
||||||
double frametime; // time between engine frames
|
uint32_t bugcomp; // bug compatibility level, for very "special" games
|
||||||
uint features; // custom features that enables by mod-maker request
|
double realframetime; // for some system events, e.g. console animations
|
||||||
// ==== shared through RefAPI's ref_host_t
|
double starttime; // measure time to first frame
|
||||||
|
double pureframetime; // count of sleeps can be inserted between frames
|
||||||
|
double force_draw_version_time;
|
||||||
|
|
||||||
double realframetime; // for some system events, e.g. console animations
|
char draw_decals[MAX_DECALS][MAX_QPATH]; // list of unique decal indexes
|
||||||
|
vec3_t player_mins[MAX_MAP_HULLS]; // 4 hulls allowed
|
||||||
|
vec3_t player_maxs[MAX_MAP_HULLS]; // 4 hulls allowed
|
||||||
|
|
||||||
uint framecount; // global framecount
|
// for CL_{Push,Pop}TraceBounds
|
||||||
|
vec3_t player_mins_backup[MAX_MAP_HULLS];
|
||||||
|
vec3_t player_maxs_backup[MAX_MAP_HULLS];
|
||||||
|
qboolean trace_bounds_pushed;
|
||||||
|
|
||||||
// list of unique decal indexes
|
qboolean allow_console; // allow console in dev-mode or multiplayer game
|
||||||
char draw_decals[MAX_DECALS][MAX_QPATH];
|
qboolean allow_console_init; // initial value to allow the console
|
||||||
|
qboolean key_overstrike; // key overstrike mode
|
||||||
vec3_t player_mins[MAX_MAP_HULLS]; // 4 hulls allowed
|
qboolean stuffcmds_pending; // should execute stuff commands
|
||||||
vec3_t player_maxs[MAX_MAP_HULLS]; // 4 hulls allowed
|
qboolean allow_cheats; // this host will allow cheating
|
||||||
|
qboolean change_game; // initialize when game is changed
|
||||||
void* hWnd; // main window
|
qboolean mouse_visible; // vgui override cursor control (never change outside Platform_SetCursorType!)
|
||||||
qboolean allow_console; // allow console in dev-mode or multiplayer game
|
qboolean shutdown_issued; // engine is shutting down
|
||||||
qboolean allow_console_init; // initial value to allow the console
|
qboolean apply_game_config; // when true apply only to game cvars and ignore all other commands
|
||||||
qboolean key_overstrike; // key overstrike mode
|
qboolean apply_opengl_config; // when true apply only to opengl cvars and ignore all other commands
|
||||||
qboolean stuffcmds_pending; // should execute stuff commands
|
qboolean config_executed; // a bit who indicated was config.cfg already executed e.g. from valve.rc
|
||||||
qboolean allow_cheats; // this host will allow cheating
|
qboolean crashed; // set to true if crashed
|
||||||
qboolean con_showalways; // show console always (developer and dedicated)
|
#if XASH_DLL_LOADER
|
||||||
qboolean change_game; // initialize when game is changed
|
qboolean enabledll;
|
||||||
qboolean mouse_visible; // vgui override cursor control (never change outside Platform_SetCursorType!)
|
#endif
|
||||||
qboolean shutdown_issued; // engine is shutting down
|
qboolean textmode;
|
||||||
double force_draw_version_time;
|
|
||||||
qboolean apply_game_config; // when true apply only to game cvars and ignore all other commands
|
|
||||||
qboolean apply_opengl_config;// when true apply only to opengl cvars and ignore all other commands
|
|
||||||
qboolean config_executed; // a bit who indicated was config.cfg already executed e.g. from valve.rc
|
|
||||||
qboolean crashed; // set to true if crashed
|
|
||||||
qboolean daemonized;
|
|
||||||
qboolean enabledll;
|
|
||||||
qboolean textmode;
|
|
||||||
|
|
||||||
// some settings were changed and needs to global update
|
// some settings were changed and needs to global update
|
||||||
qboolean userinfo_changed;
|
qboolean userinfo_changed;
|
||||||
qboolean movevars_changed;
|
qboolean movevars_changed;
|
||||||
qboolean renderinfo_changed;
|
qboolean renderinfo_changed;
|
||||||
|
|
||||||
char rootdir[MAX_OSPATH]; // member root directory
|
|
||||||
char rodir[MAX_OSPATH]; // readonly root
|
|
||||||
char gamefolder[MAX_QPATH]; // it's a default gamefolder
|
|
||||||
poolhandle_t imagepool; // imagelib mempool
|
|
||||||
poolhandle_t soundpool; // soundlib mempool
|
|
||||||
|
|
||||||
// for IN_MouseMove() easy access
|
// for IN_MouseMove() easy access
|
||||||
int window_center_x;
|
int window_center_x;
|
||||||
int window_center_y;
|
int window_center_y;
|
||||||
|
string gamedll;
|
||||||
struct decallist_s *decalList; // used for keep decals, when renderer is restarted or changed
|
string clientlib;
|
||||||
int numdecals;
|
|
||||||
|
|
||||||
// bug compatibility level, for very "special" games
|
|
||||||
uint32_t bugcomp;
|
|
||||||
|
|
||||||
// measure time to first frame
|
|
||||||
double starttime;
|
|
||||||
|
|
||||||
// count of sleeps can be inserted between frames
|
|
||||||
double pureframetime;
|
|
||||||
} host_parm_t;
|
} host_parm_t;
|
||||||
|
|
||||||
extern host_parm_t host;
|
extern host_parm_t host;
|
||||||
extern sysinfo_t SI;
|
|
||||||
|
|
||||||
#define CMD_SERVERDLL BIT( 0 ) // added by server.dll
|
#define CMD_SERVERDLL BIT( 0 ) // added by server.dll
|
||||||
#define CMD_CLIENTDLL BIT( 1 ) // added by client.dll
|
#define CMD_CLIENTDLL BIT( 1 ) // added by client.dll
|
||||||
@@ -373,13 +366,49 @@ extern sysinfo_t SI;
|
|||||||
|
|
||||||
typedef void (*xcommand_t)( void );
|
typedef void (*xcommand_t)( void );
|
||||||
|
|
||||||
|
//
|
||||||
|
// zone.c
|
||||||
|
//
|
||||||
|
void Memory_Init( void );
|
||||||
|
void _Mem_Free( void *data, const char *filename, int fileline );
|
||||||
|
void *_Mem_Realloc( poolhandle_t poolptr, void *memptr, size_t size, qboolean clear, const char *filename, int fileline )
|
||||||
|
ALLOC_CHECK( 3 ) WARN_UNUSED_RESULT;
|
||||||
|
void *_Mem_Alloc( poolhandle_t poolptr, size_t size, qboolean clear, const char *filename, int fileline )
|
||||||
|
ALLOC_CHECK( 2 ) MALLOC_LIKE( _Mem_Free, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
poolhandle_t _Mem_AllocPool( const char *name, const char *filename, int fileline )
|
||||||
|
WARN_UNUSED_RESULT;
|
||||||
|
void _Mem_FreePool( poolhandle_t *poolptr, const char *filename, int fileline );
|
||||||
|
void _Mem_EmptyPool( poolhandle_t poolptr, const char *filename, int fileline );
|
||||||
|
void _Mem_Check( const char *filename, int fileline );
|
||||||
|
qboolean Mem_IsAllocatedExt( poolhandle_t poolptr, void *data );
|
||||||
|
void Mem_PrintList( size_t minallocationsize );
|
||||||
|
void Mem_PrintStats( void );
|
||||||
|
|
||||||
|
#define Mem_Malloc( pool, size ) _Mem_Alloc( pool, size, false, __FILE__, __LINE__ )
|
||||||
|
#define Mem_Calloc( pool, size ) _Mem_Alloc( pool, size, true, __FILE__, __LINE__ )
|
||||||
|
#define Mem_Realloc( pool, ptr, size ) _Mem_Realloc( pool, ptr, size, true, __FILE__, __LINE__ )
|
||||||
|
#define Mem_Free( mem ) _Mem_Free( mem, __FILE__, __LINE__ )
|
||||||
|
#define Mem_AllocPool( name ) _Mem_AllocPool( name, __FILE__, __LINE__ )
|
||||||
|
#define Mem_FreePool( pool ) _Mem_FreePool( pool, __FILE__, __LINE__ )
|
||||||
|
#define Mem_EmptyPool( pool ) _Mem_EmptyPool( pool, __FILE__, __LINE__ )
|
||||||
|
#define Mem_IsAllocated( mem ) Mem_IsAllocatedExt( NULL, mem )
|
||||||
|
#define Mem_Check() _Mem_Check( __FILE__, __LINE__ )
|
||||||
|
|
||||||
//
|
//
|
||||||
// filesystem_engine.c
|
// filesystem_engine.c
|
||||||
//
|
//
|
||||||
qboolean FS_LoadProgs( void );
|
void FS_Init( const char *basedir );
|
||||||
void FS_Init( void );
|
|
||||||
void FS_Shutdown( void );
|
void FS_Shutdown( void );
|
||||||
void *FS_GetNativeObject( const char *obj );
|
void *FS_GetNativeObject( const char *obj );
|
||||||
|
int FS_Close( file_t *file );
|
||||||
|
search_t *FS_Search( const char *pattern, int caseinsensitive, int gamedironly )
|
||||||
|
MALLOC_LIKE( _Mem_Free, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
file_t *FS_Open( const char *filepath, const char *mode, qboolean gamedironly )
|
||||||
|
MALLOC_LIKE( FS_Close, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
byte *FS_LoadFile( const char *path, fs_offset_t *filesizeptr, qboolean gamedironly )
|
||||||
|
MALLOC_LIKE( _Mem_Free, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
byte *FS_LoadDirectFile( const char *path, fs_offset_t *filesizeptr )
|
||||||
|
MALLOC_LIKE( _Mem_Free, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
//
|
//
|
||||||
// cmd.c
|
// cmd.c
|
||||||
@@ -412,30 +441,6 @@ void Cmd_ExecuteString( const char *text );
|
|||||||
void Cmd_ForwardToServer( void );
|
void Cmd_ForwardToServer( void );
|
||||||
void Cmd_Escape( char *newCommand, const char *oldCommand, int len );
|
void Cmd_Escape( char *newCommand, const char *oldCommand, int len );
|
||||||
|
|
||||||
//
|
|
||||||
// zone.c
|
|
||||||
//
|
|
||||||
void Memory_Init( void );
|
|
||||||
void *_Mem_Realloc( poolhandle_t poolptr, void *memptr, size_t size, qboolean clear, const char *filename, int fileline ) ALLOC_CHECK( 3 );
|
|
||||||
void *_Mem_Alloc( poolhandle_t poolptr, size_t size, qboolean clear, const char *filename, int fileline ) ALLOC_CHECK( 2 );
|
|
||||||
poolhandle_t _Mem_AllocPool( const char *name, const char *filename, int fileline );
|
|
||||||
void _Mem_FreePool( poolhandle_t *poolptr, const char *filename, int fileline );
|
|
||||||
void _Mem_EmptyPool( poolhandle_t poolptr, const char *filename, int fileline );
|
|
||||||
void _Mem_Free( void *data, const char *filename, int fileline );
|
|
||||||
void _Mem_Check( const char *filename, int fileline );
|
|
||||||
qboolean Mem_IsAllocatedExt( poolhandle_t poolptr, void *data );
|
|
||||||
void Mem_PrintList( size_t minallocationsize );
|
|
||||||
void Mem_PrintStats( void );
|
|
||||||
|
|
||||||
#define Mem_Malloc( pool, size ) _Mem_Alloc( pool, size, false, __FILE__, __LINE__ )
|
|
||||||
#define Mem_Calloc( pool, size ) _Mem_Alloc( pool, size, true, __FILE__, __LINE__ )
|
|
||||||
#define Mem_Realloc( pool, ptr, size ) _Mem_Realloc( pool, ptr, size, true, __FILE__, __LINE__ )
|
|
||||||
#define Mem_Free( mem ) _Mem_Free( mem, __FILE__, __LINE__ )
|
|
||||||
#define Mem_AllocPool( name ) _Mem_AllocPool( name, __FILE__, __LINE__ )
|
|
||||||
#define Mem_FreePool( pool ) _Mem_FreePool( pool, __FILE__, __LINE__ )
|
|
||||||
#define Mem_EmptyPool( pool ) _Mem_EmptyPool( pool, __FILE__, __LINE__ )
|
|
||||||
#define Mem_IsAllocated( mem ) Mem_IsAllocatedExt( NULL, mem )
|
|
||||||
#define Mem_Check() _Mem_Check( __FILE__, __LINE__ )
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// imagelib
|
// imagelib
|
||||||
@@ -446,10 +451,10 @@ void Image_Setup( void );
|
|||||||
void Image_Init( void );
|
void Image_Init( void );
|
||||||
void Image_Shutdown( void );
|
void Image_Shutdown( void );
|
||||||
void Image_AddCmdFlags( uint flags );
|
void Image_AddCmdFlags( uint flags );
|
||||||
rgbdata_t *FS_LoadImage( const char *filename, const byte *buffer, size_t size );
|
|
||||||
qboolean FS_SaveImage( const char *filename, rgbdata_t *pix );
|
|
||||||
rgbdata_t *FS_CopyImage( rgbdata_t *in );
|
|
||||||
void FS_FreeImage( rgbdata_t *pack );
|
void FS_FreeImage( rgbdata_t *pack );
|
||||||
|
rgbdata_t *FS_LoadImage( const char *filename, const byte *buffer, size_t size ) MALLOC_LIKE( FS_FreeImage, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
qboolean FS_SaveImage( const char *filename, rgbdata_t *pix );
|
||||||
|
rgbdata_t *FS_CopyImage( rgbdata_t *in ) MALLOC_LIKE( FS_FreeImage, 1 ) WARN_UNUSED_RESULT;
|
||||||
extern const bpc_desc_t PFDesc[]; // image get pixelformat
|
extern const bpc_desc_t PFDesc[]; // image get pixelformat
|
||||||
qboolean Image_Process( rgbdata_t **pix, int width, int height, uint flags, float reserved );
|
qboolean Image_Process( rgbdata_t **pix, int width, int height, uint flags, float reserved );
|
||||||
void Image_PaletteHueReplace( byte *palSrc, int newHue, int start, int end, int pal_size );
|
void Image_PaletteHueReplace( byte *palSrc, int newHue, int start, int end, int pal_size );
|
||||||
@@ -475,14 +480,6 @@ typedef enum
|
|||||||
WF_TOTALCOUNT, // must be last
|
WF_TOTALCOUNT, // must be last
|
||||||
} sndformat_t;
|
} sndformat_t;
|
||||||
|
|
||||||
// soundlib global settings
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
SL_USE_LERPING = BIT(0), // lerping sounds during resample
|
|
||||||
SL_KEEP_8BIT = BIT(1), // don't expand 8bit sounds automatically up to 16 bit
|
|
||||||
SL_ALLOW_OVERWRITE = BIT(2), // allow to overwrite stored sounds
|
|
||||||
} slFlags_t;
|
|
||||||
|
|
||||||
// wavdata output flags
|
// wavdata output flags
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -491,21 +488,20 @@ typedef enum
|
|||||||
SOUND_STREAM = BIT( 1 ), // this is a streaminfo, not a real sound
|
SOUND_STREAM = BIT( 1 ), // this is a streaminfo, not a real sound
|
||||||
|
|
||||||
// Sound_Process manipulation flags
|
// Sound_Process manipulation flags
|
||||||
SOUND_RESAMPLE = BIT(12), // resample sound to specified rate
|
SOUND_RESAMPLE = BIT( 12 ), // resample sound to specified rate
|
||||||
SOUND_CONVERT16BIT = BIT(13), // change sound resolution from 8 bit to 16
|
|
||||||
} sndFlags_t;
|
} sndFlags_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
word rate; // num samples per second (e.g. 11025 - 11 khz)
|
word rate; // num samples per second (e.g. 11025 - 11 khz)
|
||||||
byte width; // resolution - bum bits divided by 8 (8 bit is 1, 16 bit is 2)
|
byte width; // resolution - bum bits divided by 8 (8 bit is 1, 16 bit is 2)
|
||||||
byte channels; // num channels (1 - mono, 2 - stereo)
|
byte channels; // num channels (1 - mono, 2 - stereo)
|
||||||
int loopStart; // offset at this point sound will be looping while playing more than only once
|
uint loopStart; // offset at this point sound will be looping while playing more than only once
|
||||||
int samples; // total samplecount in wav
|
uint samples; // total samplecount in wav
|
||||||
uint type; // compression type
|
uint type; // compression type
|
||||||
uint flags; // misc sound flags
|
uint flags; // misc sound flags
|
||||||
byte *buffer; // sound buffer
|
byte *buffer; // sound buffer
|
||||||
size_t size; // for bounds checking
|
size_t size; // for bounds checking
|
||||||
} wavdata_t;
|
} wavdata_t;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -513,15 +509,15 @@ typedef struct
|
|||||||
//
|
//
|
||||||
void Sound_Init( void );
|
void Sound_Init( void );
|
||||||
void Sound_Shutdown( void );
|
void Sound_Shutdown( void );
|
||||||
wavdata_t *FS_LoadSound( const char *filename, const byte *buffer, size_t size );
|
|
||||||
void FS_FreeSound( wavdata_t *pack );
|
void FS_FreeSound( wavdata_t *pack );
|
||||||
stream_t *FS_OpenStream( const char *filename );
|
void FS_FreeStream( stream_t *stream );
|
||||||
|
wavdata_t *FS_LoadSound( const char *filename, const byte *buffer, size_t size ) MALLOC_LIKE( FS_FreeSound, 1 ) WARN_UNUSED_RESULT;
|
||||||
|
stream_t *FS_OpenStream( const char *filename ) MALLOC_LIKE( FS_FreeStream, 1 ) WARN_UNUSED_RESULT;
|
||||||
wavdata_t *FS_StreamInfo( stream_t *stream );
|
wavdata_t *FS_StreamInfo( stream_t *stream );
|
||||||
int FS_ReadStream( stream_t *stream, int bytes, void *buffer );
|
int FS_ReadStream( stream_t *stream, int bytes, void *buffer );
|
||||||
int FS_SetStreamPos( stream_t *stream, int newpos );
|
int FS_SetStreamPos( stream_t *stream, int newpos );
|
||||||
int FS_GetStreamPos( stream_t *stream );
|
int FS_GetStreamPos( stream_t *stream );
|
||||||
void FS_FreeStream( stream_t *stream );
|
qboolean Sound_Process( wavdata_t **wav, int rate, int width, int channels, uint flags );
|
||||||
qboolean Sound_Process( wavdata_t **wav, int rate, int width, uint flags );
|
|
||||||
uint Sound_GetApproxWavePlayLen( const char *filepath );
|
uint Sound_GetApproxWavePlayLen( const char *filepath );
|
||||||
qboolean Sound_SupportedFileFormat( const char *fileext );
|
qboolean Sound_SupportedFileFormat( const char *fileext );
|
||||||
|
|
||||||
@@ -533,19 +529,16 @@ typedef void( *pfnChangeGame )( const char *progname );
|
|||||||
qboolean Host_IsQuakeCompatible( void );
|
qboolean Host_IsQuakeCompatible( void );
|
||||||
void EXPORT Host_Shutdown( void );
|
void EXPORT Host_Shutdown( void );
|
||||||
int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGame, pfnChangeGame func );
|
int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGame, pfnChangeGame func );
|
||||||
int Host_CompareFileTime( int ft1, int ft2 );
|
|
||||||
void Host_EndGame( qboolean abort, const char *message, ... ) _format( 2 );
|
void Host_EndGame( qboolean abort, const char *message, ... ) _format( 2 );
|
||||||
void Host_AbortCurrentFrame( void ) NORETURN;
|
void Host_AbortCurrentFrame( void ) NORETURN;
|
||||||
void Host_WriteServerConfig( const char *name );
|
void Host_WriteServerConfig( const char *name );
|
||||||
void Host_WriteOpenGLConfig( void );
|
void Host_WriteOpenGLConfig( void );
|
||||||
void Host_WriteVideoConfig( void );
|
void Host_WriteVideoConfig( void );
|
||||||
void Host_WriteConfig( void );
|
void Host_WriteConfig( void );
|
||||||
qboolean Host_IsLocalGame( void );
|
|
||||||
qboolean Host_IsLocalClient( void );
|
|
||||||
void Host_ShutdownServer( void );
|
void Host_ShutdownServer( void );
|
||||||
void Host_Error( const char *error, ... ) _format( 1 );
|
void Host_Error( const char *error, ... ) _format( 1 );
|
||||||
void Host_ValidateEngineFeatures( uint32_t features );
|
void Host_ValidateEngineFeatures( uint32_t mask, uint32_t features );
|
||||||
void Host_Frame( float time );
|
void Host_Frame( double time );
|
||||||
void Host_Credits( void );
|
void Host_Credits( void );
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -556,7 +549,7 @@ void COM_NewGame( char const *pMapName );
|
|||||||
void COM_LoadLevel( char const *pMapName, qboolean background );
|
void COM_LoadLevel( char const *pMapName, qboolean background );
|
||||||
void COM_LoadGame( char const *pSaveFileName );
|
void COM_LoadGame( char const *pSaveFileName );
|
||||||
void COM_ChangeLevel( char const *pNewLevel, char const *pLandmarkName, qboolean background );
|
void COM_ChangeLevel( char const *pNewLevel, char const *pLandmarkName, qboolean background );
|
||||||
void COM_Frame( float time );
|
void COM_Frame( double time );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================
|
==============================================================
|
||||||
@@ -587,7 +580,7 @@ qboolean SV_Active( void );
|
|||||||
char *COM_MemFgets( byte *pMemFile, int fileSize, int *filePos, char *pBuffer, int bufferSize );
|
char *COM_MemFgets( byte *pMemFile, int fileSize, int *filePos, char *pBuffer, int bufferSize );
|
||||||
void COM_HexConvert( const char *pszInput, int nInputLength, byte *pOutput );
|
void COM_HexConvert( const char *pszInput, int nInputLength, byte *pOutput );
|
||||||
int COM_SaveFile( const char *filename, const void *data, int len );
|
int COM_SaveFile( const char *filename, const void *data, int len );
|
||||||
byte* COM_LoadFileForMe( const char *filename, int *pLength );
|
byte *COM_LoadFileForMe( const char *filename, int *pLength ) MALLOC_LIKE( free, 1 );
|
||||||
qboolean COM_IsSafeFileToDownload( const char *filename );
|
qboolean COM_IsSafeFileToDownload( const char *filename );
|
||||||
cvar_t *pfnCVarGetPointer( const char *szVarName );
|
cvar_t *pfnCVarGetPointer( const char *szVarName );
|
||||||
int pfnDrawConsoleString( int x, int y, char *string );
|
int pfnDrawConsoleString( int x, int y, char *string );
|
||||||
@@ -677,21 +670,28 @@ void HPAK_FlushHostQueue( void );
|
|||||||
#define INPUT_DEVICE_JOYSTICK (1<<2)
|
#define INPUT_DEVICE_JOYSTICK (1<<2)
|
||||||
#define INPUT_DEVICE_VR (1<<3)
|
#define INPUT_DEVICE_VR (1<<3)
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum connprotocol_e
|
||||||
|
{
|
||||||
|
PROTO_CURRENT = 0, // Xash3D 49
|
||||||
|
PROTO_LEGACY, // Xash3D 48
|
||||||
|
PROTO_QUAKE, // Quake 15
|
||||||
|
PROTO_GOLDSRC, // GoldSrc 48
|
||||||
|
} connprotocol_t;
|
||||||
|
|
||||||
// shared calls
|
// shared calls
|
||||||
struct physent_s;
|
struct physent_s;
|
||||||
struct sv_client_s;
|
struct sv_client_s;
|
||||||
typedef struct sizebuf_s sizebuf_t;
|
typedef struct sizebuf_s sizebuf_t;
|
||||||
qboolean CL_IsInGame( void );
|
qboolean CL_IsInGame( void );
|
||||||
qboolean CL_IsInMenu( void );
|
|
||||||
qboolean CL_IsInConsole( void );
|
qboolean CL_IsInConsole( void );
|
||||||
qboolean CL_IsThirdPerson( void );
|
qboolean CL_IsThirdPerson( void );
|
||||||
qboolean CL_IsIntermission( void );
|
qboolean CL_IsIntermission( void );
|
||||||
qboolean CL_Initialized( void );
|
qboolean CL_Initialized( void );
|
||||||
char *CL_Userinfo( void );
|
char *CL_Userinfo( void );
|
||||||
void CL_LegacyUpdateInfo( void );
|
|
||||||
void CL_CharEvent( int key );
|
void CL_CharEvent( int key );
|
||||||
qboolean CL_DisableVisibility( void );
|
qboolean CL_DisableVisibility( void );
|
||||||
byte *COM_LoadFile( const char *filename, int usehunk, int *pLength );
|
byte *COM_LoadFile( const char *filename, int usehunk, int *pLength ) MALLOC_LIKE( free, 1 );
|
||||||
struct cmd_s *Cmd_GetFirstFunctionHandle( void );
|
struct cmd_s *Cmd_GetFirstFunctionHandle( void );
|
||||||
struct cmd_s *Cmd_GetNextFunctionHandle( struct cmd_s *cmd );
|
struct cmd_s *Cmd_GetNextFunctionHandle( struct cmd_s *cmd );
|
||||||
struct cmdalias_s *Cmd_AliasGetList( void );
|
struct cmdalias_s *Cmd_AliasGetList( void );
|
||||||
@@ -700,8 +700,9 @@ void Log_Printf( const char *fmt, ... ) _format( 1 );
|
|||||||
void SV_BroadcastCommand( const char *fmt, ... ) _format( 1 );
|
void SV_BroadcastCommand( const char *fmt, ... ) _format( 1 );
|
||||||
void SV_BroadcastPrintf( struct sv_client_s *ignore, const char *fmt, ... ) _format( 2 );
|
void SV_BroadcastPrintf( struct sv_client_s *ignore, const char *fmt, ... ) _format( 2 );
|
||||||
void CL_ClearStaticEntities( void );
|
void CL_ClearStaticEntities( void );
|
||||||
qboolean S_StreamGetCurrentState( char *currentTrack, char *loopTrack, int *position );
|
qboolean S_StreamGetCurrentState( char *currentTrack, size_t currentTrackSize, char *loopTrack, size_t loopTrackSize, int *position );
|
||||||
void CL_ServerCommand( qboolean reliable, const char *fmt, ... ) _format( 2 );
|
void CL_ServerCommand( qboolean reliable, const char *fmt, ... ) _format( 2 );
|
||||||
|
void CL_UpdateInfo( const char *key, const char *value );
|
||||||
void CL_HudMessage( const char *pMessage );
|
void CL_HudMessage( const char *pMessage );
|
||||||
const char *CL_MsgInfo( int cmd );
|
const char *CL_MsgInfo( int cmd );
|
||||||
void SV_DrawDebugTriangles( void );
|
void SV_DrawDebugTriangles( void );
|
||||||
@@ -768,13 +769,46 @@ void UI_ShowConnectionWarning( void );
|
|||||||
void Cmd_Null_f( void );
|
void Cmd_Null_f( void );
|
||||||
void Rcon_Print( host_redirect_t *rd, const char *pMsg );
|
void Rcon_Print( host_redirect_t *rd, const char *pMsg );
|
||||||
qboolean COM_ParseVector( char **pfile, float *v, size_t size );
|
qboolean COM_ParseVector( char **pfile, float *v, size_t size );
|
||||||
void COM_NormalizeAngles( vec3_t angles );
|
|
||||||
int COM_FileSize( const char *filename );
|
int COM_FileSize( const char *filename );
|
||||||
void COM_FreeFile( void *buffer );
|
void COM_FreeFile( void *buffer );
|
||||||
int COM_CompareFileTime( const char *filename1, const char *filename2, int *iCompare );
|
int COM_CompareFileTime( const char *filename1, const char *filename2, int *iCompare );
|
||||||
char *va( const char *format, ... ) _format( 1 );
|
char *va( const char *format, ... ) _format( 1 );
|
||||||
qboolean CRC32_MapFile( dword *crcvalue, const char *filename, qboolean multiplayer );
|
qboolean CRC32_MapFile( dword *crcvalue, const char *filename, qboolean multiplayer );
|
||||||
|
|
||||||
|
static inline void COM_NormalizeAngles( vec3_t angles )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < 3; i++ )
|
||||||
|
{
|
||||||
|
if( angles[i] > 180.0f )
|
||||||
|
angles[i] -= 360.0f;
|
||||||
|
else if( angles[i] < -180.0f )
|
||||||
|
angles[i] += 360.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !XASH_DEDICATED
|
||||||
|
connprotocol_t CL_Protocol( void );
|
||||||
|
#else
|
||||||
|
static inline connprotocol_t CL_Protocol( void )
|
||||||
|
{
|
||||||
|
return PROTO_CURRENT;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline qboolean Host_IsLocalGame( void )
|
||||||
|
{
|
||||||
|
if( SV_Active( ))
|
||||||
|
return SV_GetMaxClients() == 1 ? true : false;
|
||||||
|
return CL_GetMaxClients() == 1 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline qboolean Host_IsLocalClient( void )
|
||||||
|
{
|
||||||
|
return CL_Initialized( ) && SV_Initialized( ) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
// soundlib shared exports
|
// soundlib shared exports
|
||||||
qboolean S_Init( void );
|
qboolean S_Init( void );
|
||||||
void S_Shutdown( void );
|
void S_Shutdown( void );
|
||||||
@@ -812,6 +846,16 @@ void NET_MasterClear( void );
|
|||||||
void NET_MasterShutdown( void );
|
void NET_MasterShutdown( void );
|
||||||
qboolean NET_GetMaster( netadr_t from, uint *challenge, double *last_heartbeat );
|
qboolean NET_GetMaster( netadr_t from, uint *challenge, double *last_heartbeat );
|
||||||
|
|
||||||
|
//
|
||||||
|
// munge.c
|
||||||
|
//
|
||||||
|
void COM_Munge( byte *data, size_t len, int seq );
|
||||||
|
void COM_UnMunge( byte *data, size_t len, int seq );
|
||||||
|
void COM_Munge2( byte *data, size_t len, int seq );
|
||||||
|
void COM_UnMunge2( byte *data, size_t len, int seq );
|
||||||
|
void COM_Munge3( byte *data, size_t len, int seq );
|
||||||
|
void COM_UnMunge3( byte *data, size_t len, int seq );
|
||||||
|
|
||||||
//
|
//
|
||||||
// sounds.c
|
// sounds.c
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ GNU General Public License for more details.
|
|||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "kbutton.h"
|
#include "kbutton.h"
|
||||||
|
|
||||||
extern convar_t con_gamemaps;
|
|
||||||
|
|
||||||
#define CON_MAXCMDS 4096 // auto-complete intermediate list
|
#define CON_MAXCMDS 4096 // auto-complete intermediate list
|
||||||
|
|
||||||
typedef struct autocomplete_list_s
|
typedef struct autocomplete_list_s
|
||||||
@@ -465,7 +463,7 @@ static qboolean Cmd_GetSoundList( const char *s, char *completedname, int length
|
|||||||
t = FS_Search( va( "%s%s*.*", DEFAULT_SOUNDPATH, s ), true, false );
|
t = FS_Search( va( "%s%s*.*", DEFAULT_SOUNDPATH, s ), true, false );
|
||||||
if( !t ) return false;
|
if( !t ) return false;
|
||||||
|
|
||||||
Q_strncpy( matchbuf, t->filenames[0] + sizeof( DEFAULT_SOUNDPATH ) - 1, MAX_STRING );
|
Q_strncpy( matchbuf, t->filenames[0] + sizeof( DEFAULT_SOUNDPATH ) - 1, sizeof( matchbuf ));
|
||||||
COM_StripExtension( matchbuf );
|
COM_StripExtension( matchbuf );
|
||||||
if( completedname && length )
|
if( completedname && length )
|
||||||
Q_strncpy( completedname, matchbuf, length );
|
Q_strncpy( completedname, matchbuf, length );
|
||||||
@@ -478,7 +476,7 @@ static qboolean Cmd_GetSoundList( const char *s, char *completedname, int length
|
|||||||
if( Q_stricmp( ext, "wav" ) && Q_stricmp( ext, "mp3" ))
|
if( Q_stricmp( ext, "wav" ) && Q_stricmp( ext, "mp3" ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Q_strncpy( matchbuf, t->filenames[i] + sizeof( DEFAULT_SOUNDPATH ) - 1, MAX_STRING );
|
Q_strncpy( matchbuf, t->filenames[i] + sizeof( DEFAULT_SOUNDPATH ) - 1, sizeof( matchbuf ));
|
||||||
COM_StripExtension( matchbuf );
|
COM_StripExtension( matchbuf );
|
||||||
Con_Printf( "%16s\n", matchbuf );
|
Con_Printf( "%16s\n", matchbuf );
|
||||||
numsounds++;
|
numsounds++;
|
||||||
@@ -585,7 +583,7 @@ static qboolean Cmd_GetKeysList( const char *s, char *completedname, int length
|
|||||||
Con_Printf( "%16s\n", matchbuf );
|
Con_Printf( "%16s\n", matchbuf );
|
||||||
}
|
}
|
||||||
|
|
||||||
Con_Printf( "\n^3 %lu keys found.\n", numkeys );
|
Con_Printf( "\n^3 %zu keys found.\n", numkeys );
|
||||||
|
|
||||||
if( completedname && length )
|
if( completedname && length )
|
||||||
{
|
{
|
||||||
@@ -764,14 +762,14 @@ static qboolean Cmd_GetGamesList( const char *s, char *completedname, int length
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( !numgamedirs ) return false;
|
if( !numgamedirs ) return false;
|
||||||
Q_strncpy( matchbuf, gamedirs[0], MAX_STRING );
|
Q_strncpy( matchbuf, gamedirs[0], sizeof( matchbuf ));
|
||||||
if( completedname && length )
|
if( completedname && length )
|
||||||
Q_strncpy( completedname, matchbuf, length );
|
Q_strncpy( completedname, matchbuf, length );
|
||||||
if( numgamedirs == 1 ) return true;
|
if( numgamedirs == 1 ) return true;
|
||||||
|
|
||||||
for( i = 0; i < numgamedirs; i++ )
|
for( i = 0; i < numgamedirs; i++ )
|
||||||
{
|
{
|
||||||
Q_strncpy( matchbuf, gamedirs[i], MAX_STRING );
|
Q_strncpy( matchbuf, gamedirs[i], sizeof( matchbuf ));
|
||||||
Con_Printf( "%16s\n", matchbuf );
|
Con_Printf( "%16s\n", matchbuf );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -825,14 +823,14 @@ static qboolean Cmd_GetCDList( const char *s, char *completedname, int length )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( !numcdcommands ) return false;
|
if( !numcdcommands ) return false;
|
||||||
Q_strncpy( matchbuf, cdcommands[0], MAX_STRING );
|
Q_strncpy( matchbuf, cdcommands[0], sizeof( matchbuf ));
|
||||||
if( completedname && length )
|
if( completedname && length )
|
||||||
Q_strncpy( completedname, matchbuf, length );
|
Q_strncpy( completedname, matchbuf, length );
|
||||||
if( numcdcommands == 1 ) return true;
|
if( numcdcommands == 1 ) return true;
|
||||||
|
|
||||||
for( i = 0; i < numcdcommands; i++ )
|
for( i = 0; i < numcdcommands; i++ )
|
||||||
{
|
{
|
||||||
Q_strncpy( matchbuf, cdcommands[i], MAX_STRING );
|
Q_strncpy( matchbuf, cdcommands[i], sizeof( matchbuf ));
|
||||||
Con_Printf( "%16s\n", matchbuf );
|
Con_Printf( "%16s\n", matchbuf );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -901,12 +899,10 @@ static qboolean Cmd_CheckMapsList_R( qboolean fRefresh, qboolean onlyingamedir )
|
|||||||
if( f )
|
if( f )
|
||||||
{
|
{
|
||||||
qboolean have_spawnpoints = false;
|
qboolean have_spawnpoints = false;
|
||||||
dheader_t *header;
|
|
||||||
dlump_t entities;
|
dlump_t entities;
|
||||||
|
|
||||||
memset( buf, 0, MAX_SYSPATH );
|
memset( buf, 0, MAX_SYSPATH );
|
||||||
FS_Read( f, buf, MAX_SYSPATH );
|
FS_Read( f, buf, MAX_SYSPATH );
|
||||||
header = (dheader_t *)buf;
|
|
||||||
|
|
||||||
// check all the lumps and some other errors
|
// check all the lumps and some other errors
|
||||||
if( !Mod_TestBmodelLumps( f, t->filenames[i], buf, true, &entities ))
|
if( !Mod_TestBmodelLumps( f, t->filenames[i], buf, true, &entities ))
|
||||||
@@ -937,7 +933,7 @@ static qboolean Cmd_CheckMapsList_R( qboolean fRefresh, qboolean onlyingamedir )
|
|||||||
char token[MAX_TOKEN];
|
char token[MAX_TOKEN];
|
||||||
qboolean worldspawn = true;
|
qboolean worldspawn = true;
|
||||||
|
|
||||||
Q_strncpy( message, "No Title", MAX_STRING );
|
Q_strncpy( message, "No Title", sizeof( message ));
|
||||||
pfile = ents;
|
pfile = ents;
|
||||||
|
|
||||||
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
|
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
|
||||||
@@ -1014,13 +1010,14 @@ int GAME_EXPORT Cmd_CheckMapsList( int fRefresh )
|
|||||||
return Cmd_CheckMapsList_R( fRefresh, true );
|
return Cmd_CheckMapsList_R( fRefresh, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete_list_t cmd_list[] =
|
static const autocomplete_list_t cmd_list[] =
|
||||||
{
|
{
|
||||||
{ "map_background", 1, Cmd_GetMapList },
|
{ "map_background", 1, Cmd_GetMapList },
|
||||||
{ "changelevel2", 1, Cmd_GetMapList },
|
{ "changelevel2", 1, Cmd_GetMapList },
|
||||||
{ "changelevel", 1, Cmd_GetMapList },
|
{ "changelevel", 1, Cmd_GetMapList },
|
||||||
{ "playdemo", 1, Cmd_GetDemoList, },
|
{ "playdemo", 1, Cmd_GetDemoList, },
|
||||||
{ "timedemo", 1, Cmd_GetDemoList, },
|
{ "timedemo", 1, Cmd_GetDemoList, },
|
||||||
|
{ "listdemo", 1, Cmd_GetDemoList, },
|
||||||
{ "playvol", 1, Cmd_GetSoundList },
|
{ "playvol", 1, Cmd_GetSoundList },
|
||||||
{ "hpkval", 1, Cmd_GetCustomList },
|
{ "hpkval", 1, Cmd_GetCustomList },
|
||||||
{ "hpklist", 1, Cmd_GetCustomList },
|
{ "hpklist", 1, Cmd_GetCustomList },
|
||||||
@@ -1076,7 +1073,7 @@ for various cmds
|
|||||||
*/
|
*/
|
||||||
static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize )
|
static qboolean Cmd_AutocompleteName( const char *source, int arg, char *buffer, size_t bufsize )
|
||||||
{
|
{
|
||||||
autocomplete_list_t *list;
|
const autocomplete_list_t *list;
|
||||||
|
|
||||||
for( list = cmd_list; list->name; list++ )
|
for( list = cmd_list; list->name; list++ )
|
||||||
{
|
{
|
||||||
@@ -1203,7 +1200,7 @@ void Con_CompleteCommand( field_t *field )
|
|||||||
|
|
||||||
if( !con.matchCount ) return; // no matches
|
if( !con.matchCount ) return; // no matches
|
||||||
|
|
||||||
memcpy( &temp, con.completionField, sizeof( field_t ) );
|
temp = *con.completionField;
|
||||||
|
|
||||||
// autocomplete second arg
|
// autocomplete second arg
|
||||||
if( (Cmd_Argc() >= 2) || ((Cmd_Argc() == 1) && nextcmd) )
|
if( (Cmd_Argc() >= 2) || ((Cmd_Argc() == 1) && nextcmd) )
|
||||||
@@ -1397,7 +1394,7 @@ void Host_WriteConfig( void )
|
|||||||
f = FS_Open( "config.cfg.new", "w", false );
|
f = FS_Open( "config.cfg.new", "w", false );
|
||||||
if( f )
|
if( f )
|
||||||
{
|
{
|
||||||
Con_Reportf( "Host_WriteConfig()\n" );
|
Con_Reportf( "%s()\n", __func__ );
|
||||||
FS_Printf( f, "//=======================================================================\n");
|
FS_Printf( f, "//=======================================================================\n");
|
||||||
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
||||||
FS_Printf( f, "//\t\t\tconfig.cfg - archive of cvars\n" );
|
FS_Printf( f, "//\t\t\tconfig.cfg - archive of cvars\n" );
|
||||||
@@ -1480,7 +1477,7 @@ void Host_WriteOpenGLConfig( void )
|
|||||||
f = FS_Open( va( "%s.new", name ), "w", false );
|
f = FS_Open( va( "%s.new", name ), "w", false );
|
||||||
if( f )
|
if( f )
|
||||||
{
|
{
|
||||||
Con_Reportf( "Host_WriteGLConfig()\n" );
|
Con_Reportf( "%s()\n", __func__ );
|
||||||
FS_Printf( f, "//=======================================================================\n" );
|
FS_Printf( f, "//=======================================================================\n" );
|
||||||
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
||||||
FS_Printf( f, "//\t\t %s - archive of renderer implementation cvars\n", name );
|
FS_Printf( f, "//\t\t %s - archive of renderer implementation cvars\n", name );
|
||||||
@@ -1510,7 +1507,7 @@ void Host_WriteVideoConfig( void )
|
|||||||
f = FS_Open( "video.cfg.new", "w", false );
|
f = FS_Open( "video.cfg.new", "w", false );
|
||||||
if( f )
|
if( f )
|
||||||
{
|
{
|
||||||
Con_Reportf( "Host_WriteVideoConfig()\n" );
|
Con_Reportf( "%s()\n", __func__ );
|
||||||
FS_Printf( f, "//=======================================================================\n" );
|
FS_Printf( f, "//=======================================================================\n" );
|
||||||
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
|
||||||
FS_Printf( f, "//\t\tvideo.cfg - archive of renderer variables\n");
|
FS_Printf( f, "//\t\tvideo.cfg - archive of renderer variables\n");
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ static int Sys_ModuleName( HANDLE process, char *name, void *address, int len )
|
|||||||
|
|
||||||
static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
|
static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
|
||||||
{
|
{
|
||||||
char message[1024];
|
char message[8192]; // match *nix Sys_Crash
|
||||||
int len = 0;
|
int len = 0;
|
||||||
size_t i;
|
size_t i;
|
||||||
HANDLE process = GetCurrentProcess();
|
HANDLE process = GetCurrentProcess();
|
||||||
@@ -92,7 +92,7 @@ static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
|
|||||||
STACKFRAME64 stackframe;
|
STACKFRAME64 stackframe;
|
||||||
DWORD image;
|
DWORD image;
|
||||||
|
|
||||||
memcpy( &context, pInfo->ContextRecord, sizeof( CONTEXT ));
|
context = *pInfo->ContextRecord;
|
||||||
|
|
||||||
options = SymGetOptions();
|
options = SymGetOptions();
|
||||||
options |= SYMOPT_DEBUG;
|
options |= SYMOPT_DEBUG;
|
||||||
@@ -129,9 +129,29 @@ static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
|
|||||||
stackframe.AddrBStore.Mode = AddrModeFlat;
|
stackframe.AddrBStore.Mode = AddrModeFlat;
|
||||||
stackframe.AddrStack.Offset = context.IntSp;
|
stackframe.AddrStack.Offset = context.IntSp;
|
||||||
stackframe.AddrStack.Mode = AddrModeFlat;
|
stackframe.AddrStack.Mode = AddrModeFlat;
|
||||||
|
#elif _M_ARM
|
||||||
|
image = IMAGE_FILE_MACHINE_ARMNT;
|
||||||
|
stackframe.AddrPC.Offset = context.Pc;
|
||||||
|
stackframe.AddrPC.Mode = AddrModeFlat;
|
||||||
|
stackframe.AddrFrame.Offset = context.R11;
|
||||||
|
stackframe.AddrFrame.Mode = AddrModeFlat;
|
||||||
|
stackframe.AddrStack.Offset = context.Sp;
|
||||||
|
stackframe.AddrStack.Mode = AddrModeFlat;
|
||||||
|
#elif _M_ARM64
|
||||||
|
image = IMAGE_FILE_MACHINE_ARM64;
|
||||||
|
stackframe.AddrPC.Offset = context.Pc;
|
||||||
|
stackframe.AddrPC.Mode = AddrModeFlat;
|
||||||
|
stackframe.AddrFrame.Offset = context.Fp;
|
||||||
|
stackframe.AddrFrame.Mode = AddrModeFlat;
|
||||||
|
stackframe.AddrStack.Offset = context.Sp;
|
||||||
|
stackframe.AddrStack.Mode = AddrModeFlat;
|
||||||
#elif
|
#elif
|
||||||
#error
|
#error
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
len = Q_snprintf( message, sizeof( message ), "Ver: " XASH_ENGINE_NAME " " XASH_VERSION " (build %i-%s, %s-%s)\n",
|
||||||
|
Q_buildnum(), Q_buildcommit(), Q_buildos(), Q_buildarch() );
|
||||||
|
|
||||||
len += Q_snprintf( message + len, 1024 - len, "Sys_Crash: address %p, code %p\n",
|
len += Q_snprintf( message + len, 1024 - len, "Sys_Crash: address %p, code %p\n",
|
||||||
pInfo->ExceptionRecord->ExceptionAddress, (void*)pInfo->ExceptionRecord->ExceptionCode );
|
pInfo->ExceptionRecord->ExceptionAddress, (void*)pInfo->ExceptionRecord->ExceptionCode );
|
||||||
if( SymGetLineFromAddr64( process, (DWORD64)pInfo->ExceptionRecord->ExceptionAddress, &dline, &line ) )
|
if( SymGetLineFromAddr64( process, (DWORD64)pInfo->ExceptionRecord->ExceptionAddress, &dline, &line ) )
|
||||||
@@ -259,6 +279,10 @@ static long _stdcall Sys_Crash( PEXCEPTION_POINTERS pInfo )
|
|||||||
// check to avoid recursive call
|
// check to avoid recursive call
|
||||||
host.crashed = true;
|
host.crashed = true;
|
||||||
|
|
||||||
|
#ifdef XASH_SDL
|
||||||
|
SDL_SetWindowGrab( host.hWnd, SDL_FALSE );
|
||||||
|
#endif // XASH_SDL
|
||||||
|
|
||||||
#if DBGHELP
|
#if DBGHELP
|
||||||
Sys_StackTrace( pInfo );
|
Sys_StackTrace( pInfo );
|
||||||
#else
|
#else
|
||||||
@@ -309,7 +333,6 @@ void Sys_SetupCrashHandler( void )
|
|||||||
{
|
{
|
||||||
SetErrorMode( SEM_FAILCRITICALERRORS ); // no abort/retry/fail errors
|
SetErrorMode( SEM_FAILCRITICALERRORS ); // no abort/retry/fail errors
|
||||||
oldFilter = SetUnhandledExceptionFilter( Sys_Crash );
|
oldFilter = SetUnhandledExceptionFilter( Sys_Crash );
|
||||||
host.hInst = GetModuleHandle( NULL );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sys_RestoreCrashHandler( void )
|
void Sys_RestoreCrashHandler( void )
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ GNU General Public License for more details.
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "custom.h"
|
#include "custom.h"
|
||||||
#include "ref_common.h"
|
#include "ref_common.h"
|
||||||
|
#include "hpak.h" // be aware of HPK limits
|
||||||
|
|
||||||
static rgbdata_t *CustomDecal_LoadImage( const char *path, void *raw, int size )
|
static rgbdata_t *CustomDecal_LoadImage( const char *path, void *raw, int size )
|
||||||
{
|
{
|
||||||
@@ -93,7 +94,7 @@ qboolean COM_CreateCustomization( customization_t *pListHead, resource_t *pResou
|
|||||||
|
|
||||||
if( FBitSet( flags, FCUST_FROMHPAK ))
|
if( FBitSet( flags, FCUST_FROMHPAK ))
|
||||||
{
|
{
|
||||||
if( !HPAK_GetDataPointer( CUSTOM_RES_PATH, pResource, (byte **)&pCust->pBuffer, NULL ))
|
if( !HPAK_GetDataPointer( hpk_custom_file.string, pResource, (byte **)&pCust->pBuffer, NULL ))
|
||||||
bError = true;
|
bError = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -115,11 +116,11 @@ qboolean COM_CreateCustomization( customization_t *pListHead, resource_t *pResou
|
|||||||
{
|
{
|
||||||
if( !FBitSet( flags, FCUST_IGNOREINIT ))
|
if( !FBitSet( flags, FCUST_IGNOREINIT ))
|
||||||
{
|
{
|
||||||
if( pResource->nDownloadSize >= (1 * 1024) && pResource->nDownloadSize <= ( 128 * 1024 ))
|
if( pResource->nDownloadSize >= HPAK_ENTRY_MIN_SIZE && pResource->nDownloadSize <= HPAK_ENTRY_MAX_SIZE )
|
||||||
{
|
{
|
||||||
pCust->bTranslated = true;
|
pCust->bTranslated = true;
|
||||||
pCust->nUserData1 = 0;
|
pCust->nUserData1 = 0;
|
||||||
pCust->nUserData2 = 1;
|
pCust->nUserData2 = 7;
|
||||||
|
|
||||||
if( !FBitSet( flags, FCUST_WIPEDATA ))
|
if( !FBitSet( flags, FCUST_WIPEDATA ))
|
||||||
pCust->pInfo = CustomDecal_LoadImage( pResource->szFileName, pCust->pBuffer, pCust->resource.nDownloadSize );
|
pCust->pInfo = CustomDecal_LoadImage( pResource->szFileName, pCust->pBuffer, pCust->resource.nDownloadSize );
|
||||||
|
|||||||
@@ -18,17 +18,17 @@ GNU General Public License for more details.
|
|||||||
#include "base_cmd.h"
|
#include "base_cmd.h"
|
||||||
#include "eiface.h" // ARRAYSIZE
|
#include "eiface.h" // ARRAYSIZE
|
||||||
|
|
||||||
convar_t *cvar_vars = NULL; // head of list
|
static convar_t *cvar_vars = NULL; // head of list
|
||||||
CVAR_DEFINE_AUTO( cmd_scripting, "0", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "enable simple condition checking and variable operations" );
|
CVAR_DEFINE_AUTO( cmd_scripting, "0", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "enable simple condition checking and variable operations" );
|
||||||
|
|
||||||
#ifdef HACKS_RELATED_HLMODS
|
|
||||||
typedef struct cvar_filter_quirks_s
|
typedef struct cvar_filter_quirks_s
|
||||||
{
|
{
|
||||||
const char *gamedir; // gamedir to enable for
|
const char *gamedir; // gamedir to enable for
|
||||||
const char *cvars; // list of cvars should be excluded from filter
|
const char *cvars; // list of cvars should be excluded from filter
|
||||||
} cvar_filter_quirks_t;
|
} cvar_filter_quirks_t;
|
||||||
|
|
||||||
static cvar_filter_quirks_t cvar_filter_quirks[] =
|
#ifdef HACKS_RELATED_HLMODS
|
||||||
|
static const cvar_filter_quirks_t cvar_filter_quirks[] =
|
||||||
{
|
{
|
||||||
// EXAMPLE:
|
// EXAMPLE:
|
||||||
//{
|
//{
|
||||||
@@ -44,10 +44,10 @@ static cvar_filter_quirks_t cvar_filter_quirks[] =
|
|||||||
"cl_dodmusic" // Day of Defeat Beta 1.3 cvar
|
"cl_dodmusic" // Day of Defeat Beta 1.3 cvar
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static cvar_filter_quirks_t *cvar_active_filter_quirks = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const cvar_filter_quirks_t *cvar_active_filter_quirks = NULL;
|
||||||
|
|
||||||
CVAR_DEFINE_AUTO( cl_filterstuffcmd, "1", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "filter commands coming from server" );
|
CVAR_DEFINE_AUTO( cl_filterstuffcmd, "1", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "filter commands coming from server" );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -70,15 +70,14 @@ find the specified variable by name
|
|||||||
*/
|
*/
|
||||||
convar_t *Cvar_FindVarExt( const char *var_name, int ignore_group )
|
convar_t *Cvar_FindVarExt( const char *var_name, int ignore_group )
|
||||||
{
|
{
|
||||||
// TODO: ignore group for cvar
|
convar_t *var;
|
||||||
#if defined(XASH_HASHED_VARS)
|
|
||||||
return (convar_t *)BaseCmd_Find( HM_CVAR, var_name );
|
|
||||||
#else
|
|
||||||
convar_t *var;
|
|
||||||
|
|
||||||
if( !var_name )
|
if( !var_name )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#if defined(XASH_HASHED_VARS) // TODO: ignore_group
|
||||||
|
var = BaseCmd_Find( HM_CVAR, var_name );
|
||||||
|
#else
|
||||||
for( var = cvar_vars; var; var = var->next )
|
for( var = cvar_vars; var; var = var->next )
|
||||||
{
|
{
|
||||||
if( ignore_group && FBitSet( ignore_group, var->flags ))
|
if( ignore_group && FBitSet( ignore_group, var->flags ))
|
||||||
@@ -87,9 +86,13 @@ convar_t *Cvar_FindVarExt( const char *var_name, int ignore_group )
|
|||||||
if( !Q_stricmp( var_name, var->name ))
|
if( !Q_stricmp( var_name, var->name ))
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// HACKHACK: HL25 compatibility
|
||||||
|
if( !var && !Q_stricmp( var_name, "gl_widescreen_yfov" ))
|
||||||
|
var = Cvar_FindVarExt( "r_adjust_fov", ignore_group );
|
||||||
|
|
||||||
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -164,8 +167,7 @@ static qboolean Cvar_UpdateInfo( convar_t *var, const char *value, qboolean noti
|
|||||||
return false; // failed to change value
|
return false; // failed to change value
|
||||||
|
|
||||||
// time to update server copy of userinfo
|
// time to update server copy of userinfo
|
||||||
CL_ServerCommand( true, "setinfo \"%s\" \"%s\"\n", var->name, value );
|
CL_UpdateInfo( var->name, value );
|
||||||
CL_LegacyUpdateInfo();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -231,7 +233,7 @@ static const char *Cvar_ValidateString( convar_t *var, const char *value )
|
|||||||
if( !COM_CheckStringEmpty( szNew ) ) Q_strncpy( szNew, "empty", sizeof( szNew ));
|
if( !COM_CheckStringEmpty( szNew ) ) Q_strncpy( szNew, "empty", sizeof( szNew ));
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FBitSet( var->flags, FCVAR_NOEXTRAWHITEPACE ))
|
if( FBitSet( var->flags, FCVAR_NOEXTRAWHITESPACE ))
|
||||||
{
|
{
|
||||||
char *szVal = szNew;
|
char *szVal = szNew;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@@ -273,6 +275,15 @@ static qboolean Cvar_ValidateVarName( const char *s, qboolean isvalue )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Cvar_Free( convar_t *var )
|
||||||
|
{
|
||||||
|
freestring( var->name );
|
||||||
|
freestring( var->string );
|
||||||
|
freestring( var->def_string );
|
||||||
|
freestring( var->desc );
|
||||||
|
Mem_Free( var );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cvar_UnlinkVar
|
Cvar_UnlinkVar
|
||||||
@@ -312,17 +323,13 @@ static int Cvar_UnlinkVar( const char *var_name, int group )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// unlink variable from list
|
// unlink variable from list
|
||||||
freestring( var->string );
|
|
||||||
*prev = var->next;
|
*prev = var->next;
|
||||||
|
|
||||||
// only allocated cvars can throw these fields
|
// only allocated cvars can throw these fields
|
||||||
if( FBitSet( var->flags, FCVAR_ALLOCATED ))
|
if( FBitSet( var->flags, FCVAR_ALLOCATED ))
|
||||||
{
|
Cvar_Free( var );
|
||||||
freestring( var->name );
|
else
|
||||||
freestring( var->def_string );
|
freestring( var->string );
|
||||||
freestring( var->desc );
|
|
||||||
Mem_Free( var );
|
|
||||||
}
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,7 +618,7 @@ static convar_t *Cvar_Set2( const char *var_name, const char *value )
|
|||||||
return Cvar_Get( var_name, value, FCVAR_USER_CREATED, NULL );
|
return Cvar_Get( var_name, value, FCVAR_USER_CREATED, NULL );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( !Cmd_CurrentCommandIsPrivileged( ))
|
if( !Cmd_CurrentCommandIsPrivileged( ))
|
||||||
{
|
{
|
||||||
if( FBitSet( var->flags, FCVAR_PRIVILEGED ))
|
if( FBitSet( var->flags, FCVAR_PRIVILEGED ))
|
||||||
@@ -794,7 +801,7 @@ void GAME_EXPORT Cvar_Set( const char *var_name, const char *value )
|
|||||||
if( !var_name )
|
if( !var_name )
|
||||||
{
|
{
|
||||||
// there is an error in C code if this happens
|
// there is an error in C code if this happens
|
||||||
Con_Printf( "Cvar_Set: passed NULL variable name\n" );
|
Con_Printf( "%s: passed NULL variable name\n", __func__ );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -803,7 +810,7 @@ void GAME_EXPORT Cvar_Set( const char *var_name, const char *value )
|
|||||||
if( !var )
|
if( !var )
|
||||||
{
|
{
|
||||||
// there is an error in C code if this happens
|
// there is an error in C code if this happens
|
||||||
Con_Printf( "Cvar_Set: variable '%s' not found\n", var_name );
|
Con_Printf( "%s: variable '%s' not found\n", __func__, var_name );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -848,7 +855,7 @@ float GAME_EXPORT Cvar_VariableValue( const char *var_name )
|
|||||||
if( !var_name )
|
if( !var_name )
|
||||||
{
|
{
|
||||||
// there is an error in C code if this happens
|
// there is an error in C code if this happens
|
||||||
Con_Printf( "Cvar_VariableValue: passed NULL variable name\n" );
|
Con_Printf( "%s: passed NULL variable name\n", __func__ );
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,7 +892,7 @@ const char *Cvar_VariableString( const char *var_name )
|
|||||||
if( !var_name )
|
if( !var_name )
|
||||||
{
|
{
|
||||||
// there is an error in C code if this happens
|
// there is an error in C code if this happens
|
||||||
Con_Printf( "Cvar_VariableString: passed NULL variable name\n" );
|
Con_Printf( "%s: passed NULL variable name\n", __func__ );
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -955,7 +962,7 @@ static void Cvar_SetGL( const char *name, const char *value )
|
|||||||
|
|
||||||
static qboolean Cvar_ShouldSetCvar( convar_t *v, qboolean isPrivileged )
|
static qboolean Cvar_ShouldSetCvar( convar_t *v, qboolean isPrivileged )
|
||||||
{
|
{
|
||||||
const char *prefixes[] = { "cl_", "gl_", "m_", "r_", "hud_", "joy_" };
|
const char *prefixes[] = { "cl_", "gl_", "m_", "r_", "hud_", "joy_", "con_", "scr_" };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( isPrivileged )
|
if( isPrivileged )
|
||||||
@@ -967,7 +974,6 @@ static qboolean Cvar_ShouldSetCvar( convar_t *v, qboolean isPrivileged )
|
|||||||
if( cl_filterstuffcmd.value <= 0.0f )
|
if( cl_filterstuffcmd.value <= 0.0f )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
#ifdef HACKS_RELATED_HLMODS
|
|
||||||
// check if game-specific filter exceptions should be applied
|
// check if game-specific filter exceptions should be applied
|
||||||
// TODO: for cmd exceptions, make generic function
|
// TODO: for cmd exceptions, make generic function
|
||||||
if( cvar_active_filter_quirks )
|
if( cvar_active_filter_quirks )
|
||||||
@@ -998,7 +1004,6 @@ static qboolean Cvar_ShouldSetCvar( convar_t *v, qboolean isPrivileged )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if( FBitSet( v->flags, FCVAR_FILTERABLE ))
|
if( FBitSet( v->flags, FCVAR_FILTERABLE ))
|
||||||
return false;
|
return false;
|
||||||
@@ -1218,6 +1223,20 @@ static void Cvar_List_f( void )
|
|||||||
Con_Printf( "\n%i cvars\n", count );
|
Con_Printf( "\n%i cvars\n", count );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static qboolean Cvar_ValidateUnlinkGroup( int group )
|
||||||
|
{
|
||||||
|
if( FBitSet( group, FCVAR_EXTDLL ) && !Cvar_VariableInteger( "host_gameloaded" ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( FBitSet( group, FCVAR_CLIENTDLL ) && !Cvar_VariableInteger( "host_clientloaded" ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( FBitSet( group, FCVAR_GAMEUIDLL ) && !Cvar_VariableInteger( "host_gameuiloaded" ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cvar_Unlink
|
Cvar_Unlink
|
||||||
@@ -1229,19 +1248,95 @@ void Cvar_Unlink( int group )
|
|||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_gameloaded" ) && FBitSet( group, FCVAR_EXTDLL ))
|
if( !Cvar_ValidateUnlinkGroup( group ))
|
||||||
return;
|
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_clientloaded" ) && FBitSet( group, FCVAR_CLIENTDLL ))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( Cvar_VariableInteger( "host_gameuiloaded" ) && FBitSet( group, FCVAR_GAMEUIDLL ))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
count = Cvar_UnlinkVar( NULL, group );
|
count = Cvar_UnlinkVar( NULL, group );
|
||||||
Con_Reportf( "unlink %i cvars\n", count );
|
Con_Reportf( "unlink %i cvars\n", count );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pending_cvar_t *Cvar_PrepareToUnlink( int group )
|
||||||
|
{
|
||||||
|
pending_cvar_t *list = NULL;
|
||||||
|
pending_cvar_t *tail = NULL;
|
||||||
|
convar_t *cv;
|
||||||
|
|
||||||
|
for( cv = cvar_vars; cv != NULL; cv = cv->next )
|
||||||
|
{
|
||||||
|
size_t namelen;
|
||||||
|
pending_cvar_t *p;
|
||||||
|
|
||||||
|
if( !FBitSet( cv->flags, group ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
namelen = Q_strlen( cv->name ) + 1;
|
||||||
|
p = Mem_Malloc( host.mempool, sizeof( *list ) + namelen );
|
||||||
|
p->next = NULL;
|
||||||
|
p->cv_cur = cv;
|
||||||
|
p->cv_next = cv->next;
|
||||||
|
p->cv_allocated = FBitSet( cv->flags, FCVAR_ALLOCATED ) ? true : false;
|
||||||
|
Q_strncpy( p->cv_name, cv->name, namelen );
|
||||||
|
|
||||||
|
if( list == NULL )
|
||||||
|
list = p;
|
||||||
|
else
|
||||||
|
tail->next = p;
|
||||||
|
|
||||||
|
tail = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cvar_UnlinkPendingCvars( pending_cvar_t *list )
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while( list != NULL )
|
||||||
|
{
|
||||||
|
pending_cvar_t *next = list->next;
|
||||||
|
convar_t *cv_prev, *cv;
|
||||||
|
|
||||||
|
for( cv_prev = NULL, cv = cvar_vars; cv != NULL; cv_prev = cv, cv = cv->next )
|
||||||
|
{
|
||||||
|
if( cv == list->cv_cur )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( cv == NULL )
|
||||||
|
{
|
||||||
|
Con_Reportf( "%s: can't find %s in variable list\n", __func__, list->cv_name );
|
||||||
|
Mem_Free( list );
|
||||||
|
list = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unlink cvar from list
|
||||||
|
BaseCmd_Remove( HM_CVAR, list->cv_name );
|
||||||
|
if( cv_prev != NULL )
|
||||||
|
cv_prev->next = list->cv_next;
|
||||||
|
else cvar_vars = list->cv_next;
|
||||||
|
|
||||||
|
if( list->cv_allocated )
|
||||||
|
Cvar_Free( list->cv_cur );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: can't free cvar string here because
|
||||||
|
// it's not safe to access cv_cur and
|
||||||
|
// can't save string pointer because it could've been changed
|
||||||
|
// and pointer to it is already lost
|
||||||
|
// freestring( list->cv_string );
|
||||||
|
}
|
||||||
|
|
||||||
|
// now free pending cvar
|
||||||
|
Mem_Free( list );
|
||||||
|
list = next;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Con_Reportf( "unlink %i cvars\n", count );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
Cvar_Init
|
Cvar_Init
|
||||||
|
|||||||
@@ -18,45 +18,18 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#include "cvardef.h"
|
#include "cvardef.h"
|
||||||
|
|
||||||
#ifdef XASH_64BIT
|
// As some mods dynamically allocate cvars and free them without notifying the engine
|
||||||
#define CVAR_SENTINEL 0xDEADBEEFDEADBEEF
|
// let's construct a list of cvars that must be removed
|
||||||
#else
|
typedef struct pending_cvar_s
|
||||||
#define CVAR_SENTINEL 0xDEADBEEF
|
|
||||||
#endif
|
|
||||||
#define CVAR_CHECK_SENTINEL( cv ) ((uintptr_t)(cv)->next == CVAR_SENTINEL)
|
|
||||||
|
|
||||||
// NOTE: if this is changed, it must be changed in cvardef.h too
|
|
||||||
typedef struct convar_s
|
|
||||||
{
|
{
|
||||||
// this part shared with cvar_t
|
struct pending_cvar_s *next;
|
||||||
char *name;
|
|
||||||
char *string;
|
|
||||||
int flags;
|
|
||||||
float value;
|
|
||||||
struct convar_s *next;
|
|
||||||
|
|
||||||
// this part unique for convar_t
|
convar_t *cv_cur; // preserve the data that might get freed
|
||||||
char *desc; // variable descrition info
|
convar_t *cv_next;
|
||||||
char *def_string; // keep pointer to initial value
|
qboolean cv_allocated; // if it's allocated by us, it's safe to access cv_cur
|
||||||
} convar_t;
|
char cv_name[];
|
||||||
|
} pending_cvar_t;
|
||||||
|
|
||||||
// cvar internal flags
|
|
||||||
#define FCVAR_RENDERINFO (1<<16) // save to a seperate config called video.cfg
|
|
||||||
#define FCVAR_READ_ONLY (1<<17) // cannot be set by user at all, and can't be requested by CvarGetPointer from game dlls
|
|
||||||
#define FCVAR_EXTENDED (1<<18) // this is convar_t (sets on registration)
|
|
||||||
#define FCVAR_ALLOCATED (1<<19) // this convar_t is fully dynamic allocated (include description)
|
|
||||||
#define FCVAR_VIDRESTART (1<<20) // recreate the window is cvar with this flag was changed
|
|
||||||
#define FCVAR_TEMPORARY (1<<21) // these cvars holds their values and can be unlink in any time
|
|
||||||
#define FCVAR_MOVEVARS (1<<22) // this cvar is a part of movevars_t struct that shared between client and server
|
|
||||||
#define FCVAR_USER_CREATED (1<<23) // created by a set command (dll's used)
|
|
||||||
|
|
||||||
#define CVAR_DEFINE( cv, cvname, cvstr, cvflags, cvdesc ) \
|
|
||||||
convar_t cv = { (char*)cvname, (char*)cvstr, cvflags, 0.0f, (void *)CVAR_SENTINEL, (char*)cvdesc, NULL }
|
|
||||||
|
|
||||||
#define CVAR_DEFINE_AUTO( cv, cvstr, cvflags, cvdesc ) \
|
|
||||||
CVAR_DEFINE( cv, #cv, cvstr, cvflags, cvdesc )
|
|
||||||
|
|
||||||
#ifndef REF_DLL
|
|
||||||
cvar_t *Cvar_GetList( void );
|
cvar_t *Cvar_GetList( void );
|
||||||
#define Cvar_FindVar( name ) Cvar_FindVarExt( name, 0 )
|
#define Cvar_FindVar( name ) Cvar_FindVarExt( name, 0 )
|
||||||
convar_t *Cvar_FindVarExt( const char *var_name, int ignore_group );
|
convar_t *Cvar_FindVarExt( const char *var_name, int ignore_group );
|
||||||
@@ -81,6 +54,8 @@ qboolean Cvar_CommandWithPrivilegeCheck( convar_t *v, qboolean isPrivileged );
|
|||||||
void Cvar_Init( void );
|
void Cvar_Init( void );
|
||||||
void Cvar_PostFSInit( void );
|
void Cvar_PostFSInit( void );
|
||||||
void Cvar_Unlink( int group );
|
void Cvar_Unlink( int group );
|
||||||
#endif // REF_DLL
|
|
||||||
|
pending_cvar_t *Cvar_PrepareToUnlink( int group );
|
||||||
|
void Cvar_UnlinkPendingCvars( pending_cvar_t *pending_cvars );
|
||||||
|
|
||||||
#endif//CVAR_H
|
#endif//CVAR_H
|
||||||
|
|||||||
@@ -16,12 +16,37 @@ GNU General Public License for more details.
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "xash3d_mathlib.h"
|
#include "xash3d_mathlib.h"
|
||||||
#include "ref_api.h"
|
#include "ref_api.h"
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
ref_globals_t refState;
|
ref_globals_t refState;
|
||||||
|
|
||||||
void CL_ProcessFile( qboolean successfully_received, const char *filename )
|
const char *CL_MsgInfo( int cmd )
|
||||||
{
|
{
|
||||||
|
static string sz;
|
||||||
|
|
||||||
|
Q_strncpy( sz, "???", sizeof( sz ));
|
||||||
|
|
||||||
|
if( cmd >= 0 && cmd <= svc_lastmsg )
|
||||||
|
{
|
||||||
|
// get engine message name
|
||||||
|
const char *svc_string = svc_strings[cmd];
|
||||||
|
|
||||||
|
Q_strncpy( sz, svc_string, sizeof( sz ));
|
||||||
|
}
|
||||||
|
else if( cmd > svc_lastmsg && cmd <= ( svc_lastmsg + MAX_USER_MESSAGES ))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < MAX_USER_MESSAGES; i++ )
|
||||||
|
{
|
||||||
|
if( svgame.msg[i].number == cmd )
|
||||||
|
{
|
||||||
|
Q_strncpy( sz, svgame.msg[i].name, sizeof( sz ));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GAME_EXPORT CL_Active( void )
|
int GAME_EXPORT CL_Active( void )
|
||||||
@@ -39,11 +64,6 @@ qboolean CL_IsInGame( void )
|
|||||||
return true; // always active for dedicated servers
|
return true; // always active for dedicated servers
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean CL_IsInMenu( void )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
qboolean CL_IsInConsole( void )
|
qboolean CL_IsInConsole( void )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -139,11 +159,6 @@ void GAME_EXPORT S_StopSound(int entnum, int channel, const char *soundname)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int S_GetCurrentStaticSounds( soundlist_t *pout, int size )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GAME_EXPORT CL_GetMaxClients( void )
|
int GAME_EXPORT CL_GetMaxClients( void )
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user