mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-06 12:25:00 +08:00
Compare commits
2392 Commits
v0.20
...
continuous
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
05ff0d6020 | ||
|
|
3cea12627e | ||
|
|
b59b7c1a8d | ||
|
|
dd2c369df3 | ||
|
|
8b79e49a0f | ||
|
|
4ea6eba8f2 | ||
|
|
f649076bc3 | ||
|
|
8ecffa4663 | ||
|
|
e90b83849a | ||
|
|
d517b9717a | ||
|
|
2c0d6e06be | ||
|
|
dec71850a1 | ||
|
|
b1860972c6 | ||
|
|
1f4c9b67da | ||
|
|
c2da125358 | ||
|
|
31fa990d44 | ||
|
|
d3e60c7d84 | ||
|
|
e2424b4303 | ||
|
|
240563cd1b | ||
|
|
d708cd58fb | ||
|
|
491b503f96 | ||
|
|
636a2228f6 | ||
|
|
bb03e2597c | ||
|
|
21c828ee40 | ||
|
|
132c9de142 | ||
|
|
9d9507d77f | ||
|
|
7daa6c3451 | ||
|
|
c8e1ffe0dd | ||
|
|
b5f02324a6 | ||
|
|
47f5dfdcfd | ||
|
|
33da68b013 | ||
|
|
618ec83c9d | ||
|
|
85de61ebc8 | ||
|
|
2feaae59f7 | ||
|
|
2550d7fbd3 | ||
|
|
565f717804 | ||
|
|
b56c83a2f9 | ||
|
|
bf17996f72 | ||
|
|
a3acb1c85b | ||
|
|
d4d63301e0 | ||
|
|
e9af0c9810 | ||
|
|
131ad9c790 | ||
|
|
bfcaba54dc | ||
|
|
f67736180b | ||
|
|
725b7ea7f9 | ||
|
|
600d574376 | ||
|
|
04f42df7d5 | ||
|
|
ab15662d78 | ||
|
|
072b0cef27 | ||
|
|
e274c62cfc | ||
|
|
a28d45fdb2 | ||
|
|
6ca5f7c6fb | ||
|
|
af316bff14 | ||
|
|
c8945caefc | ||
|
|
8c61a2f021 | ||
|
|
0b24810927 | ||
|
|
b3d8fb03bf | ||
|
|
02c5890c2f | ||
|
|
0579e40857 | ||
|
|
c77f290bc6 | ||
|
|
7bf9407177 | ||
|
|
b41fe076ae | ||
|
|
a7c422fde6 | ||
|
|
568a394a40 | ||
|
|
2b6a550405 | ||
|
|
7200f0da7e | ||
|
|
d3c3c26618 | ||
|
|
7152393089 | ||
|
|
661e60720d | ||
|
|
bf959da7ff | ||
|
|
75d476f9df | ||
|
|
b077822f4d | ||
|
|
6d3f188675 | ||
|
|
0231f5e8ac | ||
|
|
901b35d4b1 | ||
|
|
eaafd0ff13 | ||
|
|
963d9b8f2a | ||
|
|
5696c9c96a | ||
|
|
862b9e68be | ||
|
|
2f2890cd11 | ||
|
|
482aa840e7 | ||
|
|
4599983c8e | ||
|
|
11172838f2 | ||
|
|
47bc50b8c6 | ||
|
|
7c82766a5c | ||
|
|
5d6cf62405 | ||
|
|
edc08e39ef | ||
|
|
a9846e765d | ||
|
|
aa54309d5c | ||
|
|
443317bedf | ||
|
|
ffd320507f | ||
|
|
60df08c11c | ||
|
|
7d464df107 | ||
|
|
296f89acf9 | ||
|
|
5f31417bae | ||
|
|
150d98bd15 | ||
|
|
f162fbd806 | ||
|
|
7d8ea61ac2 | ||
|
|
40041e30eb | ||
|
|
a247e139bf | ||
|
|
00b2ca7f5a | ||
|
|
e58007aab3 | ||
|
|
dca862a838 | ||
|
|
7e71e20714 | ||
|
|
cee6862924 | ||
|
|
a8cc68f6b9 | ||
|
|
2af0adb629 | ||
|
|
628ac376ed | ||
|
|
251e6ac1dc | ||
|
|
9b6518376c | ||
|
|
6c3fee7f27 | ||
|
|
c111a59639 | ||
|
|
ba9bb70924 | ||
|
|
6acc97b0ef | ||
|
|
cd681d4303 | ||
|
|
46f30e215c | ||
|
|
2ae038c01c | ||
|
|
aaa9fbd50f | ||
|
|
51d4716bcb | ||
|
|
045caacfee | ||
|
|
95a5c670a2 | ||
|
|
30259e1573 | ||
|
|
8b884132b7 | ||
|
|
266f9a6bc6 | ||
|
|
58177d9251 | ||
|
|
69e801d6b8 | ||
|
|
388cc3061f | ||
|
|
c9d29b3955 | ||
|
|
371025dc8e | ||
|
|
cf7a79bff3 | ||
|
|
55dfa1bf44 | ||
|
|
519c8a032a | ||
|
|
c15822f375 | ||
|
|
0e91deec19 | ||
|
|
87b204c661 | ||
|
|
caefa0b7b9 | ||
|
|
a311923d4e | ||
|
|
ee4cb39f3e | ||
|
|
18436a70eb | ||
|
|
8298053e6a | ||
|
|
9304a0041d | ||
|
|
64f92003fa | ||
|
|
be0a241244 | ||
|
|
df6546d5b1 | ||
|
|
a0c31120d9 | ||
|
|
c0757bd84c | ||
|
|
9fa32a9cf4 | ||
|
|
15bc09b06b | ||
|
|
315aea1991 | ||
|
|
380422a6dc | ||
|
|
be26ecf1c9 | ||
|
|
d2bbe9dfd2 | ||
|
|
9c929c1405 | ||
|
|
9551240680 | ||
|
|
6605d0456c | ||
|
|
99e8f7b486 | ||
|
|
5ac8f63741 | ||
|
|
9d3949a948 | ||
|
|
5bd1dd34b3 | ||
|
|
6862b14e59 | ||
|
|
dc1d65f621 | ||
|
|
fba3a2b67f | ||
|
|
b946c8455d | ||
|
|
c56e876043 | ||
|
|
9773d11464 | ||
|
|
3c28b11754 | ||
|
|
f2584dcb9d | ||
|
|
ce73838f1b | ||
|
|
49f972a7c9 | ||
|
|
1ae01d89de | ||
|
|
8e54e18c8f | ||
|
|
18136e5320 | ||
|
|
a29f1899d3 | ||
|
|
0f804ffc30 | ||
|
|
620a4b4894 | ||
|
|
4cf87c2c23 | ||
|
|
f031c31b77 | ||
|
|
c2447d8634 | ||
|
|
ae9c1d9f18 | ||
|
|
0132eb6e44 | ||
|
|
f12df54226 | ||
|
|
d971055927 | ||
|
|
6059538d77 | ||
|
|
17deba0606 | ||
|
|
82a2d272ad | ||
|
|
707a9228e1 | ||
|
|
59ddfb787f | ||
|
|
acdf1da995 | ||
|
|
f1cdab91eb | ||
|
|
05d5abe4db | ||
|
|
44e017a410 | ||
|
|
64f3884f23 | ||
|
|
6386782674 | ||
|
|
8084687e50 | ||
|
|
6c16de55c0 | ||
|
|
537237ef62 | ||
|
|
4dfc3f34cb | ||
|
|
d22bbb4213 | ||
|
|
0e3b14e9a5 | ||
|
|
afb0540aa3 | ||
|
|
4d802d8901 | ||
|
|
6a4bf4965f | ||
|
|
a3c9538d12 | ||
|
|
632264809f | ||
|
|
bcfabbe802 | ||
|
|
c244cfc937 | ||
|
|
520fc33394 | ||
|
|
f705a7cd26 | ||
|
|
65bfff69d0 | ||
|
|
9d8ba03f5e | ||
|
|
778b8ede58 | ||
|
|
f8a1a2ed71 | ||
|
|
b4a7c266b5 | ||
|
|
a488f79852 | ||
|
|
b290046503 | ||
|
|
e8409cee8b | ||
|
|
1d4d355b38 | ||
|
|
dfe12535a5 | ||
|
|
74946100f1 | ||
|
|
9a1717915c | ||
|
|
3691eb6e48 | ||
|
|
3bb7471fd3 | ||
|
|
74e09ddb12 | ||
|
|
6b73d056b2 | ||
|
|
3e7847551a | ||
|
|
91d92935fa | ||
|
|
eff033298a | ||
|
|
3a8f4961bc | ||
|
|
b81f94518a | ||
|
|
96f7f5457d | ||
|
|
498ec6b4f1 | ||
|
|
607e62a1ae | ||
|
|
d41a80bc2c | ||
|
|
643bec4071 | ||
|
|
a7e84230c3 | ||
|
|
c96cf7e22d | ||
|
|
46c61660cf | ||
|
|
f6fecce52b | ||
|
|
54a5947a3c | ||
|
|
521bc675a2 | ||
|
|
845cee2578 | ||
|
|
93ceb0e4ed | ||
|
|
13aab4e59c | ||
|
|
36c2f9e9f2 | ||
|
|
514da0ffa9 | ||
|
|
37b8d5da79 | ||
|
|
b5d602d953 | ||
|
|
c926fee13c | ||
|
|
a675806c91 | ||
|
|
683c4874f8 | ||
|
|
20ced857b4 | ||
|
|
c6c86f9665 | ||
|
|
1e0107944f | ||
|
|
21797f9ac8 | ||
|
|
c800b34cd4 | ||
|
|
1612e2d669 | ||
|
|
26d229c8ca | ||
|
|
9c66e86be1 | ||
|
|
7e9f87de2d | ||
|
|
67737446ac | ||
|
|
dabed4f9eb | ||
|
|
f9b6389248 | ||
|
|
9ec1e259b4 | ||
|
|
0c2d480d89 | ||
|
|
350d8ccb7b | ||
|
|
0c512d0431 | ||
|
|
3bf55c9ea4 | ||
|
|
9994c57796 | ||
|
|
3f724b6b17 | ||
|
|
255773b4de | ||
|
|
5b73a788da | ||
|
|
748b06a00e | ||
|
|
273bccdc9a | ||
|
|
f0a2362da3 | ||
|
|
be8ade23e8 | ||
|
|
6814908d80 | ||
|
|
08dbfc45d3 | ||
|
|
89f9b3df68 | ||
|
|
40c9a2fb82 | ||
|
|
a34c22fb10 | ||
|
|
e161ff0f7a | ||
|
|
fee42eab5a | ||
|
|
2d2e03f235 | ||
|
|
4c3c3529e9 | ||
|
|
7051b844ff | ||
|
|
68377435c8 | ||
|
|
652b1804a8 | ||
|
|
e7e1677786 | ||
|
|
f330aac113 | ||
|
|
dbdd330cf7 | ||
|
|
c448c7b0b1 | ||
|
|
8d7b9c2f01 | ||
|
|
b6a235445a | ||
|
|
9fcd4baa87 | ||
|
|
fb0102eb8e | ||
|
|
9c1afaa372 | ||
|
|
1d1a6badb5 | ||
|
|
2d41c9cb15 | ||
|
|
722cbe1f02 | ||
|
|
8ac2c241c4 | ||
|
|
dd11f73951 | ||
|
|
a443547d4d | ||
|
|
7a795edeb5 | ||
|
|
a8cbfb8dda | ||
|
|
5216cccef4 | ||
|
|
a87f399e68 | ||
|
|
dd310ab851 | ||
|
|
16cc0ca0fe | ||
|
|
83d26ad233 | ||
|
|
d1f9a8f2db | ||
|
|
a2e1071808 | ||
|
|
0aa8a2891c | ||
|
|
c0ceab7513 | ||
|
|
5c90e716cb | ||
|
|
0073225549 | ||
|
|
d03a64602b | ||
|
|
d67a4234cc | ||
|
|
0d37244490 | ||
|
|
6426919cb5 | ||
|
|
0a0d63663a | ||
|
|
71b06801ef | ||
|
|
cfc7b35927 | ||
|
|
76564958d1 | ||
|
|
a464c3dd66 | ||
|
|
bd969f3594 | ||
|
|
fb87d7c0b3 | ||
|
|
a69fc87940 | ||
|
|
e481e1d73e | ||
|
|
6c0eed1b2b | ||
|
|
a6c67fdf9f | ||
|
|
03f838e37e | ||
|
|
e21fa4a910 | ||
|
|
46889ed453 | ||
|
|
882fcc152c | ||
|
|
a41902bd46 | ||
|
|
a6af32dafd | ||
|
|
d6dfb83be7 | ||
|
|
597429cf41 | ||
|
|
5ea074a1fd | ||
|
|
29c9393da3 | ||
|
|
bf6829189e | ||
|
|
a62a9429c9 | ||
|
|
f2c080e736 | ||
|
|
ea55e78855 | ||
|
|
f7c536b81c | ||
|
|
6c40104c66 | ||
|
|
4d7d592918 | ||
|
|
c5e91f299b | ||
|
|
cff276db71 | ||
|
|
30d1492b93 | ||
|
|
f07eea5073 | ||
|
|
fe407fbe00 | ||
|
|
78bc177e05 | ||
|
|
8fb908e3d4 | ||
|
|
d8b261370a | ||
|
|
a2c9ac5b1f | ||
|
|
7f9025e178 | ||
|
|
8647110a10 | ||
|
|
48e44f0057 | ||
|
|
e3934af7d1 | ||
|
|
a5ee631191 | ||
|
|
ce39255ef0 | ||
|
|
5aac5d2a52 | ||
|
|
061b50404d | ||
|
|
279cec5ae9 | ||
|
|
83a5648335 | ||
|
|
a8fc9a4c5a | ||
|
|
6f6ddbce28 | ||
|
|
4cb425d2bb | ||
|
|
bf5fd40d64 | ||
|
|
6bc613bdb4 | ||
|
|
a982562658 | ||
|
|
96a9172e36 | ||
|
|
34d7664342 | ||
|
|
b0a79df86f | ||
|
|
9e107e900c | ||
|
|
8f819a2fde | ||
|
|
3251b68df5 | ||
|
|
3ac8ad9484 | ||
|
|
b9ca0d4563 | ||
|
|
dcb3da53b0 | ||
|
|
e68b19ed1a | ||
|
|
14c7a84482 | ||
|
|
c1d1aa6787 | ||
|
|
bee81e9723 | ||
|
|
1bfb6c560a | ||
|
|
24d6f1788a | ||
|
|
fb95cc9a97 | ||
|
|
b949da291e | ||
|
|
2ecbe5b67e | ||
|
|
6634e0487c | ||
|
|
7d61b5317c | ||
|
|
201258dc9e | ||
|
|
0330569537 | ||
|
|
a1ab84a2ca | ||
|
|
2d79f3ef7a | ||
|
|
99a7e9ad87 | ||
|
|
02b8037f33 | ||
|
|
fc55a685e3 | ||
|
|
b76a75d6b4 | ||
|
|
a251600c8a | ||
|
|
c551aefd77 | ||
|
|
f343f0da41 | ||
|
|
6d318a4102 | ||
|
|
a2b992d865 | ||
|
|
ddf3f2ffdb | ||
|
|
2454e87509 | ||
|
|
0dc44249a2 | ||
|
|
150cbfa4de | ||
|
|
c0b068d81b | ||
|
|
fbc312b6cf | ||
|
|
342e0d3e2e | ||
|
|
202b228691 | ||
|
|
c9c1286803 | ||
|
|
eab98b0eda | ||
|
|
35be80fc21 | ||
|
|
6041bb0a43 | ||
|
|
c7dd9d6437 | ||
|
|
d378878c91 | ||
|
|
4a2f8cafcd | ||
|
|
d254bac16b | ||
|
|
e23b632ce5 | ||
|
|
2f321b1471 | ||
|
|
0265e88d8f | ||
|
|
4114d2f24d | ||
|
|
8124035763 | ||
|
|
96127c6eb0 | ||
|
|
cf65a39b83 | ||
|
|
0341f96b70 | ||
|
|
c95d91cfe3 | ||
|
|
cbd10c6279 | ||
|
|
5df9e57743 | ||
|
|
c178022fb5 | ||
|
|
724c29d711 | ||
|
|
74a2dbeb91 | ||
|
|
5d20d24ebc | ||
|
|
0e2fc277c8 | ||
|
|
1505740b73 | ||
|
|
6bad07b39d | ||
|
|
f85437dfc5 | ||
|
|
c765261db6 | ||
|
|
73087ead2d | ||
|
|
8c88e82709 | ||
|
|
40dd6e0234 | ||
|
|
eb23b226cc | ||
|
|
676526a518 | ||
|
|
7e0bd86b65 | ||
|
|
97489635af | ||
|
|
a9ea3976a7 | ||
|
|
5501ca927a | ||
|
|
a19fb82d66 | ||
|
|
9d032e953f | ||
|
|
38587151a9 | ||
|
|
02d5bab04b | ||
|
|
d8f3e53b1f | ||
|
|
877ed8a92a | ||
|
|
487a652aa8 | ||
|
|
64c5d141af | ||
|
|
16db8a8008 | ||
|
|
b6b14da102 | ||
|
|
a575605c75 | ||
|
|
a205a3e878 | ||
|
|
26ef3e274c | ||
|
|
33be1b7591 | ||
|
|
de19d78571 | ||
|
|
287381d5ca | ||
|
|
4acd0e5304 | ||
|
|
cb1063c305 | ||
|
|
59bfc8c32f | ||
|
|
23494f4e20 | ||
|
|
b58fbc0c94 | ||
|
|
46f38c84b5 | ||
|
|
99f290b622 | ||
|
|
680ecfefab | ||
|
|
7222c74000 | ||
|
|
1e43cb734b | ||
|
|
cb19fa2f6d | ||
|
|
73fcb84b62 | ||
|
|
3584d3d1a6 | ||
|
|
e95139af94 | ||
|
|
962f88d31b | ||
|
|
a738b2a50b | ||
|
|
34fa1b5ec8 | ||
|
|
2fdd080eef | ||
|
|
95f87e24ee | ||
|
|
bfe17fa241 | ||
|
|
a94a5f1f29 | ||
|
|
dc71456174 | ||
|
|
c6b6938e14 | ||
|
|
2823a6d269 | ||
|
|
bee35a1873 | ||
|
|
e4ae386964 | ||
|
|
36831555b9 | ||
|
|
8eef212726 | ||
|
|
1589defda1 | ||
|
|
df921d8664 | ||
|
|
f3949474b9 | ||
|
|
706ef65208 | ||
|
|
435b95fc5a | ||
|
|
aeece35291 | ||
|
|
abd7f3dca3 | ||
|
|
1c9f333420 | ||
|
|
75e5da071c | ||
|
|
52bd923d9d | ||
|
|
ab5a9eec53 | ||
|
|
88916fdac4 | ||
|
|
22f60d50ac | ||
|
|
4ed562697b | ||
|
|
64166c7d82 | ||
|
|
0df89bddeb | ||
|
|
3168e5ccf0 | ||
|
|
72fe214f49 | ||
|
|
e1cbf96100 | ||
|
|
1d6f695749 | ||
|
|
08a2d431da | ||
|
|
8bdb49516d | ||
|
|
e7f5cb6910 | ||
|
|
9968b192c3 | ||
|
|
79f2c69963 | ||
|
|
2067667c9c | ||
|
|
e017b9145f | ||
|
|
c1c27c5f18 | ||
|
|
87a56a5fa1 | ||
|
|
aee99f6094 | ||
|
|
bf03f739bb | ||
|
|
e23580c1de | ||
|
|
e49848d090 | ||
|
|
1bfc6e6705 | ||
|
|
e7c41759fb | ||
|
|
a07f81820c | ||
|
|
b39378a6da | ||
|
|
5c6b9d3235 | ||
|
|
3d49ca25b3 | ||
|
|
43fde38d88 | ||
|
|
6461fa5042 | ||
|
|
788bc820c8 | ||
|
|
36ff819daf | ||
|
|
8905883225 | ||
|
|
4031f5cb01 | ||
|
|
cd46ad19a3 | ||
|
|
6f7b1695d7 | ||
|
|
28a4b51939 | ||
|
|
5e878aae89 | ||
|
|
7e05562c14 | ||
|
|
777dd3a03c | ||
|
|
9977cb20c0 | ||
|
|
5661766c79 | ||
|
|
60d65d368a | ||
|
|
031594cc99 | ||
|
|
d4bf57c7c2 | ||
|
|
8e16c0e410 | ||
|
|
d5f4b409e8 | ||
|
|
88c560aac4 | ||
|
|
c3a6cad0c1 | ||
|
|
a862446072 | ||
|
|
8d04ae8802 | ||
|
|
0de0615eeb | ||
|
|
ea24b5f3ca | ||
|
|
eb7f19d3cf | ||
|
|
ca134a85ee | ||
|
|
00765f1ff2 | ||
|
|
013bfe5c34 | ||
|
|
5f625bb6e1 | ||
|
|
547a862024 | ||
|
|
6ea8d141d9 | ||
|
|
bdc2390d41 | ||
|
|
acc113309c | ||
|
|
5afda72290 | ||
|
|
6a7b330463 | ||
|
|
f5b9826fd9 | ||
|
|
82addf11bb | ||
|
|
aee5e46516 | ||
|
|
40e248aa63 | ||
|
|
24ee3ae318 | ||
|
|
f79aaf93f8 | ||
|
|
0d89849cab | ||
|
|
d962255ebe | ||
|
|
21b47dff32 | ||
|
|
1905782c41 | ||
|
|
b29b3d5859 | ||
|
|
3533b0d284 | ||
|
|
7e06d049f5 | ||
|
|
5a4c443c79 | ||
|
|
4bbd1e59a4 | ||
|
|
0809453b2c | ||
|
|
8350d81c18 | ||
|
|
57499dea33 | ||
|
|
6b223f1325 | ||
|
|
03a85e0caa | ||
|
|
01ad3dda2a | ||
|
|
2a05624615 | ||
|
|
f3ed9b21c0 | ||
|
|
16c87ae2c9 | ||
|
|
c16a10e6f3 | ||
|
|
c7d748e8df | ||
|
|
0e16110c3a | ||
|
|
c966589a50 | ||
|
|
4c02c25506 | ||
|
|
a4997d0647 | ||
|
|
243c3cc80f | ||
|
|
a8dbec56c3 | ||
|
|
9c62fa901f | ||
|
|
996897e30e | ||
|
|
93ee5b9446 | ||
|
|
c0c8119040 | ||
|
|
61c75b9809 | ||
|
|
868d10a842 | ||
|
|
699f3579fe | ||
|
|
873ce0ce48 | ||
|
|
450f77443d | ||
|
|
278ff22ba9 | ||
|
|
d9ef1d4608 | ||
|
|
58df771c9e | ||
|
|
a6ecc778fc | ||
|
|
37e890f326 | ||
|
|
0d6137ee40 | ||
|
|
653eb00cc6 | ||
|
|
b84aba68fa | ||
|
|
1855fab80b | ||
|
|
23f1c43282 | ||
|
|
a7c76ac0bf | ||
|
|
26959cd280 | ||
|
|
1fdf6180e6 | ||
|
|
d2237fa144 | ||
|
|
febdfacbd3 | ||
|
|
ef663a8790 | ||
|
|
ba039b8e71 | ||
|
|
02ce80981c | ||
|
|
a40a325d3c | ||
|
|
85cc942a3c | ||
|
|
a23e17c6d7 | ||
|
|
59412f3d92 | ||
|
|
0a15cc389d | ||
|
|
13f8a02cdf | ||
|
|
8caa2d142f | ||
|
|
3b8009917a | ||
|
|
e2e14945e4 | ||
|
|
16595bf2c0 | ||
|
|
f49a2bc8f3 | ||
|
|
d994c6df9a | ||
|
|
3a57f26351 | ||
|
|
7fd1534753 | ||
|
|
bd52a9ec2d | ||
|
|
9e0d389d9e | ||
|
|
8680757844 | ||
|
|
95a8d2f51f | ||
|
|
70b26a13c2 | ||
|
|
6a1f96a2c6 | ||
|
|
4ce2475602 | ||
|
|
e7ece41ba0 | ||
|
|
05579927a5 | ||
|
|
2f5b359c99 | ||
|
|
214fc7e827 | ||
|
|
df173a83ed | ||
|
|
3918bcd71c | ||
|
|
f19ed1c1c2 | ||
|
|
03ec2f603b | ||
|
|
1ee01163b7 | ||
|
|
b1d60c248d | ||
|
|
d9cbf1fa89 | ||
|
|
cd022bdac7 | ||
|
|
5d7d5319fd | ||
|
|
d4470402ee | ||
|
|
05560c7607 | ||
|
|
81c752da2b | ||
|
|
fd2ad447a8 | ||
|
|
18d55c1de2 | ||
|
|
d0d09c878f | ||
|
|
e791d44dd8 | ||
|
|
152f6d154c | ||
|
|
5627dbbf34 | ||
|
|
9cd9744407 | ||
|
|
f13c285287 | ||
|
|
cca7744f1c | ||
|
|
31ae22961b | ||
|
|
a3603f497d | ||
|
|
d36cb62a2e | ||
|
|
2ca6029e03 | ||
|
|
dee5cae5f3 | ||
|
|
ef4bc2acf2 | ||
|
|
eb61bcf76a | ||
|
|
cb43df43ef | ||
|
|
356f78ee81 | ||
|
|
275cd73ade | ||
|
|
bb1b9dad23 | ||
|
|
e27ac6b092 | ||
|
|
7333ddc1d9 | ||
|
|
fbd7d8f58a | ||
|
|
3415185dde | ||
|
|
551ea71906 | ||
|
|
1d965d7543 | ||
|
|
1d62df0e2d | ||
|
|
b0f52236bc | ||
|
|
7dcddc559c | ||
|
|
277bead9b7 | ||
|
|
d8093ec587 | ||
|
|
323626c308 | ||
|
|
68ff265e8d | ||
|
|
a3ab04e0cb | ||
|
|
7d2bf93c72 | ||
|
|
04107d384e | ||
|
|
3a0f1763fb | ||
|
|
377dd9a255 | ||
|
|
8961e37d7c | ||
|
|
de1e53311a | ||
|
|
19582cdf11 | ||
|
|
fa0e7e4369 | ||
|
|
2378331e47 | ||
|
|
5549e7301c | ||
|
|
5ab7d09a00 | ||
|
|
c54e1625d1 | ||
|
|
d0127e5e14 | ||
|
|
0f643f1f87 | ||
|
|
16eb12b1e0 | ||
|
|
4856a3c084 | ||
|
|
78e239d883 | ||
|
|
5a7b68fcc1 | ||
|
|
c33a384975 | ||
|
|
5b582b744a | ||
|
|
c96f8ba722 | ||
|
|
9f92e2a1f7 | ||
|
|
710b234493 | ||
|
|
75759530e3 | ||
|
|
5162ab62fd | ||
|
|
3e2a215c15 | ||
|
|
e2540bd446 | ||
|
|
07fd4f37ef | ||
|
|
92b72a7d33 | ||
|
|
cb3b16e2ec | ||
|
|
bd3dc71f39 | ||
|
|
48176233bd | ||
|
|
a292d2fd53 | ||
|
|
27aad9f4a0 | ||
|
|
71a3cedba8 | ||
|
|
ec2951cf45 | ||
|
|
ff436ae100 | ||
|
|
cfdfdd5c93 | ||
|
|
8b96e7ca87 | ||
|
|
1603b8028c | ||
|
|
8c7db8499f | ||
|
|
fbdd79644b | ||
|
|
ac39090f6e | ||
|
|
8f207362a5 | ||
|
|
b16fa8eddc | ||
|
|
2261b0dcab | ||
|
|
9eb49fc673 | ||
|
|
c61c84ad4f | ||
|
|
71c9fd2772 | ||
|
|
1464e1e2be | ||
|
|
cf557d191a | ||
|
|
b72033eb74 | ||
|
|
cec903fd10 | ||
|
|
b333edeefe | ||
|
|
76c7273600 | ||
|
|
096ee34f67 | ||
|
|
5b52a9a19f | ||
|
|
cacfff008f | ||
|
|
398cec626e | ||
|
|
cadad6ce34 | ||
|
|
588d080a63 | ||
|
|
1affc36f06 | ||
|
|
8d6ac3fad4 | ||
|
|
0d5d30398b | ||
|
|
eb0686fca1 | ||
|
|
41025c0049 | ||
|
|
6518a5cf8b | ||
|
|
49936120ca | ||
|
|
e4a5b95e81 | ||
|
|
84fc8d4281 | ||
|
|
e9da3e2976 | ||
|
|
c1252b5642 | ||
|
|
7d54952422 | ||
|
|
b28d10f69f | ||
|
|
6cb3b2f01a | ||
|
|
248be5458f | ||
|
|
2e7306e96a | ||
|
|
558ded6d6a | ||
|
|
c52dc69360 | ||
|
|
ba1648c689 | ||
|
|
101a7a1240 | ||
|
|
25d6b2b069 | ||
|
|
f67b97e63c | ||
|
|
9a24cb8c96 | ||
|
|
c157b7def3 | ||
|
|
de88aec958 | ||
|
|
7f31871b5a | ||
|
|
f55ef63e26 | ||
|
|
824a34ee1e | ||
|
|
46e2ccd2bf | ||
|
|
339c08d89f | ||
|
|
2db2375b4d | ||
|
|
d86ab19351 | ||
|
|
db40d58208 | ||
|
|
33ff7bbd61 | ||
|
|
4d4162336a | ||
|
|
372514151d | ||
|
|
6c9ce478a9 | ||
|
|
78555ab125 | ||
|
|
f2c671d809 | ||
|
|
4bce193645 | ||
|
|
129de871e3 | ||
|
|
c24a1fafc5 | ||
|
|
cee3757e6f | ||
|
|
12ed092446 | ||
|
|
2fb19a0cfd | ||
|
|
79624fa400 | ||
|
|
550ced9c36 | ||
|
|
fd795d5612 | ||
|
|
dc0982932b | ||
|
|
5d387101b9 | ||
|
|
eef1e1868a | ||
|
|
4005ef831a | ||
|
|
b0c71c598f | ||
|
|
d7848b7b8d | ||
|
|
9cdce1ce69 | ||
|
|
84edd9d0c4 | ||
|
|
d8355a651f | ||
|
|
004ac8105e | ||
|
|
2e8ab13242 | ||
|
|
27d9fc0afe | ||
|
|
192d510924 | ||
|
|
3614cfa878 | ||
|
|
12efcf1c44 | ||
|
|
a8de11643c | ||
|
|
597027277c | ||
|
|
48988e66bd | ||
|
|
37e3cf7e86 | ||
|
|
01e0542223 | ||
|
|
93a7ccd14f | ||
|
|
892e5c59eb | ||
|
|
c2992afb4a | ||
|
|
b99e7a6304 | ||
|
|
8888b456df | ||
|
|
53987f47e2 | ||
|
|
7cac1d290d | ||
|
|
55b048aab9 | ||
|
|
881a7edb9f | ||
|
|
6c62136f11 | ||
|
|
f34b35be5a | ||
|
|
4b5ee87de1 | ||
|
|
67903b55cc | ||
|
|
55bf0e8a53 | ||
|
|
f1487cf576 | ||
|
|
29e32310cf | ||
|
|
2ea549f250 | ||
|
|
b2ea8c9d18 | ||
|
|
6e27926a10 | ||
|
|
96c30371b7 | ||
|
|
9a42f4149f | ||
|
|
dca4226e4b | ||
|
|
b3c1c173a9 | ||
|
|
3e67445ef3 | ||
|
|
127bd89b44 | ||
|
|
3361e74f54 | ||
|
|
48e199bfa1 | ||
|
|
575179dbf5 | ||
|
|
e024a67436 | ||
|
|
e3103249f4 | ||
|
|
0746cb5365 | ||
|
|
fcda7517fe | ||
|
|
2c77f4c566 | ||
|
|
1caa276531 | ||
|
|
e673fe9a02 | ||
|
|
3ccbc7a28c | ||
|
|
8bb5ec5e26 | ||
|
|
35ff062407 | ||
|
|
ec355a83d1 | ||
|
|
182d8edb42 | ||
|
|
762e4da7a0 | ||
|
|
098c4c009b | ||
|
|
f8cf2c8953 | ||
|
|
cc6838ec97 | ||
|
|
dca637d4bb | ||
|
|
3949422430 | ||
|
|
2c8488f07a | ||
|
|
1df1fc32df | ||
|
|
eac8c116a8 | ||
|
|
a03019f5e4 | ||
|
|
714b4f45e4 | ||
|
|
68be8157ea | ||
|
|
ea2a8b6785 | ||
|
|
8c80d3b85d | ||
|
|
33c0764e65 | ||
|
|
d085c5a843 | ||
|
|
4ada40e8a8 | ||
|
|
1630d87c0d | ||
|
|
3a956a1ad3 | ||
|
|
774ced312f | ||
|
|
fec3d33dcf | ||
|
|
d4610e30fd | ||
|
|
885cda971d | ||
|
|
ef0b227967 | ||
|
|
19a785a98a | ||
|
|
b96bfcfe7a | ||
|
|
412c635499 | ||
|
|
da5ec56567 | ||
|
|
e664e80b27 | ||
|
|
d177b6f528 | ||
|
|
2ef3d78d9f | ||
|
|
5ea5e1167b | ||
|
|
116a605248 | ||
|
|
9690fe9334 | ||
|
|
a81fa84321 | ||
|
|
5ef97ae99e | ||
|
|
d667845777 | ||
|
|
b12b2aaf79 | ||
|
|
6b62f9c1b9 | ||
|
|
ba1cf25314 | ||
|
|
fb2ba6a6e2 | ||
|
|
fb6e310eab | ||
|
|
bcbd1a59c6 | ||
|
|
8e45a43ad2 | ||
|
|
115ed82c19 | ||
|
|
5c1e06ae74 | ||
|
|
f9205825b6 | ||
|
|
9040c34f48 | ||
|
|
9e9703e6de | ||
|
|
6486533355 | ||
|
|
34160151a4 | ||
|
|
daaaa324bd | ||
|
|
af5c74981b | ||
|
|
249ce6bca1 | ||
|
|
b648c74815 | ||
|
|
a2d459ae84 | ||
|
|
573781b45d | ||
|
|
3299999f3d | ||
|
|
91be4f6521 | ||
|
|
f2f21b24a1 | ||
|
|
9ef43a4794 | ||
|
|
fc02a69686 | ||
|
|
b10a0dc5c5 | ||
|
|
e5f0d1557c | ||
|
|
d8a3f4850a | ||
|
|
882d957b5c | ||
|
|
afd1727898 | ||
|
|
70a73e47a7 | ||
|
|
fe3f15ad33 | ||
|
|
66f625f840 | ||
|
|
3e1833722f | ||
|
|
4b8e11f561 | ||
|
|
0d04c20578 | ||
|
|
41c819f3d3 | ||
|
|
957154f097 | ||
|
|
fad506ef03 | ||
|
|
9150bbdfd8 | ||
|
|
aa4e2f0ae4 | ||
|
|
2bacc91922 | ||
|
|
458aa6d8b8 | ||
|
|
6963741020 | ||
|
|
b55aa982b0 | ||
|
|
492481eea8 | ||
|
|
76bff9cd4b | ||
|
|
47a6be86b1 | ||
|
|
287688d985 | ||
|
|
610d528042 | ||
|
|
89ec39821e | ||
|
|
82cfd3ecc3 | ||
|
|
5a3e3b3977 | ||
|
|
9cf6e421cb | ||
|
|
5c56b51044 | ||
|
|
577add56f1 | ||
|
|
adc5aa4659 | ||
|
|
5beed5ab29 | ||
|
|
34dd52ca90 | ||
|
|
6304b51f32 | ||
|
|
97a7de3377 | ||
|
|
7424b29e56 | ||
|
|
3c64d2ad80 | ||
|
|
1274fa13c8 | ||
|
|
3765686077 | ||
|
|
9fffd7a270 | ||
|
|
e37c07f44f | ||
|
|
214a3cce73 | ||
|
|
d738b07660 | ||
|
|
48ca8f9a70 | ||
|
|
c565b0a505 | ||
|
|
474833a3bf | ||
|
|
602f23fbdf | ||
|
|
7e9d46689c | ||
|
|
b6347d17c9 | ||
|
|
8293bc91d4 | ||
|
|
fb0f184d6b | ||
|
|
58e95c7d6f | ||
|
|
7a5381e658 | ||
|
|
375c06400c | ||
|
|
e481c86ba2 | ||
|
|
21b9f07323 | ||
|
|
0bff62e696 | ||
|
|
858597832d | ||
|
|
9b0ac7cb32 | ||
|
|
3c27384b6b | ||
|
|
1e8c26a527 | ||
|
|
f4069de7f2 | ||
|
|
e95161aa14 | ||
|
|
0984368a31 | ||
|
|
f4961d9da7 | ||
|
|
f42a174482 | ||
|
|
13bf607031 | ||
|
|
3cfdb1213b | ||
|
|
d58105d64d | ||
|
|
1bdd844860 | ||
|
|
11f3d97cd7 | ||
|
|
fccf044976 | ||
|
|
c23396f533 | ||
|
|
33c9f7118b | ||
|
|
c741ec223f | ||
|
|
d6d98bd297 | ||
|
|
5e1b5d89f7 | ||
|
|
a0edfd28b2 | ||
|
|
555fd02407 | ||
|
|
f7f9cfecfc | ||
|
|
2aeee59a31 | ||
|
|
12b8965a8c | ||
|
|
b5b6b8b785 | ||
|
|
35e073ceff | ||
|
|
b2cc96cf0d | ||
|
|
f7489a3747 | ||
|
|
0e7ebf6d44 | ||
|
|
69607d7890 | ||
|
|
4e87eb068a | ||
|
|
03a7c67731 | ||
|
|
5ba2449d10 | ||
|
|
0ee2fd8a8a | ||
|
|
080b9b30a1 | ||
|
|
749ac5ed54 | ||
|
|
6c8b9af6bb | ||
|
|
07922c0239 | ||
|
|
1a54ec92e0 | ||
|
|
663b574b8b | ||
|
|
430c51b71a | ||
|
|
20bcd03f19 | ||
|
|
dab959fc32 | ||
|
|
eff75e5d50 | ||
|
|
d103f022b4 | ||
|
|
72b8246969 | ||
|
|
030d05f018 | ||
|
|
59cd5493e7 | ||
|
|
98a7f6fa3f | ||
|
|
65095df124 | ||
|
|
ee370ea007 | ||
|
|
05016f8639 | ||
|
|
12154de6f5 | ||
|
|
3fca567b81 | ||
|
|
634574f249 | ||
|
|
f782d444a8 | ||
|
|
b68def2b9c | ||
|
|
d944301a60 | ||
|
|
15ba932046 | ||
|
|
b73c16c216 | ||
|
|
0ba4ef678c | ||
|
|
919d510f63 | ||
|
|
6557ac7fb4 | ||
|
|
87c307f47e | ||
|
|
f3e50b5500 | ||
|
|
705f252ed8 | ||
|
|
cb28101732 | ||
|
|
f87863b8bc | ||
|
|
25fb89f717 | ||
|
|
36e7856b9c | ||
|
|
34b0cdc125 | ||
|
|
25a1cb8ce7 | ||
|
|
a610b1545b | ||
|
|
30b698067a | ||
|
|
f63f1a0dc6 | ||
|
|
9cb867a7d4 | ||
|
|
00ddd95c27 | ||
|
|
0ffd1b9ff1 | ||
|
|
2109d49aa3 | ||
|
|
f910f4896c | ||
|
|
6eae3471cf | ||
|
|
c0fa91bec9 | ||
|
|
ba6dd3c751 | ||
|
|
fd63018fb5 | ||
|
|
2225915702 | ||
|
|
d14e486721 | ||
|
|
82b6da493a | ||
|
|
bec0b36bb9 | ||
|
|
e2c2821191 | ||
|
|
a19d34035d | ||
|
|
77ea03a62c | ||
|
|
402a0f129d | ||
|
|
d7116afc92 | ||
|
|
d5fe491c14 | ||
|
|
92138428c5 | ||
|
|
f3ff942ea9 | ||
|
|
ced6e8869a | ||
|
|
d7af50ea6c | ||
|
|
f7d4e5a2ea | ||
|
|
2e3788f23d | ||
|
|
eaf9a9283a | ||
|
|
ae66291272 | ||
|
|
4f78ec01cf | ||
|
|
be084d5603 | ||
|
|
aac0be1ab3 | ||
|
|
6282acc825 | ||
|
|
39fd30a472 | ||
|
|
279e391949 | ||
|
|
6df25392b8 | ||
|
|
327372e253 | ||
|
|
801dbaa387 | ||
|
|
ffd5c2d3d0 | ||
|
|
84c14b32ec | ||
|
|
c481e52558 | ||
|
|
b946ed4625 | ||
|
|
ef1572b15b | ||
|
|
aaeb18f433 | ||
|
|
dd1d86c289 | ||
|
|
16b162f7bb | ||
|
|
500ca54550 | ||
|
|
5313dc9475 | ||
|
|
9c0c1a802c | ||
|
|
fbedbdca7d | ||
|
|
6232e288e1 | ||
|
|
a6475f530b | ||
|
|
de84df99f3 | ||
|
|
a5d5c1f60b | ||
|
|
6ac3156a82 | ||
|
|
2705e77a4e | ||
|
|
a09aa31b7a | ||
|
|
9466461ce0 | ||
|
|
74ce7e9b10 | ||
|
|
10481a4ecc | ||
|
|
acd86ce490 | ||
|
|
1119a9ac22 | ||
|
|
171c0c8d3b | ||
|
|
9b5e0fef01 | ||
|
|
2f5e3b0aea | ||
|
|
ca3b0e6246 | ||
|
|
eb0459a045 | ||
|
|
5d98e13fb8 | ||
|
|
113904ea91 | ||
|
|
1dc3cc2d57 | ||
|
|
15a5975abf | ||
|
|
65debeb738 | ||
|
|
209a03a12a | ||
|
|
c28aeb2362 | ||
|
|
9152bbf106 | ||
|
|
40ba0238f8 | ||
|
|
4a3efa511c | ||
|
|
2479d28cd5 | ||
|
|
787d3bc5dd | ||
|
|
0bec78a958 | ||
|
|
e305b81df0 | ||
|
|
4cb109abe0 | ||
|
|
49a65edfc3 | ||
|
|
c6bfc82019 | ||
|
|
a4865fd2fc | ||
|
|
4bbd0cc404 | ||
|
|
4684f174ee | ||
|
|
34eb258cae | ||
|
|
b4c0ccbede | ||
|
|
51b5d7a41d | ||
|
|
15846a8ea8 | ||
|
|
e694081626 | ||
|
|
cb9605430d | ||
|
|
80507b2eca | ||
|
|
ed47346ef1 | ||
|
|
75ccd2283b | ||
|
|
409edf5a70 | ||
|
|
d047dfc319 | ||
|
|
13ed2742b2 | ||
|
|
03a3fb83b6 | ||
|
|
df1c9a5029 | ||
|
|
07e622f224 | ||
|
|
aa3a0fa392 | ||
|
|
c1287b3950 | ||
|
|
e5763e2e9a | ||
|
|
42a3c7b059 | ||
|
|
e621c98602 | ||
|
|
eb7eb4acbc | ||
|
|
e5b32fe8ac | ||
|
|
52061621ac | ||
|
|
339711c3c7 | ||
|
|
256fe7ede9 | ||
|
|
2febe632c5 | ||
|
|
c454e37064 | ||
|
|
fe1aba3561 | ||
|
|
41aa867a21 | ||
|
|
b36ebc294f | ||
|
|
3d71e5d111 | ||
|
|
ac59f25375 | ||
|
|
3393e2d95c | ||
|
|
e1ea3387ee | ||
|
|
071638794a | ||
|
|
953dd3d1a7 | ||
|
|
12bb0ca44b | ||
|
|
499cd48e83 | ||
|
|
444e08f59a | ||
|
|
9450c08eec | ||
|
|
18e68f1ab3 | ||
|
|
7555fefc18 | ||
|
|
f4fb8b4ac2 | ||
|
|
0d5cd89144 | ||
|
|
e273e09fc9 | ||
|
|
327017421c | ||
|
|
6e179346c9 | ||
|
|
ee218f36e0 | ||
|
|
f3400c983e | ||
|
|
9397301a73 | ||
|
|
f1ec612819 | ||
|
|
08f834cd82 | ||
|
|
48c17d08d9 | ||
|
|
f20fddee1c | ||
|
|
754d55beef | ||
|
|
cd813bbfbe | ||
|
|
07afbd64d4 | ||
|
|
af7d6f6fa8 | ||
|
|
cb0f513bf0 | ||
|
|
a3ef6c955c | ||
|
|
60e7a7aa23 | ||
|
|
e1431e1040 | ||
|
|
b794f2fda0 | ||
|
|
934d9ba69a | ||
|
|
9e54ddfd55 | ||
|
|
a86a24d33d | ||
|
|
fe9ed0ac9b | ||
|
|
18c94b6ec4 | ||
|
|
8fa0290e25 | ||
|
|
080cd146dd | ||
|
|
b1d910a3a5 | ||
|
|
840283d6e5 | ||
|
|
d72481e5ac | ||
|
|
dbe9309475 | ||
|
|
9fa4de6ee8 | ||
|
|
fd3c5e8384 | ||
|
|
d50ed1c087 | ||
|
|
e48133bf4b | ||
|
|
ea3bfd969c | ||
|
|
7469d6a248 | ||
|
|
859f36afce | ||
|
|
436a788ac8 | ||
|
|
5098e24806 | ||
|
|
1d8acc16f1 | ||
|
|
802c7a86a9 | ||
|
|
406eb828da | ||
|
|
0e9106685b | ||
|
|
9b001987e9 | ||
|
|
5c2c02c317 | ||
|
|
21c898d796 | ||
|
|
e48b708fa6 | ||
|
|
ccf7619ae5 | ||
|
|
eabbd0061f | ||
|
|
7d0d6b8e0d | ||
|
|
eb36fe0155 | ||
|
|
9381a40506 | ||
|
|
a19270a0dc | ||
|
|
c34ce2d9e1 | ||
|
|
58465c3727 | ||
|
|
177ed2c603 | ||
|
|
7bb994f7bc | ||
|
|
0c4f35e2d0 | ||
|
|
3287501f97 | ||
|
|
2454594a18 | ||
|
|
4daab23e2d | ||
|
|
51161004eb | ||
|
|
6477f1656e | ||
|
|
270e2a76a8 | ||
|
|
c61442e960 | ||
|
|
d0928af355 | ||
|
|
674093517e | ||
|
|
ebf3877cda | ||
|
|
e97310c441 | ||
|
|
cbe3e608b6 | ||
|
|
f30f23ba51 | ||
|
|
1ba117a8e9 | ||
|
|
d9a245dcb5 | ||
|
|
9cbf5ab6a6 | ||
|
|
c9e4e62474 | ||
|
|
aa6a1db0a9 | ||
|
|
e9d66be10a | ||
|
|
8b6f12418e | ||
|
|
7013d447ca | ||
|
|
93b2f535e2 | ||
|
|
591d572870 | ||
|
|
3ab749cc2e | ||
|
|
084fac3606 | ||
|
|
f377461fdf | ||
|
|
a2971ce939 | ||
|
|
65671d8788 | ||
|
|
809d5f1aa8 | ||
|
|
49fc6143ab | ||
|
|
8717843333 | ||
|
|
f6d8996968 | ||
|
|
9389305072 | ||
|
|
b6bd4bc6f8 | ||
|
|
4c6fbafd20 | ||
|
|
43c6175918 | ||
|
|
fcd741e2b8 | ||
|
|
89807250e5 | ||
|
|
24f7db19d8 | ||
|
|
49d93c0e76 | ||
|
|
707c93c32c | ||
|
|
e204f05726 | ||
|
|
3bd8ad50d2 | ||
|
|
3488d4e65f | ||
|
|
3da736a1eb | ||
|
|
e30c61c0e2 | ||
|
|
64e97124c3 | ||
|
|
46979419ae | ||
|
|
30d9b6d844 | ||
|
|
88045ce3be | ||
|
|
dd881d3da9 | ||
|
|
76d0608ee1 | ||
|
|
a894ca60c6 | ||
|
|
023f6712f9 | ||
|
|
42740149ac | ||
|
|
7b74015c4d | ||
|
|
57c71efe53 | ||
|
|
45de874598 | ||
|
|
aa702f0678 | ||
|
|
927dccc71d | ||
|
|
c2a24fbbce | ||
|
|
ae94a6aeba | ||
|
|
e9da43666c | ||
|
|
d27dd68072 | ||
|
|
b1ee27a3f3 | ||
|
|
32372654c2 | ||
|
|
17d0b19f9e | ||
|
|
d13f7f06e4 | ||
|
|
f469b56b93 | ||
|
|
ef74f86ce2 | ||
|
|
616cbdb1eb | ||
|
|
0a49e69818 | ||
|
|
adb8ec1da8 | ||
|
|
5d73c6cb84 | ||
|
|
afa1d429fe | ||
|
|
d1309c3aeb | ||
|
|
b35cf6e30c | ||
|
|
8cbe0e5b30 | ||
|
|
c1fe547925 | ||
|
|
1064b41ab2 | ||
|
|
2a6c2e5db4 | ||
|
|
816337a7bb | ||
|
|
d237114962 | ||
|
|
c1ca2c1a95 | ||
|
|
44a43c2c09 | ||
|
|
ee8098839e | ||
|
|
305b2579eb | ||
|
|
1a09d297ee | ||
|
|
d45e6e0ad1 | ||
|
|
2d2523df4a | ||
|
|
5a0fcfffb0 | ||
|
|
f252161d90 | ||
|
|
e0216e2658 | ||
|
|
0f2bb5720b | ||
|
|
0621e365ff | ||
|
|
8ea455def7 | ||
|
|
8cf822c426 | ||
|
|
4a009c1c2c | ||
|
|
360dc4f7ed | ||
|
|
ffe43e1f22 | ||
|
|
a52d901f25 | ||
|
|
5bae2f06ad | ||
|
|
69b0954007 | ||
|
|
0645402946 | ||
|
|
c59b244d04 | ||
|
|
5678d9a253 | ||
|
|
a520d245a6 | ||
|
|
b56f6fa330 | ||
|
|
f141869ce3 | ||
|
|
807f3852bd | ||
|
|
084089b919 | ||
|
|
f571a41cf3 | ||
|
|
686a966ff7 | ||
|
|
c29eb458ea | ||
|
|
234c843f60 | ||
|
|
7ed0499aa9 | ||
|
|
401b145040 | ||
|
|
3853ff5435 | ||
|
|
744c6b2680 | ||
|
|
030a17fc58 | ||
|
|
b1e2e84a11 | ||
|
|
12a6088912 | ||
|
|
fe9f3f78a0 | ||
|
|
327eb330ed | ||
|
|
470121512a | ||
|
|
dedc144b8b | ||
|
|
6d37398fad | ||
|
|
3c8fe508f0 | ||
|
|
8ffb3aac8a | ||
|
|
0ed9391969 | ||
|
|
e54289f811 | ||
|
|
17b091e5a9 | ||
|
|
61c142e2db | ||
|
|
7e664679a0 | ||
|
|
fd152e82e8 | ||
|
|
0c50e43663 | ||
|
|
7a2ac4a9c0 | ||
|
|
e6bb9d980d | ||
|
|
45cc7e5bcc | ||
|
|
4be4870982 | ||
|
|
19c2061831 | ||
|
|
3a8c58d192 | ||
|
|
24763f9b07 | ||
|
|
0d7a2e7bad | ||
|
|
82ab06efdd | ||
|
|
4110ee0928 | ||
|
|
4b05cf4399 | ||
|
|
f29a9f5f58 | ||
|
|
28001ea150 | ||
|
|
f633b3dbf6 | ||
|
|
bebfa611fc | ||
|
|
3e9f2df2bf | ||
|
|
fce8afabfb | ||
|
|
9d49985100 | ||
|
|
a7d4cafe10 | ||
|
|
ca2a6635b6 | ||
|
|
7f1bb9b4a6 | ||
|
|
7341a6b020 | ||
|
|
ac05acf6dc | ||
|
|
3e1db432df | ||
|
|
3c682507e7 | ||
|
|
e9ae6d08b5 | ||
|
|
f435a81c97 | ||
|
|
cb34c23844 | ||
|
|
9f9141823a | ||
|
|
d3437c70bd | ||
|
|
8630ef2c67 | ||
|
|
0b50678912 | ||
|
|
22ff45f5d0 | ||
|
|
905bbf1515 | ||
|
|
88c1b1400d | ||
|
|
8e48a98d48 | ||
|
|
76dbefb9ec | ||
|
|
327dcc0293 | ||
|
|
e6c55107c7 | ||
|
|
c5dbbea9ef | ||
|
|
74707551ae | ||
|
|
2f5f5ef0a6 | ||
|
|
f7dc9d8e72 | ||
|
|
238162bb79 | ||
|
|
1fda8753bd | ||
|
|
a688bed79f | ||
|
|
b0ff51d5a0 | ||
|
|
68f633e9cd | ||
|
|
a520af42e8 | ||
|
|
0a6885e02d | ||
|
|
aa5a509316 | ||
|
|
97879430e9 | ||
|
|
ae97eae42f | ||
|
|
c5d7e3c783 | ||
|
|
9bcd36cc24 | ||
|
|
c6881a425f | ||
|
|
8d0209b122 | ||
|
|
279894cfd4 | ||
|
|
169ee14724 | ||
|
|
8866d5cfd6 | ||
|
|
3b9a7910d0 | ||
|
|
b5885d4107 | ||
|
|
a254a342b1 | ||
|
|
0db95d76a8 | ||
|
|
69a9211fc9 | ||
|
|
44cd03f464 | ||
|
|
9242a0a510 | ||
|
|
2b9e050f57 | ||
|
|
9d4fe707bb | ||
|
|
0d2552c3f6 | ||
|
|
b3c9637422 | ||
|
|
01a3321d63 | ||
|
|
5a5e72c424 | ||
|
|
b8dc7494eb | ||
|
|
532cd779a7 | ||
|
|
d202a6c572 | ||
|
|
6e864e4f8f | ||
|
|
6ef76fe665 | ||
|
|
314672d82c | ||
|
|
1d558b33d6 | ||
|
|
911385d019 | ||
|
|
5b97c2135a | ||
|
|
365f24e1fe | ||
|
|
7157c3b441 | ||
|
|
28d7f2eaa2 | ||
|
|
0d449370e0 | ||
|
|
10ad1c3b38 | ||
|
|
90c566dde3 | ||
|
|
33cbead4a4 | ||
|
|
d6dfeaeba7 | ||
|
|
bc00c6c54b | ||
|
|
3d5aa7c20c | ||
|
|
a5ba43ea39 | ||
|
|
3eb4862794 | ||
|
|
c025606739 | ||
|
|
067e9be37a | ||
|
|
b7b9c611cf | ||
|
|
3c4eec62ae | ||
|
|
fd7dba74cd | ||
|
|
a8674c18df | ||
|
|
b26cd6cc94 | ||
|
|
55a29e6e6b | ||
|
|
56d7c05b51 | ||
|
|
5e4fc64430 | ||
|
|
12ea6dcfd7 | ||
|
|
a41f8cb01b | ||
|
|
a9c82dbe21 | ||
|
|
5350d88f57 | ||
|
|
fc132e87f4 | ||
|
|
c326853617 | ||
|
|
3ad60a0fa1 | ||
|
|
772f4dcb60 | ||
|
|
657a6af9dc | ||
|
|
5e1f189db3 | ||
|
|
a2d11f670a | ||
|
|
5bf6f814ef | ||
|
|
fc84cd2a0a | ||
|
|
ab43486ee0 | ||
|
|
d8724f0be4 | ||
|
|
fce3959d15 | ||
|
|
36b0d47f5f | ||
|
|
cf84ad12f1 | ||
|
|
ffe7114a47 | ||
|
|
6891ed8064 | ||
|
|
8f91830997 | ||
|
|
fbdfed84be | ||
|
|
786c408f6e | ||
|
|
6e031b518a | ||
|
|
500dd0a82b | ||
|
|
d562642e26 | ||
|
|
cbcb90638b | ||
|
|
8211acf4e0 | ||
|
|
c4a25e0d70 | ||
|
|
3ec9977212 | ||
|
|
64eb0a694d | ||
|
|
d46d62bf03 | ||
|
|
95ed044fee | ||
|
|
3fe392b41f | ||
|
|
854bfb8673 | ||
|
|
fb43a5590f | ||
|
|
5d4f8373c4 | ||
|
|
ac9664c7ae | ||
|
|
2905f951bd | ||
|
|
79dc090aae | ||
|
|
d52b07beac | ||
|
|
12815bfbf2 | ||
|
|
b9b8b0521b | ||
|
|
af8febabd1 | ||
|
|
f0a856d9c8 | ||
|
|
85895c5311 | ||
|
|
c076f4ff8e | ||
|
|
87ce35b32d | ||
|
|
5285f51a26 | ||
|
|
3e23634369 | ||
|
|
36cec298c2 | ||
|
|
6199426e5e | ||
|
|
4e295622be | ||
|
|
2182ba9630 | ||
|
|
e5720cf8b9 | ||
|
|
6063ca2ad1 | ||
|
|
99de598ea4 | ||
|
|
b23d5ed354 | ||
|
|
a1ce5faac2 | ||
|
|
afaabe26a6 | ||
|
|
a68afcc672 | ||
|
|
d4bb5423ae | ||
|
|
ce8e5880e2 | ||
|
|
0cef18af86 | ||
|
|
ad4d0cf00a | ||
|
|
a6f12d3009 | ||
|
|
fa09854671 | ||
|
|
78d2cd848a | ||
|
|
463997da51 | ||
|
|
fef0993f54 | ||
|
|
2218126c75 | ||
|
|
2388260848 | ||
|
|
40298cefb6 | ||
|
|
45bf927c74 | ||
|
|
347c6d6a91 | ||
|
|
ab6214142f | ||
|
|
402b38951d | ||
|
|
6807cf5849 | ||
|
|
15dc25d2cd | ||
|
|
568c7fd917 | ||
|
|
e5562a7b61 | ||
|
|
ac308f7298 | ||
|
|
7a88379917 | ||
|
|
e44718d531 | ||
|
|
e6a2c207de | ||
|
|
df83b155a1 | ||
|
|
cc2c97cfad | ||
|
|
c69ea00e79 | ||
|
|
f63dd72260 | ||
|
|
5b0b917468 | ||
|
|
b138a63502 | ||
|
|
8eec5389fe | ||
|
|
5524aaae1e | ||
|
|
acffeb1dad | ||
|
|
6c7d57e1eb | ||
|
|
7c9f5f8ab1 | ||
|
|
6b4f55c4bf | ||
|
|
89335938c1 | ||
|
|
437630d26d | ||
|
|
341c9dae39 | ||
|
|
c10b70cb61 | ||
|
|
4c7bf1ff44 | ||
|
|
f467d0c807 | ||
|
|
a717b7fc49 | ||
|
|
07a9c4602d | ||
|
|
eeb170af22 | ||
|
|
c532c3032c | ||
|
|
2b8b3e1993 | ||
|
|
b0a889d1a1 | ||
|
|
bd1bfea695 | ||
|
|
a1299e1dfe | ||
|
|
1a5a76a201 | ||
|
|
b072b627a2 | ||
|
|
5d18c6d678 | ||
|
|
59fba30a52 | ||
|
|
193cde83b6 | ||
|
|
12bfb8f795 | ||
|
|
9ae72dbc47 | ||
|
|
ae6ad74994 | ||
|
|
f417433f59 | ||
|
|
080dc38f11 | ||
|
|
13f93412cd | ||
|
|
ca975d0168 | ||
|
|
b82d0bad7a | ||
|
|
d1de9e2802 | ||
|
|
efdf9e3599 | ||
|
|
060835cf2f | ||
|
|
74485f30d3 | ||
|
|
8dda35a128 | ||
|
|
978ec27a57 | ||
|
|
113f18cfb0 | ||
|
|
6f36edfd16 | ||
|
|
5fb4edeb36 | ||
|
|
dd29e705f8 | ||
|
|
8445567ab4 | ||
|
|
11d4cb0f1e | ||
|
|
db48d0ded7 | ||
|
|
86a777880f | ||
|
|
0d195ee6fe | ||
|
|
5e4996b119 | ||
|
|
f25254369d | ||
|
|
9ce8edcb38 | ||
|
|
33d79ddb24 | ||
|
|
52d1383f14 | ||
|
|
843c9abf9b | ||
|
|
924e895753 | ||
|
|
ac40badaa5 | ||
|
|
fd83b0dc17 | ||
|
|
5715023a0d | ||
|
|
51526948c0 | ||
|
|
10ec32e264 | ||
|
|
4fbd96d201 | ||
|
|
81b01ac561 | ||
|
|
771c359ed0 | ||
|
|
d1a5c33bf1 | ||
|
|
641f0632ef | ||
|
|
974f0787a4 | ||
|
|
87ceb0f9cb | ||
|
|
cfcd58dd78 | ||
|
|
8044d23e7f | ||
|
|
b175d6d95f | ||
|
|
d3e213aa1b | ||
|
|
26e09c240a | ||
|
|
15eb6808c4 | ||
|
|
5402e1a259 | ||
|
|
74086cc4c1 | ||
|
|
9c85d114e7 | ||
|
|
81c4acab66 | ||
|
|
6f2fda427e | ||
|
|
09b7f22cee | ||
|
|
691a305f8e | ||
|
|
66dc20dc2d | ||
|
|
92cfa2af48 | ||
|
|
9515cccb94 | ||
|
|
a7d02b8268 | ||
|
|
22815d2784 | ||
|
|
95ee88720c | ||
|
|
58dbc1ba31 | ||
|
|
d7431783d4 | ||
|
|
c8410f7e46 | ||
|
|
80e20cb55b | ||
|
|
654bac83a5 | ||
|
|
fc7fb8b62d | ||
|
|
65d624140e | ||
|
|
cd2720ba81 | ||
|
|
d2f3b1974e | ||
|
|
91742d613d | ||
|
|
fba323cf1f | ||
|
|
f67d0ffa5a | ||
|
|
a6fbf5fb74 | ||
|
|
df616b950d | ||
|
|
37cf4da136 | ||
|
|
668d528e3b | ||
|
|
12da44a3d7 | ||
|
|
51fcae8cec | ||
|
|
6473efa995 | ||
|
|
cf7852832f | ||
|
|
29ad3de78a | ||
|
|
8169c2a40b | ||
|
|
85f99c723a | ||
|
|
edc171be04 | ||
|
|
9047fe2e74 | ||
|
|
24ea8fba4b | ||
|
|
e07417aead | ||
|
|
13b36e66b3 | ||
|
|
7821f425e7 | ||
|
|
f0783ddee1 | ||
|
|
d4d39c66fb | ||
|
|
a2d8a47376 | ||
|
|
3f7773f83b | ||
|
|
18933e7981 | ||
|
|
9917cba8fc | ||
|
|
203afda053 | ||
|
|
6dbb694fdc | ||
|
|
0c26c24331 | ||
|
|
51635995a2 | ||
|
|
988183a96a | ||
|
|
d8fd0b3dcb | ||
|
|
a6b43fbfff | ||
|
|
61643585e0 | ||
|
|
75e8a51058 | ||
|
|
3a55b9cd67 | ||
|
|
89baa633c8 | ||
|
|
1bf08cc2c3 | ||
|
|
36d757c74a | ||
|
|
0891356ec5 | ||
|
|
0fa1b4f944 | ||
|
|
56103a90eb | ||
|
|
2fa964e939 | ||
|
|
0027678a56 | ||
|
|
ffea7d9729 | ||
|
|
0e286f31c5 | ||
|
|
b9cec43e2c | ||
|
|
bb84a3cb7f | ||
|
|
5aa6bfee85 | ||
|
|
204544f50f | ||
|
|
df4f21680c | ||
|
|
2c1b862654 | ||
|
|
ea5937bce0 | ||
|
|
6e4ab74694 | ||
|
|
2c74a633d0 | ||
|
|
22e770e4d4 | ||
|
|
1f26710bd0 | ||
|
|
96f35f76e1 | ||
|
|
fa37d153c8 | ||
|
|
aa5594d11f | ||
|
|
6b332eabd2 | ||
|
|
13cf909b99 | ||
|
|
606b5354e6 | ||
|
|
e29dcb4125 | ||
|
|
c3513b1615 | ||
|
|
abbd0f92a4 | ||
|
|
f9d0fba05f | ||
|
|
1ffe050205 | ||
|
|
a2f741fe8a | ||
|
|
d0a39ef492 | ||
|
|
f63d2d747f | ||
|
|
7e687b45bb | ||
|
|
284eeea3c3 | ||
|
|
01b2266b7e | ||
|
|
0714ab27b5 | ||
|
|
4ae608913b | ||
|
|
295adcf222 | ||
|
|
3351ecd754 | ||
|
|
ccf90beb7d | ||
|
|
7fbbe9f015 | ||
|
|
46fd27eb14 | ||
|
|
f1a4d66d27 | ||
|
|
c619bb4af7 | ||
|
|
210137c325 | ||
|
|
d4d79573f6 | ||
|
|
b7a32f6843 | ||
|
|
f1dabf13a1 | ||
|
|
947b94d29f | ||
|
|
f007374866 | ||
|
|
7cb06956c2 | ||
|
|
ebfa8e6ffc | ||
|
|
7869aac2e5 | ||
|
|
f3dfbc9219 | ||
|
|
4f89288ccf | ||
|
|
fb8791529e | ||
|
|
f0feb1dfbf | ||
|
|
2df27e14a8 | ||
|
|
764ef93984 | ||
|
|
d8b3ab4dcc | ||
|
|
08e72bad35 | ||
|
|
7e574ea42e | ||
|
|
0963e05716 | ||
|
|
23e2f4d0cc | ||
|
|
ca3544d559 | ||
|
|
7a0a355baf | ||
|
|
f7bf081650 | ||
|
|
a4be009ce7 | ||
|
|
d3248aad66 | ||
|
|
000c594596 | ||
|
|
960a8959d5 | ||
|
|
2604ea39c5 | ||
|
|
dc186c3cba | ||
|
|
f60112773f | ||
|
|
37aa5b1e99 | ||
|
|
aa07dab8ab | ||
|
|
ac213c22ed | ||
|
|
e0efe0aa23 | ||
|
|
29bc0392ee | ||
|
|
054765232e | ||
|
|
89425e4bf2 | ||
|
|
a777e7c80d | ||
|
|
1350fd0b52 | ||
|
|
d7db48ce4b | ||
|
|
293482fbd5 | ||
|
|
3771a1d6c5 | ||
|
|
07f1f7ded1 | ||
|
|
1cac321c00 | ||
|
|
aa7bfb4819 | ||
|
|
0c18a06946 | ||
|
|
24edcf7d9e | ||
|
|
ecddae8ee6 | ||
|
|
1ab49adbf2 | ||
|
|
28b49e00e5 | ||
|
|
1e6be598e9 | ||
|
|
155e15939b | ||
|
|
3f014fde73 | ||
|
|
66db69862f | ||
|
|
fc665527ae | ||
|
|
0c6b51fa0c | ||
|
|
c00e77c02e | ||
|
|
25c0557f7f | ||
|
|
76ea3c39a0 | ||
|
|
e67bd4811a | ||
|
|
7a215766c6 | ||
|
|
576f0a72c5 | ||
|
|
55b4597390 | ||
|
|
c64b3db6b8 | ||
|
|
67e77ca099 | ||
|
|
f726793711 | ||
|
|
1944f48516 | ||
|
|
992bcd89ef | ||
|
|
2356bc9905 | ||
|
|
9159d406e3 | ||
|
|
508eb7ab5f | ||
|
|
1de1852409 | ||
|
|
664506f79e | ||
|
|
06eb6838a9 | ||
|
|
f2a9f805b8 | ||
|
|
c6648a69ba | ||
|
|
3203d9a043 | ||
|
|
8599119c8d | ||
|
|
a3d6e7bcfe | ||
|
|
36702aafe7 | ||
|
|
b93938956e | ||
|
|
c96f10d40b | ||
|
|
8a9231628e | ||
|
|
66d66eb835 | ||
|
|
9a4dec64f9 | ||
|
|
94dc74a37f | ||
|
|
b24c1a51d3 | ||
|
|
c79a649d97 | ||
|
|
f9d1d14848 | ||
|
|
1a1d81de62 | ||
|
|
6c9321e50c | ||
|
|
c366e25a10 | ||
|
|
8ab97fbbf0 | ||
|
|
a5a66f6c3e | ||
|
|
1c6604806c | ||
|
|
39893609fd | ||
|
|
b9901bcb70 | ||
|
|
6571c78ed4 | ||
|
|
d1e6063650 | ||
|
|
42db1faa51 | ||
|
|
efc156fcf5 | ||
|
|
207675990e | ||
|
|
e8cd6e9d65 | ||
|
|
ab256e294e | ||
|
|
d9fd6aa05c | ||
|
|
57382c7cea | ||
|
|
1042291ad6 | ||
|
|
c9e4912a2a | ||
|
|
e5e1570aed | ||
|
|
621399c49b | ||
|
|
c3684109bf | ||
|
|
f3fedbfdba | ||
|
|
29a8bfb1dc | ||
|
|
004e190435 | ||
|
|
378c4f30f3 | ||
|
|
a8c877c841 | ||
|
|
8ce448cc77 | ||
|
|
4ba95277b9 | ||
|
|
cce7c7d782 | ||
|
|
9e5d5e0ea3 | ||
|
|
a235bec5f1 | ||
|
|
a3a8acfe6c | ||
|
|
9e4e9cab04 | ||
|
|
e4ad8def0d | ||
|
|
ec95948b69 | ||
|
|
ef6ff3cfa6 | ||
|
|
7bcfce5a7a | ||
|
|
08c04200fb | ||
|
|
8bbd0d5119 | ||
|
|
ade0fd4afa | ||
|
|
ed7ed818bb | ||
|
|
91f845c335 | ||
|
|
81ef12be9e | ||
|
|
2aafe9df9f | ||
|
|
3b933eabf5 | ||
|
|
f5ccf093d6 | ||
|
|
fe0da74e75 | ||
|
|
2939ab8ea4 | ||
|
|
dd90262db2 | ||
|
|
4f8e4b5f64 | ||
|
|
32068d8090 | ||
|
|
bd4979f5b0 | ||
|
|
a5e1e9646c | ||
|
|
013918a371 | ||
|
|
1b20694a1c | ||
|
|
2db6ad2c8a | ||
|
|
8c351d9255 | ||
|
|
c4ef42009c | ||
|
|
8d5426cdcd | ||
|
|
7b8ec0ad4b | ||
|
|
901e52615b | ||
|
|
88ce5fd0b6 | ||
|
|
588dede2a2 | ||
|
|
0efc5e82ec | ||
|
|
c3da9d8c8f | ||
|
|
a547526e86 | ||
|
|
09d647182d | ||
|
|
af3c0686c5 | ||
|
|
8b76ab93fb | ||
|
|
9ffc02b6e9 | ||
|
|
5d307d603c | ||
|
|
affc64c6da | ||
|
|
e00c20b288 | ||
|
|
dcf7ec2c3d | ||
|
|
21a31ec81d | ||
|
|
9287a0f5c5 | ||
|
|
4723eb2586 | ||
|
|
15ec6539e3 | ||
|
|
8d793521c4 | ||
|
|
2147542e33 | ||
|
|
a0af256641 | ||
|
|
21174dc9cf | ||
|
|
894726d699 | ||
|
|
f8e6033ae6 | ||
|
|
4abe1a77f4 | ||
|
|
79f3a6f60e | ||
|
|
a2c83144c0 | ||
|
|
6e0d372504 | ||
|
|
91ee9bd32a | ||
|
|
6ea25b8194 | ||
|
|
5bc4359a2f | ||
|
|
17d3eaa590 | ||
|
|
6ceb101ba1 | ||
|
|
f7f069a38b | ||
|
|
37c5dfa49f | ||
|
|
0260a6c234 | ||
|
|
2ad209b973 | ||
|
|
e9712fc24f | ||
|
|
eef52ea2d0 | ||
|
|
8018f4a000 | ||
|
|
9d0c7338ab | ||
|
|
18d8ef287d | ||
|
|
9b1fccd1fa | ||
|
|
32e96bdad1 | ||
|
|
c50f73b892 | ||
|
|
a1c948e591 | ||
|
|
db3e71bfcc | ||
|
|
2b436dced0 | ||
|
|
a89f9fa181 | ||
|
|
6063149b93 | ||
|
|
a28d15e519 | ||
|
|
94959110f6 | ||
|
|
86be161677 | ||
|
|
9313f7e80e | ||
|
|
43f1137565 | ||
|
|
ad4062969b | ||
|
|
60c10333aa | ||
|
|
0f84ce40f0 | ||
|
|
3894edcb98 | ||
|
|
5b387ba36a | ||
|
|
d011dccaab | ||
|
|
b7922368bd | ||
|
|
947a615707 | ||
|
|
b2d93b7b55 | ||
|
|
49a20a9ac5 | ||
|
|
8966172ce0 | ||
|
|
ddd48c420b | ||
|
|
f31e9ae19e | ||
|
|
4543008012 | ||
|
|
d54a648792 | ||
|
|
13a3f22001 | ||
|
|
75e80bc2ff | ||
|
|
386ae2067b | ||
|
|
b289de26a6 | ||
|
|
415f5baa1c | ||
|
|
3fdfbff09b | ||
|
|
163225e180 | ||
|
|
1369c2029b | ||
|
|
4f31d7504a | ||
|
|
585955eb19 | ||
|
|
1a5b2576f7 | ||
|
|
ddc4d76668 | ||
|
|
f5e400de69 | ||
|
|
9c8059ea96 | ||
|
|
c62db950f1 | ||
|
|
9c9953bb60 | ||
|
|
acaf15c5d2 | ||
|
|
25569db053 | ||
|
|
a391038d27 | ||
|
|
9ea45a71f5 | ||
|
|
ea39836b88 | ||
|
|
bfa01f5b3b | ||
|
|
23974d24c3 | ||
|
|
868947cbb4 | ||
|
|
cb942d7e81 | ||
|
|
05cf8d0edc | ||
|
|
071f15b570 | ||
|
|
e5a40fd745 | ||
|
|
f2ab4c0d0e | ||
|
|
0ba1a8e7bc | ||
|
|
ed0ca2b2d2 | ||
|
|
26404315cb | ||
|
|
be1958473b | ||
|
|
8b59875e93 | ||
|
|
accacd54f5 | ||
|
|
331a2046c8 | ||
|
|
c9f176f802 | ||
|
|
523798857b | ||
|
|
2edc8b16ae | ||
|
|
29902f48d5 | ||
|
|
d25a661701 | ||
|
|
a93d9ac71c | ||
|
|
c68af64fe5 | ||
|
|
3d9a4560d5 | ||
|
|
9120d40ce5 | ||
|
|
4db2aaffc4 | ||
|
|
155eb1ba58 | ||
|
|
efaf7ac622 | ||
|
|
6cc2205321 | ||
|
|
0a818f3f3f | ||
|
|
fe2c4af8c2 | ||
|
|
3e7dd30fd7 | ||
|
|
42f47f51b5 | ||
|
|
aea9e8efa2 | ||
|
|
a6cd67cc65 | ||
|
|
585ae28dd2 | ||
|
|
4abac92891 | ||
|
|
a813be7d54 | ||
|
|
e77957bc81 | ||
|
|
9b6f26c191 | ||
|
|
385cc3f497 | ||
|
|
c0db39594b | ||
|
|
add4cf4232 | ||
|
|
586d613a27 | ||
|
|
45334064b6 | ||
|
|
ca84a1a10e | ||
|
|
14008703f6 | ||
|
|
58edfbc485 | ||
|
|
fa555c1f09 | ||
|
|
75210b1ff6 | ||
|
|
b278751834 | ||
|
|
3b192ca490 | ||
|
|
12dd225db2 | ||
|
|
56d5f08128 | ||
|
|
256284d76f | ||
|
|
cf5ebd128c | ||
|
|
5b597028fe | ||
|
|
012d1fa8bd | ||
|
|
1b426b67e7 | ||
|
|
8d50049db7 | ||
|
|
cba9fb1a07 | ||
|
|
932fc8e3c7 | ||
|
|
5884cf88d3 | ||
|
|
d2157fa28c | ||
|
|
6e43f9bdd0 | ||
|
|
d9ed654f04 | ||
|
|
8090db2e75 | ||
|
|
652a946e09 | ||
|
|
d6d90f03a0 | ||
|
|
d7b3c7b681 | ||
|
|
c158771f59 | ||
|
|
63c4b2748c | ||
|
|
9bc3d6d315 | ||
|
|
1a59389261 | ||
|
|
221a9bab54 | ||
|
|
102fb8ec40 | ||
|
|
db89c4236a | ||
|
|
b1048556c6 | ||
|
|
11194f339d | ||
|
|
c95e847890 | ||
|
|
4daa7c23a0 | ||
|
|
3e8e751dc7 | ||
|
|
239474b01e | ||
|
|
12b579bc34 | ||
|
|
6d614e028a | ||
|
|
a234888d44 | ||
|
|
5e0a0765ce | ||
|
|
3af742f103 | ||
|
|
9452a389a5 | ||
|
|
766ef84af4 | ||
|
|
5b8d504817 | ||
|
|
61fe9fd1fe | ||
|
|
33ba1f25f3 | ||
|
|
2106eef4b2 | ||
|
|
23998ef720 | ||
|
|
1332381e2d | ||
|
|
7f98998765 | ||
|
|
5aef09ce5d | ||
|
|
69e15e9c7b | ||
|
|
9e1170fc56 | ||
|
|
5a36a26dd1 | ||
|
|
a92b310e0e | ||
|
|
b40344f1f0 | ||
|
|
36b32cad0f | ||
|
|
7b127c23f5 | ||
|
|
9acedb3408 | ||
|
|
5f54582692 | ||
|
|
63d8794902 | ||
|
|
ede9e5095d | ||
|
|
abd9778ef3 | ||
|
|
299e3fe957 | ||
|
|
3e7e251828 | ||
|
|
f2120672d0 | ||
|
|
d3ab2023ae | ||
|
|
cdcd139171 | ||
|
|
88e1780c68 | ||
|
|
68e10d7b53 | ||
|
|
378b655cd2 | ||
|
|
b7fa48a1eb | ||
|
|
eb652d53ac | ||
|
|
c53985c0bc | ||
|
|
f60c398f32 | ||
|
|
bb387cfe4b | ||
|
|
341e440c07 | ||
|
|
e6b9b67825 | ||
|
|
9c6183e6a0 | ||
|
|
2aaa6c6e04 | ||
|
|
80a5c53cb2 | ||
|
|
e4a71afe63 | ||
|
|
23ea7ecbcc | ||
|
|
5cdb35f508 | ||
|
|
03668116d7 | ||
|
|
f3d8a2bcb0 | ||
|
|
09ae961221 | ||
|
|
d015e97eae | ||
|
|
b4aecfbf23 | ||
|
|
df7f8259a1 | ||
|
|
fff71e449e | ||
|
|
d4003f9527 | ||
|
|
9acd2f5d22 | ||
|
|
d30605c09f | ||
|
|
9ff6d44178 | ||
|
|
90b163dc1d | ||
|
|
2d97126baf | ||
|
|
3f3160e220 | ||
|
|
065811cc46 | ||
|
|
e69956c9ea | ||
|
|
e96271a8a9 | ||
|
|
f0c9aa1585 | ||
|
|
ce269f8c6d | ||
|
|
4515d3e3cb | ||
|
|
c80da05e94 | ||
|
|
bef873e1f8 | ||
|
|
a5e3a74e93 | ||
|
|
d9290f2e03 | ||
|
|
98ffbaf87a | ||
|
|
1e1c0a9aa3 | ||
|
|
9979d4feb7 | ||
|
|
5f2d346b9b | ||
|
|
64a96b26ad | ||
|
|
0db1a7743d | ||
|
|
a641488b98 | ||
|
|
371cfc1cce | ||
|
|
46b0590e4e | ||
|
|
95393cde72 | ||
|
|
ea6846e2f9 | ||
|
|
9b22149509 | ||
|
|
ce1fc386a2 | ||
|
|
77bebe3000 | ||
|
|
9292d81052 | ||
|
|
e1985eeb4f | ||
|
|
53768c84d6 | ||
|
|
3c2840f7d1 | ||
|
|
32f6f359a4 | ||
|
|
0428de6285 | ||
|
|
92f0bf54f1 | ||
|
|
8fcfde1e42 | ||
|
|
e0dfc4c0b4 | ||
|
|
80a806aaad | ||
|
|
762d57fd88 | ||
|
|
732cb925e5 | ||
|
|
f59a3ca417 | ||
|
|
deb7591d1e | ||
|
|
82c54b1b54 | ||
|
|
8d942bcc86 | ||
|
|
c39d42cc62 | ||
|
|
51a45d745e | ||
|
|
544fc63b6b | ||
|
|
e06518c594 | ||
|
|
012a193685 | ||
|
|
dc2ab714f6 | ||
|
|
4c6fd79f07 | ||
|
|
293b42b9d4 | ||
|
|
88ab42cc15 | ||
|
|
7429a6bc8a | ||
|
|
89ca0dec5e | ||
|
|
9045657352 | ||
|
|
3984a58025 | ||
|
|
237d6f8689 | ||
|
|
79a7b7b1a3 | ||
|
|
b81345f063 | ||
|
|
87340ceca8 | ||
|
|
7a58813254 | ||
|
|
3d9c482eae | ||
|
|
5d97a293fe | ||
|
|
3c8ce640c4 | ||
|
|
efafd7c01c | ||
|
|
fb165dfec1 | ||
|
|
248c8a745c | ||
|
|
7c47bfd0db | ||
|
|
e96ea719d5 | ||
|
|
17cf4bf402 | ||
|
|
04c17995a2 | ||
|
|
4994a7ef6f | ||
|
|
e3d9ac4840 | ||
|
|
0c69f7649c | ||
|
|
84a3f6883d | ||
|
|
8f8c8e6614 | ||
|
|
1b4f997951 | ||
|
|
6e6185dba2 | ||
|
|
1f134fdb72 | ||
|
|
64b001a505 | ||
|
|
5f4d81866f | ||
|
|
19303f7bd7 | ||
|
|
a967caa91f | ||
|
|
3ce16227ba | ||
|
|
3e7351cb33 | ||
|
|
4021d7bf5c | ||
|
|
68472f90eb | ||
|
|
7ad658ee3a | ||
|
|
0ee5ff3aad | ||
|
|
9a0da3cd4f | ||
|
|
e3b547c8a9 | ||
|
|
e602ca1d66 | ||
|
|
01e2ea24da | ||
|
|
f5783ae1df | ||
|
|
49445f0663 | ||
|
|
27da2e10ff | ||
|
|
7d0e45b507 | ||
|
|
9b40d91a9b | ||
|
|
02c68c3a70 | ||
|
|
a0d09c9954 | ||
|
|
c7e3eae9dd | ||
|
|
70cc52e203 | ||
|
|
51849c6140 | ||
|
|
fe07c48431 | ||
|
|
d8f20f3642 | ||
|
|
828def3b25 | ||
|
|
97228a4249 | ||
|
|
3e3aff040e | ||
|
|
adc718f4d5 | ||
|
|
22c148a39e | ||
|
|
70cddcb9ca | ||
|
|
2b90790071 | ||
|
|
070272489d | ||
|
|
538d8a6fb4 | ||
|
|
c8be38e75d | ||
|
|
303a88730c | ||
|
|
26a1ba543f | ||
|
|
2e2a716710 | ||
|
|
4c7e19adeb | ||
|
|
59f053b1db | ||
|
|
dce35f453d | ||
|
|
3a416636f1 | ||
|
|
bbd033c254 | ||
|
|
22dc5b7416 | ||
|
|
40c73719c0 | ||
|
|
022792709d | ||
|
|
b9ec7ac886 | ||
|
|
32eb42a92f | ||
|
|
5d8b770e6c | ||
|
|
0fe18ae6dc | ||
|
|
d0dbd185ad | ||
|
|
e11a08064d | ||
|
|
e424112020 | ||
|
|
4a56dfcd00 | ||
|
|
6a8cd7090a | ||
|
|
c57d8995c6 | ||
|
|
37435365e2 | ||
|
|
94fc0febc7 | ||
|
|
6f58ef2394 | ||
|
|
177f8ed653 | ||
|
|
d4efb55492 | ||
|
|
ef270eb642 | ||
|
|
d1af73bfcb | ||
|
|
a3a0db447b | ||
|
|
3589537147 | ||
|
|
26b8a1fe1d | ||
|
|
609235b4f1 | ||
|
|
b3ad557dd2 | ||
|
|
9c7c279a5b | ||
|
|
f376d5d59c | ||
|
|
2493659b23 | ||
|
|
e1efacb399 | ||
|
|
05d793c34b | ||
|
|
86867dcbe3 | ||
|
|
c8eac04e9b | ||
|
|
d96dcfba59 | ||
|
|
690a317f4f | ||
|
|
9c4a0d2397 | ||
|
|
a2cba95a3a | ||
|
|
fd962869e6 | ||
|
|
7663da80c3 | ||
|
|
103077b686 | ||
|
|
fbef500fb3 | ||
|
|
37ee9752e1 | ||
|
|
a6572dd042 | ||
|
|
8a99d64139 | ||
|
|
1c0262a8c4 | ||
|
|
ee67d350e3 | ||
|
|
60e3a78221 | ||
|
|
b2105a113c | ||
|
|
c293a7a26d | ||
|
|
4dae13d7bc | ||
|
|
5140bb8d7f | ||
|
|
320a3b0834 | ||
|
|
79405c7cc9 | ||
|
|
99fa5d0252 | ||
|
|
b584e89d90 | ||
|
|
7f1491f884 | ||
|
|
9fbb8a8201 | ||
|
|
4aa5778606 | ||
|
|
338b404055 | ||
|
|
500ff629bf | ||
|
|
033a947631 | ||
|
|
c08c35df69 | ||
|
|
cefe42fd66 | ||
|
|
e0cd5edddb | ||
|
|
ebd1da2730 | ||
|
|
4bbcd5daef | ||
|
|
8d88ecb951 | ||
|
|
b5e1382232 | ||
|
|
8f5c72c510 | ||
|
|
c52453faa3 | ||
|
|
8c9aa2588c | ||
|
|
d03d29f6f5 | ||
|
|
77f8da275a | ||
|
|
0c6c0003b1 | ||
|
|
1c49d76fb7 | ||
|
|
714084bf5b | ||
|
|
2efdf56317 | ||
|
|
7fc09da482 | ||
|
|
d315a838bd | ||
|
|
6879c1f097 | ||
|
|
25860f6263 | ||
|
|
c52d4b7998 | ||
|
|
0c62967d8a | ||
|
|
f34db62940 | ||
|
|
b0ed8a5ba3 | ||
|
|
95ff769020 | ||
|
|
9b158f5926 | ||
|
|
29c2169012 | ||
|
|
56ef16b0f9 | ||
|
|
eeda097603 | ||
|
|
77e296ffef | ||
|
|
72d5dfed34 | ||
|
|
7f8caf1634 | ||
|
|
1871f39b2b | ||
|
|
6eae7acd34 | ||
|
|
36a5247181 | ||
|
|
153b8cbcc3 | ||
|
|
44a8ede94d | ||
|
|
529bb53d52 | ||
|
|
b35415637b | ||
|
|
35e42a2295 | ||
|
|
dbabb861f2 | ||
|
|
224bf07930 | ||
|
|
870ae030ca | ||
|
|
9ba39f65b3 | ||
|
|
3d8fe065b5 | ||
|
|
513381a322 | ||
|
|
c36f415793 | ||
|
|
3617e8e7a1 | ||
|
|
65cf77c32b | ||
|
|
e0ce5640d1 | ||
|
|
e7f369a765 | ||
|
|
58429bbc79 | ||
|
|
5fc39662ec | ||
|
|
4c73f026b2 | ||
|
|
932ad73441 | ||
|
|
bf0d694c71 | ||
|
|
a2e689aba3 | ||
|
|
c82eb39d54 | ||
|
|
a00256a61c | ||
|
|
842a15ee45 | ||
|
|
e7785c9ccb | ||
|
|
2b521ee201 | ||
|
|
ce27aad67b | ||
|
|
6784b9062e | ||
|
|
f23ecc6895 | ||
|
|
ae6b460f35 | ||
|
|
1ca28badad |
27
.builds/alpine.yml
Normal file
27
.builds/alpine.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
image: alpine/latest
|
||||||
|
packages:
|
||||||
|
- build-base
|
||||||
|
- sdl2-dev
|
||||||
|
- freetype-dev
|
||||||
|
- fontconfig-dev
|
||||||
|
- opus-dev
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure -8 --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-alpine-amd64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-alpine-amd64.tar.bz2
|
||||||
30
.builds/debian-arm64.yml
Normal file
30
.builds/debian-arm64.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
image: debian/sid
|
||||||
|
arch: amd64
|
||||||
|
packages:
|
||||||
|
- build-essential
|
||||||
|
- python-is-python3
|
||||||
|
- libsdl2-dev
|
||||||
|
- libfreetype-dev
|
||||||
|
- libfontconfig-dev
|
||||||
|
- libopus-dev
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure -8 --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-debian-arm64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-debian-arm64.tar.bz2
|
||||||
|
|
||||||
29
.builds/debian.yml
Normal file
29
.builds/debian.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
image: debian/sid
|
||||||
|
packages:
|
||||||
|
- build-essential
|
||||||
|
- python-is-python3
|
||||||
|
- libsdl2-dev
|
||||||
|
- libfreetype-dev
|
||||||
|
- libfontconfig-dev
|
||||||
|
- libopus-dev
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure -8 --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-debian-amd64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-debian-amd64.tar.bz2
|
||||||
|
|
||||||
29
.builds/freebsd.yml
Normal file
29
.builds/freebsd.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
image: freebsd/latest
|
||||||
|
packages:
|
||||||
|
- lang/python
|
||||||
|
- devel/pkgconf
|
||||||
|
- devel/sdl20
|
||||||
|
- print/freetype2
|
||||||
|
- x11-fonts/fontconfig
|
||||||
|
- audio/opus
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
./waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-freebsd-amd64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-freebsd-amd64.tar.bz2
|
||||||
|
|
||||||
29
.builds/netbsd.yml
Normal file
29
.builds/netbsd.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
image: netbsd/latest
|
||||||
|
packages:
|
||||||
|
- python311
|
||||||
|
- SDL2
|
||||||
|
- freetype2
|
||||||
|
- fontconfig
|
||||||
|
- libopus
|
||||||
|
- pkgconf
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
python3.11 waf configure --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
python3.11 waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-netbsd-amd64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-netbsd-amd64.tar.bz2
|
||||||
|
|
||||||
26
.builds/openbsd.yml
Normal file
26
.builds/openbsd.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
image: openbsd/latest
|
||||||
|
packages:
|
||||||
|
- python3
|
||||||
|
- sdl2
|
||||||
|
- opus
|
||||||
|
sources:
|
||||||
|
- https://git.sr.ht/~a1batross/xash3d-fwgs
|
||||||
|
tasks:
|
||||||
|
- client: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
python3 waf configure --enable-tests --enable-engine-tests build install --destdir=bin
|
||||||
|
- server: |
|
||||||
|
cd xash3d-fwgs
|
||||||
|
python3 waf configure --reconfigure --dedicated build install --destdir=bin
|
||||||
|
- run-tests: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
export SDL_VIDEODRIVER=wayland
|
||||||
|
./xash3d -runtests
|
||||||
|
./xash -runtests
|
||||||
|
rm -rf valve/gameinfo.txt test_*
|
||||||
|
- package: |
|
||||||
|
cd xash3d-fwgs/bin
|
||||||
|
tar -cjvf xash3d-fwgs-openbsd-amd64.tar.bz2 *
|
||||||
|
artifacts:
|
||||||
|
- xash3d-fwgs/bin/xash3d-fwgs-openbsd-amd64.tar.bz2
|
||||||
|
|
||||||
54
.cirrus.yml
54
.cirrus.yml
@@ -1,32 +1,48 @@
|
|||||||
task:
|
task:
|
||||||
name: freebsd-10-amd64
|
# Seems packages for it were removed from the mirrors
|
||||||
freebsd_instance:
|
# name: freebsd-12-amd64
|
||||||
image_family: freebsd-10-4
|
# freebsd_instance:
|
||||||
setup_script:
|
# image_family: freebsd-12-4
|
||||||
- pkg install -y git sdl2 python
|
# setup_script:
|
||||||
- git submodule update --init --recursive
|
# - pkg update
|
||||||
test_script:
|
# - pkg install -y pkgconf git sdl2 python fontconfig opus
|
||||||
# - ./scripts/build_freebsd_engine.sh dedicated
|
# - git submodule update --init --recursive
|
||||||
- ./scripts/build_freebsd_engine.sh
|
# test_script:
|
||||||
|
# - ./scripts/cirrus/build_freebsd.sh dedicated
|
||||||
|
# - ./scripts/cirrus/build_freebsd.sh full
|
||||||
|
|
||||||
task:
|
task:
|
||||||
name: freebsd-11-amd64
|
name: freebsd-13-amd64
|
||||||
freebsd_instance:
|
freebsd_instance:
|
||||||
image_family: freebsd-11-3
|
image_family: freebsd-13-2
|
||||||
setup_script:
|
setup_script:
|
||||||
- pkg install -y git sdl2 python
|
- pkg update
|
||||||
|
- pkg install -y pkgconf git sdl2 python fontconfig opus
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
test_script:
|
test_script:
|
||||||
# - ./scripts/build_freebsd_engine.sh dedicated
|
- ./scripts/cirrus/build_freebsd.sh dedicated
|
||||||
- ./scripts/build_freebsd_engine.sh
|
- ./scripts/cirrus/build_freebsd.sh full
|
||||||
|
|
||||||
task:
|
task:
|
||||||
name: freebsd-12-amd64
|
name: freebsd-14-amd64
|
||||||
freebsd_instance:
|
freebsd_instance:
|
||||||
image_family: freebsd-12-0
|
image_family: freebsd-14-0-snap
|
||||||
setup_script:
|
setup_script:
|
||||||
- pkg install -y git sdl2 python
|
- pkg update
|
||||||
|
- pkg install -y pkgconf git sdl2 python fontconfig opus
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
test_script:
|
test_script:
|
||||||
# - ./scripts/build_freebsd_engine.sh dedicated
|
- ./scripts/cirrus/build_freebsd.sh dedicated
|
||||||
- ./scripts/build_freebsd_engine.sh
|
- ./scripts/cirrus/build_freebsd.sh full
|
||||||
|
|
||||||
|
task:
|
||||||
|
name: freebsd-15-amd64
|
||||||
|
freebsd_instance:
|
||||||
|
image_family: freebsd-15-0-snap
|
||||||
|
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
|
||||||
|
|||||||
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*.c text eol=lf diff=cpp
|
||||||
|
*.h text eol=lf diff=cpp
|
||||||
|
wscript text eol=lf diff=python
|
||||||
128
.github/workflows/c-cpp.yml
vendored
Normal file
128
.github/workflows/c-cpp.yml
vendored
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
name: Build & Deploy Engine
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
# cleanup:
|
||||||
|
# runs-on: self-hosted
|
||||||
|
# steps:
|
||||||
|
# - name: Cleanup
|
||||||
|
# run: rm -rf .* || true
|
||||||
|
build:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
continue-on-error: true
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# Linux build specifically want oldest Ubuntu as possible
|
||||||
|
# to be crossdistribution compatible, otherwise use ubuntu-latest
|
||||||
|
- os: ubuntu-20.04
|
||||||
|
targetos: linux
|
||||||
|
targetarch: amd64
|
||||||
|
- os: ubuntu-20.04
|
||||||
|
targetos: linux
|
||||||
|
targetarch: i386
|
||||||
|
# - os: ubuntu-aarch64-20.04
|
||||||
|
# targetos: linux
|
||||||
|
# targetarch: aarch64
|
||||||
|
|
||||||
|
# - os: ubuntu-20.04
|
||||||
|
# targetos: android
|
||||||
|
# targetarch: 32
|
||||||
|
# - os: ubuntu-20.04
|
||||||
|
# targetos: android
|
||||||
|
# targetarch: 64
|
||||||
|
|
||||||
|
# - os: ubuntu-20.04
|
||||||
|
# targetos: motomagx
|
||||||
|
# targetarch: armv6
|
||||||
|
|
||||||
|
- os: ubuntu-latest
|
||||||
|
targetos: nswitch
|
||||||
|
targetarch: arm64
|
||||||
|
- os: ubuntu-latest
|
||||||
|
targetos: psvita
|
||||||
|
targetarch: armv7hf
|
||||||
|
- os: windows-latest
|
||||||
|
targetos: win32
|
||||||
|
targetarch: amd64
|
||||||
|
- os: windows-2019 # always use the oldest possible for 32-bit because of older compilers, and better support of certain legacy OSes
|
||||||
|
targetos: win32
|
||||||
|
targetarch: i386
|
||||||
|
env:
|
||||||
|
SDL_VERSION: 2.28.5
|
||||||
|
GH_CPU_ARCH: ${{ matrix.targetarch }}
|
||||||
|
ANDROID_SDK_TOOLS_VER: 4333796
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: bash scripts/gha/deps_${{ matrix.targetos }}.sh
|
||||||
|
- name: Build engine
|
||||||
|
run: bash scripts/gha/build_${{ matrix.targetos }}.sh
|
||||||
|
- name: Upload engine (artifacts)
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifact-${{ matrix.targetos }}-${{ matrix.targetarch }}
|
||||||
|
path: artifacts/*
|
||||||
|
flatpak:
|
||||||
|
name: "Flatpak"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- app: su.xash.Engine.Compat.i386
|
||||||
|
container:
|
||||||
|
image: bilelmoussaoui/flatpak-github-actions:freedesktop-22.08
|
||||||
|
options: --privileged
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Build flatpak (Compat.i386)
|
||||||
|
uses: FWGS/flatpak-github-actions/flatpak-builder@v6.1
|
||||||
|
with:
|
||||||
|
bundle: ${{ matrix.app }}.flatpak
|
||||||
|
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:
|
||||||
|
name: "Upload releases"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build, flatpak]
|
||||||
|
if: ${{ github.event_name == 'push' }}
|
||||||
|
steps:
|
||||||
|
- name: Remove old release
|
||||||
|
uses: FWGS/delete-tag-and-release@v0.2.1-dev
|
||||||
|
with:
|
||||||
|
tag_name: ${{ 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: |
|
||||||
|
cd artifacts/
|
||||||
|
for i in artifact-* su.xash.Engine.*; do
|
||||||
|
mv "$i"/* .
|
||||||
|
rm -rf "$i"
|
||||||
|
done
|
||||||
|
ls -R .
|
||||||
|
cd ../
|
||||||
|
sleep 20s
|
||||||
|
- name: Upload new release
|
||||||
|
uses: FWGS/action-gh-release@v0.1.15
|
||||||
|
with:
|
||||||
|
name: Xash3D FWGS Continuous ${{ github.ref_name }} Build
|
||||||
|
tag_name: ${{ github.ref_name == 'master' && 'continuous' || format('continuous-{0}', github.ref_name) }}
|
||||||
|
prerelease: true
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: artifacts/*
|
||||||
|
draft: false
|
||||||
16
.gitignore
vendored
16
.gitignore
vendored
@@ -60,6 +60,7 @@ Makefile.dep
|
|||||||
ALL_BUILD.*
|
ALL_BUILD.*
|
||||||
INSTALL.*
|
INSTALL.*
|
||||||
ZERO_CHECK.*
|
ZERO_CHECK.*
|
||||||
|
CMakeLists.txt
|
||||||
|
|
||||||
# Visual Studio
|
# Visual Studio
|
||||||
*.obj
|
*.obj
|
||||||
@@ -314,9 +315,8 @@ build-*
|
|||||||
|
|
||||||
# Waf
|
# Waf
|
||||||
build_current
|
build_current
|
||||||
.waf-*
|
*waf-*/
|
||||||
waf-*/
|
*waf3-*/
|
||||||
waf3-*/
|
|
||||||
.lock-waf*
|
.lock-waf*
|
||||||
*.lastbuildstate
|
*.lastbuildstate
|
||||||
*.unsuccessfulbuild
|
*.unsuccessfulbuild
|
||||||
@@ -327,3 +327,13 @@ __pycache__
|
|||||||
*.vcproj
|
*.vcproj
|
||||||
*.sln
|
*.sln
|
||||||
*.vcxproj
|
*.vcxproj
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode/*
|
||||||
|
*.code-workspace
|
||||||
|
.history/*
|
||||||
|
.cache/*
|
||||||
|
enc_temp_folder/
|
||||||
|
|
||||||
|
# KDevelop4
|
||||||
|
*.kdev4
|
||||||
|
|||||||
21
.gitmodules
vendored
21
.gitmodules
vendored
@@ -1,12 +1,21 @@
|
|||||||
[submodule "mainui"]
|
[submodule "mainui"]
|
||||||
path = mainui
|
path = 3rdparty/mainui
|
||||||
url = https://github.com/FWGS/mainui_cpp
|
url = https://github.com/FWGS/mainui_cpp
|
||||||
[submodule "ref_gl/nanogl"]
|
[submodule "ref_gl/nanogl"]
|
||||||
path = ref_gl/nanogl
|
path = 3rdparty/nanogl
|
||||||
url = https://github.com/FWGS/nanogl
|
url = https://github.com/FWGS/nanogl
|
||||||
[submodule "ref_gl/gl-wes-v2"]
|
[submodule "ref_gl/gl-wes-v2"]
|
||||||
path = ref_gl/gl-wes-v2
|
path = 3rdparty/gl-wes-v2
|
||||||
url = https://github.com/FWGS/gl-wes-v2
|
url = https://github.com/FWGS/gl-wes-v2
|
||||||
[submodule "vgui-dev"]
|
[submodule "ref_gl/gl4es"]
|
||||||
path = vgui-dev
|
path = 3rdparty/gl4es/gl4es
|
||||||
url = https://github.com/FWGS/vgui-dev
|
url = https://github.com/ptitSeb/gl4es
|
||||||
|
[submodule "vgui_support"]
|
||||||
|
path = 3rdparty/vgui_support
|
||||||
|
url = https://github.com/FWGS/vgui_support
|
||||||
|
[submodule "opus"]
|
||||||
|
path = 3rdparty/opus/opus
|
||||||
|
url = https://github.com/xiph/opus
|
||||||
|
[submodule "3rdparty/xash-extras"]
|
||||||
|
path = 3rdparty/extras/xash-extras
|
||||||
|
url = https://github.com/FWGS/xash-extras
|
||||||
|
|||||||
213
.travis.yml
213
.travis.yml
@@ -1,213 +0,0 @@
|
|||||||
language: c
|
|
||||||
compiler: gcc
|
|
||||||
sudo: false
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- SDL_VERSION=2.0.8
|
|
||||||
- DEPLOY_BRANCH=anewengine
|
|
||||||
git:
|
|
||||||
depth: 50
|
|
||||||
submodules: true
|
|
||||||
jdk:
|
|
||||||
- oraclejdk8
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- stage: init
|
|
||||||
name: "Initialize webdav cache"
|
|
||||||
os: linux
|
|
||||||
cache: false
|
|
||||||
script:
|
|
||||||
- sh scripts/yadisk_clear.sh
|
|
||||||
- stage: build
|
|
||||||
name: "Build for Windows MSVC"
|
|
||||||
cache: ccache
|
|
||||||
os: windows
|
|
||||||
before_script:
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_${TRAVIS_OS_NAME}_deps.sh
|
|
||||||
script:
|
|
||||||
- sh scripts/build_${TRAVIS_OS_NAME}_engine.sh
|
|
||||||
after_script:
|
|
||||||
- sh scripts/continious_upload.sh xash3d-vc.7z xash3d-vc2008-sln.7z
|
|
||||||
- # ...
|
|
||||||
name: "Build for Linux i686"
|
|
||||||
cache: ccache
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- gcc-multilib
|
|
||||||
- g++-multilib
|
|
||||||
- libx11-dev:i386
|
|
||||||
- libxext-dev:i386
|
|
||||||
- x11-utils
|
|
||||||
- libgl1-mesa-dev
|
|
||||||
- libasound-dev
|
|
||||||
- libstdc++6:i386
|
|
||||||
- libfuse2:i386
|
|
||||||
- zlib1g:i386
|
|
||||||
- unzip
|
|
||||||
before_script:
|
|
||||||
- export ARCH=i686
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_${TRAVIS_OS_NAME}_deps.sh
|
|
||||||
script:
|
|
||||||
- sh scripts/build_${TRAVIS_OS_NAME}_engine.sh full
|
|
||||||
- sh scripts/build_${TRAVIS_OS_NAME}_engine.sh dedicated
|
|
||||||
after_script:
|
|
||||||
- ccache --show-stats
|
|
||||||
- sh scripts/continious_upload.sh xash3d-fwgs-${ARCH}.AppImage xashds-linux-${ARCH}
|
|
||||||
- # ...
|
|
||||||
name: "Build for Android"
|
|
||||||
cache: ccache
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
language: java # we want xenial, so just java, not android
|
|
||||||
jdk: openjdk8
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- clang-9
|
|
||||||
- lld-9
|
|
||||||
- p7zip-full
|
|
||||||
sources:
|
|
||||||
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
|
|
||||||
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
|
|
||||||
before_script:
|
|
||||||
- export ANDROID_HOME=$TRAVIS_BUILD_DIR/sdk
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_android_deps.sh r10e
|
|
||||||
- export ANDROID_SDK_HOME=$ANDROID_HOME
|
|
||||||
- export ANDROID_NDK_HOME=$ANDROID_SDK_HOME/ndk-bundle
|
|
||||||
script:
|
|
||||||
- cd android
|
|
||||||
- export ARCHS="armeabi armeabi-v7a x86"
|
|
||||||
- export TOOLCHAIN="host"
|
|
||||||
- sh compile.sh release
|
|
||||||
after_script:
|
|
||||||
- ccache --show-stats
|
|
||||||
- sh ../scripts/continious_upload.sh xashdroid.apk
|
|
||||||
- # ...
|
|
||||||
name: "Build for Android 64"
|
|
||||||
cache: ccache
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
language: java # we want xenial, so just java, not android
|
|
||||||
jdk: openjdk8
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- clang-9
|
|
||||||
- lld-9
|
|
||||||
- p7zip-full
|
|
||||||
sources:
|
|
||||||
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
|
|
||||||
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
|
|
||||||
before_script:
|
|
||||||
- export ANDROID_HOME=$TRAVIS_BUILD_DIR/sdk
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_android_deps.sh r10e
|
|
||||||
- export ANDROID_SDK_HOME=$ANDROID_HOME
|
|
||||||
- export ANDROID_NDK_HOME=$ANDROID_SDK_HOME/ndk-bundle
|
|
||||||
script:
|
|
||||||
- cd android
|
|
||||||
- export ARCHS="aarch64 x86_64"
|
|
||||||
- export API=21
|
|
||||||
- export TOOLCHAIN="host"
|
|
||||||
- sh compile.sh release
|
|
||||||
after_script:
|
|
||||||
- ccache --show-stats
|
|
||||||
- mv xashdroid.apk xashdroid-64-test.apk
|
|
||||||
- sh ../scripts/continious_upload.sh xashdroid-64-test.apk
|
|
||||||
- # ...
|
|
||||||
name: "Build for Linux amd64"
|
|
||||||
cache: ccache
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libx11-dev
|
|
||||||
- libxext-dev
|
|
||||||
- x11-utils
|
|
||||||
- libgl1-mesa-dev
|
|
||||||
- libasound-dev
|
|
||||||
- libstdc++6
|
|
||||||
- libfuse2
|
|
||||||
- unzip
|
|
||||||
before_script:
|
|
||||||
- export ARCH=x86_64
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_${TRAVIS_OS_NAME}_deps.sh
|
|
||||||
script:
|
|
||||||
- sh scripts/build_${TRAVIS_OS_NAME}_engine.sh full
|
|
||||||
- sh scripts/build_${TRAVIS_OS_NAME}_engine.sh dedicated
|
|
||||||
after_script:
|
|
||||||
- ccache --show-stats
|
|
||||||
- sh scripts/continious_upload.sh xash3d-fwgs-${ARCH}.AppImage xashds-linux-${ARCH}
|
|
||||||
# - # ...
|
|
||||||
# name: "Build for Windows MinGW"
|
|
||||||
# cache: ccache
|
|
||||||
# os: linux
|
|
||||||
# dist: xenial
|
|
||||||
# addons:
|
|
||||||
# apt:
|
|
||||||
# packages:
|
|
||||||
# - mingw-w64-i686-dev
|
|
||||||
# - binutils-mingw-w64-i686
|
|
||||||
# - gcc-mingw-w64-i686
|
|
||||||
# - g++-mingw-w64-i686
|
|
||||||
# - p7zip-full
|
|
||||||
# before_script:
|
|
||||||
# - sh scripts/travis_common_deps.sh
|
|
||||||
# - sh scripts/travis_mingw_deps.sh
|
|
||||||
# script:
|
|
||||||
# - sh scripts/build_mingw_engine.sh
|
|
||||||
# after_script:
|
|
||||||
# - ccache --show-stats
|
|
||||||
# - sh scripts/continious_upload.sh xash3d-mingw.7z
|
|
||||||
# - # ...
|
|
||||||
# name: "Build for OSX"
|
|
||||||
# cache: ccache
|
|
||||||
# os: osx
|
|
||||||
# before_script:
|
|
||||||
# - sh scripts/travis_common_deps.sh
|
|
||||||
# - sh scripts/travis_${TRAVIS_OS_NAME}_deps.sh
|
|
||||||
# script:
|
|
||||||
# - sh scripts/build_${TRAVIS_OS_NAME}_engine.sh
|
|
||||||
# after_script:
|
|
||||||
# - sh scripts/continious_upload.sh xash3d-osx.tar.bz2
|
|
||||||
- # ...
|
|
||||||
name: "Build for MotoMAGX"
|
|
||||||
sudo: true
|
|
||||||
cache: ccache
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- libc6:i386
|
|
||||||
- libstdc++6:i386
|
|
||||||
- gcc-multilib
|
|
||||||
- g++-multilib
|
|
||||||
- p7zip-full
|
|
||||||
sources:
|
|
||||||
- sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
|
|
||||||
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
|
|
||||||
before_script:
|
|
||||||
- sh scripts/travis_common_deps.sh
|
|
||||||
- sh scripts/travis_motomagx_deps.sh
|
|
||||||
script:
|
|
||||||
- sh scripts/build_motomagx_engine.sh
|
|
||||||
after_script:
|
|
||||||
- cd $TRAVIS_BUILD_DIR
|
|
||||||
- ccache --show-stats
|
|
||||||
- sh scripts/continious_upload.sh xash3d-magx.7z
|
|
||||||
- stage: deploy
|
|
||||||
name: "Deploy to github repo"
|
|
||||||
os: linux
|
|
||||||
cache: false
|
|
||||||
script:
|
|
||||||
- sh scripts/travis-deploy.sh xash3d-fwgs-i686.AppImage xash3d-fwgs-x86_64.AppImage xash3d-vc.7z xash3d-vc2008-sln.7z xashdroid.apk xashdroid-64-test.apk xashds-linux-i686 xashds-linux-x86_64 xash3d-magx.7z
|
|
||||||
29
3rdparty/extras/wscript
vendored
Normal file
29
3rdparty/extras/wscript
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
def options(opt):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def configure(conf):
|
||||||
|
if not conf.path.find_dir('xash-extras'):
|
||||||
|
conf.fatal('Can\'t find xash-extras submodule.')
|
||||||
|
return
|
||||||
|
|
||||||
|
conf.load('zip')
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
srcdir = bld.path.find_dir('xash-extras')
|
||||||
|
|
||||||
|
if bld.env.DEST_OS in ['android']:
|
||||||
|
install_path = bld.env.PREFIX
|
||||||
|
else:
|
||||||
|
install_path = os.path.join(bld.env.SHAREDIR, bld.env.GAMEDIR)
|
||||||
|
|
||||||
|
bld(features='zip',
|
||||||
|
name = 'extras.pk3',
|
||||||
|
files = srcdir.ant_glob('**/*'),
|
||||||
|
relative_to = srcdir,
|
||||||
|
compresslevel = 0,
|
||||||
|
install_path = install_path)
|
||||||
1
3rdparty/extras/xash-extras
vendored
Submodule
1
3rdparty/extras/xash-extras
vendored
Submodule
Submodule 3rdparty/extras/xash-extras added at 853f633be1
1
3rdparty/gl-wes-v2
vendored
Submodule
1
3rdparty/gl-wes-v2
vendored
Submodule
Submodule 3rdparty/gl-wes-v2 added at 2d9b5afe10
1
3rdparty/gl4es/gl4es
vendored
Submodule
1
3rdparty/gl4es/gl4es
vendored
Submodule
Submodule 3rdparty/gl4es/gl4es added at 5226f5f937
24
3rdparty/gl4es/wscript
vendored
Normal file
24
3rdparty/gl4es/wscript
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
def options(opt):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def configure(conf):
|
||||||
|
if not conf.path.find_dir('gl4es') or not conf.path.find_dir('gl4es/src'):
|
||||||
|
conf.fatal('Can\'t find gl4es submodule. Run `git submodule update --init --recursive`.')
|
||||||
|
return
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
gl4es_srcdir = bld.path.find_node('gl4es/src')
|
||||||
|
|
||||||
|
bld.stlib(source = gl4es_srcdir.ant_glob(['gl/*.c', 'gl/*/*.c', 'glx/hardext.c']),
|
||||||
|
target = 'gl4es',
|
||||||
|
features = 'c',
|
||||||
|
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'],
|
||||||
|
cflags = ['-w', '-fvisibility=hidden', '-std=gnu99'],
|
||||||
|
subsystem = bld.env.MSVC_SUBSYSTEM,
|
||||||
|
export_includes = '.')
|
||||||
1
3rdparty/mainui
vendored
Submodule
1
3rdparty/mainui
vendored
Submodule
Submodule 3rdparty/mainui added at 46d05f9ff5
1
3rdparty/nanogl
vendored
Submodule
1
3rdparty/nanogl
vendored
Submodule
Submodule 3rdparty/nanogl added at 76393a8fde
1
3rdparty/opus/opus
vendored
Submodule
1
3rdparty/opus/opus
vendored
Submodule
Submodule 3rdparty/opus/opus added at 8cf872a186
40
3rdparty/opus/wscript
vendored
Normal file
40
3rdparty/opus/wscript
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
def options(opt):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def configure(conf):
|
||||||
|
if not conf.path.find_dir('opus') or not conf.path.find_dir('opus/src'):
|
||||||
|
conf.fatal('Can\'t find opus submodule. Run `git submodule update --init --recursive`.')
|
||||||
|
return
|
||||||
|
|
||||||
|
# TODO: ARM/x86 intrinsics detection
|
||||||
|
# TODO: maybe call autotools/cmake/meson instead?
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
sources = bld.path.ant_glob([
|
||||||
|
'opus/src/*.c',
|
||||||
|
'opus/celt/*.c',
|
||||||
|
'opus/silk/*.c',
|
||||||
|
'opus/silk/float/*.c'
|
||||||
|
], excl = [
|
||||||
|
'opus/src/repacketizer_demo.c',
|
||||||
|
'opus/src/opus_demo.c',
|
||||||
|
'opus/src/opus_compare.c',
|
||||||
|
'opus/celt/opus_custom_demo.c'
|
||||||
|
])
|
||||||
|
includes = ['opus/include/', 'opus/celt/', 'opus/silk/', 'opus/silk/float/']
|
||||||
|
defines = ['USE_ALLOCA', 'OPUS_BUILD', 'FLOAT_APPROX', 'PACKAGE_VERSION="1.3.1"', 'CUSTOM_MODES']
|
||||||
|
|
||||||
|
bld.stlib(
|
||||||
|
source = sources,
|
||||||
|
target = 'opus',
|
||||||
|
features = 'c',
|
||||||
|
includes = includes,
|
||||||
|
defines = defines,
|
||||||
|
subsystem = bld.env.MSVC_SUBSYSTEM,
|
||||||
|
export_includes = ['opus/include/']
|
||||||
|
)
|
||||||
1
3rdparty/vgui_support
vendored
Submodule
1
3rdparty/vgui_support
vendored
Submodule
Submodule 3rdparty/vgui_support added at a2a7b9073f
17
Documentation/bug-compatibility.md
Normal file
17
Documentation/bug-compatibility.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Bug-compatibility in Xash3D FWGS
|
||||||
|
|
||||||
|
Xash3D FWGS has special mode for games that rely on original engine bugs.
|
||||||
|
|
||||||
|
In this mode, we emulate the behaviour of selected functions that may help running mods relying on engine bugs, but enabling them by default may break majority of other games.
|
||||||
|
|
||||||
|
At this time, we only have implemented GoldSrc bug-compatibility. It can be enabled with `-bugcomp` command line switch.
|
||||||
|
|
||||||
|
## GoldSrc bug-compatibility
|
||||||
|
|
||||||
|
### Emulated bugs
|
||||||
|
|
||||||
|
* `pfnPEntityOfEntIndex` in GoldSrc returns NULL for last player due to incorrect player index comparison
|
||||||
|
|
||||||
|
### Games and mods that require this
|
||||||
|
|
||||||
|
* Counter-Strike: Condition Zero - Deleted Scenes
|
||||||
9
Documentation/cross-compiling-for-windows-with-wine.md
Normal file
9
Documentation/cross-compiling-for-windows-with-wine.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Cross-compiling for Windows with Wine
|
||||||
|
|
||||||
|
This can be useful to test engine in Wine without using virtual machines or dual-booting to Windows.
|
||||||
|
|
||||||
|
0. Clone and install https://github.com/mstorsjo/msvc-wine (you can skip CMake part)
|
||||||
|
1. Set environment variable MSVC_WINE_PATH to the path to installed MSVC toolchain
|
||||||
|
2. Pre-load wine: `wineserver -k; wineserver -p; wine64 wineboot`
|
||||||
|
3. Run `./waf configure -T <build-type> --enable-wine-msvc --sdl2=../SDL2_VC`. Configuration step will take more time than usual.
|
||||||
|
4. .. other typical steps to build from console ...
|
||||||
10
Documentation/debugging-using-minidumps.md
Normal file
10
Documentation/debugging-using-minidumps.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Debugging your mod using minidump files (Windows only)
|
||||||
|
Minidump files is awesome instrument for debugging your mod after it's being released, or for catch specific crashes which are presented only in one specific configuration, but doesn't happens in other configurations or even on developer machine. It contains a lot of information useful for debugging, and therefore it size is not so small: around hundreds or even thousands of megabytes. But this is not a problem, since minidump files compresses very effectively using common algorithms.
|
||||||
|
There are short algorithm, explaining how to use this debugging instrument:
|
||||||
|
|
||||||
|
1. User starts your mod with `-minidumps` startup parameter
|
||||||
|
2. Finally, crash happened on user's machine, and minidump file being written. This file has `.mdmp` extension and located in same folder, where mod folder located
|
||||||
|
3. User packs this minidump file to .zip/.7z archive, and somehow sends it to developer
|
||||||
|
4. Developer just opens minidump file in Visual Studio, then a virtual debugging session is opened and now reasons of crash is pretty easy to detect: you can see call stack, local function variables and global variables, information about exception and a lot of other information
|
||||||
|
|
||||||
|
You can find more information about minidumps in this [awesome article](https://learn.microsoft.com/en-us/windows/win32/dxtecharts/crash-dump-analysis?source=recommendations#writing-a-minidump).
|
||||||
24
Documentation/donate.md
Normal file
24
Documentation/donate.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Developers donation page
|
||||||
|
|
||||||
|
On this page you can find links where you can support each developer individually, who has provided public sponsorship information.
|
||||||
|
|
||||||
|
### [a1batross](https://github.com/a1batross)
|
||||||
|
|
||||||
|
* Initial Xash3D SDL2/Linux port author, Xash3D FWGS engine maintainer, creator of non-commercial Flying With Gauss organization.
|
||||||
|
* Boosty page: https://boosty.to/a1ba
|
||||||
|
|
||||||
|
### [nekonomicon](https://github.com/nekonomicon)
|
||||||
|
|
||||||
|
* [hlsdk-portable](https://github.com/FWGS/hlsdk-portable), [mdldec](../utils/mdldec), [opensource-mods.md](opensource-mods.md) maintainer and Xash3D FWGS [contributor](https://github.com/FWGS/xash3d-fwgs/commits?author=nekonomicon) (*BSD/clang port, PNG support, etc).
|
||||||
|
* Boosty page: https://boosty.to/nekonomicon
|
||||||
|
|
||||||
|
### [Velaron](https://github.com/Velaron)
|
||||||
|
* [cs16-client](https://github.com/Velaron/cs16-client) & [tf15-client](https://github.com/Velaron/tf15-client) maintainer and Xash3D FWGS [contributor](https://github.com/FWGS/xash3d-fwgs/commits?author=Velaron) (Android port, voice chat, etc).
|
||||||
|
* BuyMeACoffee page: https://www.buymeacoffee.com/velaron
|
||||||
|
|
||||||
|
### [SNMetamorph](https://github.com/SNMetamorph)
|
||||||
|
* [PrimeXT](https://github.com/SNMetamorph/PrimeXT) & [GoldSrc Monitor](https://github.com/SNMetamorph/goldsrc-monitor) maintainer and Xash3D FWGS [contributor](https://github.com/FWGS/xash3d-fwgs/commits?author=SNMetamorph) (Windows port, voice chat, etc).
|
||||||
|
* BTC: `16GAzK3qei5AwBW7sggXp3yNcFHBtdpxXj`
|
||||||
|
* ETH (ERC20): `0xb580eeca9756e3881f9d6d026e28db28eb72a383`
|
||||||
|
* USDT (ERC20): `0xb580eeca9756e3881f9d6d026e28db28eb72a383`
|
||||||
|
* USDC (ERC20): `0xb580eeca9756e3881f9d6d026e28db28eb72a383`
|
||||||
150
Documentation/entity-tools.md
Normal file
150
Documentation/entity-tools.md
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
# There are few new commands availiable in xash3d fork:
|
||||||
|
|
||||||
|
## Commands:
|
||||||
|
### ent_create
|
||||||
|
Create entity with specified classname and key/values
|
||||||
|
|
||||||
|
`ent_create <classname> <key> <value> <key> <value> ...`
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
`ent_create monster_zombie targetname zomb1`
|
||||||
|
|
||||||
|
after creating entity, ent_last_xxx cvars are set to new entity and ent_last_cb called, look at ent_getvars description
|
||||||
|
|
||||||
|
### ent_fire
|
||||||
|
|
||||||
|
Make some actions on entity
|
||||||
|
|
||||||
|
`ent_fire <pattern> <command> <args>`
|
||||||
|
Availiavle commands:
|
||||||
|
* Set fields (Only set entity field, does not call any functions):
|
||||||
|
* health
|
||||||
|
* gravity
|
||||||
|
* movetype
|
||||||
|
* solid
|
||||||
|
* rendermode
|
||||||
|
* rendercolor (vector)
|
||||||
|
* renderfx
|
||||||
|
* renderamt
|
||||||
|
* hullmin (vector)
|
||||||
|
* hullmax (vector)
|
||||||
|
* Actions
|
||||||
|
* rename: set entity targetname
|
||||||
|
* settarget: set entity target (only targetnames)
|
||||||
|
* setmodel: set entity model (does not update)
|
||||||
|
* set: set key/value by server library
|
||||||
|
* See game FGD to get list.
|
||||||
|
* command takes two arguments
|
||||||
|
* touch: touch entity by current player.
|
||||||
|
* use: use entity by current player.
|
||||||
|
* movehere: place entity in player fov.
|
||||||
|
* drop2floor: place entity to nearest floor surface
|
||||||
|
* moveup: move entity to 25 units up
|
||||||
|
* moveup (value): move by y axis relatively to specified value
|
||||||
|
* Flags (Set/clear specified flag bit, arg is bit number):
|
||||||
|
* setflag
|
||||||
|
* clearflag
|
||||||
|
* setspawnflag
|
||||||
|
* clearspawnflag
|
||||||
|
|
||||||
|
### ent_info
|
||||||
|
Print information about entity by identificator
|
||||||
|
|
||||||
|
`ent_info <identificator>`
|
||||||
|
|
||||||
|
### ent_getvars
|
||||||
|
Set client cvars containing entity information (useful for [[Scripting]]) and call ent_last_cb
|
||||||
|
|
||||||
|
`ent_getvars <identificator>`
|
||||||
|
|
||||||
|
These cvars are set:
|
||||||
|
```
|
||||||
|
ent_last_name
|
||||||
|
ent_last_num
|
||||||
|
ent_last_inst
|
||||||
|
ent_last_origin
|
||||||
|
ent_last_class
|
||||||
|
```
|
||||||
|
|
||||||
|
### ent_list
|
||||||
|
Print short information about antities, filtered by pattern
|
||||||
|
|
||||||
|
`ent_list <pattern>`
|
||||||
|
|
||||||
|
## Syntax description
|
||||||
|
|
||||||
|
### \<identificator\>
|
||||||
|
|
||||||
|
* !cross: entity under aim
|
||||||
|
* Instance code: !\<number\>_\<seria\l>
|
||||||
|
* set by ent_getvars command
|
||||||
|
* Entity index
|
||||||
|
* targetname pattern
|
||||||
|
|
||||||
|
### \<pattern\>
|
||||||
|
|
||||||
|
Pattern is like identificator, but may filter many entities by classname
|
||||||
|
|
||||||
|
### (vector)
|
||||||
|
|
||||||
|
used by ent_fire command. vector means three float values, entered without quotes
|
||||||
|
|
||||||
|
### key/value
|
||||||
|
|
||||||
|
All entities parameters may be set by specifiing key and value strings.
|
||||||
|
|
||||||
|
Originally, this mechanizm is used in map/bsp format, but it can be used in enttools too.
|
||||||
|
|
||||||
|
Keys and values are passed to server library and processed by entity keyvalue function, setting edict and entity owns parameters.
|
||||||
|
|
||||||
|
If value contains spaces, it must be put in quotes:
|
||||||
|
|
||||||
|
`ent_fire !cross set origin "0 0 0"`
|
||||||
|
|
||||||
|
## Using with scripting
|
||||||
|
|
||||||
|
ent_create and ent_getvars commands are setting cvars on client
|
||||||
|
|
||||||
|
It can be used with ent_last_cb alias that is executed after setting cvars.
|
||||||
|
|
||||||
|
Simple example:
|
||||||
|
|
||||||
|
```
|
||||||
|
ent_create weapon_c4
|
||||||
|
alias ent_last_cb "ent_fire \$ent_last_inst use"
|
||||||
|
```
|
||||||
|
|
||||||
|
Use weapon_c4 after creating it.
|
||||||
|
|
||||||
|
Note that you cannot use many dfferent callbacks at the same time.
|
||||||
|
|
||||||
|
You can set entity name by by pattern and create special script, contatning all callbacks.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
example.cfg
|
||||||
|
```
|
||||||
|
alias ent_last_cb exec entity_cb.cfg
|
||||||
|
ent create \<class\> targetname my_ent1_$name
|
||||||
|
ent_create \<class\> targetname my_ent2_$name
|
||||||
|
```
|
||||||
|
entity_cb.cfg
|
||||||
|
```
|
||||||
|
if $ent_last_name == my_ent1_$name
|
||||||
|
:(ent1 actions)
|
||||||
|
if $ent_last_name == my_ent2_$name
|
||||||
|
:(ent2 actions)
|
||||||
|
```
|
||||||
|
Note that scripting cannot be blocking. You cannot wait for server answer and continue. But you can use small scripts, connected with ent_last_cb command. The best usage is user interaction. You can add touch buttons to screen or call user command menu actions by callbacks.
|
||||||
|
## Server side
|
||||||
|
|
||||||
|
To enable entity tools on server, set sv_enttools_enable to 1
|
||||||
|
|
||||||
|
To change maximum number of entities, touched by ent_fire, change sv_enttools_maxfire to required number.
|
||||||
|
|
||||||
|
To enable actions on players, set sv_enttools_players to 1.
|
||||||
|
|
||||||
|
To enable entity tools for player by nickname, set sv_enttools_godplayer to nickname. Useful to temporary enable from rcon.
|
||||||
|
|
||||||
|
To prevent crash on some actions, set host_mapdesign_fatal to 0
|
||||||
8
Documentation/extensions/expanded-common-structures.md
Normal file
8
Documentation/extensions/expanded-common-structures.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Expanded structures that used by engine and mods
|
||||||
|
To make porting and developing mods on 64-bit platforms less painful, we decided to expand size of several structures.
|
||||||
|
This information important in case you are using codebase like XashXT, Paranoia 2: Savior and want to compile your mod for platform with 64-bit pointer size: you should replace old definitions with new ones, otherwise your mod will not work with Xash3D FWGS (typically, it's just crashing when starting map).
|
||||||
|
| Structure name | Locates in file | Original size on 64-bit | Current size on 64-bit |
|
||||||
|
|----------------|-----------------|-------------------------|------------------------|
|
||||||
|
|`mfaceinfo_t` | `common/com_model.h` | 176 bytes | 304 bytes |
|
||||||
|
|`decal_s` | `common/com_model.h` | 72 bytes | 88 bytes |
|
||||||
|
|`mextrasurf_t` | `common/com_model.h` | 376 bytes | 504 bytes |
|
||||||
@@ -31,11 +31,14 @@ Issue #0. Inconsistency between ABI and Q_buildarch.\
|
|||||||
Resolution: Change Q_buildarch return value to use Debian-styled architectures list: https://www.debian.org/ports/, which includes a special naming for big/little-endian and hard/soft-float ARM.
|
Resolution: Change Q_buildarch return value to use Debian-styled architectures list: https://www.debian.org/ports/, which includes a special naming for big/little-endian and hard/soft-float ARM.
|
||||||
|
|
||||||
Issue #1: Build-system integration.\
|
Issue #1: Build-system integration.\
|
||||||
Resolution: implemented as [LibraryNaming.cmake](https://github.com/FWGS/hlsdk-xash3d/blob/master/cmake/LibraryNaming.cmake) and [library_naming.py](https://github.com/FWGS/hlsdk-xash3d/blob/master/scripts/waifulib/library_naming.py) extensions, see
|
Resolution: implemented as [LibraryNaming.cmake](https://github.com/FWGS/hlsdk-portable/blob/master/cmake/LibraryNaming.cmake) and [library_naming.py](https://github.com/FWGS/hlsdk-portable/blob/master/scripts/waifulib/library_naming.py) extensions, see
|
||||||
|
|
||||||
Issue #2(related to #0): Which ARM flavours we actually need to handle?\
|
Issue #2(related to #0): Which ARM flavours we actually need to handle?\
|
||||||
Resolution: Little-endian only, as there is no known big-endian ARM platforms in the wild.
|
Resolution: Little-endian only, as there is no known big-endian ARM platforms in the wild.
|
||||||
Architecture is coded this way:
|
Architecture is coded this way:
|
||||||
* ```armvxy```, where `x` is ARM instruction set level and `y` is hard-float ABI presence: `hf` where hard float ABI used, otherwise `l`.
|
* ```armvxy```, where `x` is ARM instruction set level and `y` is hard-float ABI presence: `hf` where hard float ABI used, otherwise `l`.
|
||||||
|
|
||||||
|
Issue #3: Some mods (like The Specialists, Tyrian, ...) already apply suffixes _i386, _i686 to the gamedll path:\
|
||||||
|
Resolution: On x86 on **Win/Lin/Mac**, don't change anything. Otherwise, strip the _i?86 part and follow the usual scheme.
|
||||||
|
|
||||||
See discussion: https://github.com/FWGS/xash3d-fwgs/issues/39
|
See discussion: https://github.com/FWGS/xash3d-fwgs/issues/39
|
||||||
|
|||||||
22
Documentation/extensions/mp3-loops.md
Normal file
22
Documentation/extensions/mp3-loops.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
## Looping MP3 extension
|
||||||
|
|
||||||
|
It is now possible to loop MP3 file in Xash3D FWGS by adding a custom text tag with `LOOP_START` or `LOOPSTART` in description and time point (in raw samples) in value.
|
||||||
|
|
||||||
|
### Example with foobar2000
|
||||||
|
1. Open Foobar2000
|
||||||
|
2. Add your .mp3 file to playlist
|
||||||
|
3. Right click to newly added file and select Properties
|
||||||
|
4. In Metadata tab, at the bottom of the table, select "+add new"
|
||||||
|
5. In newly added line replace `<60>input field name<6D>` with `LOOP_START` (without any symbols).
|
||||||
|
6. Press Tab and enter loop time point in raw samples. For example, `0` will replay sound file from beginning to end indefinitely.
|
||||||
|
|
||||||
|
### Possible alternatives
|
||||||
|
1. Classic WAV files looping. HQ WAV files can take too much disk space, and recommended software supporting cue points is paid, outdated and can't run on modern systems. (Although there is alternative that's proven to work with idTech-based engines called LoopAuditioneer.)
|
||||||
|
2. Vorbis looping through comment. Engine doesn't support Vorbis but this extension was highly inspired by this hack.
|
||||||
|
|
||||||
|
### Known bugs and limitations
|
||||||
|
1. At this time using MP3 as SFX requires complete decoding. This can cause noticeable stutters, so keep MP3 file length in mind.
|
||||||
|
2. We deliberately only support modern ID3v2.3 and ID3v2.4 tags. Using ID3v1 is not possible.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
65
Documentation/extensions/sounds.lst.md
Normal file
65
Documentation/extensions/sounds.lst.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# sounds.lst.md
|
||||||
|
|
||||||
|
Using sounds.lst located in scripts folder, modder can override some of the hardcoded sounds in temp entities and server physics.
|
||||||
|
|
||||||
|
File format:
|
||||||
|
```
|
||||||
|
<group name>
|
||||||
|
{
|
||||||
|
<path1>
|
||||||
|
<path2>
|
||||||
|
<path3>
|
||||||
|
}
|
||||||
|
|
||||||
|
<group2 name> <path with %d> <min number> <max number>
|
||||||
|
```
|
||||||
|
|
||||||
|
* Sounds can use any supported sound format (WAV or MP3).
|
||||||
|
* The path must be relative to the sounds/ folder in the game or base directory root, addon folder, or archive root.
|
||||||
|
* Groups can be empty or omitted from the file to load no sound.
|
||||||
|
* Groups can either list a set of files or specify a format string and a range.
|
||||||
|
* Anything after // will be considered a comment and ignored.
|
||||||
|
* Behavior is undefined if the group was listed multiple times.
|
||||||
|
|
||||||
|
Currently supported groups are:
|
||||||
|
|Group name|Usage|
|
||||||
|
|----------|-----|
|
||||||
|
|`BouncePlayerShell`|Used for BOUNCE_SHELL tempentity hitsound|
|
||||||
|
|`BounceWeaponShell`|Used for BOUCNE_SHOTSHELL tempentity hitsound|
|
||||||
|
|`BounceConcrete`|Used for BOUNCE_CONCRETE tempentity hitsound|
|
||||||
|
|`BounceGlass`|Used for BOUCNE_GLASS|
|
||||||
|
|`BounceMetal`|Used for BOUNCE_METAL|
|
||||||
|
|`BounceFlesh`|Used for BOUNCE_FLESH|
|
||||||
|
|`BounceWood`|Used for BOUNCE_WOOD|
|
||||||
|
|`Ricochet`|Used for BOUNCE_SHRAP and ricochet tempentities|
|
||||||
|
|`Explode`|Used for tempentity explosions|
|
||||||
|
|`EntityWaterEnter`|Used for entity entering water|
|
||||||
|
|`EntityWaterExit`|Used for entity exiting water|
|
||||||
|
|`PlayerWaterEnter`|Used for player entering water|
|
||||||
|
|`PlayerWaterExit`|Used for player exiting water|
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
This example is based on defaults sounds used in Half-Life:
|
||||||
|
|
||||||
|
```
|
||||||
|
BouncePlayerShell "player/pl_shell%d.wav" 1 3
|
||||||
|
BounceWeaponShell "weapons/sshell%d.wav" 1 3
|
||||||
|
BounceConcrete "debris/concrete%d.wav" 1 3
|
||||||
|
BounceGlass "debris/glass%d.wav" 1 4
|
||||||
|
BounceMetal "debris/metal%d.wav" 1 6
|
||||||
|
BounceFlesh "debris/flesh%d.wav" 1 7
|
||||||
|
BounceWood "debris/wood%d.wav" 1 4
|
||||||
|
Ricochet "weapons/ric%d.wav" 1 5
|
||||||
|
Explode "weapons/explode%d.wav" 3 5
|
||||||
|
EntityWaterEnter "player/pl_wade%d.wav" 1 4
|
||||||
|
EntityWaterExit "player/pl_wade%d.wav" 1 4
|
||||||
|
PlayerWaterEnter
|
||||||
|
{
|
||||||
|
"player/pl_wade1.wav"
|
||||||
|
}
|
||||||
|
PlayerWaterExit
|
||||||
|
{
|
||||||
|
"player/pl_wade2.wav"
|
||||||
|
}
|
||||||
|
```
|
||||||
116
Documentation/gameinfo.md
Normal file
116
Documentation/gameinfo.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Game definition and information file
|
||||||
|
|
||||||
|
gameinfo.txt is an essential part of any Xash3D based game. It allows basic customization for games creators, like setting game title, DLL paths, etc.
|
||||||
|
|
||||||
|
This document defines gameinfo.txt syntax, supported keys and liblist.gam conversion rules for the latest version of the engine. Note for engine developers, keep this document in sync with an implementation.
|
||||||
|
|
||||||
|
## gameinfo.txt syntax
|
||||||
|
|
||||||
|
* gameinfo.txt is a simple list of keys and values, separated by newline.
|
||||||
|
* You can add single line comments using double slashes (//).
|
||||||
|
* Keys can accept integer, float, string or boolean values.
|
||||||
|
* Boolean keys use 0 as false and 1 as true value.
|
||||||
|
* To have spaces in string values, you must enclose them in double quotes. Then, to have double quotes, you must escape it with backslash, and to have a backslash you need to use double backslashes.
|
||||||
|
|
||||||
|
The example:
|
||||||
|
```
|
||||||
|
// this is a comment :)
|
||||||
|
// this is another comment
|
||||||
|
some_integer_key 123
|
||||||
|
|
||||||
|
this_is_float_key 13.37 // optional comment
|
||||||
|
|
||||||
|
enable_feature 1 // boolean, 1 to enable, 0 to disable
|
||||||
|
|
||||||
|
example_string_key string_value
|
||||||
|
example_spaces "string with spaces"
|
||||||
|
example_title "Fate\\Stay Night" // engine will parse it as Fate\Stay Night
|
||||||
|
```
|
||||||
|
|
||||||
|
## gameinfo.txt keys
|
||||||
|
|
||||||
|
This is a list of all gameinfo.txt keys supported by the engine. Be aware that the engine will silently skip all unrecognized keys.
|
||||||
|
|
||||||
|
| Key | Type | Default value | Description |
|
||||||
|
| ---------------- | ---------- | --------------- | ----------- |
|
||||||
|
| `ambient0` | string | Empty string | Automatic ambient sound |
|
||||||
|
| `ambient1` | string | Empty string | Automatic ambient sound |
|
||||||
|
| `ambient2` | string | Empty string | Automatic ambient sound |
|
||||||
|
| `ambient3` | string | Empty string | Automatic ambient sound |
|
||||||
|
| `basedir` | string | `valve` | Game base directory, used to share assets between games |
|
||||||
|
| `date` | string | Empty string | Game release date. Unused. |
|
||||||
|
| `dllpath` | string | `cl_dlls` | Game DLL path. Engine will search custom DLLs (client or menu, for example) in this directory, except `gamedll`, see below. |
|
||||||
|
| `fallback_dir` | string | Empty string | Additional game base directory |
|
||||||
|
| `gamedir` | string | Current gamedir | Game directory, ignored in FWGS, as game directory is defined by the game directory name |
|
||||||
|
| `gamedll` | string | `dlls/hl.dll` | Game server DLL for 32-bit x86 Windows (see LibraryNaming.md for details) |
|
||||||
|
| `gamemode` | string | Empty string | Game type. When set to `singleplayer_only` or `multiplayer_only` marks the game as SP or MP only respectively, hiding the option in game UI. Omitting this key or using custom values mark the game as both MP and SP compatible. |
|
||||||
|
| `icon` | string | `game.ico` | Game icon. Engine will automatically append .ico and may automatically switch to .tga icon as well |
|
||||||
|
| `max_beams` | integer | 128 | Beams limit, 64 min, 512 max |
|
||||||
|
| `max_edicts` | integer | 900 | Entities limit, 600 min, 8192 max (protocol limit). In FWGS, minimum is 64. |
|
||||||
|
| `max_particles` | integer | 4096 | Particles limit, 1024 min, 131072 max |
|
||||||
|
| `max_tempents` | integer | 500 | Temporary entities limit. 300 min, 2048 max |
|
||||||
|
| `mp_entity` | string | `info_player_deathmatch` | Entity used to mark maps as multiplayer |
|
||||||
|
| `mp_filter` | string | Empty string | When set, used to filter multiplayer maps instead of `mp_entity`.<br>If the map name starts with the same characters as this filter, it's considered a multiplayer map |
|
||||||
|
| `nomodels` | boolean | 0 | When set to 1, disallows changing player model in UI |
|
||||||
|
| `noskills` | boolean | 0 | When set to 1, disallows selection of game difficulty |
|
||||||
|
| `secure` | boolean | 0 | When set to 1, original Unkle Mike's engine will completely disable developer mode. FWGS ignores but preserves this value for compatibility. |
|
||||||
|
| `size` | integer | 0 | Game directory size in bytes, used in Change Game dialog only |
|
||||||
|
| `startmap` | string | `c0a0` | The name of the map used in new game |
|
||||||
|
| `sp_entity` | string | `info_player_start` | Entity used to mark map as single player. Used in map validation |
|
||||||
|
| `title` | string | `New Game` | Game title, used in window title, default server name, etc. |
|
||||||
|
| `trainmap` | string | `t0a0` | The name of the training map (Hazard Course) |
|
||||||
|
| `type` | string | Empty string | Game type, used in Change Game UI. |
|
||||||
|
| `url_info` | string | Empty string | Game homepage URL, used in Change Game UI |
|
||||||
|
| `url_update` | string | Empty string | Game updates URL, used in Settings UI |
|
||||||
|
| `version` | float | 1.0 | Game version, used in Change Game dialog and in server info |
|
||||||
|
|
||||||
|
## FWGS-specific gameinfo.txt keys
|
||||||
|
|
||||||
|
These strings are specific to Xash3D FWGS.
|
||||||
|
|
||||||
|
| Key | Type | Default value | Description |
|
||||||
|
| ----------------------- | ---------- | ------------------------ | ----------- |
|
||||||
|
| `animated_title` | boolean | 0 | Use animated title in main menu (WON Half-Life logo.avi imitation from Half-Life 25-th anniversary update)
|
||||||
|
| `autosave_aged_count` | integer | 2 | Auto saves limit used in saves rotation |
|
||||||
|
| `gamedll_linux` | string | Generated from `gamedll` | Game server DLL for 32-bit x86 Linux (see LibraryNaming.md for details) |
|
||||||
|
| `gamedll_osx` | string | Generated from `gamedll` | Game server DLL for 32-bit x86 macOS (see LibraryNaming.md for details) |
|
||||||
|
| `hd_background` | boolean | 0 | Use HD background for main menu (Half-Life 25-th anniversary update) |
|
||||||
|
| `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 |
|
||||||
|
| `quicksave_aged_count` | integer | 2 | Quick saves limit used in saves rotation |
|
||||||
|
|
||||||
|
## Note on GoldSrc liblist.gam support
|
||||||
|
|
||||||
|
As Xash3D accidentally supports GoldSrc games, it also supports parsing liblist.gam.\
|
||||||
|
Xash3D will use this file if gameinfo.txt is absent, or if its modification timestamp is older than liblist.gam.
|
||||||
|
|
||||||
|
For game creators who plan supporting only Xash3D, using this file is not recommended.
|
||||||
|
|
||||||
|
The table below defines conversion rules from liblist.gam to gameinfo.txt. Some keys' interpretation does differ from `gameinfo.txt`, in this case a note will be left. If `liblist.gam` key isn't present in this table, it's ignored.
|
||||||
|
|
||||||
|
| `liblist.gam` key | `gameinfo.txt` key | Note |
|
||||||
|
| ----------------- | ------------------ | ---- |
|
||||||
|
| `animated_title` | `animated_title` | |
|
||||||
|
| `edicts` | `max_edicts` | |
|
||||||
|
| `fallback_dir` | `fallback_dir` | |
|
||||||
|
| `game` | `title` | |
|
||||||
|
| `gamedir` | `gamedir` | |
|
||||||
|
| `gamedll` | `gamedll` | |
|
||||||
|
| `gamedll_linux` | `gamedll_linux` | |
|
||||||
|
| `gamedll_osx` | `gamedll_osx` | |
|
||||||
|
| `hd_background` | `hd_background` | |
|
||||||
|
| `icon` | `icon` | |
|
||||||
|
| `mpentity` | `mp_entity` | |
|
||||||
|
| `mpfilter` | `mp_filter` | |
|
||||||
|
| `nomodels` | `nomodels` | |
|
||||||
|
| `secure` | `secure` | In GoldSrc it's used to mark the multiplayer game as anti-cheat enabled.<br>Original Xash3D misinterprets its value for disallowing console and developer mode.<br>FWGS ignores this key but preserves for compatibility. |
|
||||||
|
| `startmap` | `startmap` | |
|
||||||
|
| `size` | `size` | |
|
||||||
|
| `trainingmap` | `trainmap` | |
|
||||||
|
| `trainmap` | `trainmap` | |
|
||||||
|
| `type` | `type` & `gamemode`| In `liblist.gam` this key works as both `type` and `gamemode`.<br>If value is `singleplayer_only` or `multiplayer_only` the game is marked as SP or MP only, and `gameinfo.txt` type set to `Single` or `Multiplayer`.<br>Any custom value will mark the game as both SP and MP compatible, and type is set to whatever custom value. |
|
||||||
|
| `url_dl` | `url_update` | |
|
||||||
|
| `url_info` | `url_info` | |
|
||||||
|
| `version` | `version` | |
|
||||||
|
|
||||||
|
|
||||||
@@ -1,7 +1,40 @@
|
|||||||
# Server porting
|
# Self-made port
|
||||||
|
## Compatibility with RISC architectures
|
||||||
|
### Unaligned access
|
||||||
|
Unaligned access on **i386** causes only performance penalty, but on **RISC** it can cause unstable work.
|
||||||
|
|
||||||
|
For HLSDK at least you need such patches in util.cpp:
|
||||||
|
- https://github.com/FWGS/halflife/commit/7bfefe86e35d67867ae7af830ac1fc38f2908360
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/617d75545f2ecb9b2d46cc30728dc37c9eb6d35e
|
||||||
|
|
||||||
|
### Signed chars
|
||||||
|
`char` type defined as **signed** for **x86** and as **unsigned** for **arm**.
|
||||||
|
|
||||||
|
And sometimes such difference can break logic.
|
||||||
|
|
||||||
|
As a solution you can use `signed char` type in code directly or use `-fsigned-char` option for gcc/clang compilers.
|
||||||
|
|
||||||
|
For HLSDK at least you need such [fix](https://github.com/FWGS/hlsdk-portable/commit/1ca34fcb4381682bd517612b530db22a1354a795) in nodes.cpp/.h.
|
||||||
|
|
||||||
|
## Compatibility with 64bit architectures
|
||||||
|
You need list of patches for Studio Model Render, MAKE_STRING macro and nodes:
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/d287ed446332e615ab5fb25ca81b99fa14d18a73
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/3bce17e3a04f8af10a927a07ceb8ab0f09152ec4
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/9ebfc981773ec4c7a89ffe52d9c249e1fbef9634
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/00833188dab87ef5746286479ba5aeb9d83b4a0c
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/4661b5c1a5245b27a5532745c11e44b5540e4172
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/2b61380146b1d58a8c465f0e312c061b12bda115
|
||||||
|
- https://github.com/FWGS/hlsdk-portable/commit/8ef6cb2427ee16a763103bd3f315f38e2f01cfe2
|
||||||
|
|
||||||
|
## Mobility API
|
||||||
|
Xash3D FWGS has special extended interface in `mobility_int.h` which adds some new features like vibration on mobile platforms.
|
||||||
|
|
||||||
|
## Porting server-side code
|
||||||
Original valve's server code was compatible with linux and gcc 2.x.
|
Original valve's server code was compatible with linux and gcc 2.x.
|
||||||
|
|
||||||
Newer gcc versions have restriction which breaks build.
|
Newer gcc versions have restriction which breaks build.
|
||||||
Now, to make it building with gcc 4.x, you need do following:
|
|
||||||
|
Now, to make it building with gcc 4.x+ or clang, you need to do following:
|
||||||
* Go to cbase.h and redefine macros as following
|
* Go to cbase.h and redefine macros as following
|
||||||
```
|
```
|
||||||
#define SetThink( a ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (&a)
|
#define SetThink( a ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (&a)
|
||||||
@@ -18,58 +51,60 @@ Now, to make it building with gcc 4.x, you need do following:
|
|||||||
* Replace all SetThink(NULL), SetTouch(NULL), setUse(NULL) and SetBlocked(NULL) by ResetThink(), ResetTouch(), ResetUse() and ResetBlocked()
|
* Replace all SetThink(NULL), SetTouch(NULL), setUse(NULL) and SetBlocked(NULL) by ResetThink(), ResetTouch(), ResetUse() and ResetBlocked()
|
||||||
* Sometimes you may need to add #include <ctype.h> if functions tolower or isspace are missing
|
* Sometimes you may need to add #include <ctype.h> if functions tolower or isspace are missing
|
||||||
|
|
||||||
# Client porting
|
## Porting client-side code
|
||||||
|
|
||||||
## VGUI library
|
|
||||||
|
|
||||||
Valve's client uses vgui library which is available only on x86 systems and has big amount of mistakes in headers. The best and simplest way of porting is removing VGUI dependency at all.
|
|
||||||
Most singleplayer mods don't really use VGUI at all. It is used in multiplayer only to show score table and MOTD window
|
|
||||||
|
|
||||||
## Porting
|
|
||||||
|
|
||||||
### First strategy: full port
|
|
||||||
|
|
||||||
#### Basic port (Stage 1)
|
|
||||||
* First, remove all files and headers which use vgui (contains "vgui" in file name).
|
|
||||||
* After that, try to build it and remove vgui includes.
|
|
||||||
* Remove all gViewPort usings.
|
|
||||||
* Remove all CVoiceManager usings (xash3d does not support voice)
|
|
||||||
* Redefine all DLLEXPORT defines as empty field (Place it under _WIN32 macro if you want to keep windows compatibility).
|
* Redefine all DLLEXPORT defines as empty field (Place it under _WIN32 macro if you want to keep windows compatibility).
|
||||||
* Remove hud_servers.cpp and Servers_Init/Servers_Shutdown from hud.cpp
|
* Remove hud_servers.cpp and Servers_Init/Servers_Shutdown from hud.cpp.
|
||||||
* Fix CAPS filenames in includes (like STDIO.H, replace by stdio.h).
|
* Fix CAPS filenames in includes (like STDIO.H, replace by stdio.h).
|
||||||
* Replace broken macros as DECLARE_MESSAGE, DECLARE_COMMAND by fixed examples from our hlsdk-xash3d port (cl_util.h)
|
* Replace broken macros as DECLARE_MESSAGE, DECLARE_COMMAND by fixed examples from our hlsdk-portable port (cl_util.h).
|
||||||
* Add ctype.h where it is need (tolower, isspace functions)
|
* Add ctype.h where is needed (tolower, isspace functions).
|
||||||
* Add string.h where it is need (memcpy, strcpy, etc)
|
* Add string.h where is needed (memcpy, strcpy, etc).
|
||||||
* Use in_defs.h from hlsdk_client
|
* Use in_defs.h from hlsdk-portable.
|
||||||
* Add scoreboard_stub.cpp and input_stub.cpp from hlsdk-xash3d to fix linking.
|
* Add input_xash3d.cpp from hlsdk-portable project to fix input.
|
||||||
Now your client should be able to build and work correctly. Add input_xash3d.cpp from hlsdk-xash3d project to fix input.
|
|
||||||
|
|
||||||
#### Multiplayer fix (Stage 2)
|
Now your client should be able to build and work correctly.
|
||||||
Look at hlsdk-xash3d project.
|
|
||||||
|
|
||||||
Main changes are:
|
# Porting mod to hlsdk-portable
|
||||||
* Add MOTD.cpp, scoreboard.cpp and input_xash3d.cpp
|
Look at changes which was made.
|
||||||
* Add missing functions to hud_redraw.cpp, hud.cpp and tri.cpp, fix class defination in hud.h
|
|
||||||
* Remove duplicate functions from hud.cpp and HOOK_MESSAGE's for it
|
|
||||||
* Remove +showscores/-showscores hooks from input.h
|
|
||||||
* Fix cl_util.h
|
|
||||||
|
|
||||||
### Second way: move mod to hlsdk-xash3d
|
If there are not too much changes (for example, only some weapons was added), add these changes in hlsdk-portable.
|
||||||
Look at changes you made in client.
|
|
||||||
|
|
||||||
If there are not much changes (for example, only some weapons was add), add these changes in hlsdk-xash3d.
|
You can use diff with original HLSDK and apply it as patch to hlsdk-portable.
|
||||||
|
|
||||||
You may use diff with original HLSDK you used and apply it as patch to hlsdk-xash3d.
|
|
||||||
|
|
||||||
|
```
|
||||||
|
NOTE: Many an old mods was made on HLSDK 2.0-2.1 and some rare mods on HLSDK 1.0.
|
||||||
|
So you need to have different versions of HLSDK to make diffs.
|
||||||
|
Plus different Spirit of Half-Life versions if mod was made on it.
|
||||||
|
Also, weapons in old HLSDK versions does not use client weapon prediction system and you may be need to port standart half-life weapons to server side.
|
||||||
|
```
|
||||||
Files must have same line endings (use dos2unix on all files).
|
Files must have same line endings (use dos2unix on all files).
|
||||||
|
|
||||||
I recommend to enable ignoring space changes in diff.
|
We recommend to enable ignoring space changes in diff.
|
||||||
### Writing Makefiles
|
|
||||||
|
|
||||||
Use Makefile from hlsdk-xash3d as Makefile example.
|
Move all new files to separate directories.
|
||||||
|
|
||||||
Get .c and .cpp file lists from Visual Studio project and fill SRCS and SRCS_C variables to Makefile.
|
# Possible replacements for non-portable external dependencies
|
||||||
|
1. If mod uses **fmod.dll** or **base.dll** to play mp3/ogg on client-side or to precache sounds on server-side, you can replace it with:
|
||||||
|
- [pfnPrimeMusicStream](https://github.com/FWGS/hlsdk-portable/blob/master/engine/cdll_int.h#L293=) engine callback;
|
||||||
|
- [miniaudio](https://github.com/mackron/miniaudio);
|
||||||
|
- [phonon](https://community.kde.org/Phonon).
|
||||||
|
|
||||||
Remove all files containing vgui in name from list, add missing include dirs.
|
2. If mod uses **OpenGL**, porting code to Xash3D render interface is recommended.
|
||||||
|
|
||||||
|
3. If mod uses **cg.dll**, you can try to port code to [NVFX](https://github.com/tlorach/nvFX).
|
||||||
|
|
||||||
|
4. If mod uses detours, comment code or try to find replacement somehow by yourself.
|
||||||
|
|
||||||
|
# Additional recommendations
|
||||||
|
1. If mod uses STL, you can replace it with [MiniUTL](https://github.com/FWGS/MiniUTL).
|
||||||
|
2. Avoid to use dynamic casts to make small size binaries.
|
||||||
|
3. Avoid to use exceptions to make small size binaries.
|
||||||
|
|
||||||
|
# Writing build scripts
|
||||||
|
|
||||||
|
Use wscript/CMakeLists.txt files from hlsdk-portable as build scripts example.
|
||||||
|
|
||||||
|
Get .c and .cpp file lists from Visual Studio project.
|
||||||
|
|
||||||
|
Add missing include dirs.
|
||||||
|
|
||||||
Do same for Android.mk if you are building for android.
|
|
||||||
|
|||||||
15
Documentation/musl.md
Normal file
15
Documentation/musl.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Xash3D FWGS on `musl`
|
||||||
|
|
||||||
|
Xash3D FWGS works on `musl` out of the box. However, the engine doesn't try to differentiate glibc and musl anymore. If you see error similar to:
|
||||||
|
|
||||||
|
```
|
||||||
|
Host_InitError: can't initialize cl_dlls/client.so: Error relocating valve/cl_dlls/client.so: __sprintf_chk: symbol not found
|
||||||
|
```
|
||||||
|
|
||||||
|
... or you know that the game you're running is linked against glibc, you can try using `libgcompat`, like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ LD_PRELOAD=/lib/libgcompat.so.0 ./xash3d ...
|
||||||
|
```
|
||||||
|
|
||||||
|
It will automatically add the missing symbols that glibc binaries usually need. In the future we might automatically link engine against `libgcompat` for better compatibility with prebuilt or closed-source games, if there will be any use for this.
|
||||||
11
Documentation/not-supported-mod-list-and-reasons-why.md
Normal file
11
Documentation/not-supported-mod-list-and-reasons-why.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Not supported mods and reasons why
|
||||||
|
|
||||||
|
|Name |Version |Why not working |What was made for that
|
||||||
|
|---- |------- |--------------- |----------------------
|
||||||
|
|Blue Shift |The latest steam release |Uses vgui2 library which xash3d does not support |Recreated source code here: https://github.com/FWGS/hlsdk-xash3d/tree/bshift
|
||||||
|
|Counter Strike |1.6(The latest steam release) |Uses vgui2 library which xash3d does not support |Some work on vgui2 support was made here: https://github.com/FWGS/xash3d/tree/vinterface
|
||||||
|
|Counter Strike: Condition Zero |The latest steam release |Uses vgui2 library which xash3d does not support |Some work on vgui2 support was made here: https://github.com/FWGS/xash3d/tree/vinterface
|
||||||
|
|Counter Strike: Condition Zero - Deleted scenes |The latest steam release |Uses vgui2 library which xash3d does not support |Some work on vgui2 support was made here: https://github.com/FWGS/xash3d/tree/vinterface
|
||||||
|
|Day of Defeat |The latest steam release |Uses vgui2 library which xash3d does not support |Some work on vgui2 support was made here: https://github.com/FWGS/xash3d/tree/vinterface
|
||||||
|
|Sven-Coop |5.0+ |Uses custom GoldSrc engine |
|
||||||
|
|
||||||
380
Documentation/opensource-mods.md
Normal file
380
Documentation/opensource-mods.md
Normal file
@@ -0,0 +1,380 @@
|
|||||||
|
Source code of this mods is available for modders and porters in public access.
|
||||||
|
|
||||||
|
# Original Work
|
||||||
|
## Absolute Zero
|
||||||
|
Official gitlab repository - https://gitlab.com/Cobalt-57/half-life-absolute-zero/
|
||||||
|
|
||||||
|
## Adrenaline Gamer
|
||||||
|
Official github repository by Martin \"Bullet\" Webrant - https://github.com/martinwebrant/agmod
|
||||||
|
|
||||||
|
## Arrangement
|
||||||
|
Mirrored on github - https://github.com/JoelTroch/am_src_30jan2011
|
||||||
|
|
||||||
|
## Arrangemode: Rebirth
|
||||||
|
Mirrored on github - https://github.com/JoelTroch/am_src_rebirth
|
||||||
|
|
||||||
|
## Battle Grounds
|
||||||
|
Mirrored on github - https://github.com/nekonomicon/BattleGrounds
|
||||||
|
|
||||||
|
## Bubblemod
|
||||||
|
Download page on official site(WM snapshot) - [http://www.bubblemod.org/dl_default.php](https://web.archive.org/web/20130717133158/http://www.bubblemod.org/dl_default.php)
|
||||||
|
|
||||||
|
Mirrored on github - https://github.com/HLSources/BubbleMod
|
||||||
|
|
||||||
|
## Chicken Fortress
|
||||||
|
Official github repository - https://github.com/CKFDevPowered/CKF3Alpha
|
||||||
|
|
||||||
|
## Cold Ice
|
||||||
|
Version 1.9 is available on ModDB - https://www.moddb.com/mods/cold-ice/downloads/cold-ice-sdk
|
||||||
|
|
||||||
|
Version 1.9 mirrored on github - https://github.com/solidi/hl-mods/tree/master/ci
|
||||||
|
|
||||||
|
## Cold Ice Ressurection
|
||||||
|
Mirrored on github - https://github.com/solidi/hl-mods/tree/master/cir
|
||||||
|
|
||||||
|
## Cthulhu
|
||||||
|
Uploaded to github by Oleg Cherkasky - https://github.com/gunrunners-paradise/Cthulhu-HLmod-SDK
|
||||||
|
|
||||||
|
## Deathmatch Classic
|
||||||
|
Available in Valve's Half-Life repository - https://github.com/ValveSoftware/halflife/tree/master/dmc
|
||||||
|
|
||||||
|
## ESHQ
|
||||||
|
Official github repository - https://github.com/adslbarxatov/xash3d-for-ESHQ
|
||||||
|
|
||||||
|
## Flat-Life
|
||||||
|
Available on GamerLab - http://gamer-lab.com/eng/code_mods_goldsrc/Half-Life_2D_(Flat-Life)
|
||||||
|
|
||||||
|
## Gang Wars
|
||||||
|
Mirrored on github - https://github.com/nekonomicon/gw1.45src
|
||||||
|
|
||||||
|
## Go-mod
|
||||||
|
Versions 2.0 and 3.0, available in mod archives on ModDB - https://www.moddb.com/mods/go-mod/downloads
|
||||||
|
|
||||||
|
Version 3.0, mirrored on github - https://github.com/nekonomicon/Go-mod30
|
||||||
|
|
||||||
|
## GT mod
|
||||||
|
Available on GamerLab - http://gamer-lab.com/eng/code_mods_goldsrc/GT_mod_(Polnie_ishodniki)
|
||||||
|
|
||||||
|
## Half-Life: Advanced Deathmatch
|
||||||
|
Mirrored on github - https://github.com/solidi/hl-mods/tree/master/hla
|
||||||
|
|
||||||
|
## Half-Life: Decay
|
||||||
|
Mirrored on github(PC Port) - https://github.com/hoaxer/Half-Life-Decay
|
||||||
|
|
||||||
|
## Half-Life: Echoes
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/half-life-echoes
|
||||||
|
|
||||||
|
## Half-Life: Expanded Arsenal
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/half-life-expanded-arsenal
|
||||||
|
|
||||||
|
## Half-Life: Gravgun mod
|
||||||
|
Branch **gravgun** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/gravgun
|
||||||
|
|
||||||
|
## Half-Life: Invasion
|
||||||
|
Official github repository - https://github.com/jlecorre/hlinvasion
|
||||||
|
|
||||||
|
## Half-Life: Pong
|
||||||
|
Mirrored on github - https://github.com/solidi/hl-mods/tree/master/pong
|
||||||
|
|
||||||
|
## Half-Life: Quest Mode
|
||||||
|
Available on cs-mapping.com.ua - https://old.cs-mapping.com.ua/forum/showthread.php?t=38030
|
||||||
|
|
||||||
|
## Half-Life: Top-Down
|
||||||
|
Official gitlab repository - https://gitlab.com/Sockman/hltopdown
|
||||||
|
|
||||||
|
## Half-Life: Update
|
||||||
|
Official github repository - https://github.com/Fograin/hl-subsmod-ex
|
||||||
|
|
||||||
|
## Half-Life: Rally
|
||||||
|
Official gitlab repository - https://gitlab.com/hlrally/src
|
||||||
|
|
||||||
|
## Half-Life: Weapon Edition
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/half-life-weapon-edition/downloads/half-life-weapon-edition-1508-alpha-open-src
|
||||||
|
|
||||||
|
## Half-Life: Year of the Dragon
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/year-of-the-dragon
|
||||||
|
|
||||||
|
## Half-Nuked
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/half-nuked/downloads/half-nuked-src
|
||||||
|
|
||||||
|
## Half-Payne
|
||||||
|
Official github repository - https://github.com/suXinjke/HalfPayne
|
||||||
|
|
||||||
|
## Half-Quake
|
||||||
|
Official github repository - https://github.com/muddasheep/hqtrilogy
|
||||||
|
|
||||||
|
## Half-Rats: Parasomnia
|
||||||
|
Official github repository - https://github.com/HeathGames/half_rats_parasomnia_src
|
||||||
|
|
||||||
|
## Half-Screwed
|
||||||
|
Official github repository - https://github.com/desukuran/half-screwed
|
||||||
|
|
||||||
|
## Headcrab Frenzy
|
||||||
|
Version 1.3 on ModDB - https://www.moddb.com/mods/headcrab-frenzy/downloads/headcrab-frenzy-13-beta-source-code
|
||||||
|
|
||||||
|
## Heart of Evil
|
||||||
|
Mirrored on github - https://github.com/nekonomicon/HeartOfEvil
|
||||||
|
|
||||||
|
## Ingram Chillin' Mod
|
||||||
|
Official SourceForge repository - https://sourceforge.net/projects/icm-hl/
|
||||||
|
|
||||||
|
## MechMod
|
||||||
|
Official github repository - https://github.com/vermagav/mechmod
|
||||||
|
|
||||||
|
## Mortal Combat Forever
|
||||||
|
Available on GamerLab - http://gamer-lab.com/eng/code_mods_goldsrc/Mortal_Combat_Forever_(Polnie_ishodniki)
|
||||||
|
|
||||||
|
## Natural Selection
|
||||||
|
Official github repository - https://github.com/unknownworlds/NS
|
||||||
|
|
||||||
|
## Overturn
|
||||||
|
Available in mod archive on ModDB - https://www.moddb.com/mods/overturn
|
||||||
|
|
||||||
|
## Oz Deathmatch
|
||||||
|
Mirrored on github - https://github.com/nekonomicon/OZDM
|
||||||
|
|
||||||
|
## Paranoia
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/paranoia/downloads/paranoia-toolkit
|
||||||
|
|
||||||
|
## Paranoia 2: The Savior
|
||||||
|
Prealpha, mirrored on github - https://github.com/a1batross/Paranoia2_ancient
|
||||||
|
|
||||||
|
Version 1.51, mirrored on github - https://github.com/a1batross/Paranoia2_original
|
||||||
|
|
||||||
|
## Raven City
|
||||||
|
*Unfinished mod*
|
||||||
|
|
||||||
|
Was found on HLFX - http://hlfx.ru/forum/showthread.php?s=2c892dfc52f72be52a89c3f52a397cd0&threadid=1819&postid=44674#post44674
|
||||||
|
|
||||||
|
## Ricochet
|
||||||
|
Available in Valve's Half-Life repository - https://github.com/ValveSoftware/halflife/tree/master/ricochet
|
||||||
|
|
||||||
|
## Spirit of Half-Life
|
||||||
|
[Logic&Trick's](https://github.com/LogicAndTrick) mirror - https://files.logic-and-trick.com/#/Half-Life/Mods/Spirit%20of%20Half-Life
|
||||||
|
|
||||||
|
## The Wastes
|
||||||
|
Version 1.5: mirrored on code.idtech.space - https://code.idtech.space/vera/halflife-thewastes-sdk
|
||||||
|
|
||||||
|
## Threewave CTF
|
||||||
|
*Unfinished mod by Valve Software*
|
||||||
|
|
||||||
|
Available in Valve's Half-Life repository with Deathmatch Classic sources - https://github.com/ValveSoftware/halflife/tree/master/dmc
|
||||||
|
|
||||||
|
## Trinity Render
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/half-life-episode-two/downloads/trinity-rendering-engine-v308f
|
||||||
|
|
||||||
|
## Tyrian: Ground Assault
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/tyriangroundassault/downloads/tyrianga-v1-0-src
|
||||||
|
|
||||||
|
## Wasteland
|
||||||
|
Mirrored on code.idtech.space - https://code.idtech.space/vera/halflife-wasteland-sdk
|
||||||
|
|
||||||
|
## Wizard Wars
|
||||||
|
Download page on official site - http://www.thothie.com/ww/
|
||||||
|
|
||||||
|
## XashXT
|
||||||
|
Mirrored on github - https://github.com/a1batross/XashXT_original
|
||||||
|
|
||||||
|
## Xen-Warrior
|
||||||
|
*Source code is a part of Spirit of Half-Life 1.0-1.2 under XENWARRIOR macro*
|
||||||
|
|
||||||
|
[Logic&Trick's](https://github.com/LogicAndTrick) mirror - https://files.logic-and-trick.com/#/Half-Life/Mods/Spirit%20of%20Half-Life
|
||||||
|
|
||||||
|
## Zombie-X
|
||||||
|
Available in mod archive on ModDB - https://www.moddb.com/mods/zombie-x-10-final/downloads/zombie-x-10-dle-beta6-last-version
|
||||||
|
|
||||||
|
## ZXC
|
||||||
|
Available on ModDB - https://www.moddb.com/mods/zxc-mod-133/downloads/zxc-mod-136-final
|
||||||
|
|
||||||
|
Mirrored on github - https://github.com/ZXCmod/ZXCmod
|
||||||
|
|
||||||
|
# Reimplementation
|
||||||
|
## Absolute Redemption
|
||||||
|
Branch **redempt** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/redempt
|
||||||
|
|
||||||
|
## Adrenaline Gamer
|
||||||
|
OpenAG by YaLTeR - https://github.com/YaLTeR/OpenAG
|
||||||
|
|
||||||
|
## Afraid of Monsters
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-aom
|
||||||
|
|
||||||
|
Branch **aom** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/aom
|
||||||
|
|
||||||
|
## Afraid of Monsters: Director's cut
|
||||||
|
Reverse-engineered code: branch **aomdc** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/aomdc
|
||||||
|
|
||||||
|
## Azure Sheep
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-asheep
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **asheep** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/asheep
|
||||||
|
|
||||||
|
## Big Lolly
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-biglolly
|
||||||
|
|
||||||
|
Branch **biglolly** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/biglolly
|
||||||
|
|
||||||
|
## Black Ops
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-blackops
|
||||||
|
|
||||||
|
Branch **blackops** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/blackops
|
||||||
|
|
||||||
|
## Bloody Pizza: Vendetta
|
||||||
|
Branch **caseclosed** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/caseclosed
|
||||||
|
|
||||||
|
## Case Closed
|
||||||
|
Branch **caseclosed** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/caseclosed
|
||||||
|
|
||||||
|
## Cleaner's Adventures
|
||||||
|
Branch **CAd** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/CAd
|
||||||
|
|
||||||
|
## Counter Strike
|
||||||
|
Reverse-engineered code of client part by a1batross - https://github.com/Velaron/cs16-client
|
||||||
|
|
||||||
|
Reverse-engineered code of server part by nagist - https://github.com/nagist/cs16nd
|
||||||
|
|
||||||
|
Reverse-engineered code of server part by s1lentq - https://github.com/s1lentq/ReGameDLL_CS
|
||||||
|
|
||||||
|
## Counter Strike Online
|
||||||
|
CSO-like Xash3D-based mod, CSMoE - https://github.com/MoeMod/CSMoE
|
||||||
|
|
||||||
|
## Crack-Life: Campaign Mode
|
||||||
|
Recreation by lostgamer aka nillerusr - https://github.com/LostGamerHL/crack_life
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **clcampaign** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/clcampaign
|
||||||
|
|
||||||
|
## Escape from the Darkness
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-eftd
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **eftd** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/eftd
|
||||||
|
|
||||||
|
## Half-Life: Black Guard
|
||||||
|
*This mod uses dlls from Cleaner's Adventures*
|
||||||
|
|
||||||
|
Branch **CAd** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/CAd
|
||||||
|
|
||||||
|
## Half-Life: Blue Shift
|
||||||
|
Unkle Mike's recreation - https://hlfx.ru/forum/showthread.php?s=&threadid=5253
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **bshift** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/bshift
|
||||||
|
|
||||||
|
## Half-Life: Induction
|
||||||
|
Branch **induction** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/induction
|
||||||
|
|
||||||
|
## Half-Life: Opposing Force
|
||||||
|
Recreation by lostgamer aka nillerusr - https://github.com/LostGamerHL/hlsdk-xash3d
|
||||||
|
|
||||||
|
Reverse-engineered code: clean branch **opfor** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/opfor
|
||||||
|
|
||||||
|
Spirit of Half Life: Opposing-Force Edition - https://github.com/Hammermaps-DEV/SOHL-V1.9-Opposing-Force-Edition
|
||||||
|
|
||||||
|
## Half-Life: Rebellion
|
||||||
|
Reverse-engineered code: branch **rebellion** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/rebellion
|
||||||
|
|
||||||
|
## Half-Life: Urbicide
|
||||||
|
Branch **hl_urbicide** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/hl_urbicide
|
||||||
|
|
||||||
|
## Half-Life: Visitors
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-visitors
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **visitors** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/visitors
|
||||||
|
|
||||||
|
## Half-Secret
|
||||||
|
Branch **half-secret** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/half-secret
|
||||||
|
|
||||||
|
## Night at the Office
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-nato
|
||||||
|
|
||||||
|
Branch **noffice** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/noffice
|
||||||
|
|
||||||
|
## Poke 646
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-poke646
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **poke646** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/poke646
|
||||||
|
|
||||||
|
## Poke 646: Vendetta
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-poke646-vendetta
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **poke646_vendetta** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/poke646_vendetta
|
||||||
|
|
||||||
|
## Residual Life
|
||||||
|
Reverse-engineered code: branch **residual_point** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/residual_point
|
||||||
|
|
||||||
|
## Residual Point
|
||||||
|
Reverse-engineered code: branch **residual_point** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/residual_point
|
||||||
|
|
||||||
|
## Sewer Beta
|
||||||
|
Branch **sewer_beta** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/sewer_beta
|
||||||
|
|
||||||
|
## Team Fortress Classic
|
||||||
|
Reverse-engineered code by Velaron - https://github.com/Velaron/tf15-client
|
||||||
|
|
||||||
|
## The Gate
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-thegate
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **thegate** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/thegate
|
||||||
|
|
||||||
|
## They Hunger
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-theyhunger
|
||||||
|
|
||||||
|
Reverse-engineered code: branch **theyhunger** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/theyhunger
|
||||||
|
|
||||||
|
They Hunger: Tactical - https://www.moddb.com/mods/they-hunger-tactical/downloads/tht-source-code-documentation
|
||||||
|
|
||||||
|
## Times of Troubles
|
||||||
|
malortie's recreation - https://github.com/malortie/hl-tot
|
||||||
|
|
||||||
|
Branch **tot** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/tot
|
||||||
|
|
||||||
|
# Derived work
|
||||||
|
## Adrenaline Gamer
|
||||||
|
Branch **aghl** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/aghl
|
||||||
|
|
||||||
|
## Bubblemod
|
||||||
|
Branch **bubblemod** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/bubblemod
|
||||||
|
|
||||||
|
## Deathmatch Classic
|
||||||
|
Deathmatch Classic: Adrenaline Gamer Edition - https://github.com/martinwebrant/agmod/tree/master/src/dmc
|
||||||
|
|
||||||
|
Deathmatch Quaked - https://www.moddb.com/games/deathmatch-classic/downloads/dmq2
|
||||||
|
|
||||||
|
Branch **dmc** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/dmc
|
||||||
|
|
||||||
|
## Half-Life: Echoes
|
||||||
|
Branch **echoes** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/echoes
|
||||||
|
|
||||||
|
## Half-Life: Invasion
|
||||||
|
Port to HLSDK 2.4 by malortie - https://github.com/malortie/hl-invasion
|
||||||
|
|
||||||
|
Port to Linux by fmoraw - https://github.com/fmoraw/hlinvasion
|
||||||
|
|
||||||
|
Branch **invasion** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/invasion
|
||||||
|
|
||||||
|
## Half-Life: Top-Down
|
||||||
|
Branch **hltopdown** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/hltopdown
|
||||||
|
|
||||||
|
## Half-Screwed
|
||||||
|
Branch **half-screwed** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/half-screwed
|
||||||
|
|
||||||
|
## Natural Selection
|
||||||
|
Port to Linux - https://github.com/fmoraw/NS
|
||||||
|
|
||||||
|
## Spirit of Half-Life
|
||||||
|
Version 1.2: branch **sohl1.2** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/sohl1.2
|
||||||
|
|
||||||
|
## Swiss Cheese Halloween 2002
|
||||||
|
Just more playable version by malortie - https://github.com/malortie/hl-shall
|
||||||
|
|
||||||
|
Branch **halloween** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/halloween
|
||||||
|
|
||||||
|
## The Wastes
|
||||||
|
Version 1.5: Port to Linux - https://git.mentality.rip/a1batross/halflife-thewastes-sdk
|
||||||
|
|
||||||
|
## Threewave CTF
|
||||||
|
Branch **dmc** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/dmc
|
||||||
|
|
||||||
|
## Xen-Warrior
|
||||||
|
Branch **sohl1.2** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/sohl1.2
|
||||||
|
|
||||||
|
## Zombie-X
|
||||||
|
Branch **zombie-x** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/zombie-x
|
||||||
|
|
||||||
@@ -2,35 +2,32 @@ Xash3D FWGS is intended to be easily ported to specific platform, however main i
|
|||||||
|
|
||||||
This page is about merged ports to main source tree and responsible for it developers.
|
This page is about merged ports to main source tree and responsible for it developers.
|
||||||
|
|
||||||
For porting guidelines, look here(TODO!)
|
For porting guidelines, look engine-porting-guide.md.
|
||||||
|
|
||||||
Status:
|
Status:
|
||||||
* **Supported**: active, confirmed to be fully functional.
|
* **Supported**: active, was confirmed to be fully functional.
|
||||||
* **In progress**: active, under development.
|
* **In progress**: active, under development.
|
||||||
* **Incomplete**: not active, but some work was accepted to main repository before
|
|
||||||
* **Old Engine**: port was for old engine fork
|
* **Old Engine**: port was for old engine fork
|
||||||
* **Not maintained**: lack of human resources
|
* **Not maintained**: lack of human resources
|
||||||
* **Not merged**: was done in third-party fork, real status unknown
|
|
||||||
* **Deprecated**: not supported anymore
|
* **Deprecated**: not supported anymore
|
||||||
|
|
||||||
Table is sorted by status.
|
Table is sorted by status and platform.
|
||||||
|
|
||||||
| Platform | Status | Maintainer | Note
|
| Platform | Status | Maintainer | Note
|
||||||
| -------- | ------ | ---------- | ----
|
| -------- | ------ | ---------- | ----
|
||||||
| Windows | Supported | @a1batross |
|
| Android | Supported | @Velaron |
|
||||||
| Linux(x86) | Supported | @a1batross, @mittorn |
|
| *BSD | Supported | @nekonomicon |
|
||||||
| Linux(amd64) | Supported | @mittorn |
|
| DOS4GW | Supported | @mittorn |
|
||||||
| *BSD | Supported | @nekonomicon |
|
| GNU/Linux | Supported | @a1batross, @mittorn |
|
||||||
| Linux(arm) | Supported | @a1batross, @mittorn |
|
| Haiku | Supported | not maintained | Was added by #478 and #483
|
||||||
| Android | Supported | @a1batross, @mittorn |
|
| macOS | Supported | @sofakng |
|
||||||
| MotoMAGX | Supported | @a1batross |
|
| MotoMAGX | Supported | @a1batross |
|
||||||
| Linux(elbrus) | In progress | @a1batross, @mittorn | Rare and eventual access to e2k machine
|
| PSVita | Supported | @fgsfdsfgs |
|
||||||
| Android/Linux(aarch64) | In progress | @a1batross |
|
| Switch | Supported | @fgsfdsfgs |
|
||||||
| Linux(mipsel) | In progress | @mittorn |
|
| Windows | Supported | @a1batross, @SNMetamorph |
|
||||||
| Haiku | Incomplete, Old Engine | not maintained |
|
| PSP | In progress | @Crow_bar, @Velaron | [GitHub Repository](https://github.com/Crow-bar/xash3d-fwgs)
|
||||||
| Emscripten | Incomplete, Old Engine | not maintained |
|
| Wii | In progress | Collaborative effort | [GitHub Repository](https://github.com/saucesaft/xash3d-wii)
|
||||||
| PSVita | Not merged, Old Engine | not maintained | [GitHub Repository](https://github.com/fgsfdsfgs/vitaXash3D)
|
| Emscripten | Old Engine | not maintained |
|
||||||
| Switch | Not merged, Old Engine | not maintained | [GitHub Repository](https://github.com/switchports/xash3d-switch)
|
| 3DS | Old Engine fork | not maintained | [GitHub Repository](https://github.com/masterfeizz/Xash3DS)
|
||||||
| 3DS | Not merged, Old Engine | not maintained | [GitHub Repository](https://github.com/masterfeizz/Xash3DS)
|
| Oculus Quest | Old Engine fork | @DrBeef | [GitHub Repository](https://github.com/DrBeef/Lambda1VR)
|
||||||
| macOS | Deprecated | not maintained | See GitHub issue #61
|
| iOS | Deprecated | not maintained | See GitHub issue #61
|
||||||
| iOS | Deprecated | not maintained | See GitHub issue #61
|
|
||||||
|
|||||||
49
Documentation/psvita.md
Normal file
49
Documentation/psvita.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
## PlayStation Vita port
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
1. Make sure your PSVita is [set up to run homebrew applications](https://vita.hacks.guide/).
|
||||||
|
2. Install [kubridge](https://github.com/TheOfficialFloW/kubridge/releases/) by copying `kubridge.suprx` to your taiHEN plugins folder (usually `ux0:/tai`) and add it to your `config.txt`, for example:
|
||||||
|
```
|
||||||
|
*KERNEL
|
||||||
|
ux0:tai/kubridge.skprx
|
||||||
|
```
|
||||||
|
3. Install `libshacccg.suprx` by following [this guide](https://cimmerian.gitbook.io/vita-troubleshooting-guide/shader-compiler/extract-libshacccg.suprx).
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
1. If you have an old vitaXash3D install, remove it.
|
||||||
|
2. Get `xash3d-fwgs-psvita.7z` from the latest [automatic build](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous).
|
||||||
|
3. Install `xash.vpk` from the 7z archive onto your PSVita.
|
||||||
|
4. Copy the `data` directory from the 7z archive to the root of your PSVita's SD card.
|
||||||
|
5. Copy the valve folder and any other mod folders from your Half-Life install to `ux0:/data/xash3d/` (you can use other mountpoints instead of `ux0`). **Do not overwrite anything.**
|
||||||
|
|
||||||
|
### Build instructions
|
||||||
|
1. Install [VitaSDK](https://vitasdk.org/).
|
||||||
|
2. Build and install [vitaGL](https://github.com/Rinnegatamante/vitaGL):
|
||||||
|
```
|
||||||
|
git clone https://github.com/Rinnegatamante/vitaGL.git
|
||||||
|
make -C vitaGL NO_TEX_COMBINER=1 HAVE_UNFLIPPED_FBOS=1 HAVE_PTHREAD=1 SINGLE_THREADED_GC=1 MATH_SPEEDHACK=1 DRAW_SPEEDHACK=1 HAVE_CUSTOM_HEAP=1 -j2 install
|
||||||
|
```
|
||||||
|
3. Build and install [vita-rtld](https://github.com/fgsfdsfgs/vita-rtld):
|
||||||
|
```
|
||||||
|
git clone https://github.com/fgsfdsfgs/vita-rtld.git && cd vita-rtld
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
make -j2 install
|
||||||
|
```
|
||||||
|
4. Build and install [this SDL2 fork](https://github.com/Northfear/SDL) with vitaGL integration:
|
||||||
|
```
|
||||||
|
git clone https://github.com/Northfear/SDL.git && cd SDL
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE=${VITASDK}/share/vita.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DVIDEO_VITA_VGL=ON ..
|
||||||
|
make -j2 install
|
||||||
|
```
|
||||||
|
5. Use `waf`:
|
||||||
|
```
|
||||||
|
./waf configure -T release --psvita
|
||||||
|
./waf build
|
||||||
|
```
|
||||||
|
6. Copy all the resulting `.so` files into a single folder:
|
||||||
|
```
|
||||||
|
./waf install --destdir=xash3d
|
||||||
|
```
|
||||||
|
7. `xash.vpk` is located in `build/engine/`.
|
||||||
@@ -46,7 +46,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
16. [Betrayal](http://www.moddb.com/mods/betrayal) (this mod has inner bugs; set **gl_allow_mirrors** to **0** to prevent drops of game's perfomance in some areas)
|
16. [Betrayal](http://www.moddb.com/mods/betrayal) (this mod has inner bugs; set **gl_allow_mirrors** to **0** to prevent drops of game's perfomance in some areas)
|
||||||
17. [Between Two Worlds](https://www.runthinkshootlive.com/posts/between-two-worlds/)
|
17. [Between Two Worlds](https://www.runthinkshootlive.com/posts/between-two-worlds/)
|
||||||
18. [Black Mesa Energy Testing Chamber](http://twhl.info/competitions.php?results=17)
|
18. [Black Mesa Energy Testing Chamber](http://twhl.info/competitions.php?results=17)
|
||||||
19. [Black Mesa Sideline](http://www.isolated-design.de/half-life-mods/black-mesa-sideline/) (set **gl_allow_mirrors** to **0** to prevent drops of game's perfomance in some areas)
|
19. [Black Mesa Sideline](https://www.moddb.com/mods/black-mesa-sideline) (set **gl_allow_mirrors** to **0** to prevent drops of game's perfomance in some areas)
|
||||||
20. [BlackMesa 2007( Black Mesa Missions 2007 )](http://www.moddb.com/addons/blackmesa-2007)
|
20. [BlackMesa 2007( Black Mesa Missions 2007 )](http://www.moddb.com/addons/blackmesa-2007)
|
||||||
21. [Blood and Bones](https://www.runthinkshootlive.com/posts/blood-and-bones/)
|
21. [Blood and Bones](https://www.runthinkshootlive.com/posts/blood-and-bones/)
|
||||||
22. Boom (Huknenn) v1.0 & [HL Boom: Gold Edition v1.1](http://www.moddb.com/mods/boom)
|
22. Boom (Huknenn) v1.0 & [HL Boom: Gold Edition v1.1](http://www.moddb.com/mods/boom)
|
||||||
@@ -103,8 +103,8 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
72. [Freeman](https://www.runthinkshootlive.com/posts/freeman/)
|
72. [Freeman](https://www.runthinkshootlive.com/posts/freeman/)
|
||||||
73. [Freeman's Escape](http://www.moddb.com/mods/freeman-escape-french) (2 maps by *JiggZ*)
|
73. [Freeman's Escape](http://www.moddb.com/mods/freeman-escape-french) (2 maps by *JiggZ*)
|
||||||
74. [Freeman's Fight](https://www.runthinkshootlive.com/posts/freemans-fight/)
|
74. [Freeman's Fight](https://www.runthinkshootlive.com/posts/freemans-fight/)
|
||||||
75. [Freeman's Return](http://jpmaps.wz.cz/epizody.htm)
|
75. [Freeman's Return](https://www.moddb.com/games/half-life/addons/freemans-return-v12)
|
||||||
76. [Freeman's Return 2](http://jpmaps.wz.cz/epizody.htm)
|
76. [Freeman's Return 2](https://www.moddb.com/games/half-life/addons/freemans-return-2-v11)
|
||||||
77. [Freeman's Revenge](https://www.runthinkshootlive.com/posts/freemans-revenge/)
|
77. [Freeman's Revenge](https://www.runthinkshootlive.com/posts/freemans-revenge/)
|
||||||
78. [Freeman's Tomb( The Crypt )](http://twhl.info/vault.php?map=3787)
|
78. [Freeman's Tomb( The Crypt )](http://twhl.info/vault.php?map=3787)
|
||||||
79. [G-Invasion v2.5](http://www.moddb.com/mods/g-man-invasion) aka G-Man Invasion (there is an inner crash bug on final titles: some text lines are too long and cannot be properly displayed)
|
79. [G-Invasion v2.5](http://www.moddb.com/mods/g-man-invasion) aka G-Man Invasion (there is an inner crash bug on final titles: some text lines are too long and cannot be properly displayed)
|
||||||
@@ -120,7 +120,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
89. [Gut Reaction](http://www.moddb.com/mods/gut-reaction)
|
89. [Gut Reaction](http://www.moddb.com/mods/gut-reaction)
|
||||||
90. [Half-Life C.A.G.E.D.](https://store.steampowered.com/app/679990/HalfLife_Caged/) (set **-num edicts 4096** in command-line parameters for successful start)
|
90. [Half-Life C.A.G.E.D.](https://store.steampowered.com/app/679990/HalfLife_Caged/) (set **-num edicts 4096** in command-line parameters for successful start)
|
||||||
90. [Half-Life: Dreamcast v1.1](http://www.moddb.com/mods/half-life-dreamcast)
|
90. [Half-Life: Dreamcast v1.1](http://www.moddb.com/mods/half-life-dreamcast)
|
||||||
91. [Half-Life: OPS](http://www.dcfan.net.ru/forum/f109/half-life-ops-3791/) (link dead!)
|
91. [Half-Life: OPS](https://www.runthinkshootlive.com/posts/half-life-ops/)
|
||||||
92. [Half-Life: Uplink](https://www.fileplanet.com/10360/10000/fileinfo/Half-Life:-UpLink-Demo)
|
92. [Half-Life: Uplink](https://www.fileplanet.com/10360/10000/fileinfo/Half-Life:-UpLink-Demo)
|
||||||
92. [Half-Quake](http://www.moddb.com/mods/halfquake-amen)
|
92. [Half-Quake](http://www.moddb.com/mods/halfquake-amen)
|
||||||
93. [Half-Quake 2: Amen](http://www.moddb.com/mods/halfquake-amen)
|
93. [Half-Quake 2: Amen](http://www.moddb.com/mods/halfquake-amen)
|
||||||
@@ -129,7 +129,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
96. [Haunted](https://www.runthinkshootlive.com/posts/haunted/) (set **sv_validate_changelevel** to **0** to avoid a problem with level change between maps **pagan7** and **pagan8**)
|
96. [Haunted](https://www.runthinkshootlive.com/posts/haunted/) (set **sv_validate_changelevel** to **0** to avoid a problem with level change between maps **pagan7** and **pagan8**)
|
||||||
97. [Hazardous Materials: Episode 1 & 2](http://www.moddb.com/mods/half-life-hazardous-materials)
|
97. [Hazardous Materials: Episode 1 & 2](http://www.moddb.com/mods/half-life-hazardous-materials)
|
||||||
98. [Hazardous-Course 2](http://www.moddb.com/mods/hazardous-course-2)
|
98. [Hazardous-Course 2](http://www.moddb.com/mods/hazardous-course-2)
|
||||||
99. [Help Wanted](http://maps.mrsucko.org/work/)
|
99. [Help Wanted](https://www.moddb.com/games/half-life/addons/help-wanted)
|
||||||
100. [Hidden Evil v1.01](https://www.runthinkshootlive.com/posts/hidden-evil/)
|
100. [Hidden Evil v1.01](https://www.runthinkshootlive.com/posts/hidden-evil/)
|
||||||
101. [High Speed](http://www.moddb.com/games/half-life/addons/high-speed-english-version)
|
101. [High Speed](http://www.moddb.com/games/half-life/addons/high-speed-english-version)
|
||||||
102. [hlife_hotdog_compo26](http://twhl.info/vault.php?map=5181)
|
102. [hlife_hotdog_compo26](http://twhl.info/vault.php?map=5181)
|
||||||
@@ -155,7 +155,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
122. [Mario Keys](http://www.moddb.com/mods/mario-keys)
|
122. [Mario Keys](http://www.moddb.com/mods/mario-keys)
|
||||||
123. [McBeth](https://www.runthinkshootlive.com/posts/mcbeth/)
|
123. [McBeth](https://www.runthinkshootlive.com/posts/mcbeth/)
|
||||||
124. [Medieval World](http://www.moddb.com/mods/medieval-world)
|
124. [Medieval World](http://www.moddb.com/mods/medieval-world)
|
||||||
125. [Mel Soaring 2: Star Rancor](http://www.etherealhell.com/etherealhell/index.php/my-levels/half-life)
|
125. [Mel Soaring 2: Star Rancor](https://www.moddb.com/addons/mel-soaring-2-star-rancor)
|
||||||
126. [MINIMICUS](http://twhl.info/vault.php?map=163)
|
126. [MINIMICUS](http://twhl.info/vault.php?map=163)
|
||||||
127. [Mission Failed](http://www.moddb.com/mods/mission-failed)
|
127. [Mission Failed](http://www.moddb.com/mods/mission-failed)
|
||||||
128. [Mission MC Poker](http://www.moddb.com/mods/half-life-mission-mc-poker)
|
128. [Mission MC Poker](http://www.moddb.com/mods/half-life-mission-mc-poker)
|
||||||
@@ -176,7 +176,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)](http://www.visgi.info/maps/)
|
146. [Outwards (Day One)](https://drive.google.com/file/d/1mjQ8wUazYbwTq9Ocg0Vs0raq4avbTRne/view?usp=sharing)
|
||||||
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)
|
||||||
@@ -184,7 +184,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
151. [Phobos IV](http://www.moddb.com/mods/phobos-iv)
|
151. [Phobos IV](http://www.moddb.com/mods/phobos-iv)
|
||||||
152. [Pimp My Car](https://www.runthinkshootlive.com/posts/pimp-my-car/) (there is an inner issue with incorrect responses of buttons on combination locks)
|
152. [Pimp My Car](https://www.runthinkshootlive.com/posts/pimp-my-car/) (there is an inner issue with incorrect responses of buttons on combination locks)
|
||||||
153. [Point Blank – Stackdeath Complex](https://www.runthinkshootlive.com/posts/half-life-point-blank-stackdeath-complex/)
|
153. [Point Blank – Stackdeath Complex](https://www.runthinkshootlive.com/posts/half-life-point-blank-stackdeath-complex/)
|
||||||
154. [Prisoner Escaped](http://four0four.org/downloads/maps/)
|
154. [Prisoner Escaped](https://www.moddb.com/mods/prisoner-escaped-1-2)
|
||||||
155. [Prisoner of Event](http://wp.vondur.net/?page_id=40)
|
155. [Prisoner of Event](http://wp.vondur.net/?page_id=40)
|
||||||
156. [Prisoner of War](https://www.runthinkshootlive.com/posts/prisoner-of-war/)
|
156. [Prisoner of War](https://www.runthinkshootlive.com/posts/prisoner-of-war/)
|
||||||
157. [Project Quantum Leap](http://www.moddb.com/mods/project-quantum-leap)
|
157. [Project Quantum Leap](http://www.moddb.com/mods/project-quantum-leap)
|
||||||
@@ -206,7 +206,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
173. [Run for Life](https://www.runthinkshootlive.com/posts/run-for-life/) (the "stolen" version of this mod with changed menu background also known as *Mad Escape*)
|
173. [Run for Life](https://www.runthinkshootlive.com/posts/run-for-life/) (the "stolen" version of this mod with changed menu background also known as *Mad Escape*)
|
||||||
174. [S.W.A.T.](http://www.moddb.com/mods/swat2)
|
174. [S.W.A.T.](http://www.moddb.com/mods/swat2)
|
||||||
175. [Sabotage](https://www.runthinkshootlive.com/posts/sabotage-2/)
|
175. [Sabotage](https://www.runthinkshootlive.com/posts/sabotage-2/)
|
||||||
176. [Sagharmath](http://hl.webz.cz/hl1/eng.php?what=rec&zkratka=sa) (link dead!)
|
176. [Sagharmath](https://www.moddb.com/games/half-life/addons/sagharmath)
|
||||||
177. [Sandscroll](https://gamebanana.com/maps/15988)
|
177. [Sandscroll](https://gamebanana.com/maps/15988)
|
||||||
178. [Saving Bob](https://www.runthinkshootlive.com/posts/saving-bob/)
|
178. [Saving Bob](https://www.runthinkshootlive.com/posts/saving-bob/)
|
||||||
179. [Secret Base](https://www.runthinkshootlive.com/posts/secret-base/)
|
179. [Secret Base](https://www.runthinkshootlive.com/posts/secret-base/)
|
||||||
@@ -217,12 +217,12 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
184. [Sky Mesa](http://www.moddb.com/mods/sky-mesa)
|
184. [Sky Mesa](http://www.moddb.com/mods/sky-mesa)
|
||||||
185. [Sleephorst v1.5](http://www.moddb.com/mods/sleephorst-v15)
|
185. [Sleephorst v1.5](http://www.moddb.com/mods/sleephorst-v15)
|
||||||
186. [Smart Decoy](http://www.moddb.com/mods/smart-decoy)
|
186. [Smart Decoy](http://www.moddb.com/mods/smart-decoy)
|
||||||
187. [Somewhere in Time](http://twhl.info/vault.php?map=5530) (link dead!)
|
187. [Somewhere in Time](https://www.runthinkshootlive.com/posts/somewhere-in-time/)
|
||||||
188. [Sooper 2](http://www.k-saz.freeserve.co.uk/projects.htm) (link dead!)
|
188. [Sooper2](https://www.runthinkshootlive.com/posts/sooper-2/)
|
||||||
189. [Split-Second](http://twhl.info/vault.php?map=4343)
|
189. [Split-Second](http://twhl.info/vault.php?map=4343)
|
||||||
190. [Subhumanity](https://www.runthinkshootlive.com/posts/sub-humanity/)
|
190. [Subhumanity](https://www.runthinkshootlive.com/posts/sub-humanity/)
|
||||||
191. [Terror Side](https://www.runthinkshootlive.com/posts/terror-side/) (set **sv_validate_changelevel** to **0** to avoid problem with level change between some maps)
|
191. [Terror Side](https://www.runthinkshootlive.com/posts/terror-side/) (set **sv_validate_changelevel** to **0** to avoid problem with level change between some maps)
|
||||||
192. [Test Your Skill](http://www.tys-mod.de.vu/&e=40455876) (link dead!)
|
192. [Test Your Skill](https://www.moddb.com/games/half-life/addons/test-your-skill)
|
||||||
193. [The Challenger Deep](https://www.runthinkshootlive.com/posts/challenger-deep/)
|
193. [The Challenger Deep](https://www.runthinkshootlive.com/posts/challenger-deep/)
|
||||||
194. [The Challenger Deep 2](http://www.moddb.com/mods/the-challenger-deep-2)
|
194. [The Challenger Deep 2](http://www.moddb.com/mods/the-challenger-deep-2)
|
||||||
195. [The Evil Thing](http://www.moddb.com/mods/the-evil-thing)
|
195. [The Evil Thing](http://www.moddb.com/mods/the-evil-thing)
|
||||||
@@ -282,12 +282,12 @@ 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)](http://www.richmans-maps.ch.vu/) (link dead!)
|
9. [Hazardous-Course (first version of Hazardous-Course 2)](https://drive.google.com/file/d/16djJZSpNWKyScSxSyMqX-u_S-2i400rl/view?usp=sharing)
|
||||||
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)
|
||||||
13. [Kleiners Adventures Demo](http://www.moddb.com/mods/kleiners-adventures)
|
13. [Kleiners Adventures Demo](http://www.moddb.com/mods/kleiners-adventures)
|
||||||
14. [Kleiners Adventures: The White Line Demo](https://www.gamefront.com/files/13595030/Kleiners_Adventure_siemka321_edition) (link dead!)
|
14. [Kleiners Adventures: The White Line Demo](https://www.moddb.com/mods/kleiners-adventure-siemka321-edition)
|
||||||
15. [LV-426: Episode 1](https://www.runthinkshootlive.com/posts/lv426-version-a/)
|
15. [LV-426: Episode 1](https://www.runthinkshootlive.com/posts/lv426-version-a/)
|
||||||
16. [Malevolence(1.3 and older)](http://www.moddb.com/mods/malevolence)
|
16. [Malevolence(1.3 and older)](http://www.moddb.com/mods/malevolence)
|
||||||
17. [Meth-Life Demo v1.0](https://www.gamewatcher.com/mods/half-life-mod/meth-life-mod-demo-1-0)
|
17. [Meth-Life Demo v1.0](https://www.gamewatcher.com/mods/half-life-mod/meth-life-mod-demo-1-0)
|
||||||
@@ -305,11 +305,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](http://www.richmans-maps.ch.vu/) (link dead!)
|
32. [Technology Test 2](https://drive.google.com/file/d/1LfldzsMIN5j07bgtNkfY5v0Xl0S9de_G/view?usp=sharing)
|
||||||
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](http://www.richmans-maps.ch.vu/) (link dead!)
|
36. [Time-Shift](https://drive.google.com/file/d/1pK1s-2SIlSMQHVRPMLdC_94wTa__8_DX/view?usp=sharing)
|
||||||
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)
|
||||||
@@ -317,7 +317,7 @@ For mappacks - place *.bsp files to **valve/maps** folder, *.wad files to **valv
|
|||||||
41. [Zombieland v1.1](http://www.moddb.com/mods/zombieland)
|
41. [Zombieland v1.1](http://www.moddb.com/mods/zombieland)
|
||||||
|
|
||||||
## Just mappacks
|
## Just mappacks
|
||||||
1. [AvsM 1 v1.2](http://www.moddb.com/mods/avsm-2-project-xen/downloads/avsm-1-v12-full-version-croeng) (link dead!)
|
1. [AvsM 1 v1.2](https://www.moddb.com/mods/avsm-1-2003-version-re-release/)
|
||||||
2. [Cook The Headcrab Episodes 1 & 2](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-series)
|
2. [Cook The Headcrab Episodes 1 & 2](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-series)
|
||||||
3. [Cook The Headcrab Episode 3](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-3)
|
3. [Cook The Headcrab Episode 3](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-3)
|
||||||
4. [Cook The Headcrab Episode 4](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-4)
|
4. [Cook The Headcrab Episode 4](http://www.moddb.com/games/half-life/addons/cook-the-headcrab-episode-4)
|
||||||
@@ -379,7 +379,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)](http://half-life.ru/forum/showthread.php?threadid=13959)
|
8. [Lost in Black Mesa(first version without HLFX)](https://drive.google.com/file/d/1bEnm_AxJs-ly8hTEZIQBw_v2BsXdSiGa/view?usp=sharing)
|
||||||
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)
|
||||||
@@ -422,7 +422,7 @@ Mods:
|
|||||||
33. [C2](https://www.runthinkshootlive.com/posts/c2/)
|
33. [C2](https://www.runthinkshootlive.com/posts/c2/)
|
||||||
34. [C3](https://www.runthinkshootlive.com/posts/c3/)
|
34. [C3](https://www.runthinkshootlive.com/posts/c3/)
|
||||||
35. [C5](https://www.runthinkshootlive.com/posts/c5/)
|
35. [C5](https://www.runthinkshootlive.com/posts/c5/)
|
||||||
36. [Caged](http://www.caylegeorge.com/ld_history/cg_maps.htm) (link dead!)
|
36. [Caged](https://store.steampowered.com/app/679990/HalfLife_Caged/)
|
||||||
37. [Camera Puzzle](http://twhl.info/vault.php?map=740) (this map perfectly demonstrates an improved feature of Xash3D Engine - game is correctly saving and restoring 3rd person view for the player after loading a previously saved game)
|
37. [Camera Puzzle](http://twhl.info/vault.php?map=740) (this map perfectly demonstrates an improved feature of Xash3D Engine - game is correctly saving and restoring 3rd person view for the player after loading a previously saved game)
|
||||||
38. [CataXen](http://twhl.info/vault.php?map=3429)
|
38. [CataXen](http://twhl.info/vault.php?map=3429)
|
||||||
39. [Cause of Death](http://twhl.info/competitions.php?results=7)
|
39. [Cause of Death](http://twhl.info/competitions.php?results=7)
|
||||||
@@ -440,7 +440,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://www.gamefront.com/files/13532512) (3rd link dead!)
|
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)
|
||||||
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)
|
||||||
@@ -469,7 +469,7 @@ Mods:
|
|||||||
80. [Extinct Lifeform Hunt](https://www.fileplanet.com/13501/10000/fileinfo/Extinct-Lifeform-Hunt)
|
80. [Extinct Lifeform Hunt](https://www.fileplanet.com/13501/10000/fileinfo/Extinct-Lifeform-Hunt)
|
||||||
81. [Facility](http://twhl.info/vault.php?map=5482)
|
81. [Facility](http://twhl.info/vault.php?map=5482)
|
||||||
82. [Facility Escape](http://twhl.info/vault.php?map=3673)
|
82. [Facility Escape](http://twhl.info/vault.php?map=3673)
|
||||||
83. [Fallout](http://www.thewall.de/forum/thread/hl1-sp-48h-mapping-contest/64975.4.html) (map by *simb*)
|
83. [Fallout](http://www.thewall.de/forum/thread/hl1-sp-48h-mapping-contest/64975.4.html) (map by *simb*) (link dead!)
|
||||||
84. [Final Assault](http://twhl.info/vault.php?map=4500)
|
84. [Final Assault](http://twhl.info/vault.php?map=4500)
|
||||||
85. [Flat](http://hl.loess.ru/?mods=&search=Flat)
|
85. [Flat](http://hl.loess.ru/?mods=&search=Flat)
|
||||||
86. [Freeman's Allegiance](https://www.runthinkshootlive.com/posts/freemans-allegiance/)
|
86. [Freeman's Allegiance](https://www.runthinkshootlive.com/posts/freemans-allegiance/)
|
||||||
@@ -498,8 +498,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](http://web.archive.org/web/20070305075816/http://www.twhl.co.za/mapvault/2817.zip) (map from *TWHL* by *Archie* aka *The Hunter*)
|
112. [Impulse 101 Fun - The Train](https://drive.google.com/file/d/1jAuMCCmREH0mfAEAscqaG8FQGa2uNknb/view?usp=sharing) (map from *TWHL* by *Archie* aka *The Hunter*)
|
||||||
113. [In America](http://www.lambda-force.org/load/half_life/karty/half_life_in_america/18-1-0-476)
|
113. [In America](https://drive.google.com/file/d/1gOC8zfnUvBxRy8Rr8juNiUNbLYjoZpnn/view?usp=sharing)
|
||||||
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!)
|
||||||
@@ -641,7 +641,7 @@ Mods:
|
|||||||
252. [Tower](http://twhl.info/vault.php?map=250) (Required Spirit of Half-Life for item_suit)
|
252. [Tower](http://twhl.info/vault.php?map=250) (Required Spirit of Half-Life for item_suit)
|
||||||
253. [TriggerHappy](https://www.fileplanet.com/8929/0/fileinfo/TriggerHappy)
|
253. [TriggerHappy](https://www.fileplanet.com/8929/0/fileinfo/TriggerHappy)
|
||||||
254. [TriggerHappy2](https://www.fileplanet.com/13503/10000/fileinfo/TriggerHappy2)
|
254. [TriggerHappy2](https://www.fileplanet.com/13503/10000/fileinfo/TriggerHappy2)
|
||||||
255. [TriggerHappy2.5](http://www.atomicgamer.com/files/14120/trhappy25-zip) (link dead!)
|
255. [TriggerHappy2.5](https://www.moddb.com/games/half-life/addons/trigger-happy-v25)
|
||||||
256. [Trouble](https://gamebanana.com/maps/166033)
|
256. [Trouble](https://gamebanana.com/maps/166033)
|
||||||
257. [Tunnels](http://twhl.info/vault.php?map=5350)
|
257. [Tunnels](http://twhl.info/vault.php?map=5350)
|
||||||
258. [Twisted Hazard Course](https://www.fileplanet.com/52919/50000/fileinfo/Twisted-Hazard-Course)
|
258. [Twisted Hazard Course](https://www.fileplanet.com/52919/50000/fileinfo/Twisted-Hazard-Course)
|
||||||
@@ -668,7 +668,7 @@ Mods:
|
|||||||
279. [X-treme Violence](http://www.moddb.com/mods/x-treme-violence)
|
279. [X-treme Violence](http://www.moddb.com/mods/x-treme-violence)
|
||||||
280. [XargoL's Entry for Vassy's Compo](http://twhl.info/vault.php?map=769)
|
280. [XargoL's Entry for Vassy's Compo](http://twhl.info/vault.php?map=769)
|
||||||
281. [Xen Again](https://www.fileplanet.com/9132/0/fileinfo/XEN-AGAIN)
|
281. [Xen Again](https://www.fileplanet.com/9132/0/fileinfo/XEN-AGAIN)
|
||||||
282. [Xen World](http://www.lambda-force.org/load/half_life/karty/half_life_xen_world/18-1-0-481)
|
282. [Xen World](http://www.lambda-force.org/load/half_life/karty/half_life_xen_world/18-1-0-481) (link dead!)
|
||||||
283. [XUnil](https://www.fileplanet.com/7883/0/fileinfo/XUNIL)
|
283. [XUnil](https://www.fileplanet.com/7883/0/fileinfo/XUNIL)
|
||||||
284. [Zeeba-G's TWHL Compo 26 Entry](http://twhl.info/competitions.php?results=26)
|
284. [Zeeba-G's TWHL Compo 26 Entry](http://twhl.info/competitions.php?results=26)
|
||||||
285. [Zombies!](https://gamebanana.com/maps/160812)
|
285. [Zombies!](https://gamebanana.com/maps/160812)
|
||||||
@@ -694,7 +694,7 @@ For Linux and OS X you must download crossbuild from [here](http://www.moddb.com
|
|||||||
2. [Big Scientists](http://www.moddb.com/mods/big-scientists)
|
2. [Big Scientists](http://www.moddb.com/mods/big-scientists)
|
||||||
3. [Black Silla Assault DEMO v1.2](http://www.moddb.com/mods/black-silla-assault)
|
3. [Black Silla Assault DEMO v1.2](http://www.moddb.com/mods/black-silla-assault)
|
||||||
4. [Blbej Den](http://www.moddb.com/mods/blbej-den)
|
4. [Blbej Den](http://www.moddb.com/mods/blbej-den)
|
||||||
5. [Cold Experiment v1](http://jpmaps.wz.cz/epizody.htm) (you will need some files from SoHL to play it properly; download SoHL 1.2, extract files and copy following folders into **coldexv1** folder: cl_dlls, dlls, models, sprites)
|
5. [Cold Experiment v1](https://www.moddb.com/games/half-life/addons/cold-experiment) (you will need some files from SoHL to play it properly; download SoHL 1.2, extract files and copy following folders into **coldexv1** folder: cl_dlls, dlls, models, sprites)
|
||||||
6. [Dead Sector v1.0a](http://www.moddb.com/mods/dead-sector)
|
6. [Dead Sector v1.0a](http://www.moddb.com/mods/dead-sector)
|
||||||
7. [Death Is Dead](http://www.moddb.com/games/half-life/addons/death-is-dead) (there is a fog-related inner bug at the first map)
|
7. [Death Is Dead](http://www.moddb.com/games/half-life/addons/death-is-dead) (there is a fog-related inner bug at the first map)
|
||||||
8. [Escape from Black Mesa Alpha](http://www.moddb.com/mods/escape-from-black-mesa)
|
8. [Escape from Black Mesa Alpha](http://www.moddb.com/mods/escape-from-black-mesa)
|
||||||
@@ -708,11 +708,11 @@ For Linux and OS X you must download crossbuild from [here](http://www.moddb.com
|
|||||||
16. [Radiation Alert: Episode 1 v1.1](http://www.moddb.com/mods/radiation-alert-episode-1)
|
16. [Radiation Alert: Episode 1 v1.1](http://www.moddb.com/mods/radiation-alert-episode-1)
|
||||||
17. [Run From Hell v1.1b](https://www.runthinkshootlive.com/posts/run-from-hell/) (there is an inner bug with underwater crates in the map **firstmap9** - they can't be broken, so you should use **noclip** to pass through them)
|
17. [Run From Hell v1.1b](https://www.runthinkshootlive.com/posts/run-from-hell/) (there is an inner bug with underwater crates in the map **firstmap9** - they can't be broken, so you should use **noclip** to pass through them)
|
||||||
18. [Santa's Revenge](http://twhl.info/vault.php?map=4332) (set **fps_max** to **60** to avoid an inner problem of the last map with final scripted sequence, otherwise the mod can not be finished properly)
|
18. [Santa's Revenge](http://twhl.info/vault.php?map=4332) (set **fps_max** to **60** to avoid an inner problem of the last map with final scripted sequence, otherwise the mod can not be finished properly)
|
||||||
19. [Sector 6](http://www.moddb.com/mods/sector-6x) (link dead!)
|
19. [Sector 6](https://www.moddb.com/mods/sector-6/)
|
||||||
20. [Space Prisoner v1.1](http://www.moddb.com/games/half-life/addons/space-prisoner-v11) (after installing of the mod open **liblist.gam** or **gameinfo.txt** file in the mod's folder and correct the line **gamedll "..\prison\dlls\spirit.dll"** for **gamedll "dlls\spirit.dll"**, otherwise you'll not be able to start a game; there is also a scripting error on a third map of the mod, so you'll be forced to use **noclip** to pass around bugged place)
|
20. [Space Prisoner v1.1](http://www.moddb.com/games/half-life/addons/space-prisoner-v11) (after installing of the mod open **liblist.gam** or **gameinfo.txt** file in the mod's folder and correct the line **gamedll "..\prison\dlls\spirit.dll"** for **gamedll "dlls\spirit.dll"**, otherwise you'll not be able to start a game; there is also a scripting error on a third map of the mod, so you'll be forced to use **noclip** to pass around bugged place)
|
||||||
21. [Terrorist Attack 2](http://terroristattack.wz.cz/mody.html) (link dead!)
|
21. [Terrorist Attack 2](https://www.moddb.com/games/half-life/addons/terrorist-attack-2)
|
||||||
22. [Timeline III: The Heart of Darkness](http://www.moddb.com/mods/timeline-series)
|
22. [Timeline III: The Heart of Darkness](http://www.moddb.com/mods/timeline-series)
|
||||||
23. [Underground 2 Demo](http://www.isolated-design.de/half-life-mods/underground-2/)
|
23. [Underground 2 Demo](https://www.moddb.com/games/half-life/addons/underground-2-demo)
|
||||||
|
|
||||||
## Mods which based on modified Spirit of Half-Life 1.2 or older(Partially playable with SoHL 1.2 libraries or not playable at all)
|
## Mods which based on modified Spirit of Half-Life 1.2 or older(Partially playable with SoHL 1.2 libraries or not playable at all)
|
||||||
1. [Black Death](http://www.moddb.com/mods/half-life-black-death)
|
1. [Black Death](http://www.moddb.com/mods/half-life-black-death)
|
||||||
@@ -739,7 +739,7 @@ For Linux and OS X you must download crossbuild from [here](http://www.moddb.com
|
|||||||
1. [Before v1.0](http://www.moddb.com/mods/half-life-before)
|
1. [Before v1.0](http://www.moddb.com/mods/half-life-before)
|
||||||
2. [Christmas Life v1.0](http://www.moddb.com/mods/christmas-life) (initial mod works properly, but additional mappacks for this mod contain few maps that have some gameplay problems under Xash3D)
|
2. [Christmas Life v1.0](http://www.moddb.com/mods/christmas-life) (initial mod works properly, but additional mappacks for this mod contain few maps that have some gameplay problems under Xash3D)
|
||||||
3. [COLONY 42 Alpha](http://twhl.info/vault.php?map=6055)
|
3. [COLONY 42 Alpha](http://twhl.info/vault.php?map=6055)
|
||||||
4. [Crazy Crabs Demo 1 & 2](http://www.moddb.com/mods/mad-crabs-2014) (link dead!)
|
4. [Crazy Crabs Demo 1 & 2](https://www.moddb.com/mods/mad-crabs)
|
||||||
5. [Far Crab Demo v2](http://www.moddb.com/mods/far-crab)
|
5. [Far Crab Demo v2](http://www.moddb.com/mods/far-crab)
|
||||||
6. [Firefighter Demo v1.1](http://www.moddb.com/mods/firefighter-mod)
|
6. [Firefighter Demo v1.1](http://www.moddb.com/mods/firefighter-mod)
|
||||||
7. [Halfquake 3: Sunrise](http://www.moddb.com/mods/halfquake-amen)
|
7. [Halfquake 3: Sunrise](http://www.moddb.com/mods/halfquake-amen)
|
||||||
@@ -780,7 +780,7 @@ For mappacks - place *.bsp files to **gearbox/maps** folder, *.wad files to **ge
|
|||||||
16. [Mechanized Death: An Army of None](http://www.moddb.com/games/half-life-opposing-force/addons/mechanized-death-army-of-none)
|
16. [Mechanized Death: An Army of None](http://www.moddb.com/games/half-life-opposing-force/addons/mechanized-death-army-of-none)
|
||||||
17. [Nuclear Winter](http://www.moddb.com/mods/nuclear-winter-opfor)
|
17. [Nuclear Winter](http://www.moddb.com/mods/nuclear-winter-opfor)
|
||||||
18. [Opposing Force Aliens Addon](https://www.fileplanet.com/82829/80000/fileinfo/Half-Life:-Opposing-Force-Aliens-Addon-1.2)
|
18. [Opposing Force Aliens Addon](https://www.fileplanet.com/82829/80000/fileinfo/Half-Life:-Opposing-Force-Aliens-Addon-1.2)
|
||||||
19. [Opposing Life2Life](https://www.gamewatcher.com/) (link dead!)
|
19. [Opposing Life2Life](https://www.moddb.com/games/half-life/addons/opposing-life2life-final-hd)
|
||||||
20. [Realms](http://www.snarkpit.net/index.php?s=maps&map=3483)
|
20. [Realms](http://www.snarkpit.net/index.php?s=maps&map=3483)
|
||||||
21. [Shepard's Adventures](http://www.moddb.com/mods/shepards-adventures)
|
21. [Shepard's Adventures](http://www.moddb.com/mods/shepards-adventures)
|
||||||
22. [Snowy Rock](http://www.moddb.com/games/half-life-opposing-force/addons/snow-rock)
|
22. [Snowy Rock](http://www.moddb.com/games/half-life-opposing-force/addons/snow-rock)
|
||||||
@@ -825,10 +825,10 @@ Mods:
|
|||||||
3. [Bomb Squad](http://www.snarkpit.net/index.php?s=maps&map=3471)
|
3. [Bomb Squad](http://www.snarkpit.net/index.php?s=maps&map=3471)
|
||||||
4. [Corruption](http://www.snarkpit.net/index.php?s=maps&map=3154)
|
4. [Corruption](http://www.snarkpit.net/index.php?s=maps&map=3154)
|
||||||
5. [Critical Mass](http://www.moddb.com/mods/half-life-critical-mass) [C3M1 Build 1 Demo](https://www.fileplanet.com/125746/120000/fileinfo/C3M1-Build-1)
|
5. [Critical Mass](http://www.moddb.com/mods/half-life-critical-mass) [C3M1 Build 1 Demo](https://www.fileplanet.com/125746/120000/fileinfo/C3M1-Build-1)
|
||||||
6. [EPRST!](http://www.planetphillip.com/posts/ep-rst-opposing-force/) (link dead!)
|
6. [EPRST!](https://www.runthinkshootlive.com/posts/ep-rst/)
|
||||||
7. [Firing Range](https://www.runthinkshootlive.com/posts/firing-range/)
|
7. [Firing Range](https://www.runthinkshootlive.com/posts/firing-range/)
|
||||||
8. [Friendly Fire](https://www.runthinkshootlive.com/posts/friendly-fire/)
|
8. [Friendly Fire](https://www.runthinkshootlive.com/posts/friendly-fire/)
|
||||||
9. [Guitar Star Pre-Alpha](http://hl-lab.ru/eng/mods_goldsrc/Guitar_Star_(Prealpha)) (link dead!)
|
9. [Guitar Star Pre-Alpha](http://gamer-lab.com/rus/mods_goldsrc/Guitar_Star_(Prealpha))
|
||||||
10. [J2000](https://www.runthinkshootlive.com/posts/j2000/)
|
10. [J2000](https://www.runthinkshootlive.com/posts/j2000/)
|
||||||
11. [Killing House for OF](https://www.runthinkshootlive.com/posts/scientist-rescue-aka-cqb/)
|
11. [Killing House for OF](https://www.runthinkshootlive.com/posts/scientist-rescue-aka-cqb/)
|
||||||
12. [Klabautermann](https://www.runthinkshootlive.com/posts/klabautermann/) (though the map has some inner issues, it can be properly finished, just don't let the welder soldier die and don't press the fifth button until you mount a special gun in its' place)
|
12. [Klabautermann](https://www.runthinkshootlive.com/posts/klabautermann/) (though the map has some inner issues, it can be properly finished, just don't let the welder soldier die and don't press the fifth button until you mount a special gun in its' place)
|
||||||
|
|||||||
99
README.md
99
README.md
@@ -1,45 +1,58 @@
|
|||||||
# Xash3D FWGS Engine
|
# Xash3D FWGS Engine <img align="right" width="128" height="128" src="https://github.com/FWGS/xash3d-fwgs/raw/master/game_launch/icon-xash-material.png" alt="Xash3D FWGS icon" />
|
||||||
[](https://travis-ci.org/FWGS/xash3d-fwgs) [](https://discord.gg/TbnHcVb)
|
[](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)
|
||||||
|
|
||||||
Xash3D FWGS is a fork of Xash3D Engine by Unkle Mike with extended features and crossplatform.
|
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 FWGS is a heavily modified fork of an original [Xash3D Engine](https://www.moddb.com/engines/xash3d-engine) by Unkle Mike.
|
||||||
Xash3D is a game engine, aimed to provide compatibility with Half-Life Engine,
|
|
||||||
as well as to give game developers well known workflow and extend it.
|
|
||||||
Read more about Xash3D on ModDB: https://www.moddb.com/engines/xash3d-engine
|
|
||||||
```
|
|
||||||
|
|
||||||
Latest release build: https://github.com/FWGS/xash3d-fwgs/releases/latest
|
## Donate
|
||||||
|
[](Documentation/donate.md) \
|
||||||
Latest development build: https://github.com/FWGS/xash3d-deploy/tree/newengine-master
|
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
|
||||||
* HLSDK 2.4 support.
|
* Steam Half-Life (HLSDK 2.4) support.
|
||||||
* Crossplatform: officially supported x86 and ARM on Windows/Linux/BSD/Android. (see Documentation/ports.md for more info)
|
* Crossplatform and modern compilers support: supports Windows, Linux, BSD & Android on x86 & ARM and [many more](Documentation/ports.md).
|
||||||
* Modern compilers support: say no more to MSVC6.
|
* Better multiplayer support: multiple master servers, headless dedicated server, voice chat and IPv6 support.
|
||||||
* Better multiplayer support: multiple master servers, headless dedicated server.
|
* Multiple renderers support: OpenGL, GLESv1, GLESv2 and Software.
|
||||||
* Mobility API: allows better game integration on mobile devices(vibration, touch controls)
|
* Advanced virtual filesystem: `.pk3` and `.pk3dir` support, compatibility with GoldSrc FS module, fast case-insensitivity emulation for crossplatform.
|
||||||
* Different input methods: touch, gamepad and classic mouse & keyboard.
|
* Mobility API: better game integration on mobile devices (vibration, touch controls)
|
||||||
|
* 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.
|
||||||
* Multiple renderers support(OpenGL, GLES, Software)
|
* External VGUI support module.
|
||||||
* A set of small improvements, without broken compatibility.
|
* PNG & KTX2 image format support.
|
||||||
|
* [A set of small improvements](Documentation/), without broken compatibility.
|
||||||
|
|
||||||
## Planned fork features
|
## Installation & Running
|
||||||
* Virtual Reality support and game API
|
0) Get Xash3D FWGS binaries: you can use [testing](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous) build or you can compile engine from source code.
|
||||||
* Voice support
|
1) Copy engine binaries to some directory.
|
||||||
* Vulkan renderer
|
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).
|
||||||
|
This repository contains our fork of HLSDK and restored source code for some of the mods. Not all of them, of course.
|
||||||
|
You still needed to copy `valve` directory as all game resources located there.
|
||||||
|
3) Run the main executable (`xash3d.exe` or AppImage).
|
||||||
|
|
||||||
|
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
|
||||||
* Before sending a PR, check if you followed our coding guide in CODING_STYLE.md file.
|
* Issues are accepted in both English and Russian
|
||||||
|
* 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 https://waf.io/book/
|
||||||
|
|
||||||
If you're stuck somewhere and you need a clear example, read `.travis.yml` and `scripts/build*.sh`.
|
NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
#### Windows(Visual Studio)
|
|
||||||
|
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!
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
#### Windows (Visual Studio)
|
||||||
* Install Visual Studio.
|
* Install Visual Studio.
|
||||||
* Install latest [Python](https://python.org) **OR** run `cinst python.install` if you have Chocolatey.
|
* Install latest [Python](https://python.org) **OR** run `cinst python.install` if you have Chocolatey.
|
||||||
* Install latest [Git](https://git-scm.com/download/win) **OR** run `cinst git.install` if you have Chocolatey.
|
* Install latest [Git](https://git-scm.com/download/win) **OR** run `cinst git.install` if you have Chocolatey.
|
||||||
@@ -48,46 +61,32 @@ If you're stuck somewhere and you need a clear example, read `.travis.yml` and `
|
|||||||
* Make sure you have at least 12GB of free space to store all build-time dependencies: ~10GB for Visual Studio, 300 MB for Git, 100 MB for Python and other.
|
* Make sure you have at least 12GB of free space to store all build-time dependencies: ~10GB for Visual Studio, 300 MB for Git, 100 MB for Python and other.
|
||||||
|
|
||||||
#### GNU/Linux
|
#### GNU/Linux
|
||||||
NOTE FOR USERS WITH X86 COMPATIBLE CPUs:
|
|
||||||
We have forced build system to throw an error, if you're trying to build 64-bit engine. This done for keeping 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!
|
|
||||||
|
|
||||||
##### Debian/Ubuntu
|
##### Debian/Ubuntu
|
||||||
* Enable i386 on your system, if you're compiling 32-bit engine on amd64. If not, skip this
|
* Enable i386 on your system, if you're compiling 32-bit engine on amd64. If not, skip this
|
||||||
|
|
||||||
`$ sudo dpkg --add-architecture i386`
|
`$ sudo dpkg --add-architecture i386`
|
||||||
* Install development tools
|
* Install development tools
|
||||||
* For 32-bit engine on amd64:
|
* 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`
|
`$ sudo apt install build-essential gcc-multilib g++-multilib python libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype6-dev:i386`
|
||||||
* For everything else:
|
* For everything else: \
|
||||||
|
|
||||||
`$ sudo apt install build-essential python libsdl2-dev libfontconfig-dev libfreetype6-dev`
|
`$ sudo apt install build-essential python libsdl2-dev libfontconfig-dev libfreetype6-dev`
|
||||||
* Clone this repostory:
|
* Clone this repostory:
|
||||||
`$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`
|
`$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`
|
||||||
|
|
||||||
#### ArchLinux
|
|
||||||
* ArchLinux users are lucky enough and there is a `xash3d-git` AUR package for them.
|
|
||||||
|
|
||||||
### 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) Carefully examine which build options are available: `waf --help`
|
||||||
3) Configure build: `waf configure -T release --sdl2=c:/path/to/SDL2 --prefix=c:/path/to/any/output/directory`
|
3) Configure build: `waf configure -T release --sdl2=c:/path/to/SDL2`
|
||||||
4) Compile: `waf build`
|
4) Compile: `waf build`
|
||||||
5) Install: `waf install`
|
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.
|
||||||
|
|
||||||
0) Examine which build options are available: `./waf --help`
|
0) Examine which build options are available: `./waf --help`
|
||||||
1) Configure build: `./waf configure -T release --prefix=/path/to/any/output/directory`
|
1) Configure build: `./waf configure -T release`
|
||||||
(To compile 64-bit engine on 64-bit x86 processor, you need to pass `-8` also)
|
(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(optional): `./waf install`
|
3) Install(optional): `./waf install --destdir=/path/to/any/output/directory`
|
||||||
|
|
||||||
## Running
|
|
||||||
0) Copy libraries and main executable somewhere, if you're skipped installation stage.
|
|
||||||
1) Copy game files to same directory
|
|
||||||
2) Run `xash3d.exe`/`xash3d.sh`/`xash3d` depending on which platform you're using.
|
|
||||||
|
|
||||||
For additional info, run Xash3D with `-help` command line key.
|
|
||||||
|
|||||||
@@ -18,37 +18,36 @@ GNU General Public License for more details.
|
|||||||
// video backends (XASH_VIDEO)
|
// video backends (XASH_VIDEO)
|
||||||
#define VIDEO_NULL 0
|
#define VIDEO_NULL 0
|
||||||
#define VIDEO_SDL 1
|
#define VIDEO_SDL 1
|
||||||
#define VIDEO_ANDROID 2
|
|
||||||
#define VIDEO_FBDEV 3
|
#define VIDEO_FBDEV 3
|
||||||
|
#define VIDEO_DOS 4
|
||||||
|
|
||||||
// audio backends (XASH_SOUND)
|
// audio backends (XASH_SOUND)
|
||||||
#define SOUND_NULL 0
|
#define SOUND_NULL 0
|
||||||
#define SOUND_SDL 1
|
#define SOUND_SDL 1
|
||||||
#define SOUND_OPENSLES 2
|
|
||||||
#define SOUND_ALSA 3
|
#define SOUND_ALSA 3
|
||||||
|
|
||||||
// crash handler (XASH_CRASHHANDLER)
|
|
||||||
#define CRASHHANDLER_NULL 0
|
|
||||||
#define CRASHHANDLER_UCONTEXT 1
|
|
||||||
#define CRASHHANDLER_DBGHELP 2
|
|
||||||
#define CRASHHANDLER_WIN32 3
|
|
||||||
|
|
||||||
// input (XASH_INPUT)
|
// input (XASH_INPUT)
|
||||||
#define INPUT_NULL 0
|
#define INPUT_NULL 0
|
||||||
#define INPUT_SDL 1
|
#define INPUT_SDL 1
|
||||||
#define INPUT_ANDROID 2
|
|
||||||
#define INPUT_EVDEV 3
|
#define INPUT_EVDEV 3
|
||||||
|
|
||||||
// timer (XASH_TIMER)
|
// timer (XASH_TIMER)
|
||||||
#define TIMER_NULL 0 // not used
|
#define TIMER_NULL 0 // not used
|
||||||
#define TIMER_SDL 1
|
#define TIMER_SDL 1
|
||||||
#define TIMER_LINUX 2
|
#define TIMER_POSIX 2
|
||||||
#define TIMER_WIN32 3
|
#define TIMER_WIN32 3
|
||||||
|
#define TIMER_DOS 4
|
||||||
|
|
||||||
// messageboxes (XASH_MESSAGEBOX)
|
// messageboxes (XASH_MESSAGEBOX)
|
||||||
#define MSGBOX_STDERR 0
|
#define MSGBOX_STDERR 0
|
||||||
#define MSGBOX_SDL 1
|
#define MSGBOX_SDL 1
|
||||||
#define MSGBOX_ANDROID 2
|
|
||||||
#define MSGBOX_WIN32 3
|
#define MSGBOX_WIN32 3
|
||||||
|
#define MSGBOX_NSWITCH 4
|
||||||
|
|
||||||
|
// library loading (XASH_LIB)
|
||||||
|
#define LIB_NULL 0
|
||||||
|
#define LIB_POSIX 1
|
||||||
|
#define LIB_WIN32 2
|
||||||
|
#define LIB_STATIC 3
|
||||||
|
|
||||||
#endif /* BACKENDS_H */
|
#endif /* BACKENDS_H */
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ BRUSH MODELS
|
|||||||
|
|
||||||
#define SURF_PLANEBACK BIT( 1 ) // plane should be negated
|
#define SURF_PLANEBACK BIT( 1 ) // plane should be negated
|
||||||
#define SURF_DRAWSKY BIT( 2 ) // sky surface
|
#define SURF_DRAWSKY BIT( 2 ) // sky surface
|
||||||
#define SURF_DRAWTURB_QUADS BIT( 3 ) // all subidivided polygons are quads
|
#define SURF_DRAWTURB_QUADS BIT( 3 ) // all subidivided polygons are quads
|
||||||
#define SURF_DRAWTURB BIT( 4 ) // warp surface
|
#define SURF_DRAWTURB BIT( 4 ) // warp surface
|
||||||
#define SURF_DRAWTILED BIT( 5 ) // face without lighmap
|
#define SURF_DRAWTILED BIT( 5 ) // face without lighmap
|
||||||
#define SURF_CONVEYOR BIT( 6 ) // scrolled texture (was SURF_DRAWBACKGROUND)
|
#define SURF_CONVEYOR BIT( 6 ) // scrolled texture (was SURF_DRAWBACKGROUND)
|
||||||
@@ -61,23 +61,27 @@ BRUSH MODELS
|
|||||||
#define LS_UNUSED 0xFE
|
#define LS_UNUSED 0xFE
|
||||||
#define LS_NONE 0xFF
|
#define LS_NONE 0xFF
|
||||||
|
|
||||||
|
#define MAX_MAP_CLIPNODES_HLBSP 32767
|
||||||
|
#define MAX_MAP_CLIPNODES_BSP2 524288
|
||||||
|
|
||||||
// these limis not using by modelloader but only for displaying 'mapstats' correctly
|
// these limis not using by modelloader but only for displaying 'mapstats' correctly
|
||||||
#ifdef SUPPORT_BSP2_FORMAT
|
#ifdef SUPPORT_BSP2_FORMAT
|
||||||
#define MAX_MAP_MODELS 2048 // embedded models
|
#define MAX_MAP_MODELS 2048 // embedded models
|
||||||
#define MAX_MAP_ENTSTRING 0x200000 // 2 Mb should be enough
|
#define MAX_MAP_ENTSTRING 0x200000 // 2 Mb should be enough
|
||||||
#define MAX_MAP_PLANES 131072 // can be increased without problems
|
#define MAX_MAP_PLANES 131072 // can be increased without problems
|
||||||
#define MAX_MAP_NODES 262144 // can be increased without problems
|
#define MAX_MAP_NODES 262144 // can be increased without problems
|
||||||
#define MAX_MAP_CLIPNODES 524288 // can be increased without problems
|
#define MAX_MAP_CLIPNODES MAX_MAP_CLIPNODES_BSP2 // can be increased without problems
|
||||||
#define MAX_MAP_LEAFS 131072 // CRITICAL STUFF to run ad_sepulcher!!!
|
#define MAX_MAP_LEAFS 131072 // CRITICAL STUFF to run ad_sepulcher!!!
|
||||||
#define MAX_MAP_VERTS 524288 // can be increased without problems
|
#define MAX_MAP_VERTS 524288 // can be increased without problems
|
||||||
#define MAX_MAP_FACES 262144 // can be increased without problems
|
#define MAX_MAP_FACES 262144 // can be increased without problems
|
||||||
#define MAX_MAP_MARKSURFACES 524288 // can be increased without problems
|
#define MAX_MAP_MARKSURFACES 524288 // can be increased without problems
|
||||||
#else
|
#else
|
||||||
#define MAX_MAP_MODELS 768 // embedded models
|
// increased to match PrimeXT compilers
|
||||||
|
#define MAX_MAP_MODELS 1024 // embedded models
|
||||||
#define MAX_MAP_ENTSTRING 0x100000 // 1 Mb should be enough
|
#define MAX_MAP_ENTSTRING 0x100000 // 1 Mb should be enough
|
||||||
#define MAX_MAP_PLANES 65536 // can be increased without problems
|
#define MAX_MAP_PLANES 65536 // can be increased without problems
|
||||||
#define MAX_MAP_NODES 32767 // because negative shorts are leafs
|
#define MAX_MAP_NODES 32767 // because negative shorts are leafs
|
||||||
#define MAX_MAP_CLIPNODES 32767 // because negative shorts are contents
|
#define MAX_MAP_CLIPNODES MAX_MAP_CLIPNODES_HLBSP // because negative shorts are contents
|
||||||
#define MAX_MAP_LEAFS 32767 // signed short limit
|
#define MAX_MAP_LEAFS 32767 // signed short limit
|
||||||
#define MAX_MAP_VERTS 65535 // unsigned short limit
|
#define MAX_MAP_VERTS 65535 // unsigned short limit
|
||||||
#define MAX_MAP_FACES 65535 // unsigned short limit
|
#define MAX_MAP_FACES 65535 // unsigned short limit
|
||||||
@@ -166,7 +170,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
int id; // must be little endian XASH
|
int id; // must be little endian XASH
|
||||||
int version;
|
int version;
|
||||||
dlump_t lumps[EXTRA_LUMPS];
|
dlump_t lumps[EXTRA_LUMPS];
|
||||||
} dextrahdr_t;
|
} dextrahdr_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -33,7 +33,7 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float prevanimtime;
|
float prevanimtime;
|
||||||
float sequencetime;
|
float sequencetime;
|
||||||
byte prevseqblending[2];
|
byte prevseqblending[2];
|
||||||
vec3_t prevorigin;
|
vec3_t prevorigin;
|
||||||
|
|||||||
@@ -9,7 +9,20 @@ NOTE: number at end of pixelformat name it's a total bitscount e.g. PF_RGB_24 ==
|
|||||||
========================================================================
|
========================================================================
|
||||||
*/
|
*/
|
||||||
#define ImageRAW( type ) (type == PF_RGBA_32 || type == PF_BGRA_32 || type == PF_RGB_24 || type == PF_BGR_24 || type == PF_LUMINANCE)
|
#define ImageRAW( type ) (type == PF_RGBA_32 || type == PF_BGRA_32 || type == PF_RGB_24 || type == PF_BGR_24 || type == PF_LUMINANCE)
|
||||||
#define ImageDXT( type ) (type == PF_DXT1 || type == PF_DXT3 || type == PF_DXT5 || type == PF_ATI2)
|
#define ImageCompressed( type ) \
|
||||||
|
( type == PF_DXT1 \
|
||||||
|
|| type == PF_DXT3 \
|
||||||
|
|| type == PF_DXT5 \
|
||||||
|
|| type == PF_ATI2 \
|
||||||
|
|| type == PF_BC4_SIGNED \
|
||||||
|
|| type == PF_BC4_UNSIGNED \
|
||||||
|
|| type == PF_BC5_SIGNED \
|
||||||
|
|| type == PF_BC5_UNSIGNED \
|
||||||
|
|| type == PF_BC6H_SIGNED \
|
||||||
|
|| type == PF_BC6H_UNSIGNED \
|
||||||
|
|| type == PF_BC7_UNORM \
|
||||||
|
|| type == PF_BC7_SRGB \
|
||||||
|
|| type == PF_KTX2_RAW )
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -21,10 +34,19 @@ typedef enum
|
|||||||
PF_RGB_24, // uncompressed dds or another 24-bit image
|
PF_RGB_24, // uncompressed dds or another 24-bit image
|
||||||
PF_BGR_24, // big-endian RGB (MacOS)
|
PF_BGR_24, // big-endian RGB (MacOS)
|
||||||
PF_LUMINANCE,
|
PF_LUMINANCE,
|
||||||
PF_DXT1, // s3tc DXT1 format
|
PF_DXT1, // s3tc DXT1/BC1 format
|
||||||
PF_DXT3, // s3tc DXT3 format
|
PF_DXT3, // s3tc DXT3/BC2 format
|
||||||
PF_DXT5, // s3tc DXT5 format
|
PF_DXT5, // s3tc DXT5/BC3 format
|
||||||
PF_ATI2, // latc ATI2N format
|
PF_ATI2, // latc ATI2N/BC5 format
|
||||||
|
PF_BC4_SIGNED,
|
||||||
|
PF_BC4_UNSIGNED,
|
||||||
|
PF_BC5_SIGNED,
|
||||||
|
PF_BC5_UNSIGNED,
|
||||||
|
PF_BC6H_SIGNED, // bptc BC6H signed FP16 format
|
||||||
|
PF_BC6H_UNSIGNED, // bptc BC6H unsigned FP16 format
|
||||||
|
PF_BC7_UNORM, // bptc BC7 format
|
||||||
|
PF_BC7_SRGB,
|
||||||
|
PF_KTX2_RAW, // Raw KTX2 data, used for yet unsupported KTX2 subformats
|
||||||
PF_TOTALCOUNT, // must be last
|
PF_TOTALCOUNT, // must be last
|
||||||
} pixformat_t;
|
} pixformat_t;
|
||||||
|
|
||||||
@@ -46,6 +68,8 @@ typedef enum
|
|||||||
IL_DDS_HARDWARE = BIT(4), // DXT compression is support
|
IL_DDS_HARDWARE = BIT(4), // DXT compression is support
|
||||||
IL_LOAD_DECAL = BIT(5), // special mode for load gradient decals
|
IL_LOAD_DECAL = BIT(5), // special mode for load gradient decals
|
||||||
IL_OVERVIEW = BIT(6), // overview required some unque operations
|
IL_OVERVIEW = BIT(6), // overview required some unque operations
|
||||||
|
IL_LOAD_PLAYER_DECAL = BIT(7), // special mode for player decals
|
||||||
|
IL_KTX2_RAW = BIT(8), // renderer can consume raw KTX2 files (e.g. ref_vk)
|
||||||
} ilFlags_t;
|
} ilFlags_t;
|
||||||
|
|
||||||
// goes into rgbdata_t->encode
|
// goes into rgbdata_t->encode
|
||||||
@@ -82,7 +106,7 @@ typedef enum
|
|||||||
IMAGE_ROT_90 = BIT(18), // flip from upper left corner to down right corner
|
IMAGE_ROT_90 = BIT(18), // flip from upper left corner to down right corner
|
||||||
IMAGE_ROT180 = IMAGE_FLIP_X|IMAGE_FLIP_Y,
|
IMAGE_ROT180 = IMAGE_FLIP_X|IMAGE_FLIP_Y,
|
||||||
IMAGE_ROT270 = IMAGE_FLIP_X|IMAGE_FLIP_Y|IMAGE_ROT_90,
|
IMAGE_ROT270 = IMAGE_FLIP_X|IMAGE_FLIP_Y|IMAGE_ROT_90,
|
||||||
IMAGE_EMBOSS = BIT(19), // apply emboss mapping
|
// reserved
|
||||||
IMAGE_RESAMPLE = BIT(20), // resample image to specified dims
|
IMAGE_RESAMPLE = BIT(20), // resample image to specified dims
|
||||||
// reserved
|
// reserved
|
||||||
// reserved
|
// reserved
|
||||||
|
|||||||
@@ -32,16 +32,17 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#define MIPLEVELS 4
|
#define MIPLEVELS 4
|
||||||
#define VERTEXSIZE 7
|
#define VERTEXSIZE 7
|
||||||
#define MAXLIGHTMAPS 4
|
#define MAXLIGHTMAPS 4 // max light styles per face
|
||||||
|
#define MAXDYNLIGHTS 8 // maximum dynamic lights per one pixel
|
||||||
#define NUM_AMBIENTS 4 // automatic ambient sounds
|
#define NUM_AMBIENTS 4 // automatic ambient sounds
|
||||||
|
|
||||||
// model types
|
// model types
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
mod_bad = -1,
|
mod_bad = -1,
|
||||||
mod_brush,
|
mod_brush,
|
||||||
mod_sprite,
|
mod_sprite,
|
||||||
mod_alias,
|
mod_alias,
|
||||||
mod_studio
|
mod_studio
|
||||||
} modtype_t;
|
} modtype_t;
|
||||||
|
|
||||||
@@ -92,7 +93,7 @@ typedef struct texture_s
|
|||||||
struct texture_s *alternate_anims; // bmodels in frame 1 use these
|
struct texture_s *alternate_anims; // bmodels in frame 1 use these
|
||||||
unsigned short fb_texturenum; // auto-luma texturenum
|
unsigned short fb_texturenum; // auto-luma texturenum
|
||||||
unsigned short dt_texturenum; // detail-texture binding
|
unsigned short dt_texturenum; // detail-texture binding
|
||||||
unsigned int unused[3]; // reserved
|
unsigned int unused[3]; // reserved
|
||||||
} texture_t;
|
} texture_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -104,7 +105,7 @@ typedef struct
|
|||||||
|
|
||||||
vec3_t mins, maxs; // terrain bounds (fill by user)
|
vec3_t mins, maxs; // terrain bounds (fill by user)
|
||||||
|
|
||||||
int reserved[32]; // just for future expansions or mod-makers
|
intptr_t reserved[32]; // just for future expansions or mod-makers
|
||||||
} mfaceinfo_t;
|
} mfaceinfo_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -146,7 +147,7 @@ typedef struct mnode_s
|
|||||||
|
|
||||||
// node specific
|
// node specific
|
||||||
mplane_t *plane;
|
mplane_t *plane;
|
||||||
struct mnode_s *children[2];
|
struct mnode_s *children[2];
|
||||||
#ifdef SUPPORT_BSP2_FORMAT
|
#ifdef SUPPORT_BSP2_FORMAT
|
||||||
int firstsurface;
|
int firstsurface;
|
||||||
int numsurfaces;
|
int numsurfaces;
|
||||||
@@ -165,15 +166,15 @@ struct decal_s
|
|||||||
decal_t *pnext; // linked list for each surface
|
decal_t *pnext; // linked list for each surface
|
||||||
msurface_t *psurface; // Surface id for persistence / unlinking
|
msurface_t *psurface; // Surface id for persistence / unlinking
|
||||||
float dx; // local texture coordinates
|
float dx; // local texture coordinates
|
||||||
float dy; //
|
float dy; //
|
||||||
float scale; // Pixel scale
|
float scale; // Pixel scale
|
||||||
short texture; // Decal texture
|
short texture; // Decal texture
|
||||||
short flags; // Decal flags FDECAL_*
|
short flags; // Decal flags FDECAL_*
|
||||||
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
|
glpoly_t *polys; // precomputed decal vertices
|
||||||
int reserved[4]; // just for future expansions or mod-makers
|
intptr_t reserved[4]; // just for future expansions or mod-makers
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct mleaf_s
|
typedef struct mleaf_s
|
||||||
@@ -227,7 +228,7 @@ typedef struct mextrasurf_s
|
|||||||
unsigned short numverts; // world->vertexes[]
|
unsigned short numverts; // world->vertexes[]
|
||||||
int firstvertex; // fisrt look up in tr.tbn_vectors[], then acess to world->vertexes[]
|
int firstvertex; // fisrt look up in tr.tbn_vectors[], then acess to world->vertexes[]
|
||||||
|
|
||||||
int reserved[32]; // just for future expansions or mod-makers
|
intptr_t reserved[32]; // just for future expansions or mod-makers
|
||||||
} mextrasurf_t;
|
} mextrasurf_t;
|
||||||
|
|
||||||
struct msurface_s
|
struct msurface_s
|
||||||
@@ -290,7 +291,7 @@ typedef struct model_s
|
|||||||
// shared modelinfo
|
// shared modelinfo
|
||||||
modtype_t type; // model type
|
modtype_t type; // model type
|
||||||
int numframes; // sprite's framecount
|
int numframes; // sprite's framecount
|
||||||
byte *mempool; // private mempool (was synctype)
|
poolhandle_t mempool; // private mempool (was synctype)
|
||||||
int flags; // hl compatibility
|
int flags; // hl compatibility
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -298,7 +299,7 @@ typedef struct model_s
|
|||||||
//
|
//
|
||||||
vec3_t mins, maxs; // bounding box at angles '0 0 0'
|
vec3_t mins, maxs; // bounding box at angles '0 0 0'
|
||||||
float radius;
|
float radius;
|
||||||
|
|
||||||
// brush model
|
// brush model
|
||||||
int firstmodelsurface;
|
int firstmodelsurface;
|
||||||
int nummodelsurfaces;
|
int nummodelsurfaces;
|
||||||
@@ -385,7 +386,7 @@ typedef struct player_info_s
|
|||||||
int bottomcolor;
|
int bottomcolor;
|
||||||
|
|
||||||
// last frame rendered
|
// last frame rendered
|
||||||
int renderframe;
|
int renderframe;
|
||||||
|
|
||||||
// Gait frame estimation
|
// Gait frame estimation
|
||||||
int gaitsequence;
|
int gaitsequence;
|
||||||
@@ -529,7 +530,7 @@ typedef struct
|
|||||||
#define MAX_DEMOS 32
|
#define MAX_DEMOS 32
|
||||||
#define MAX_MOVIES 8
|
#define MAX_MOVIES 8
|
||||||
#define MAX_CDTRACKS 32
|
#define MAX_CDTRACKS 32
|
||||||
#define MAX_CLIENT_SPRITES 256 // SpriteTextures
|
#define MAX_CLIENT_SPRITES 512 // SpriteTextures (0-256 hud, 256-512 client)
|
||||||
#define MAX_EFRAGS 8192 // Arcane Dimensions required
|
#define MAX_EFRAGS 8192 // Arcane Dimensions required
|
||||||
#define MAX_REQUESTS 64
|
#define MAX_REQUESTS 64
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
355
common/const.h
355
common/const.h
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -20,45 +20,45 @@
|
|||||||
// Most came from server.h
|
// Most came from server.h
|
||||||
|
|
||||||
// edict->flags
|
// edict->flags
|
||||||
#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground
|
#define FL_FLY (1U<<0) // Changes the SV_Movestep() behavior to not need to be on ground
|
||||||
#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
|
#define FL_SWIM (1U<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
|
||||||
#define FL_CONVEYOR (1<<2)
|
#define FL_CONVEYOR (1U<<2)
|
||||||
#define FL_CLIENT (1<<3)
|
#define FL_CLIENT (1U<<3)
|
||||||
#define FL_INWATER (1<<4)
|
#define FL_INWATER (1U<<4)
|
||||||
#define FL_MONSTER (1<<5)
|
#define FL_MONSTER (1U<<5)
|
||||||
#define FL_GODMODE (1<<6)
|
#define FL_GODMODE (1U<<6)
|
||||||
#define FL_NOTARGET (1<<7)
|
#define FL_NOTARGET (1U<<7)
|
||||||
#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself
|
#define FL_SKIPLOCALHOST (1U<<8) // Don't send entity to local host, it's predicting this entity itself
|
||||||
#define FL_ONGROUND (1<<9) // At rest / on the ground
|
#define FL_ONGROUND (1U<<9) // At rest / on the ground
|
||||||
#define FL_PARTIALGROUND (1<<10) // not all corners are valid
|
#define FL_PARTIALGROUND (1U<<10) // not all corners are valid
|
||||||
#define FL_WATERJUMP (1<<11) // player jumping out of water
|
#define FL_WATERJUMP (1U<<11) // player jumping out of water
|
||||||
#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera
|
#define FL_FROZEN (1U<<12) // Player is frozen for 3rd person camera
|
||||||
#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them
|
#define FL_FAKECLIENT (1U<<13) // JAC: fake client, simulated server side; don't send network messages to them
|
||||||
#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched
|
#define FL_DUCKING (1U<<14) // Player flag -- Player is fully crouched
|
||||||
#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water
|
#define FL_FLOAT (1U<<15) // Apply floating force to this entity when in water
|
||||||
#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection
|
#define FL_GRAPHED (1U<<16) // worldgraph has this ent listed as something that blocks a connection
|
||||||
|
|
||||||
// UNDONE: Do we need these?
|
// UNDONE: Do we need these?
|
||||||
#define FL_IMMUNE_WATER (1<<17)
|
#define FL_IMMUNE_WATER (1U<<17)
|
||||||
#define FL_IMMUNE_SLIME (1<<18)
|
#define FL_IMMUNE_SLIME (1U<<18)
|
||||||
#define FL_IMMUNE_LAVA (1<<19)
|
#define FL_IMMUNE_LAVA (1U<<19)
|
||||||
|
|
||||||
#define FL_PROXY (1<<20) // This is a spectator proxy
|
#define FL_PROXY (1U<<20) // This is a spectator proxy
|
||||||
#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path)
|
#define FL_ALWAYSTHINK (1U<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path)
|
||||||
#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum)
|
#define FL_BASEVELOCITY (1U<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum)
|
||||||
#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set
|
#define FL_MONSTERCLIP (1U<<23) // Only collide in with monsters who have FL_MONSTERCLIP set
|
||||||
#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
|
#define FL_ONTRAIN (1U<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
|
||||||
#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something)
|
#define FL_WORLDBRUSH (1U<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something)
|
||||||
#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc.
|
#define FL_SPECTATOR (1U<<26) // This client is a spectator, don't run touch functions, etc.
|
||||||
#define FL_LASERDOT (1<<27) // Predicted laser spot from rocket launcher
|
#define FL_LASERDOT (1U<<27) // Predicted laser spot from rocket launcher
|
||||||
|
|
||||||
#define FL_CUSTOMENTITY (1<<29) // This is a custom entity
|
#define FL_CUSTOMENTITY (1U<<29) // This is a custom entity
|
||||||
#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time
|
#define FL_KILLME (1U<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time
|
||||||
#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client
|
#define FL_DORMANT (1U<<31) // Entity is dormant, no updates to client
|
||||||
|
|
||||||
// Goes into globalvars_t.trace_flags
|
// Goes into globalvars_t.trace_flags
|
||||||
#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box
|
#define FTRACE_SIMPLEBOX (1U<<0) // Traceline with a simple box
|
||||||
#define FTRACE_IGNORE_GLASS (1<<1) // traceline will be ignored entities with rendermode != kRenderNormal
|
#define FTRACE_IGNORE_GLASS (1U<<1) // traceline will be ignored entities with rendermode != kRenderNormal
|
||||||
|
|
||||||
// walkmove modes
|
// walkmove modes
|
||||||
#define WALKMOVE_NORMAL 0 // normal walkmove
|
#define WALKMOVE_NORMAL 0 // normal walkmove
|
||||||
@@ -114,50 +114,50 @@
|
|||||||
#define EF_LIGHT 64 // rocket flare glow sprite
|
#define EF_LIGHT 64 // rocket flare glow sprite
|
||||||
#define EF_NODRAW 128 // don't draw entity
|
#define EF_NODRAW 128 // don't draw entity
|
||||||
|
|
||||||
#define EF_WATERSIDES (1<<26) // Do not remove sides for func_water entity
|
#define EF_WATERSIDES (1U<<26) // Do not remove sides for func_water entity
|
||||||
#define EF_FULLBRIGHT (1<<27) // Just get fullbright
|
#define EF_FULLBRIGHT (1U<<27) // Just get fullbright
|
||||||
#define EF_NOSHADOW (1<<28) // ignore shadow for this entity
|
#define EF_NOSHADOW (1U<<28) // ignore shadow for this entity
|
||||||
#define EF_MERGE_VISIBILITY (1<<29) // this entity allowed to merge vis (e.g. env_sky or portal camera)
|
#define EF_MERGE_VISIBILITY (1U<<29) // this entity allowed to merge vis (e.g. env_sky or portal camera)
|
||||||
#define EF_REQUEST_PHS (1<<30) // This entity requested phs bitvector instead of pvsbitvector in AddToFullPack calls
|
#define EF_REQUEST_PHS (1U<<30) // This entity requested phs bitvector instead of pvsbitvector in AddToFullPack calls
|
||||||
// g-cont. one reserved bit here for me
|
// g-cont. one reserved bit here for me
|
||||||
|
|
||||||
// entity flags
|
// entity flags
|
||||||
#define EFLAG_SLERP 1 // do studio interpolation of this entity
|
#define EFLAG_SLERP 1 // do studio interpolation of this entity
|
||||||
|
|
||||||
//
|
//
|
||||||
// temp entity events
|
// temp entity events
|
||||||
//
|
//
|
||||||
#define TE_BEAMPOINTS 0 // beam effect between two points
|
#define TE_BEAMPOINTS 0 // beam effect between two points
|
||||||
// coord coord coord (start position)
|
// coord coord coord (start position)
|
||||||
// coord coord coord (end position)
|
// coord coord coord (end position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_BEAMENTPOINT 1 // beam effect between point and entity
|
#define TE_BEAMENTPOINT 1 // beam effect between point and entity
|
||||||
// short (start entity)
|
// short (start entity)
|
||||||
// coord coord coord (end position)
|
// coord coord coord (end position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_GUNSHOT 2 // particle effect plus ricochet sound
|
#define TE_GUNSHOT 2 // particle effect plus ricochet sound
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
|
|
||||||
#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps
|
#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (scale in 0.1's)
|
// byte (scale in 0.1's)
|
||||||
// byte (framerate)
|
// byte (framerate)
|
||||||
@@ -173,54 +173,54 @@
|
|||||||
#define TE_EXPLFLAG_ROTATE 32 // rotate the sprite randomly
|
#define TE_EXPLFLAG_ROTATE 32 // rotate the sprite randomly
|
||||||
|
|
||||||
#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound
|
#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
|
|
||||||
#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps
|
#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (scale in 0.1's)
|
// byte (scale in 0.1's)
|
||||||
// byte (framerate)
|
// byte (framerate)
|
||||||
|
|
||||||
#define TE_TRACER 6 // tracer effect from point to point
|
#define TE_TRACER 6 // tracer effect from point to point
|
||||||
// coord, coord, coord (start)
|
// coord, coord, coord (start)
|
||||||
// coord, coord, coord (end)
|
// coord, coord, coord (end)
|
||||||
|
|
||||||
#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters
|
#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters
|
||||||
// coord, coord, coord (start)
|
// coord, coord, coord (start)
|
||||||
// coord, coord, coord (end)
|
// coord, coord, coord (end)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (width in 0.1's)
|
// byte (width in 0.1's)
|
||||||
// byte (amplitude in 0.01's)
|
// byte (amplitude in 0.01's)
|
||||||
// short (sprite model index)
|
// short (sprite model index)
|
||||||
|
|
||||||
#define TE_BEAMENTS 8
|
#define TE_BEAMENTS 8
|
||||||
// short (start entity)
|
// short (start entity)
|
||||||
// short (end entity)
|
// short (end entity)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite
|
#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
|
|
||||||
#define TE_LAVASPLASH 10 // Quake1 lava splash
|
#define TE_LAVASPLASH 10 // Quake1 lava splash
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
|
|
||||||
#define TE_TELEPORT 11 // Quake1 teleport splash
|
#define TE_TELEPORT 11 // Quake1 teleport splash
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
|
|
||||||
#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound
|
#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound
|
||||||
// coord coord coord (position)
|
// coord coord coord (position)
|
||||||
// byte (starting color)
|
// byte (starting color)
|
||||||
// byte (num colors)
|
// byte (num colors)
|
||||||
|
|
||||||
#define TE_BSPDECAL 13 // Decal from the .BSP file
|
#define TE_BSPDECAL 13 // Decal from the .BSP file
|
||||||
// coord, coord, coord (x,y,z), decal position (center of texture in world)
|
// coord, coord, coord (x,y,z), decal position (center of texture in world)
|
||||||
// short (texture index of precached decal texture name)
|
// short (texture index of precached decal texture name)
|
||||||
// short (entity index)
|
// short (entity index)
|
||||||
@@ -230,67 +230,67 @@
|
|||||||
// coord, coord, coord (position)
|
// coord, coord, coord (position)
|
||||||
// byte (radius)
|
// byte (radius)
|
||||||
// byte (count)
|
// byte (count)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
|
|
||||||
#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions
|
#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions
|
||||||
// coord, coord, coord (start)
|
// coord, coord, coord (start)
|
||||||
// coord, coord, coord (end)
|
// coord, coord, coord (end)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (count)
|
// byte (count)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (scale in 0.1's)
|
// byte (scale in 0.1's)
|
||||||
// byte (velocity along vector in 10's)
|
// byte (velocity along vector in 10's)
|
||||||
// byte (randomness of velocity in 10's)
|
// byte (randomness of velocity in 10's)
|
||||||
|
|
||||||
#define TE_BEAM 16 // obsolete
|
#define TE_BEAM 16 // obsolete
|
||||||
|
|
||||||
#define TE_SPRITE 17 // additive sprite, plays 1 cycle
|
#define TE_SPRITE 17 // additive sprite, plays 1 cycle
|
||||||
// coord, coord, coord (position)
|
// coord, coord, coord (position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (scale in 0.1's)
|
// byte (scale in 0.1's)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
|
|
||||||
#define TE_BEAMSPRITE 18 // A beam with a sprite at the end
|
#define TE_BEAMSPRITE 18 // A beam with a sprite at the end
|
||||||
// coord, coord, coord (start position)
|
// coord, coord, coord (start position)
|
||||||
// coord, coord, coord (end position)
|
// coord, coord, coord (end position)
|
||||||
// short (beam sprite index)
|
// short (beam sprite index)
|
||||||
// short (end sprite index)
|
// short (end sprite index)
|
||||||
|
|
||||||
#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime
|
#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime
|
||||||
// coord coord coord (center position)
|
// coord coord coord (center position)
|
||||||
// coord coord coord (axis and radius)
|
// coord coord coord (axis and radius)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime
|
#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime
|
||||||
// coord coord coord (center position)
|
// coord coord coord (center position)
|
||||||
// coord coord coord (axis and radius)
|
// coord coord coord (axis and radius)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime
|
#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime
|
||||||
// coord coord coord (center position)
|
// coord coord coord (center position)
|
||||||
// coord coord coord (axis and radius)
|
// coord coord coord (axis and radius)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
@@ -298,30 +298,30 @@
|
|||||||
#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving
|
#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving
|
||||||
// short (entity:attachment to follow)
|
// short (entity:attachment to follow)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
|
|
||||||
#define TE_GLOWSPRITE 23
|
#define TE_GLOWSPRITE 23
|
||||||
// coord, coord, coord (pos) short (model index) byte (scale / 10)
|
// coord, coord, coord (pos) short (model index) byte (scale / 10)
|
||||||
|
|
||||||
#define TE_BEAMRING 24 // connect a beam ring to two entities
|
#define TE_BEAMRING 24 // connect a beam ring to two entities
|
||||||
// short (start entity)
|
// short (start entity)
|
||||||
// short (end entity)
|
// short (end entity)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// byte (starting frame)
|
// byte (starting frame)
|
||||||
// byte (frame rate in 0.1's)
|
// byte (frame rate in 0.1's)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
// byte (line width in 0.1's)
|
// byte (line width in 0.1's)
|
||||||
// byte (noise amplitude in 0.01's)
|
// byte (noise amplitude in 0.01's)
|
||||||
// byte,byte,byte (color)
|
// byte,byte,byte (color)
|
||||||
// byte (brightness)
|
// byte (brightness)
|
||||||
// byte (scroll speed in 0.1's)
|
// byte (scroll speed in 0.1's)
|
||||||
|
|
||||||
#define TE_STREAK_SPLASH 25 // oriented shower of tracers
|
#define TE_STREAK_SPLASH 25 // oriented shower of tracers
|
||||||
// coord coord coord (start position)
|
// coord coord coord (start position)
|
||||||
// coord coord coord (direction vector)
|
// coord coord coord (direction vector)
|
||||||
// byte (color)
|
// byte (color)
|
||||||
// short (count)
|
// short (count)
|
||||||
// short (base speed)
|
// short (base speed)
|
||||||
@@ -330,15 +330,15 @@
|
|||||||
#define TE_BEAMHOSE 26 // obsolete
|
#define TE_BEAMHOSE 26 // obsolete
|
||||||
|
|
||||||
#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect
|
#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect
|
||||||
// coord, coord, coord (pos)
|
// coord, coord, coord (pos)
|
||||||
// byte (radius in 10's)
|
// byte (radius in 10's)
|
||||||
// byte byte byte (color)
|
// byte byte byte (color)
|
||||||
// byte (life in 10's)
|
// byte (life in 10's)
|
||||||
// byte (decay rate in 10's)
|
// byte (decay rate in 10's)
|
||||||
|
|
||||||
#define TE_ELIGHT 28 // point entity light, no world effect
|
#define TE_ELIGHT 28 // point entity light, no world effect
|
||||||
// short (entity:attachment to follow)
|
// short (entity:attachment to follow)
|
||||||
// coord coord coord (initial position)
|
// coord coord coord (initial position)
|
||||||
// coord (radius)
|
// coord (radius)
|
||||||
// byte byte byte (color)
|
// byte byte byte (color)
|
||||||
// byte (life in 0.1's)
|
// byte (life in 0.1's)
|
||||||
@@ -374,8 +374,8 @@
|
|||||||
|
|
||||||
#define TE_LARGEFUNNEL 100
|
#define TE_LARGEFUNNEL 100
|
||||||
// coord coord coord (funnel position)
|
// coord coord coord (funnel position)
|
||||||
// short (sprite index)
|
// short (sprite index)
|
||||||
// short (flags)
|
// short (flags)
|
||||||
|
|
||||||
#define TE_BLOODSTREAM 101 // particle spray
|
#define TE_BLOODSTREAM 101 // particle spray
|
||||||
// coord coord coord (start position)
|
// coord coord coord (start position)
|
||||||
@@ -404,7 +404,7 @@
|
|||||||
// byte (density)
|
// byte (density)
|
||||||
|
|
||||||
#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits
|
#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits
|
||||||
// coord, coord, coord (position)
|
// coord, coord, coord (position)
|
||||||
// coord, coord, coord (velocity)
|
// coord, coord, coord (velocity)
|
||||||
// angle (initial yaw)
|
// angle (initial yaw)
|
||||||
// short (model index)
|
// short (model index)
|
||||||
@@ -441,7 +441,7 @@
|
|||||||
// byte (speed)
|
// byte (speed)
|
||||||
// byte (noise)
|
// byte (noise)
|
||||||
|
|
||||||
#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound.
|
#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound.
|
||||||
// coord, coord, coord (position)
|
// coord, coord, coord (position)
|
||||||
// byte (scale in 0.1's)
|
// byte (scale in 0.1's)
|
||||||
|
|
||||||
@@ -529,7 +529,7 @@
|
|||||||
#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance)
|
#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance)
|
||||||
#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration.
|
#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration.
|
||||||
#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque
|
#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque
|
||||||
#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube.
|
#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube.
|
||||||
#define TEFIRE_FLAG_ADDITIVE 32 // if set, sprite is rendered as additive
|
#define TEFIRE_FLAG_ADDITIVE 32 // if set, sprite is rendered as additive
|
||||||
|
|
||||||
#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent)
|
#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent)
|
||||||
@@ -606,13 +606,6 @@
|
|||||||
#define CONTENT_GRAVITY_FLYFIELD -18
|
#define CONTENT_GRAVITY_FLYFIELD -18
|
||||||
#define CONTENT_FOG -19
|
#define CONTENT_FOG -19
|
||||||
|
|
||||||
#define CONTENT_EMPTY -1
|
|
||||||
#define CONTENT_SOLID -2
|
|
||||||
#define CONTENT_WATER -3
|
|
||||||
#define CONTENT_SLIME -4
|
|
||||||
#define CONTENT_LAVA -5
|
|
||||||
#define CONTENT_SKY -6
|
|
||||||
|
|
||||||
// channels
|
// channels
|
||||||
#define CHAN_AUTO 0
|
#define CHAN_AUTO 0
|
||||||
#define CHAN_WEAPON 1
|
#define CHAN_WEAPON 1
|
||||||
@@ -620,7 +613,7 @@
|
|||||||
#define CHAN_ITEM 3
|
#define CHAN_ITEM 3
|
||||||
#define CHAN_BODY 4
|
#define CHAN_BODY 4
|
||||||
#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area
|
#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area
|
||||||
#define CHAN_STATIC 6 // allocate channel from the static area
|
#define CHAN_STATIC 6 // allocate channel from the static area
|
||||||
#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network
|
#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network
|
||||||
#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
|
#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
|
||||||
|
|
||||||
@@ -628,7 +621,7 @@
|
|||||||
#define ATTN_NONE 0
|
#define ATTN_NONE 0
|
||||||
#define ATTN_NORM (float)0.8
|
#define ATTN_NORM (float)0.8
|
||||||
#define ATTN_IDLE (float)2
|
#define ATTN_IDLE (float)2
|
||||||
#define ATTN_STATIC (float)1.25
|
#define ATTN_STATIC (float)1.25
|
||||||
|
|
||||||
// pitch values
|
// pitch values
|
||||||
#define PITCH_NORM 100 // non-pitch shifted
|
#define PITCH_NORM 100 // non-pitch shifted
|
||||||
@@ -647,22 +640,22 @@
|
|||||||
#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains
|
#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains
|
||||||
|
|
||||||
// buttons
|
// buttons
|
||||||
#define IN_ATTACK (1<<0)
|
#define IN_ATTACK (1U<<0)
|
||||||
#define IN_JUMP (1<<1)
|
#define IN_JUMP (1U<<1)
|
||||||
#define IN_DUCK (1<<2)
|
#define IN_DUCK (1U<<2)
|
||||||
#define IN_FORWARD (1<<3)
|
#define IN_FORWARD (1U<<3)
|
||||||
#define IN_BACK (1<<4)
|
#define IN_BACK (1U<<4)
|
||||||
#define IN_USE (1<<5)
|
#define IN_USE (1U<<5)
|
||||||
#define IN_CANCEL (1<<6)
|
#define IN_CANCEL (1U<<6)
|
||||||
#define IN_LEFT (1<<7)
|
#define IN_LEFT (1U<<7)
|
||||||
#define IN_RIGHT (1<<8)
|
#define IN_RIGHT (1U<<8)
|
||||||
#define IN_MOVELEFT (1<<9)
|
#define IN_MOVELEFT (1U<<9)
|
||||||
#define IN_MOVERIGHT (1<<10)
|
#define IN_MOVERIGHT (1U<<10)
|
||||||
#define IN_ATTACK2 (1<<11)
|
#define IN_ATTACK2 (1U<<11)
|
||||||
#define IN_RUN (1<<12)
|
#define IN_RUN (1U<<12)
|
||||||
#define IN_RELOAD (1<<13)
|
#define IN_RELOAD (1U<<13)
|
||||||
#define IN_ALT1 (1<<14)
|
#define IN_ALT1 (1U<<14)
|
||||||
#define IN_SCORE (1<<15) // Used by client.dll for when scoreboard is held down
|
#define IN_SCORE (1U<<15) // Used by client.dll for when scoreboard is held down
|
||||||
|
|
||||||
// Break Model Defines
|
// Break Model Defines
|
||||||
#define BREAK_TYPEMASK 0x4F
|
#define BREAK_TYPEMASK 0x4F
|
||||||
@@ -691,8 +684,8 @@
|
|||||||
#define TE_BOUNCE_SHOTSHELL 2
|
#define TE_BOUNCE_SHOTSHELL 2
|
||||||
|
|
||||||
// Rendering constants
|
// Rendering constants
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
kRenderNormal, // src
|
kRenderNormal, // src
|
||||||
kRenderTransColor, // c*a+dest*(1-a)
|
kRenderTransColor, // c*a+dest*(1-a)
|
||||||
kRenderTransTexture, // src*a+dest*(1-a)
|
kRenderTransTexture, // src*a+dest*(1-a)
|
||||||
@@ -701,21 +694,21 @@ enum
|
|||||||
kRenderTransAdd, // src*a+dest
|
kRenderTransAdd, // src*a+dest
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
kRenderFxNone = 0,
|
kRenderFxNone = 0,
|
||||||
kRenderFxPulseSlow,
|
kRenderFxPulseSlow,
|
||||||
kRenderFxPulseFast,
|
kRenderFxPulseFast,
|
||||||
kRenderFxPulseSlowWide,
|
kRenderFxPulseSlowWide,
|
||||||
kRenderFxPulseFastWide,
|
kRenderFxPulseFastWide,
|
||||||
kRenderFxFadeSlow,
|
kRenderFxFadeSlow,
|
||||||
kRenderFxFadeFast,
|
kRenderFxFadeFast,
|
||||||
kRenderFxSolidSlow,
|
kRenderFxSolidSlow,
|
||||||
kRenderFxSolidFast,
|
kRenderFxSolidFast,
|
||||||
kRenderFxStrobeSlow,
|
kRenderFxStrobeSlow,
|
||||||
kRenderFxStrobeFast,
|
kRenderFxStrobeFast,
|
||||||
kRenderFxStrobeFaster,
|
kRenderFxStrobeFaster,
|
||||||
kRenderFxFlickerSlow,
|
kRenderFxFlickerSlow,
|
||||||
kRenderFxFlickerFast,
|
kRenderFxFlickerFast,
|
||||||
kRenderFxNoDissipation,
|
kRenderFxNoDissipation,
|
||||||
kRenderFxDistort, // Distort/scale/translate flicker
|
kRenderFxDistort, // Distort/scale/translate flicker
|
||||||
@@ -724,6 +717,7 @@ enum
|
|||||||
kRenderFxExplode, // Scale up really big!
|
kRenderFxExplode, // Scale up really big!
|
||||||
kRenderFxGlowShell, // Glowing Shell
|
kRenderFxGlowShell, // Glowing Shell
|
||||||
kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!)
|
kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!)
|
||||||
|
kRenderFxLightMultiplier,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int func_t;
|
typedef int func_t;
|
||||||
@@ -732,7 +726,6 @@ typedef int string_t;
|
|||||||
typedef unsigned short word;
|
typedef unsigned short word;
|
||||||
|
|
||||||
#include "xash3d_types.h"
|
#include "xash3d_types.h"
|
||||||
#define Q_isspace( ch ) (ch < 32 || ch > 255)
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -25,14 +25,18 @@
|
|||||||
#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
|
#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_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_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
|
||||||
|
|
||||||
#define FCVAR_MOVEVARS (1<<10) // this cvar is a part of movevars_t struct that shared between client and server
|
// Xash3D extensions
|
||||||
#define FCVAR_LATCH (1<<11) // notify client what this cvar will be applied only after server restart (but don't does more nothing)
|
|
||||||
#define FCVAR_GLCONFIG (1<<12) // write it into <renderer>.cfg(see RefAPI)
|
#define FCVAR_GLCONFIG (1<<12) // write it into <renderer>.cfg(see RefAPI)
|
||||||
#define FCVAR_CHANGED (1<<13) // set each time the cvar is changed
|
#define FCVAR_CHANGED (1<<13) // set each time the cvar is changed
|
||||||
#define FCVAR_GAMEUIDLL (1<<14) // defined by the menu DLL
|
#define FCVAR_GAMEUIDLL (1<<14) // defined by the menu DLL
|
||||||
#define FCVAR_CHEAT (1<<15) // can not be changed if cheats are disabled
|
#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
|
||||||
|
#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
|
typedef struct cvar_s
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|||||||
@@ -47,28 +47,11 @@ SETUP BACKENDS DEFINITIONS
|
|||||||
#endif // XASH_TIMER
|
#endif // XASH_TIMER
|
||||||
|
|
||||||
#ifndef XASH_MESSAGEBOX
|
#ifndef XASH_MESSAGEBOX
|
||||||
#define XASH_MESSAGEBOX MSGBOX_SDL
|
#if !XASH_NSWITCH // SDL2 messageboxes not available
|
||||||
|
#define XASH_MESSAGEBOX MSGBOX_SDL
|
||||||
|
#endif
|
||||||
#endif // XASH_MESSAGEBOX
|
#endif // XASH_MESSAGEBOX
|
||||||
#endif
|
#endif
|
||||||
#elif XASH_ANDROID
|
|
||||||
// we are building for Android platform, use Android APIs
|
|
||||||
#ifndef XASH_VIDEO
|
|
||||||
#define XASH_VIDEO VIDEO_ANDROID
|
|
||||||
#endif // XASH_VIDEO
|
|
||||||
|
|
||||||
#ifndef XASH_INPUT
|
|
||||||
#define XASH_INPUT INPUT_ANDROID
|
|
||||||
#endif // XASH_INPUT
|
|
||||||
|
|
||||||
#ifndef XASH_SOUND
|
|
||||||
#define XASH_SOUND SOUND_OPENSLES
|
|
||||||
#endif // XASH_SOUND
|
|
||||||
|
|
||||||
#ifndef XASH_MESSAGEBOX
|
|
||||||
#define XASH_MESSAGEBOX MSGBOX_ANDROID
|
|
||||||
#endif // XASH_MESSAGEBOX
|
|
||||||
|
|
||||||
#define XASH_USE_EVDEV
|
|
||||||
#elif XASH_LINUX
|
#elif XASH_LINUX
|
||||||
// we are building for Linux without SDL2, can draw only to framebuffer yet
|
// we are building for Linux without SDL2, can draw only to framebuffer yet
|
||||||
#ifndef XASH_VIDEO
|
#ifndef XASH_VIDEO
|
||||||
@@ -83,8 +66,18 @@ SETUP BACKENDS DEFINITIONS
|
|||||||
#define XASH_SOUND SOUND_ALSA
|
#define XASH_SOUND SOUND_ALSA
|
||||||
#endif // XASH_SOUND
|
#endif // XASH_SOUND
|
||||||
|
|
||||||
#define XASH_USE_EVDEV
|
#define XASH_USE_EVDEV 1
|
||||||
#endif // XASH_LINUX
|
#elif XASH_DOS4GW
|
||||||
|
#ifndef XASH_VIDEO
|
||||||
|
#define XASH_VIDEO VIDEO_DOS
|
||||||
|
#endif
|
||||||
|
#ifndef XASH_TIMER
|
||||||
|
#define XASH_TIMER TIMER_DOS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// usually only 10-20 fds availiable
|
||||||
|
#define XASH_REDUCE_FD
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // XASH_DEDICATED
|
#endif // XASH_DEDICATED
|
||||||
|
|
||||||
@@ -94,24 +87,13 @@ SETUP BACKENDS DEFINITIONS
|
|||||||
#ifndef XASH_MESSAGEBOX
|
#ifndef XASH_MESSAGEBOX
|
||||||
#if XASH_WIN32
|
#if XASH_WIN32
|
||||||
#define XASH_MESSAGEBOX MSGBOX_WIN32
|
#define XASH_MESSAGEBOX MSGBOX_WIN32
|
||||||
|
#elif XASH_NSWITCH
|
||||||
|
#define XASH_MESSAGEBOX MSGBOX_NSWITCH
|
||||||
#else // !XASH_WIN32
|
#else // !XASH_WIN32
|
||||||
#define XASH_MESSAGEBOX MSGBOX_STDERR
|
#define XASH_MESSAGEBOX MSGBOX_STDERR
|
||||||
#endif // !XASH_WIN32
|
#endif // !XASH_WIN32
|
||||||
#endif // XASH_MESSAGEBOX
|
#endif // XASH_MESSAGEBOX
|
||||||
|
|
||||||
//
|
|
||||||
// select crashhandler based on defines
|
|
||||||
//
|
|
||||||
#ifndef XASH_CRASHHANDLER
|
|
||||||
#if XASH_WIN32 && defined(DBGHELP)
|
|
||||||
#define XASH_CRASHHANDLER CRASHHANDLER_DBGHELP
|
|
||||||
#elif XASH_LINUX || XASH_BSD
|
|
||||||
#define XASH_CRASHHANDLER CRASHHANDLER_UCONTEXT
|
|
||||||
#else // !(XASH_LINUX || XASH_BSD || XASH_WIN32)
|
|
||||||
#define XASH_CRASHHANDLER CRASHHANDLER_NULL
|
|
||||||
#endif // !(XASH_LINUX || XASH_BSD || XASH_WIN32)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// no timer - no xash
|
// no timer - no xash
|
||||||
//
|
//
|
||||||
@@ -119,10 +101,20 @@ SETUP BACKENDS DEFINITIONS
|
|||||||
#if XASH_WIN32
|
#if XASH_WIN32
|
||||||
#define XASH_TIMER TIMER_WIN32
|
#define XASH_TIMER TIMER_WIN32
|
||||||
#else // !XASH_WIN32
|
#else // !XASH_WIN32
|
||||||
#define XASH_TIMER TIMER_LINUX
|
#define XASH_TIMER TIMER_POSIX
|
||||||
#endif // !XASH_WIN32
|
#endif // !XASH_WIN32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef XASH_STATIC_LIBS
|
||||||
|
#define XASH_LIB LIB_STATIC
|
||||||
|
#define XASH_INTERNAL_GAMELIBS
|
||||||
|
#define XASH_ALLOW_SAVERESTORE_OFFSETS
|
||||||
|
#elif XASH_WIN32
|
||||||
|
#define XASH_LIB LIB_WIN32
|
||||||
|
#elif XASH_POSIX
|
||||||
|
#define XASH_LIB LIB_POSIX
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// fallback to NULL
|
// fallback to NULL
|
||||||
//
|
//
|
||||||
@@ -146,39 +138,59 @@ Default build-depended cvar and constant values
|
|||||||
=========================================================================
|
=========================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if XASH_MOBILE_PLATFORM
|
// Platform overrides
|
||||||
#define DEFAULT_TOUCH_ENABLE "1"
|
#if XASH_NSWITCH
|
||||||
#define DEFAULT_M_IGNORE "1"
|
|
||||||
#else // !XASH_MOBILE_PLATFORM
|
|
||||||
#define DEFAULT_TOUCH_ENABLE "0"
|
#define DEFAULT_TOUCH_ENABLE "0"
|
||||||
#define DEFAULT_M_IGNORE "0"
|
#define DEFAULT_M_IGNORE "1"
|
||||||
#endif // !XASH_MOBILE_PLATFORM
|
#define DEFAULT_MODE_WIDTH 1280
|
||||||
|
#define DEFAULT_MODE_HEIGHT 720
|
||||||
|
#define DEFAULT_ALLOWCONSOLE 1
|
||||||
|
#elif XASH_PSVITA
|
||||||
|
#define DEFAULT_TOUCH_ENABLE "0"
|
||||||
|
#define DEFAULT_M_IGNORE "1"
|
||||||
|
#define DEFAULT_MODE_WIDTH 960
|
||||||
|
#define DEFAULT_MODE_HEIGHT 544
|
||||||
|
#define DEFAULT_ALLOWCONSOLE 1
|
||||||
|
#elif XASH_ANDROID
|
||||||
|
#define DEFAULT_TOUCH_ENABLE "1"
|
||||||
|
#elif XASH_MOBILE_PLATFORM
|
||||||
|
#define DEFAULT_TOUCH_ENABLE "1"
|
||||||
|
#define DEFAULT_M_IGNORE "1"
|
||||||
|
#endif // !XASH_MOBILE_PLATFORM && !XASH_NSWITCH
|
||||||
|
|
||||||
#if XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
#if XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
||||||
#define XASH_INTERNAL_GAMELIBS
|
// this means that libraries are provided with engine, but not in game data
|
||||||
// this means that libraries are provided with engine, but not in game data
|
// You need add library loading code to library.c when adding new platform
|
||||||
// You need add library loading code to library.c when adding new platform
|
#define XASH_INTERNAL_GAMELIBS
|
||||||
#endif // XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
#endif // XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
||||||
|
|
||||||
// allow override for developer/debug builds
|
// Defaults
|
||||||
|
#ifndef DEFAULT_TOUCH_ENABLE
|
||||||
|
#define DEFAULT_TOUCH_ENABLE "0"
|
||||||
|
#endif // DEFAULT_TOUCH_ENABLE
|
||||||
|
|
||||||
|
#ifndef DEFAULT_M_IGNORE
|
||||||
|
#define DEFAULT_M_IGNORE "0"
|
||||||
|
#endif // DEFAULT_M_IGNORE
|
||||||
|
|
||||||
|
#ifndef DEFAULT_JOY_DEADZONE
|
||||||
|
#define DEFAULT_JOY_DEADZONE "4096"
|
||||||
|
#endif // DEFAULT_JOY_DEADZONE
|
||||||
|
|
||||||
#ifndef DEFAULT_DEV
|
#ifndef DEFAULT_DEV
|
||||||
#define DEFAULT_DEV 0
|
#define DEFAULT_DEV 0
|
||||||
#endif // DEFAULT_DEV
|
#endif // DEFAULT_DEV
|
||||||
|
|
||||||
|
#ifndef DEFAULT_ALLOWCONSOLE
|
||||||
|
#define DEFAULT_ALLOWCONSOLE 0
|
||||||
|
#endif // DEFAULT_ALLOWCONSOLE
|
||||||
|
|
||||||
#ifndef DEFAULT_FULLSCREEN
|
#ifndef DEFAULT_FULLSCREEN
|
||||||
#define DEFAULT_FULLSCREEN 1
|
#define DEFAULT_FULLSCREEN "1" // must be a string
|
||||||
#endif // DEFAULT_FULLSCREEN
|
#endif // DEFAULT_FULLSCREEN
|
||||||
|
|
||||||
#ifndef DEFAULT_ACCELERATED_RENDERER
|
#ifndef DEFAULT_MAX_EDICTS
|
||||||
#if XASH_MOBILE_PLATFORM
|
#define DEFAULT_MAX_EDICTS 1200 // was 900 before HL25
|
||||||
#define DEFAULT_ACCELERATED_RENDERER "gles1"
|
#endif // DEFAULT_MAX_EDICTS
|
||||||
#else // !XASH_MOBILE_PLATFORM
|
|
||||||
#define DEFAULT_ACCELERATED_RENDERER "gl"
|
|
||||||
#endif // !XASH_MOBILE_PLATFORM
|
|
||||||
#endif // DEFAULT_ACCELERATED_RENDERER
|
|
||||||
|
|
||||||
#ifndef DEFAULT_SOFTWARE_RENDERER
|
|
||||||
#define DEFAULT_SOFTWARE_RENDERER "soft" // mittorn's ref_soft
|
|
||||||
#endif // DEFAULT_SOFTWARE_RENDERER
|
|
||||||
|
|
||||||
#endif // DEFAULTS_H
|
#endif // DEFAULTS_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ GNU General Public License for more details.
|
|||||||
#define FEATURES_H
|
#define FEATURES_H
|
||||||
|
|
||||||
// list of engine features that can be enabled through callback SV_CheckFeatures
|
// list of engine features that can be enabled through callback SV_CheckFeatures
|
||||||
#define ENGINE_WRITE_LARGE_COORD (1<<0) // replace standard message WRITE_COORD with big message for support more than 8192 units in world
|
#define ENGINE_WRITE_LARGE_COORD (1<<0) // replace standard message WRITE_COORD with big message for support more than 8192 units in world
|
||||||
#define ENGINE_QUAKE_COMPATIBLE (1<<1) // make engine compatible with quake (flags and effects)
|
#define ENGINE_QUAKE_COMPATIBLE (1<<1) // make engine compatible with quake (flags and effects)
|
||||||
#define ENGINE_LOAD_DELUXEDATA (1<<2) // loading deluxemap for map (if present)
|
#define ENGINE_LOAD_DELUXEDATA (1<<2) // loading deluxemap for map (if present)
|
||||||
#define ENGINE_PHYSICS_PUSHER_EXT (1<<3) // enable sets of improvements for MOVETYPE_PUSH physics
|
#define ENGINE_PHYSICS_PUSHER_EXT (1<<3) // enable sets of improvements for MOVETYPE_PUSH physics
|
||||||
@@ -25,5 +25,21 @@ GNU General Public License for more details.
|
|||||||
#define ENGINE_COMPENSATE_QUAKE_BUG (1<<5) // compensate stupid quake bug (inverse pitch) for mods where this bug is fixed
|
#define ENGINE_COMPENSATE_QUAKE_BUG (1<<5) // compensate stupid quake bug (inverse pitch) for mods where this bug is fixed
|
||||||
#define ENGINE_IMPROVED_LINETRACE (1<<6) // new traceline that tracing through alphatextures
|
#define ENGINE_IMPROVED_LINETRACE (1<<6) // new traceline that tracing through alphatextures
|
||||||
#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_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
|
||||||
|
#define ENGINE_FEATURES_MASK \
|
||||||
|
( ENGINE_WRITE_LARGE_COORD \
|
||||||
|
| ENGINE_QUAKE_COMPATIBLE \
|
||||||
|
| ENGINE_LOAD_DELUXEDATA \
|
||||||
|
| ENGINE_PHYSICS_PUSHER_EXT \
|
||||||
|
| ENGINE_LARGE_LIGHTMAPS \
|
||||||
|
| ENGINE_COMPENSATE_QUAKE_BUG \
|
||||||
|
| ENGINE_IMPROVED_LINETRACE \
|
||||||
|
| ENGINE_COMPUTE_STUDIO_LERP \
|
||||||
|
| ENGINE_LINEAR_GAMMA_SPACE \
|
||||||
|
| ENGINE_STEP_POSHISTORY_LERP )
|
||||||
|
|
||||||
#endif//FEATURES_H
|
#endif//FEATURES_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
#define ENTITY_NORMAL (1<<0)
|
#define ENTITY_NORMAL (1<<0)
|
||||||
#define ENTITY_BEAM (1<<1)
|
#define ENTITY_BEAM (1<<1)
|
||||||
|
|
||||||
// Entity state is used for the baseline and for delta compression of a packet of
|
// Entity state is used for the baseline and for delta compression of a packet of
|
||||||
// entities that is sent to a client.
|
// entities that is sent to a client.
|
||||||
typedef struct entity_state_s entity_state_t;
|
typedef struct entity_state_s entity_state_t;
|
||||||
|
|
||||||
@@ -63,36 +63,36 @@ struct entity_state_s
|
|||||||
vec3_t velocity;
|
vec3_t velocity;
|
||||||
|
|
||||||
// Send bbox down to client for use during prediction.
|
// Send bbox down to client for use during prediction.
|
||||||
vec3_t mins;
|
vec3_t mins;
|
||||||
vec3_t maxs;
|
vec3_t maxs;
|
||||||
|
|
||||||
int aiment;
|
int aiment;
|
||||||
// If owned by a player, the index of that player ( for projectiles ).
|
// If owned by a player, the index of that player ( for projectiles ).
|
||||||
int owner;
|
int owner;
|
||||||
|
|
||||||
// Friction, for prediction.
|
// Friction, for prediction.
|
||||||
float friction;
|
float friction;
|
||||||
// Gravity multiplier
|
// Gravity multiplier
|
||||||
float gravity;
|
float gravity;
|
||||||
|
|
||||||
// PLAYER SPECIFIC
|
// PLAYER SPECIFIC
|
||||||
int team;
|
int team;
|
||||||
int playerclass;
|
int playerclass;
|
||||||
int health;
|
int health;
|
||||||
qboolean spectator;
|
qboolean spectator;
|
||||||
int weaponmodel;
|
int weaponmodel;
|
||||||
int gaitsequence;
|
int gaitsequence;
|
||||||
// If standing on conveyor, e.g.
|
// If standing on conveyor, e.g.
|
||||||
vec3_t basevelocity;
|
vec3_t basevelocity;
|
||||||
// Use the crouched hull, or the regular player hull.
|
// Use the crouched hull, or the regular player hull.
|
||||||
int usehull;
|
int usehull;
|
||||||
// Latched buttons last time state updated.
|
// Latched buttons last time state updated.
|
||||||
int oldbuttons;
|
int oldbuttons;
|
||||||
// -1 = in air, else pmove entity number
|
// -1 = in air, else pmove entity number
|
||||||
int onground;
|
int onground;
|
||||||
int iStepLeft;
|
int iStepLeft;
|
||||||
// How fast we are falling
|
// How fast we are falling
|
||||||
float flFallVelocity;
|
float flFallVelocity;
|
||||||
|
|
||||||
float fov;
|
float fov;
|
||||||
int weaponanim;
|
int weaponanim;
|
||||||
@@ -135,7 +135,7 @@ typedef struct clientdata_s
|
|||||||
|
|
||||||
int bInDuck;
|
int bInDuck;
|
||||||
int weapons; // remove?
|
int weapons; // remove?
|
||||||
|
|
||||||
int flTimeStepSound;
|
int flTimeStepSound;
|
||||||
int flDuckTime;
|
int flDuckTime;
|
||||||
int flSwimTime;
|
int flSwimTime;
|
||||||
@@ -152,7 +152,7 @@ typedef struct clientdata_s
|
|||||||
int ammo_cells;
|
int ammo_cells;
|
||||||
int ammo_rockets;
|
int ammo_rockets;
|
||||||
float m_flNextAttack;
|
float m_flNextAttack;
|
||||||
|
|
||||||
int tfstate;
|
int tfstate;
|
||||||
int pushmsec;
|
int pushmsec;
|
||||||
int deadflag;
|
int deadflag;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -17,13 +17,13 @@
|
|||||||
#define EVENT_FLAGS_H
|
#define EVENT_FLAGS_H
|
||||||
|
|
||||||
// Skip local host for event send.
|
// Skip local host for event send.
|
||||||
#define FEV_NOTHOST (1<<0)
|
#define FEV_NOTHOST (1<<0)
|
||||||
|
|
||||||
// Send the event reliably. You must specify the origin and angles and use
|
// Send the event reliably. You must specify the origin and angles and use
|
||||||
// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything
|
// PLAYBACK_EVENT_FULL for this to work correctly on the server for anything
|
||||||
// that depends on the event origin/angles. I.e., the origin/angles are not
|
// that depends on the event origin/angles. I.e., the origin/angles are not
|
||||||
// taken from the invoking edict for reliable events.
|
// taken from the invoking edict for reliable events.
|
||||||
#define FEV_RELIABLE (1<<1)
|
#define FEV_RELIABLE (1<<1)
|
||||||
|
|
||||||
// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC
|
// Don't restrict to PAS/PVS, send this event to _everybody_ on the server ( useful for stopping CHAN_STATIC
|
||||||
// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ).
|
// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ).
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
#define GFL_NOMODELS (1<<0)
|
#define GFL_NOMODELS (1<<0)
|
||||||
#define GFL_NOSKILLS (1<<1)
|
#define GFL_NOSKILLS (1<<1)
|
||||||
|
#define GFL_RENDER_PICBUTTON_TEXT (1<<2)
|
||||||
|
#define GFL_HD_BACKGROUND (1<<3)
|
||||||
|
#define GFL_ANIMATED_TITLE (1<<4)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
========================================================================
|
========================================================================
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
// sub commands of svc_hltv:
|
// sub commands of svc_hltv:
|
||||||
#define HLTV_ACTIVE 0 // tells client that he's an spectator and will get director commands
|
#define HLTV_ACTIVE 0 // tells client that he's an spectator and will get director commands
|
||||||
#define HLTV_STATUS 1 // send status infos about proxy
|
#define HLTV_STATUS 1 // send status infos about proxy
|
||||||
#define HLTV_LISTEN 2 // tell client to listen to a multicast stream
|
#define HLTV_LISTEN 2 // tell client to listen to a multicast stream
|
||||||
|
|
||||||
// sub commands of svc_director:
|
// sub commands of svc_director:
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
// HLTV_EVENT event flags
|
// HLTV_EVENT event flags
|
||||||
#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important)
|
#define DRC_FLAG_PRIO_MASK 0x0F // priorities between 0 and 15 (15 most important)
|
||||||
#define DRC_FLAG_SIDE (1<<4) //
|
#define DRC_FLAG_SIDE (1<<4) //
|
||||||
#define DRC_FLAG_DRAMATIC (1<<5) // is a dramatic scene
|
#define DRC_FLAG_DRAMATIC (1<<5) // is a dramatic scene
|
||||||
#define DRC_FLAG_SLOWMOTION (1<<6) // would look good in SloMo
|
#define DRC_FLAG_SLOWMOTION (1<<6) // would look good in SloMo
|
||||||
#define DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc)
|
#define DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -26,10 +26,10 @@ typedef enum
|
|||||||
typedef struct IVoiceTweak_s
|
typedef struct IVoiceTweak_s
|
||||||
{
|
{
|
||||||
// These turn voice tweak mode on and off. While in voice tweak mode, the user's voice is echoed back
|
// These turn voice tweak mode on and off. While in voice tweak mode, the user's voice is echoed back
|
||||||
// without sending to the server.
|
// without sending to the server.
|
||||||
int (*StartVoiceTweakMode)( void ); // Returns 0 on error.
|
int (*StartVoiceTweakMode)( void ); // Returns 0 on error.
|
||||||
void (*EndVoiceTweakMode)( void );
|
void (*EndVoiceTweakMode)( void );
|
||||||
|
|
||||||
// Get/set control values.
|
// Get/set control values.
|
||||||
void (*SetControlFloat)( VoiceTweakControl iControl, float value );
|
void (*SetControlFloat)( VoiceTweakControl iControl, float value );
|
||||||
float (*GetControlFloat)( VoiceTweakControl iControl );
|
float (*GetControlFloat)( VoiceTweakControl iControl );
|
||||||
|
|||||||
@@ -1,18 +1,35 @@
|
|||||||
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
|
/*
|
||||||
//
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
// Purpose:
|
|
||||||
//
|
|
||||||
// $NoKeywords: $
|
|
||||||
//=============================================================================
|
|
||||||
|
|
||||||
#if !defined( KBUTTONH )
|
This program is free software; you can redistribute it and/or
|
||||||
#define KBUTTONH
|
modify it under the terms of the GNU General Public License
|
||||||
#pragma once
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
typedef struct kbutton_s
|
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.
|
||||||
|
|
||||||
|
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 KBUTTON_H
|
||||||
|
#define KBUTTON_H
|
||||||
|
|
||||||
|
// a1ba: copied from WinQuake/client.h
|
||||||
|
//
|
||||||
|
// cl_input
|
||||||
|
//
|
||||||
|
typedef struct
|
||||||
{
|
{
|
||||||
int down[2]; // key nums holding it down
|
int down[2]; // key nums holding it down
|
||||||
int state; // low bit is down state
|
int state; // low bit is down state
|
||||||
} kbutton_t;
|
} kbutton_t;
|
||||||
|
|
||||||
#endif // !KBUTTONH
|
STATIC_ASSERT( sizeof( kbutton_t ) == 12, "kbutton_t isn't 12 bytes!" );
|
||||||
|
|
||||||
|
#endif // KBUTTON_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -64,7 +64,7 @@ typedef struct net_response_s
|
|||||||
typedef struct net_status_s
|
typedef struct net_status_s
|
||||||
{
|
{
|
||||||
// Connected to remote server? 1 == yes, 0 otherwise
|
// Connected to remote server? 1 == yes, 0 otherwise
|
||||||
int connected;
|
int connected;
|
||||||
// Client's IP address
|
// Client's IP address
|
||||||
netadr_t local_address;
|
netadr_t local_address;
|
||||||
// Address of remote server
|
// Address of remote server
|
||||||
@@ -87,7 +87,7 @@ typedef struct net_api_s
|
|||||||
void (*SendRequest)( int context, int request, int flags, double timeout, struct netadr_s *remote_address, net_api_response_func_t response );
|
void (*SendRequest)( int context, int request, int flags, double timeout, struct netadr_s *remote_address, net_api_response_func_t response );
|
||||||
void (*CancelRequest)( int context );
|
void (*CancelRequest)( int context );
|
||||||
void (*CancelAllRequests)( void );
|
void (*CancelAllRequests)( void );
|
||||||
char *(*AdrToString)( struct netadr_s *a );
|
const char *(*AdrToString)( struct netadr_s *a );
|
||||||
int ( *CompareAdr)( struct netadr_s *a, struct netadr_s *b );
|
int ( *CompareAdr)( struct netadr_s *a, struct netadr_s *b );
|
||||||
int ( *StringToAdr)( char *s, struct netadr_s *a );
|
int ( *StringToAdr)( char *s, struct netadr_s *a );
|
||||||
const char *(*ValueForKey)( const char *s, const char *key );
|
const char *(*ValueForKey)( const char *s, const char *key );
|
||||||
|
|||||||
@@ -1,37 +1,74 @@
|
|||||||
/***
|
/*
|
||||||
*
|
Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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 NETADR_H
|
This program is free software; you can redistribute it and/or
|
||||||
#define NETADR_H
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
typedef enum
|
This program is distributed in the hope that it will be useful,
|
||||||
{
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
NA_UNUSED,
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
NA_LOOPBACK,
|
|
||||||
NA_BROADCAST,
|
|
||||||
NA_IP,
|
|
||||||
NA_IPX,
|
|
||||||
NA_BROADCAST_IPX
|
|
||||||
} netadrtype_t;
|
|
||||||
|
|
||||||
typedef struct netadr_s
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
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 NET_ADR_H
|
||||||
|
#define NET_ADR_H
|
||||||
|
|
||||||
|
#include STDINT_H
|
||||||
|
|
||||||
|
// net.h -- quake's interface to the networking layer
|
||||||
|
// a1ba: copied from Quake-2/qcommon/qcommon.h and modified to support IPv6
|
||||||
|
|
||||||
|
#define PORT_ANY -1
|
||||||
|
|
||||||
|
typedef enum {NA_LOOPBACK = 1, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX, NA_IP6, NA_MULTICAST_IP6} netadrtype_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Original Quake-2 structure:
|
||||||
|
typedef struct
|
||||||
{
|
{
|
||||||
netadrtype_t type;
|
netadrtype_t type;
|
||||||
unsigned char ip[4];
|
|
||||||
unsigned char ipx[10];
|
byte ip[4];
|
||||||
|
byte ipx[10];
|
||||||
|
|
||||||
unsigned short port;
|
unsigned short port;
|
||||||
} netadr_t;
|
} netadr_t;
|
||||||
|
*/
|
||||||
|
|
||||||
#endif//NETADR_H
|
#pragma pack( push, 1 )
|
||||||
|
typedef struct netadr_s
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
// IPv6 struct
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint16_t type6;
|
||||||
|
uint8_t ip6[16];
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t type; // must be netadrtype_t but will break with short enums
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint8_t ip[4];
|
||||||
|
uint32_t ip4; // for easier conversions
|
||||||
|
};
|
||||||
|
uint8_t ipx[10];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uint16_t port;
|
||||||
|
} netadr_t;
|
||||||
|
#pragma pack( pop )
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( netadr_t ) == 20, "netadr_t isn't 20 bytes!" );
|
||||||
|
|
||||||
|
#endif // NET_ADR_H
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
pt_static,
|
pt_static,
|
||||||
pt_grav,
|
pt_grav,
|
||||||
pt_slowgrav,
|
pt_slowgrav,
|
||||||
pt_fire,
|
pt_fire,
|
||||||
@@ -45,7 +45,7 @@ typedef struct particle_s
|
|||||||
|
|
||||||
// for pt_clientcusttom, we'll call this function each frame
|
// for pt_clientcusttom, we'll call this function each frame
|
||||||
void (*callback)( struct particle_s *particle, float frametime );
|
void (*callback)( struct particle_s *particle, float frametime );
|
||||||
|
|
||||||
// For deathfunc, etc.
|
// For deathfunc, etc.
|
||||||
unsigned char context;
|
unsigned char context;
|
||||||
} particle_t;
|
} particle_t;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -33,7 +33,7 @@ struct pmtrace_s
|
|||||||
vec3_t endpos; // final position
|
vec3_t endpos; // final position
|
||||||
pmplane_t plane; // surface normal at impact
|
pmplane_t plane; // surface normal at impact
|
||||||
int ent; // entity at impact
|
int ent; // entity at impact
|
||||||
vec3_t deltavelocity; // Change in player's velocity caused by impact.
|
vec3_t deltavelocity; // Change in player's velocity caused by impact.
|
||||||
// Only run on server.
|
// Only run on server.
|
||||||
int hitgroup;
|
int hitgroup;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,98 +20,52 @@ GNU General Public License for more details.
|
|||||||
#include "build.h"
|
#include "build.h"
|
||||||
|
|
||||||
#if !XASH_WIN32
|
#if !XASH_WIN32
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define PATH_SPLITTER "/"
|
|
||||||
|
|
||||||
#if XASH_APPLE
|
#if XASH_APPLE
|
||||||
#include <sys/syslimits.h>
|
#include <sys/syslimits.h>
|
||||||
#include "TargetConditionals.h"
|
|
||||||
#define OS_LIB_EXT "dylib"
|
#define OS_LIB_EXT "dylib"
|
||||||
#define OPEN_COMMAND "open"
|
#define OPEN_COMMAND "open"
|
||||||
#else
|
#else
|
||||||
#define OS_LIB_EXT "so"
|
#define OS_LIB_EXT "so"
|
||||||
#define OPEN_COMMAND "xdg-open"
|
#define OPEN_COMMAND "xdg-open"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define OS_LIB_PREFIX "lib"
|
#define OS_LIB_PREFIX "lib"
|
||||||
|
|
||||||
#if XASH_ANDROID
|
|
||||||
//#if defined(LOAD_HARDFP)
|
|
||||||
// #define POSTFIX "_hardfp"
|
|
||||||
//#else
|
|
||||||
#define POSTFIX
|
|
||||||
//#endif
|
|
||||||
#else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VGUI_SUPPORT_DLL "libvgui_support." OS_LIB_EXT
|
#define VGUI_SUPPORT_DLL "libvgui_support." OS_LIB_EXT
|
||||||
|
|
||||||
// Windows-specific
|
// Windows-specific
|
||||||
#define __cdecl
|
#define __cdecl
|
||||||
#define __stdcall
|
#define __stdcall
|
||||||
|
|
||||||
#define _inline static inline
|
#define _inline static inline
|
||||||
#define FORCEINLINE inline __attribute__((always_inline))
|
|
||||||
#define O_BINARY 0 // O_BINARY is Windows extension
|
|
||||||
#define O_TEXT 0 // O_TEXT is Windows extension
|
|
||||||
|
|
||||||
// Windows functions to Linux equivalent
|
#if XASH_POSIX
|
||||||
#define _mkdir( x ) mkdir( x, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH )
|
#include <unistd.h>
|
||||||
#define LoadLibrary( x ) dlopen( x, RTLD_NOW )
|
#if XASH_NSWITCH
|
||||||
#define GetProcAddress( x, y ) dlsym( x, y )
|
#define SOLDER_LIBDL_COMPAT
|
||||||
#define SetCurrentDirectory( x ) (!chdir( x ))
|
#include <solder.h>
|
||||||
#define FreeLibrary( x ) dlclose( x )
|
#elif XASH_PSVITA
|
||||||
//#define MAKEWORD( a, b ) ((short int)(((unsigned char)(a))|(((short int)((unsigned char)(b)))<<8)))
|
#define VRTLD_LIBDL_COMPAT
|
||||||
#define max( a, b ) (((a) > (b)) ? (a) : (b))
|
#include <vrtld.h>
|
||||||
#define min( a, b ) (((a) < (b)) ? (a) : (b))
|
#define O_BINARY 0
|
||||||
#define tell( a ) lseek(a, 0, SEEK_CUR)
|
#else
|
||||||
|
#include <dlfcn.h>
|
||||||
typedef unsigned char BYTE;
|
#define HAVE_DUP
|
||||||
typedef short int WORD;
|
#define O_BINARY 0
|
||||||
typedef unsigned int DWORD;
|
#endif
|
||||||
typedef int LONG;
|
#define O_TEXT 0
|
||||||
typedef unsigned int ULONG;
|
#define _mkdir( x ) mkdir( x, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH )
|
||||||
typedef int WPARAM;
|
#endif
|
||||||
typedef unsigned int LPARAM;
|
|
||||||
|
|
||||||
typedef void* HANDLE;
|
typedef void* HANDLE;
|
||||||
typedef void* HMODULE;
|
|
||||||
typedef void* HINSTANCE;
|
typedef void* HINSTANCE;
|
||||||
|
|
||||||
typedef char* LPSTR;
|
|
||||||
|
|
||||||
typedef struct tagPOINT
|
typedef struct tagPOINT
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
} POINT;
|
} POINT;
|
||||||
#else // WIN32
|
#else // WIN32
|
||||||
#define PATH_SPLITTER "\\"
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
#define _inline static inline
|
|
||||||
#define FORCEINLINE inline __attribute__((always_inline))
|
|
||||||
#else
|
|
||||||
#define FORCEINLINE __forceinline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define open _open
|
#define open _open
|
||||||
#define read _read
|
#define read _read
|
||||||
#define alloca _alloca
|
#define alloca _alloca
|
||||||
|
|
||||||
// shut-up compiler warnings
|
|
||||||
#pragma warning(disable : 4244) // MIPS
|
|
||||||
#pragma warning(disable : 4018) // signed/unsigned mismatch
|
|
||||||
#pragma warning(disable : 4305) // truncation from const double to float
|
|
||||||
#pragma warning(disable : 4115) // named type definition in parentheses
|
|
||||||
#pragma warning(disable : 4100) // unreferenced formal parameter
|
|
||||||
#pragma warning(disable : 4127) // conditional expression is constant
|
|
||||||
#pragma warning(disable : 4057) // differs in indirection to slightly different base types
|
|
||||||
#pragma warning(disable : 4201) // nonstandard extension used
|
|
||||||
#pragma warning(disable : 4706) // assignment within conditional expression
|
|
||||||
#pragma warning(disable : 4054) // type cast' : from function pointer
|
|
||||||
#pragma warning(disable : 4310) // cast truncates constant value
|
|
||||||
|
|
||||||
#define HSPRITE WINAPI_HSPRITE
|
#define HSPRITE WINAPI_HSPRITE
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
@@ -121,11 +75,9 @@ GNU General Public License for more details.
|
|||||||
#define OS_LIB_PREFIX ""
|
#define OS_LIB_PREFIX ""
|
||||||
#define OS_LIB_EXT "dll"
|
#define OS_LIB_EXT "dll"
|
||||||
#define VGUI_SUPPORT_DLL "../vgui_support." OS_LIB_EXT
|
#define VGUI_SUPPORT_DLL "../vgui_support." OS_LIB_EXT
|
||||||
#ifdef XASH_64BIT
|
#define HAVE_DUP
|
||||||
// windows NameForFunction not implemented yet
|
|
||||||
#define XASH_ALLOW_SAVERESTORE_OFFSETS
|
|
||||||
#endif
|
|
||||||
#endif //WIN32
|
#endif //WIN32
|
||||||
|
|
||||||
#ifndef XASH_LOW_MEMORY
|
#ifndef XASH_LOW_MEMORY
|
||||||
#define XASH_LOW_MEMORY 0
|
#define XASH_LOW_MEMORY 0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
#define R_EFX_H
|
#define R_EFX_H
|
||||||
|
|
||||||
// particle_t
|
// particle_t
|
||||||
#if !defined( PARTICLEDEFH )
|
#if !defined( PARTICLEDEFH )
|
||||||
#include "particledef.h"
|
#include "particledef.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ color24 gTracerColors[] =
|
|||||||
#define FTENT_SPIRAL 0x00000400
|
#define FTENT_SPIRAL 0x00000400
|
||||||
#define FTENT_SPRCYCLE 0x00000800
|
#define FTENT_SPRCYCLE 0x00000800
|
||||||
#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes
|
#define FTENT_COLLIDEALL 0x00001000 // will collide with world and slideboxes
|
||||||
#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw
|
#define FTENT_PERSIST 0x00002000 // tent is not removed when unable to draw
|
||||||
#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything
|
#define FTENT_COLLIDEKILL 0x00004000 // tent is removed upon collision with anything
|
||||||
#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner)
|
#define FTENT_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner)
|
||||||
#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed
|
#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed
|
||||||
@@ -102,7 +102,7 @@ typedef struct tempent_s
|
|||||||
int priority;
|
int priority;
|
||||||
short clientIndex; // if attached, this is the index of the client to stick to
|
short clientIndex; // if attached, this is the index of the client to stick to
|
||||||
// if COLLIDEALL, this is the index of the client to ignore
|
// if COLLIDEALL, this is the index of the client to ignore
|
||||||
// TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex!
|
// TENTS with FTENT_PLYRATTACHMENT MUST set the clientindex!
|
||||||
|
|
||||||
vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin.
|
vec3_t tentOffset; // if attached, client origin + tentOffset = tent origin.
|
||||||
cl_entity_t entity;
|
cl_entity_t entity;
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -103,7 +103,7 @@ typedef struct engine_studio_api_s
|
|||||||
|
|
||||||
// True if using D3D/OpenGL
|
// True if using D3D/OpenGL
|
||||||
int ( *IsHardware )( void );
|
int ( *IsHardware )( void );
|
||||||
|
|
||||||
// Only called by hardware interface
|
// Only called by hardware interface
|
||||||
void ( *GL_StudioDrawShadow )( void );
|
void ( *GL_StudioDrawShadow )( void );
|
||||||
void ( *GL_SetRenderMode )( int mode );
|
void ( *GL_SetRenderMode )( int mode );
|
||||||
@@ -140,7 +140,7 @@ typedef struct sv_blending_interface_s
|
|||||||
{
|
{
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
void ( *SV_StudioSetupBones )( struct model_s *pModel,
|
void ( *SV_StudioSetupBones )( struct model_s *pModel,
|
||||||
float frame,
|
float frame,
|
||||||
int sequence,
|
int sequence,
|
||||||
const vec3_t angles,
|
const vec3_t angles,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -25,7 +25,7 @@ typedef struct ref_params_s
|
|||||||
vec3_t forward;
|
vec3_t forward;
|
||||||
vec3_t right;
|
vec3_t right;
|
||||||
vec3_t up;
|
vec3_t up;
|
||||||
|
|
||||||
// Client frametime;
|
// Client frametime;
|
||||||
float frametime;
|
float frametime;
|
||||||
// Client time
|
// Client time
|
||||||
@@ -54,7 +54,7 @@ typedef struct ref_params_s
|
|||||||
int viewentity;
|
int viewentity;
|
||||||
int playernum;
|
int playernum;
|
||||||
int max_entities;
|
int max_entities;
|
||||||
int demoplayback;
|
int demoplayback;
|
||||||
int hardware;
|
int hardware;
|
||||||
int smoothing;
|
int smoothing;
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ typedef enum
|
|||||||
TF_KEEP_SOURCE = (1<<1), // some images keep source
|
TF_KEEP_SOURCE = (1<<1), // some images keep source
|
||||||
TF_NOFLIP_TGA = (1<<2), // Steam background completely ignore tga attribute 0x20
|
TF_NOFLIP_TGA = (1<<2), // Steam background completely ignore tga attribute 0x20
|
||||||
TF_EXPAND_SOURCE = (1<<3), // Don't keep source as 8-bit expand to RGBA
|
TF_EXPAND_SOURCE = (1<<3), // Don't keep source as 8-bit expand to RGBA
|
||||||
TF_ALLOW_EMBOSS = (1<<4), // Allow emboss-mapping for this image
|
// reserved
|
||||||
TF_RECTANGLE = (1<<5), // this is GL_TEXTURE_RECTANGLE
|
TF_RECTANGLE = (1<<5), // this is GL_TEXTURE_RECTANGLE
|
||||||
TF_CUBEMAP = (1<<6), // it's cubemap texture
|
TF_CUBEMAP = (1<<6), // it's cubemap texture
|
||||||
TF_DEPTHMAP = (1<<7), // custom texture filter used
|
TF_DEPTHMAP = (1<<7), // custom texture filter used
|
||||||
@@ -107,20 +107,24 @@ typedef enum
|
|||||||
TF_ARB_FLOAT = (1<<26), // float textures
|
TF_ARB_FLOAT = (1<<26), // float textures
|
||||||
TF_NOCOMPARE = (1<<27), // disable comparing for depth textures
|
TF_NOCOMPARE = (1<<27), // disable comparing for depth textures
|
||||||
TF_ARB_16BIT = (1<<28), // keep image as 16-bit (not 24)
|
TF_ARB_16BIT = (1<<28), // keep image as 16-bit (not 24)
|
||||||
|
TF_MULTISAMPLE = (1<<29), // multisampling texture
|
||||||
|
TF_ALLOW_NEAREST = (1<<30), // allows toggling nearest filtering for TF_NOMIPMAP textures
|
||||||
} texFlags_t;
|
} texFlags_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
CONTEXT_TYPE_GL = 0,
|
CONTEXT_TYPE_GL = 0, // compatibility profile
|
||||||
CONTEXT_TYPE_GLES_1_X,
|
CONTEXT_TYPE_GLES_1_X,
|
||||||
CONTEXT_TYPE_GLES_2_X
|
CONTEXT_TYPE_GLES_2_X,
|
||||||
|
CONTEXT_TYPE_GL_CORE
|
||||||
} gl_context_type_t;
|
} gl_context_type_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GLES_WRAPPER_NONE = 0, // native GLES
|
GLES_WRAPPER_NONE = 0, // native GL
|
||||||
GLES_WRAPPER_NANOGL, // used on GLES platforms
|
GLES_WRAPPER_NANOGL, // used on GLES platforms
|
||||||
GLES_WRAPPER_WES, // used on GLES platforms
|
GLES_WRAPPER_WES, // used on GLES platforms
|
||||||
|
GLES_WRAPPER_GL4ES, // used on GLES platforms
|
||||||
} gles_wrapper_t;
|
} gles_wrapper_t;
|
||||||
|
|
||||||
// 30 bytes here
|
// 30 bytes here
|
||||||
@@ -130,7 +134,7 @@ typedef struct modelstate_s
|
|||||||
short frame; // 10 bits multiple by 4, should be enough
|
short frame; // 10 bits multiple by 4, should be enough
|
||||||
byte blending[2];
|
byte blending[2];
|
||||||
byte controller[4];
|
byte controller[4];
|
||||||
byte poseparam[16];
|
byte poseparam[16];
|
||||||
byte body;
|
byte body;
|
||||||
byte skin;
|
byte skin;
|
||||||
short scale; // model scale (multiplied by 16)
|
short scale; // model scale (multiplied by 16)
|
||||||
@@ -158,10 +162,10 @@ struct ref_viewpass_s;
|
|||||||
typedef struct render_api_s
|
typedef struct render_api_s
|
||||||
{
|
{
|
||||||
// Get renderer info (doesn't changes engine state at all)
|
// Get renderer info (doesn't changes engine state at all)
|
||||||
int (*RenderGetParm)( int parm, int arg ); // generic
|
intptr_t (*RenderGetParm)( int parm, int arg ); // generic
|
||||||
void (*GetDetailScaleForTexture)( int texture, float *xScale, float *yScale );
|
void (*GetDetailScaleForTexture)( int texture, float *xScale, float *yScale );
|
||||||
void (*GetExtraParmsForTexture)( int texture, byte *red, byte *green, byte *blue, byte *alpha );
|
void (*GetExtraParmsForTexture)( int texture, byte *red, byte *green, byte *blue, byte *alpha );
|
||||||
lightstyle_t* (*GetLightStyle)( int number );
|
lightstyle_t* (*GetLightStyle)( int number );
|
||||||
dlight_t* (*GetDynamicLight)( int number );
|
dlight_t* (*GetDynamicLight)( int number );
|
||||||
dlight_t* (*GetEntityLight)( int number );
|
dlight_t* (*GetEntityLight)( int number );
|
||||||
byte (*LightToTexGamma)( byte color ); // software gamma support
|
byte (*LightToTexGamma)( byte color ); // software gamma support
|
||||||
@@ -190,9 +194,9 @@ typedef struct render_api_s
|
|||||||
|
|
||||||
// AVIkit support
|
// AVIkit support
|
||||||
void *(*AVI_LoadVideo)( const char *filename, qboolean load_audio );
|
void *(*AVI_LoadVideo)( const char *filename, qboolean load_audio );
|
||||||
int (*AVI_GetVideoInfo)( void *Avi, long *xres, long *yres, float *duration );
|
int (*AVI_GetVideoInfo)( void *Avi, int *xres, int *yres, float *duration ); // a1ba: changed longs to int
|
||||||
long (*AVI_GetVideoFrameNumber)( void *Avi, float time );
|
int (*AVI_GetVideoFrameNumber)( void *Avi, float time );
|
||||||
byte *(*AVI_GetVideoFrame)( void *Avi, long frame );
|
byte *(*AVI_GetVideoFrame)( void *Avi, int frame );
|
||||||
void (*AVI_UploadRawFrame)( int texture, int cols, int rows, int width, int height, const byte *data );
|
void (*AVI_UploadRawFrame)( int texture, int cols, int rows, int width, int height, const byte *data );
|
||||||
void (*AVI_FreeVideo)( void *Avi );
|
void (*AVI_FreeVideo)( void *Avi );
|
||||||
int (*AVI_IsActive)( void *Avi );
|
int (*AVI_IsActive)( void *Avi );
|
||||||
@@ -226,7 +230,7 @@ typedef struct render_api_s
|
|||||||
void (*R_Reserved0)( void );
|
void (*R_Reserved0)( void );
|
||||||
|
|
||||||
// static allocations
|
// static allocations
|
||||||
void *(*pfnMemAlloc)( size_t cb, const char *filename, const int fileline );
|
void *(*pfnMemAlloc)( size_t cb, const char *filename, const int fileline ) ALLOC_CHECK( 1 );
|
||||||
void (*pfnMemFree)( void *mem, const char *filename, const int fileline );
|
void (*pfnMemFree)( void *mem, const char *filename, const int fileline );
|
||||||
|
|
||||||
// engine utils (not related with render API but placed here)
|
// engine utils (not related with render API but placed here)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -12,16 +12,26 @@
|
|||||||
* without written permission from Valve LLC.
|
* without written permission from Valve LLC.
|
||||||
*
|
*
|
||||||
****/
|
****/
|
||||||
|
#pragma once
|
||||||
#ifndef STUDIO_EVENT_H
|
#ifndef STUDIO_EVENT_H
|
||||||
#define STUDIO_EVENT_H
|
#define STUDIO_EVENT_H
|
||||||
|
|
||||||
|
#define MAXEVENTSTRING 64
|
||||||
|
|
||||||
typedef struct mstudioevent_s
|
typedef struct mstudioevent_s
|
||||||
{
|
{
|
||||||
int frame;
|
// the frame at which this animation event occurs
|
||||||
int event;
|
int32_t frame;
|
||||||
int type;
|
|
||||||
char options[64];
|
// the script event type
|
||||||
|
int32_t event;
|
||||||
|
|
||||||
|
// was "type"
|
||||||
|
int32_t unused;
|
||||||
|
|
||||||
|
// options
|
||||||
|
// could be path to sound WAVE files
|
||||||
|
char options[MAXEVENTSTRING];
|
||||||
} mstudioevent_t;
|
} mstudioevent_t;
|
||||||
|
|
||||||
#endif//STUDIO_EVENT_H
|
#endif // STUDIO_EVENT_H
|
||||||
|
|||||||
24
common/synctype.h
Normal file
24
common/synctype.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
synctype.h -- shared synctype_t definition
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
Copyright (C) 2023 Alibek Omarov
|
||||||
|
|
||||||
|
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 2
|
||||||
|
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.
|
||||||
|
|
||||||
|
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 SYNCTYPE_H
|
||||||
|
#define SYNCTYPE_H
|
||||||
|
typedef enum {ST_SYNC=0, ST_RAND } synctype_t;
|
||||||
|
#endif
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
#ifndef TRIANGLEAPI_H
|
#ifndef TRIANGLEAPI_H
|
||||||
#define TRIANGLEAPI_H
|
#define TRIANGLEAPI_H
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
TRI_FRONT = 0,
|
TRI_FRONT = 0,
|
||||||
TRI_NONE = 1,
|
TRI_NONE = 1,
|
||||||
@@ -47,7 +47,7 @@ typedef struct triangleapi_s
|
|||||||
void (*Vertex3fv)( const float *worldPnt );
|
void (*Vertex3fv)( const float *worldPnt );
|
||||||
void (*Vertex3f)( float x, float y, float z );
|
void (*Vertex3f)( float x, float y, float z );
|
||||||
void (*Brightness)( float brightness );
|
void (*Brightness)( float brightness );
|
||||||
void (*CullFace)( TRICULLSTYLE style );
|
void (*CullFace)( TRICULLSTYLE style );
|
||||||
int (*SpriteTexture)( struct model_s *pSpriteModel, int frame );
|
int (*SpriteTexture)( struct model_s *pSpriteModel, int frame );
|
||||||
int (*WorldToScreen)( const float *world, float *screen ); // Returns 1 if it's z clipped
|
int (*WorldToScreen)( const float *world, float *screen ); // Returns 1 if it's z clipped
|
||||||
void (*Fog)( float flFogColor[3], float flStart, float flEnd, int bOn ); //Works just like GL_FOG, flFogColor is r/g/b.
|
void (*Fog)( float flFogColor[3], float flStart, float flEnd, int bOn ); //Works just like GL_FOG, flFogColor is r/g/b.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
|
|||||||
@@ -2,11 +2,19 @@
|
|||||||
#ifndef XASH_TYPES_H
|
#ifndef XASH_TYPES_H
|
||||||
#define XASH_TYPES_H
|
#define XASH_TYPES_H
|
||||||
|
|
||||||
#ifdef _WIN32
|
#include "build.h"
|
||||||
|
|
||||||
|
#if XASH_IRIX
|
||||||
|
#include <port.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if XASH_WIN32
|
||||||
#include <wchar.h> // off_t
|
#include <wchar.h> // off_t
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
#include <sys/types.h> // off_t
|
#include <sys/types.h> // off_t
|
||||||
|
#include STDINT_H
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
typedef int sound_t;
|
typedef int sound_t;
|
||||||
@@ -20,6 +28,12 @@ typedef byte rgb_t[3]; // unsigned byte colorpack
|
|||||||
typedef vec_t matrix3x4[3][4];
|
typedef vec_t matrix3x4[3][4];
|
||||||
typedef vec_t matrix4x4[4][4];
|
typedef vec_t matrix4x4[4][4];
|
||||||
|
|
||||||
|
#if XASH_64BIT
|
||||||
|
typedef uint32_t poolhandle_t;
|
||||||
|
#else
|
||||||
|
typedef void* poolhandle_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef true
|
#undef true
|
||||||
#undef false
|
#undef false
|
||||||
|
|
||||||
@@ -29,29 +43,21 @@ typedef enum { false, true } qboolean;
|
|||||||
typedef int qboolean;
|
typedef int qboolean;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if _MSC_VER == 1200
|
typedef uint64_t longtime_t;
|
||||||
typedef __int64 integer64; //msvc6
|
|
||||||
#elif defined (XASH_SDL) && !defined(REF_DLL)
|
|
||||||
typedef Uint64 integer64;
|
|
||||||
#else
|
|
||||||
typedef unsigned long long integer64;
|
|
||||||
#endif
|
|
||||||
typedef integer64 longtime_t;
|
|
||||||
|
|
||||||
#define MAX_STRING 256 // generic string
|
#define MAX_STRING 256 // generic string
|
||||||
#define MAX_INFO_STRING 256 // infostrings are transmitted across network
|
#define MAX_INFO_STRING 256 // infostrings are transmitted across network
|
||||||
#define MAX_SERVERINFO_STRING 512 // server handles too many settings. expand to 1024?
|
#define MAX_SERVERINFO_STRING 512 // server handles too many settings. expand to 1024?
|
||||||
#define MAX_LOCALINFO_STRING 32768 // localinfo used on server and not sended to the clients
|
#define MAX_LOCALINFO_STRING 32768 // localinfo used on server and not sended to the clients
|
||||||
#define MAX_SYSPATH 1024 // system filepath
|
#define MAX_SYSPATH 1024 // system filepath
|
||||||
|
#define MAX_VA_STRING 1024 // string length returned by va()
|
||||||
#define MAX_PRINT_MSG 8192 // how many symbols can handle single call of Con_Printf or Con_DPrintf
|
#define MAX_PRINT_MSG 8192 // how many symbols can handle single call of Con_Printf or Con_DPrintf
|
||||||
#define MAX_TOKEN 2048 // parse token length
|
#define MAX_TOKEN 2048 // parse token length
|
||||||
#define MAX_MODS 512 // environment games that engine can keep visible
|
#define MAX_MODS 512 // environment games that engine can keep visible
|
||||||
#define MAX_USERMSG_LENGTH 2048 // don't modify it's relies on a client-side definitions
|
#define MAX_USERMSG_LENGTH 2048 // don't modify it's relies on a client-side definitions
|
||||||
|
|
||||||
#define BIT( n ) ( 1U << ( n ))
|
#define BIT( n ) ( 1U << ( n ))
|
||||||
#define GAMMA ( 2.2f ) // Valve Software gamma
|
#define BIT64( n ) ( 1ULL << ( n ))
|
||||||
#define INVGAMMA ( 1.0f / 2.2f ) // back to 1.0
|
|
||||||
#define TEXGAMMA ( 0.9f ) // compensate dim textures
|
|
||||||
#define SetBits( iBitVector, bits ) ((iBitVector) = (iBitVector) | (bits))
|
#define SetBits( iBitVector, bits ) ((iBitVector) = (iBitVector) | (bits))
|
||||||
#define ClearBits( iBitVector, bits ) ((iBitVector) = (iBitVector) & ~(bits))
|
#define ClearBits( iBitVector, bits ) ((iBitVector) = (iBitVector) & ~(bits))
|
||||||
#define FBitSet( iBitVector, bit ) ((iBitVector) & (bit))
|
#define FBitSet( iBitVector, bit ) ((iBitVector) & (bit))
|
||||||
@@ -69,21 +75,68 @@ typedef integer64 longtime_t;
|
|||||||
#define ColorIndex( c ) ((( c ) - '0' ) & 7 )
|
#define ColorIndex( c ) ((( c ) - '0' ) & 7 )
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
#ifdef __i386__
|
#ifdef __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 NONNULL __attribute__((nonnull))
|
||||||
|
#define ALLOC_CHECK(x) __attribute__((alloc_size(x)))
|
||||||
|
#define FORCEINLINE inline __attribute__((always_inline))
|
||||||
|
#define NOINLINE __attribute__((noinline))
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
#define EXPORT __declspec( dllexport )
|
#define EXPORT __declspec( dllexport )
|
||||||
#define GAME_EXPORT
|
#define GAME_EXPORT
|
||||||
|
#define _format(x)
|
||||||
|
#define NORETURN
|
||||||
|
#define NONNULL
|
||||||
|
#define ALLOC_CHECK(x)
|
||||||
|
#define FORCEINLINE __forceinline
|
||||||
|
#define NOINLINE __declspec( noinline )
|
||||||
#else
|
#else
|
||||||
#define EXPORT
|
#define EXPORT
|
||||||
#define GAME_EXPORT
|
#define GAME_EXPORT
|
||||||
|
#define _format(x)
|
||||||
|
#define NORETURN
|
||||||
|
#define NONNULL
|
||||||
|
#define ALLOC_CHECK(x)
|
||||||
|
#define FORCEINLINE
|
||||||
|
#define NOINLINE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ( __GNUC__ >= 3 )
|
||||||
|
#define unlikely(x) __builtin_expect(x, 0)
|
||||||
|
#define likely(x) __builtin_expect(x, 1)
|
||||||
|
#elif defined( __has_builtin )
|
||||||
|
#if __has_builtin( __builtin_expect )
|
||||||
|
#define unlikely(x) __builtin_expect(x, 0)
|
||||||
|
#define likely(x) __builtin_expect(x, 1)
|
||||||
|
#else
|
||||||
|
#define unlikely(x) (x)
|
||||||
|
#define likely(x) (x)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define unlikely(x) (x)
|
||||||
|
#define likely(x) (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ >= 202311L || __cplusplus >= 201103L // C23 or C++ static_assert is a keyword
|
||||||
|
#define STATIC_ASSERT_( ignore, x, y ) static_assert( x, y )
|
||||||
|
#define STATIC_ASSERT static_assert
|
||||||
|
#elif __STDC_VERSION__ >= 201112L // in C11 it's _Static_assert
|
||||||
|
#define STATIC_ASSERT_( ignore, x, y ) _Static_assert( x, y )
|
||||||
|
#define STATIC_ASSERT _Static_assert
|
||||||
|
#else
|
||||||
|
#define STATIC_ASSERT_( id, x, y ) extern int id[( x ) ? 1 : -1]
|
||||||
|
// need these to correctly expand the line macro
|
||||||
|
#define STATIC_ASSERT_3( line, x, y ) STATIC_ASSERT_( static_assert_ ## line, x, y )
|
||||||
|
#define STATIC_ASSERT_2( line, x, y ) STATIC_ASSERT_3( line, x, y )
|
||||||
|
#define STATIC_ASSERT( x, y ) STATIC_ASSERT_2( __LINE__, x, y )
|
||||||
|
#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))
|
||||||
@@ -119,9 +172,13 @@ typedef unsigned int dword;
|
|||||||
typedef unsigned int uint;
|
typedef unsigned int uint;
|
||||||
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 wfile_s wfile_t; // wad 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
|
||||||
typedef off_t fs_offset_t;
|
typedef off_t fs_offset_t;
|
||||||
|
#if XASH_WIN32
|
||||||
|
typedef int fs_size_t; // return type of _read, _write funcs
|
||||||
|
#else /* !XASH_WIN32 */
|
||||||
|
typedef ssize_t fs_size_t;
|
||||||
|
#endif /* !XASH_WIN32 */
|
||||||
|
|
||||||
typedef struct dllfunc_s
|
typedef struct dllfunc_s
|
||||||
{
|
{
|
||||||
@@ -137,7 +194,8 @@ typedef struct dll_info_s
|
|||||||
void *link; // hinstance of loading library
|
void *link; // hinstance of loading library
|
||||||
} dll_info_t;
|
} dll_info_t;
|
||||||
|
|
||||||
typedef void (*setpair_t)( const char *key, const void *value, void *buffer, void *numpairs );
|
typedef void (*setpair_t)( const char *key, const void *value, const void *buffer, void *numpairs );
|
||||||
|
typedef void *(*pfnCreateInterface_t)( const char *, int * );
|
||||||
|
|
||||||
// config strings are a general means of communication from
|
// config strings are a general means of communication from
|
||||||
// the server to all connected clients.
|
// the server to all connected clients.
|
||||||
|
|||||||
@@ -1,206 +0,0 @@
|
|||||||
#############################################
|
|
||||||
# Makefile.linux - linux makefile
|
|
||||||
# Copyright (C) 2017 mittorn
|
|
||||||
|
|
||||||
# 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.
|
|
||||||
##############################################
|
|
||||||
|
|
||||||
# Default options - optimized to debug on local machine
|
|
||||||
CC ?= gcc
|
|
||||||
CXX ?= g++
|
|
||||||
CFLAGS ?= -g -O1 -fsigned-char -Wall -Wextra -Wsign-compare -Wno-unknown-pragmas -Wno-missing-field-initializers -Wno-unused-parameter -Wno-unused-but-set-variable
|
|
||||||
LDFLAGS =
|
|
||||||
LBITS := $(shell getconf LONG_BIT)
|
|
||||||
DEPS :=
|
|
||||||
|
|
||||||
XASH_COMMIT := $(firstword $(shell git rev-parse --short=6 HEAD) unknown)
|
|
||||||
|
|
||||||
ifeq ($(XASH_COMMIT),unknown)
|
|
||||||
$(warning You seems to build xash3d without git)
|
|
||||||
$(warning Please use git if you are going to publish your build)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Pass 64BIT=1 to make arguments to allow amd64 builds
|
|
||||||
ifneq ($(64BIT),1)
|
|
||||||
ifeq ($(LBITS),64)
|
|
||||||
LDFLAGS += -m32
|
|
||||||
CFLAGS += -m32
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
TOPDIR = $(PWD)/..
|
|
||||||
INCLUDES :=
|
|
||||||
XASH_SINGLE_BINARY ?= 1
|
|
||||||
INSTALL_DIR ?= ./install/
|
|
||||||
ifeq ($(NANOGL),1)
|
|
||||||
INCLUDES += -Inanogl -Inanogl/GL
|
|
||||||
endif
|
|
||||||
INCLUDES += -I/usr/include/SDL2 -Icommon -I../common -I. -I../pm_shared -Iclient -Iserver -Iclient/vgui -Icommon/sdl
|
|
||||||
|
|
||||||
#############################
|
|
||||||
# Preprocessor defines:
|
|
||||||
#############################
|
|
||||||
DEFINES =
|
|
||||||
|
|
||||||
# Specify commit hash in version string
|
|
||||||
DEFINES += -DXASH_BUILD_COMMIT=\"$(XASH_COMMIT)\"
|
|
||||||
|
|
||||||
|
|
||||||
# Only SDL backend exists on linux
|
|
||||||
ifeq ($(XASH_DEDICATED),1)
|
|
||||||
DEFINES += -DXASH_DEDICATED
|
|
||||||
else
|
|
||||||
DEFINES += -DXASH_SDL
|
|
||||||
LIBS += -lSDL2
|
|
||||||
endif
|
|
||||||
|
|
||||||
#############################################
|
|
||||||
# GL/GLES translators.
|
|
||||||
# You need clone it to engine folder to use
|
|
||||||
# Only one translator should be enabled
|
|
||||||
#############################################
|
|
||||||
ifeq ($(NANOGL),1)
|
|
||||||
DEFINES += -DXASH_NANOGL -D__MULTITEXTURE_SUPPORT__ -DEGL_LIB=\"libEGL.so\"
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(WES),1)
|
|
||||||
DEFINES += -DXASH_WES -D__MULTITEXTURE_SUPPORT__ -DEGL_LIB=\"libEGL.so\"
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(REGAL),1)
|
|
||||||
DEFINES += -DXASH_REGAL -D__MULTITEXTURE_SUPPORT__ -DEGL_LIB=\"regal/lib/linux-32/libRegal.so\"
|
|
||||||
LIBS += regal/lib/linux-32/libRegal.so
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Some libc implementations cannot use libdl in static builds, so disable it by default
|
|
||||||
ifeq ($(XASH_STATIC),1)
|
|
||||||
|
|
||||||
ifneq ($(XASH_STATIC_LIBDL),1)
|
|
||||||
DEFINES += -DNO_LIBDL
|
|
||||||
endif
|
|
||||||
|
|
||||||
XASH_SINGLE_BINARY := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(XASH_STATIC),1)
|
|
||||||
LIBS += -ldl
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(XASH_STATIC_LIBDL),1)
|
|
||||||
LIBS += -ldl
|
|
||||||
endif
|
|
||||||
|
|
||||||
LIBS += -lm -pthread
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(XASH_SINGLE_BINARY),1)
|
|
||||||
DEFINES += -DSINGLE_BINARY
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Collect files
|
|
||||||
SRCS_CPP =
|
|
||||||
SRCS = $(wildcard server/*.c) $(wildcard client/vgui/*.c) $(wildcard client/avi/*.c) $(wildcard common/*.c) $(wildcard common/imagelib/*.c) $(wildcard common/soundlib/*.c) $(wildcard common/soundlib/libmpg/*.c)
|
|
||||||
ifneq ($(XASH_DEDICATED),1)
|
|
||||||
SRCS += $(wildcard client/*.c)
|
|
||||||
SRCS += $(wildcard platform/sdl/*.c)
|
|
||||||
ifeq ($(WES),1)
|
|
||||||
SRCS += $(wildcard gl-wes-v2/src/*.c)
|
|
||||||
endif
|
|
||||||
ifeq ($(NANOGL),1)
|
|
||||||
SRCS_CPP += $(wildcard nanogl/*.cpp)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
OBJS = $(patsubst %.c,obj/%.o,$(SRCS))
|
|
||||||
OBJS_CPP = $(patsubst %.cpp,obj/%.o,$(SRCS_CPP))
|
|
||||||
|
|
||||||
#################################
|
|
||||||
# Windows DLL loader
|
|
||||||
# Should be enabled only on i386 builds
|
|
||||||
#################################
|
|
||||||
LOADER :=
|
|
||||||
ifeq ($(XASH_DLL_LOADER),1)
|
|
||||||
DEFINES += -DDLL_LOADER
|
|
||||||
ifeq ($(XASH_SINGLE_BINARY),1)
|
|
||||||
LOADER = libloader.a
|
|
||||||
else
|
|
||||||
LOADER = libloader.so
|
|
||||||
endif
|
|
||||||
DEPS += $(LOADER)
|
|
||||||
LIBS += $(LOADER)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Rules for binaries
|
|
||||||
ifeq ($(XASH_SINGLE_BINARY),0)
|
|
||||||
BINARIES = libxash.so
|
|
||||||
libxash.so : $(OBJS) $(OBJS_CPP) $(DEPS)
|
|
||||||
$(CC) -fvisibility=hidden -o libxash.so $(LDFLAGS) -shared $(OBJS) $(OBJS_CPP) $(LIBS)
|
|
||||||
|
|
||||||
else
|
|
||||||
BINARIES = xash
|
|
||||||
xash: $(OBJS) $(OBJS_CPP) $(DEPS)
|
|
||||||
ifeq ($(XASH_STATIC),1)
|
|
||||||
$(CC) -o xash -static $(LDFLAGS) $(OBJS) $(OBJS_CPP) $(LIBS)
|
|
||||||
else
|
|
||||||
$(CC) -o xash -fvisibility=hidden $(LDFLAGS) $(OBJS) $(OBJS_CPP) $(LIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(XASH_DLL_LOADER),1)
|
|
||||||
$(LOADER):
|
|
||||||
$(MAKE) -f ../loader/Makefile.linux -C ../loader $(LOADER)
|
|
||||||
cp ../loader/$(LOADER) .
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Create dirs for object files
|
|
||||||
DIRS := obj obj/server obj/client/avi obj/client/vgui obj/common/sdl obj/common/imagelib obj/common/soundlib/libmpg obj/platform/sdl obj/nanogl
|
|
||||||
$(OBJS): | $(DIRS)
|
|
||||||
|
|
||||||
$(DIRS) :
|
|
||||||
mkdir -p $(DIRS)
|
|
||||||
|
|
||||||
# Object rules
|
|
||||||
obj/%.o : %.c
|
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) -c "$<" -o "$@" -Wno-unused-result -fvisibility=hidden
|
|
||||||
|
|
||||||
obj/%.o : %.cpp
|
|
||||||
$(CXX) $(CFLAGS) $(INCLUDES) $(DEFINES) -c "$<" -o "$@"
|
|
||||||
|
|
||||||
|
|
||||||
default: $(BINARIES)
|
|
||||||
|
|
||||||
.PHONY: depend clean list install
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(OBJS) $(OBJS_CPP) $(BINARIES) ../loader/*.o ../loader/*.a ../loader/*.so $(LOADER)
|
|
||||||
|
|
||||||
list:
|
|
||||||
@echo Sources:
|
|
||||||
@echo $(SRCS)
|
|
||||||
@echo C++ Sources:
|
|
||||||
@echo $(SRCS_CPP)
|
|
||||||
@echo Objects:
|
|
||||||
@echo $(OBJS) $(OBJS_CPP)
|
|
||||||
@echo Dirs:
|
|
||||||
@echo $(DIRS)
|
|
||||||
@echo Dependencies:
|
|
||||||
@echo $(DEPS)
|
|
||||||
|
|
||||||
# Simple install rule
|
|
||||||
install: $(BINARIES)
|
|
||||||
mkdir -p $(INSTALL_DIR)
|
|
||||||
|
|
||||||
ifeq ($(XASH_SINGLE_BINARY),1)
|
|
||||||
cp xash $(INSTALL_DIR)/xash_bin
|
|
||||||
else
|
|
||||||
cp libxash.so $(INSTALL_DIR)/
|
|
||||||
cp libloader.so $(INSTALL_DIR)/
|
|
||||||
endif
|
|
||||||
@@ -1,269 +0,0 @@
|
|||||||
**Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)*
|
|
||||||
|
|
||||||
- [Building](#building)
|
|
||||||
- [Manual build (without CMake)](#manual-build-without-cmake)
|
|
||||||
- [Building Engine](#building-engine)
|
|
||||||
- [Building launch binary](#building-launch-binary)
|
|
||||||
- [Building on Windows](#building-on-windows)
|
|
||||||
- [Visual Studio 2013 (recommended for Windows)](#visual-studio-2013-recommended-for-windows)
|
|
||||||
- [Visual Studio 6](#visual-studio-6)
|
|
||||||
- [MinGW](#mingw)
|
|
||||||
- [Building Game mods](#building-game-mods)
|
|
||||||
- [Linux](#linux)
|
|
||||||
- [microndk](#microndk)
|
|
||||||
- [Makefile.linux](#makefile-linux)
|
|
||||||
- [Windows](#windows)
|
|
||||||
- [Running](#running)
|
|
||||||
- [Manual running](#manual-running)
|
|
||||||
- [Running with GDB](#running-with-gdb)
|
|
||||||
- [Using DLL Loader](#using-dll-loader)
|
|
||||||
- [Running MinGW builds](#running-mingw-builds)
|
|
||||||
- [Running MinGW builds under GDB](#running-mingw-builds-under-gdb)
|
|
||||||
|
|
||||||
# Building
|
|
||||||
|
|
||||||
## Manual build (without CMake)
|
|
||||||
|
|
||||||
### Building engine
|
|
||||||
|
|
||||||
Clone Xash3D repository using git:
|
|
||||||
|
|
||||||
git clone https://github.com/FWGS/xash3d
|
|
||||||
|
|
||||||
Move to the Xash3D folder:
|
|
||||||
|
|
||||||
cd xash3d/engine
|
|
||||||
|
|
||||||
make -f Makefile.linux XASH_VGUI=1
|
|
||||||
|
|
||||||
or same for dedicated
|
|
||||||
|
|
||||||
make -f Makefile.linux XASH_DEDICATED=1
|
|
||||||
|
|
||||||
To enable dll support on linux, build loader library:
|
|
||||||
|
|
||||||
cd ../loader
|
|
||||||
make -f Makefile.linux libloader.so libloader.a
|
|
||||||
cp libloader.so libloader.a ../engine/
|
|
||||||
|
|
||||||
And built engine with XASH_DLL_LOADER=1:
|
|
||||||
|
|
||||||
cd ../engine
|
|
||||||
make -f Makefile.linux XASH_VGUI=1 XASH_SDL=1 XASH_DLL_LOADER=1
|
|
||||||
|
|
||||||
or same for dedicated server
|
|
||||||
|
|
||||||
cd ../engine
|
|
||||||
make -f Makefile.linux XASH_DEDICATED=1 XASH_DLL_LOADER=1
|
|
||||||
|
|
||||||
### Building engine in separate library
|
|
||||||
|
|
||||||
Some old distros does not support hidden symbol visibility
|
|
||||||
This results in crash when loading server library
|
|
||||||
|
|
||||||
Building launch binary
|
|
||||||
|
|
||||||
cd (xash3d)/game_launch
|
|
||||||
gcc xash.c -o xash -ldl -lrt -lm
|
|
||||||
|
|
||||||
Building engine library:
|
|
||||||
|
|
||||||
make -f Makefile.linux XASH_SINGLE_BINARY=0
|
|
||||||
|
|
||||||
## Building on Windows
|
|
||||||
|
|
||||||
### Visual Studio 2013 (recommended for Windows)
|
|
||||||
|
|
||||||
Download latest prebuilt SDL2 from
|
|
||||||
|
|
||||||
https://www.libsdl.org/release/SDL2-devel-2.0.4-VC.zip
|
|
||||||
|
|
||||||
Unzip and rename `SDL2-2.0.4` folder to `SDL2` and put it next to xash3d project folder.
|
|
||||||
|
|
||||||
..\xash3d\
|
|
||||||
..\SDL2\
|
|
||||||
|
|
||||||
Open `xash.sln` with Visual Studio 2013 and make a build. After building, copy contents of `Debug` or
|
|
||||||
`Release` folder to directory you choose. Copy `valve` folder and `vgui.dll` from your Half Life game
|
|
||||||
installation folder and `SDL2.dll` form `\SDL2\lib\x86\` to it.
|
|
||||||
Move `vgui_support.dll` into `valve` folder.
|
|
||||||
|
|
||||||
..\valve\
|
|
||||||
..\valve\vgui_support.dll
|
|
||||||
..\menu.dll
|
|
||||||
..\SDL2.dll
|
|
||||||
..\vgui.dll
|
|
||||||
..\xash.dll
|
|
||||||
..\xash.exe
|
|
||||||
|
|
||||||
Now you good to go, just run `xash.exe`.
|
|
||||||
|
|
||||||
### Visual Studio 6
|
|
||||||
|
|
||||||
This is legacy configuration, but msvc6 seems to generate more stable and more effective code
|
|
||||||
|
|
||||||
Setup your msvc6 enviroment, unpack SDL2-2.0.4 to xash3d folder and do:
|
|
||||||
|
|
||||||
cd (xash3d)\engine
|
|
||||||
..\msvc6\build.bat
|
|
||||||
cd (xash3d)\game_launch
|
|
||||||
..\msvc6\build_launch.bat
|
|
||||||
|
|
||||||
### MinGW
|
|
||||||
|
|
||||||
The most effective configuration, but maybe unstable.
|
|
||||||
Setup your MinGW environment and run:
|
|
||||||
|
|
||||||
cd (xash3d)\engine\
|
|
||||||
CC=gcc mingw32-make -f Makefile.mingw
|
|
||||||
|
|
||||||
engine will be built to single exe binary
|
|
||||||
|
|
||||||
## Building game mods
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
|
|
||||||
#### microndk
|
|
||||||
|
|
||||||
All mods that ported to android may be build to linux using Android.mk with microndk:
|
|
||||||
|
|
||||||
[https://github.com/SDLash3D/microndk]
|
|
||||||
|
|
||||||
Clone microndk repo somewhere, change xash3d_config to preffered configuration (change arch to x86
|
|
||||||
for example)
|
|
||||||
|
|
||||||
Go to dlls folder if you are building server or cl_dlls if you are building client and do:
|
|
||||||
|
|
||||||
make -f /path/to/microndk/microndk.mk -j4
|
|
||||||
|
|
||||||
Do:
|
|
||||||
|
|
||||||
make -f /path/to/microndk/microndk.mk -j4 clean
|
|
||||||
|
|
||||||
every time when you build client after building server
|
|
||||||
|
|
||||||
#### Makefile.linux
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
On windows common way is using Visual Studio as many mods does not correctly work with mingw.
|
|
||||||
|
|
||||||
Just open project and build it.
|
|
||||||
|
|
||||||
Other is using mingw and microndk, but it was not tested yet.
|
|
||||||
|
|
||||||
hlsdk-xash3d based mods may work fine with mingw.
|
|
||||||
|
|
||||||
You may use microndk to build it. Build process is very similar to linux one.
|
|
||||||
|
|
||||||
After setting up MinGW enviroment, do:<br>
|
|
||||||
`mingw32-make -f \path\to\microndk\Microndk.mk`
|
|
||||||
|
|
||||||
to build 64-bit library, use:<br>
|
|
||||||
`mingw32-make -f \path\to\microndk\Microndk.mk 64BIT=1`
|
|
||||||
|
|
||||||
Edit xash3d_config.mk to set optimal CFLAGS if you are running server
|
|
||||||
|
|
||||||
# Running
|
|
||||||
|
|
||||||
Copy **valve** folder from Half-Life:
|
|
||||||
|
|
||||||
cp -r $HOME/.steam/steam/steamapps/common/Half-Life/valve $HOME/Games/Xash3D
|
|
||||||
|
|
||||||
**NOTE**: If you build with CMake, you can now use `make install`. It will install binaries where
|
|
||||||
they must be located. So just run `xash3d` from command line in directory where is gamedata is located.
|
|
||||||
For additional info look to the CMakeLists.txt in repo root and xash3d.sh script.
|
|
||||||
|
|
||||||
After a successful build, copy the next files to some other directory where you want to run Xash3D:
|
|
||||||
|
|
||||||
cp engine/libxash.so game_launch/xash3d mainui/libxashmenu.so $HOME/Games/Xash3D
|
|
||||||
|
|
||||||
If you built it with XASH_VGUI, also copy vgui.so:
|
|
||||||
|
|
||||||
cp ../hlsdk/linux/vgui.so vgui_support/libvgui_support.so $HOME/Games/Xash3D
|
|
||||||
|
|
||||||
Copy script:
|
|
||||||
|
|
||||||
cp ../xash3d.sh $HOME/Games/Xash3D
|
|
||||||
|
|
||||||
Run:
|
|
||||||
|
|
||||||
cd $HOME/Games/Xash3D
|
|
||||||
./xash3d.sh
|
|
||||||
|
|
||||||
## Manual running
|
|
||||||
|
|
||||||
Put xash3d binaries and vgui(optionally) to you game data directory and run:
|
|
||||||
|
|
||||||
LD_LIBRARY_PATH=. ./xash -dev 5
|
|
||||||
|
|
||||||
## Running under GDB
|
|
||||||
|
|
||||||
LD_LIBRARY_PATH=. gdb --args ./xash -dev 5
|
|
||||||
|
|
||||||
## Using DLL Loader
|
|
||||||
|
|
||||||
Put vgui_support.dll from windows build to your game data folder and run:
|
|
||||||
|
|
||||||
LD_LIBRARY_PATH=. ./xash -dev 5 -vguilib vgui.dll -clientlib valve/cl_dlls/client.dll -dll dlls/hl.dll
|
|
||||||
|
|
||||||
## Running MinGW builds
|
|
||||||
|
|
||||||
Put exe file to your game data directory
|
|
||||||
|
|
||||||
cd (game)\
|
|
||||||
xash_bin -dev 5
|
|
||||||
|
|
||||||
### Running MinGW builds under GDB
|
|
||||||
|
|
||||||
gdb --args ./xash_bin.exe -dev 5
|
|
||||||
|
|
||||||
# Useful GDB commands
|
|
||||||
|
|
||||||
Start or restart process:
|
|
||||||
|
|
||||||
(gdb) r
|
|
||||||
|
|
||||||
Show backtrace:
|
|
||||||
|
|
||||||
(gdb) bt
|
|
||||||
|
|
||||||
Full backtrace:
|
|
||||||
|
|
||||||
(gdb) bt full
|
|
||||||
|
|
||||||
Continue execution:
|
|
||||||
|
|
||||||
(gdb) c
|
|
||||||
|
|
||||||
Recover from segmentation fault:
|
|
||||||
|
|
||||||
Skipping function:
|
|
||||||
|
|
||||||
(gdb) handle SIGSEGV nopass
|
|
||||||
(gdb) ret
|
|
||||||
(gdb) c
|
|
||||||
|
|
||||||
Restart frame for beginning:
|
|
||||||
|
|
||||||
(gdb) handle SIGSEGV nopass
|
|
||||||
(gdb) jump *Host_AbortCurrentFrame
|
|
||||||
Anti-Crash script (useful for scripting servers):
|
|
||||||
```
|
|
||||||
cd /path/to/rootdir
|
|
||||||
file xash
|
|
||||||
set args xash -dev 5 -nowcon
|
|
||||||
handle SIGSEGV nopass
|
|
||||||
catch signal SIGSEGV
|
|
||||||
set $crashes=0
|
|
||||||
commands
|
|
||||||
print $crashes++
|
|
||||||
if $crashes > 500
|
|
||||||
set $crashes=0
|
|
||||||
run
|
|
||||||
else
|
|
||||||
jump *Host_AbortCurrentFrame
|
|
||||||
end
|
|
||||||
end
|
|
||||||
run
|
|
||||||
```
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
SCRIPTDIR=$(dirname "$0")
|
|
||||||
TOPDIR=$SCRIPTDIR/../../
|
|
||||||
cp $SCRIPTDIR/Makefile.dllloader $TOPDIR/loader/
|
|
||||||
cp $SCRIPTDIR/Makefile.emscripten $TOPDIR/engine/
|
|
||||||
cp $SCRIPTDIR/Makefile.linux $TOPDIR/engine/
|
|
||||||
cp $SCRIPTDIR/wscript $TOPDIR/engine/
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#! /usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
# mittorn, 2018
|
|
||||||
|
|
||||||
VERSION='0.99'
|
|
||||||
APPNAME='xash3d-fwgs'
|
|
||||||
|
|
||||||
top = '.'
|
|
||||||
|
|
||||||
def options(opt):
|
|
||||||
opt.load('compiler_c')
|
|
||||||
# opt.load('msvs')
|
|
||||||
opt.add_option('--dedicated', action = 'store_true', help = 'build dedicated server only' )
|
|
||||||
opt.add_option('--64bits', dest = 'amd64', action = 'store_true', help = 'build 64-bit engine on x86_64' )
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def configure(conf):
|
|
||||||
conf.load('compiler_c')
|
|
||||||
conf.env.append_unique('CFLAGS', '-O2')
|
|
||||||
conf.env.append_unique('DEFINES', 'SINGLE_BINARY')
|
|
||||||
conf.env.append_value('LINKFLAGS', '-ldl')
|
|
||||||
conf.env.append_value('LINKFLAGS', '-lm')
|
|
||||||
conf.env.append_value('LINKFLAGS', '-pthread')
|
|
||||||
|
|
||||||
# check for 64-bit builds
|
|
||||||
# TODO: check 32-bit toolchain and dependencies
|
|
||||||
if conf.env.DEST_CPU == 'x86_64' and not conf.options.amd64:
|
|
||||||
conf.env.append_value('LINKFLAGS', '-m32')
|
|
||||||
conf.env.append_value('CFLAGS', '-m32')
|
|
||||||
print('NOTE: will build engine with 64-bit toolchain using -m32')
|
|
||||||
else:
|
|
||||||
print('Warning: 64bit engine may be unstable')
|
|
||||||
|
|
||||||
# check for dedicated server build
|
|
||||||
if conf.options.dedicated:
|
|
||||||
conf.env.append_unique('DEFINES', 'XASH_DEDICATED')
|
|
||||||
conf.env.dedicated = True
|
|
||||||
else:
|
|
||||||
# TODO: add way to specify SDL2 path, move to separate function
|
|
||||||
try:
|
|
||||||
conf.check_cfg(path='sdl2-config', args='--cflags --libs', package='', msg='Checking for SDL2', uselib_store='SDL2')
|
|
||||||
except conf.errors.ConfigurationError:
|
|
||||||
conf.fatal('SDL2 not availiable! If you want to build dedicated server, specify --dedicated')
|
|
||||||
conf.env.append_unique('DEFINES', 'XASH_SDL')
|
|
||||||
|
|
||||||
def build(bld):
|
|
||||||
# basic build: dedicated only, no dependencies
|
|
||||||
use = [];
|
|
||||||
source = bld.path.ant_glob([
|
|
||||||
'common/*.c',
|
|
||||||
'common/imagelib/*.c',
|
|
||||||
'common/soundlib/*.c',
|
|
||||||
'common/soundlib/libmpg/*.c',
|
|
||||||
'server/*.c'])
|
|
||||||
|
|
||||||
# add client files and sdl2 library
|
|
||||||
if not bld.env.dedicated:
|
|
||||||
use += ['SDL2']
|
|
||||||
source += bld.path.ant_glob([
|
|
||||||
'client/*.c',
|
|
||||||
'client/vgui/*.c',
|
|
||||||
'client/avi/*.c',
|
|
||||||
'platform/sdl/*.c'])
|
|
||||||
|
|
||||||
|
|
||||||
bld(
|
|
||||||
target = 'xash',
|
|
||||||
features = 'c cprogram',
|
|
||||||
includes = ['../common', '../pm_shared', 'common', 'server', 'client', 'client/vgui', '.' ],
|
|
||||||
source = source,
|
|
||||||
use = use
|
|
||||||
)
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -16,6 +16,10 @@
|
|||||||
#ifndef ALIAS_H
|
#ifndef ALIAS_H
|
||||||
#define ALIAS_H
|
#define ALIAS_H
|
||||||
|
|
||||||
|
#include "build.h"
|
||||||
|
#include STDINT_H
|
||||||
|
#include "synctype.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
@@ -39,16 +43,6 @@ Alias models are position independent, so the cache manager can move them.
|
|||||||
#define ALIAS_TRACER2 0x0040 // orange split trail + rotate
|
#define ALIAS_TRACER2 0x0040 // orange split trail + rotate
|
||||||
#define ALIAS_TRACER3 0x0080 // purple trail
|
#define ALIAS_TRACER3 0x0080 // purple trail
|
||||||
|
|
||||||
// must match definition in sprite.h
|
|
||||||
#ifndef SYNCTYPE_T
|
|
||||||
#define SYNCTYPE_T
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
ST_SYNC = 0,
|
|
||||||
ST_RAND
|
|
||||||
} synctype_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ALIAS_SINGLE = 0,
|
ALIAS_SINGLE = 0,
|
||||||
@@ -63,36 +57,42 @@ typedef enum
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int ident;
|
int32_t ident;
|
||||||
int version;
|
int32_t version;
|
||||||
vec3_t scale;
|
vec3_t scale;
|
||||||
vec3_t scale_origin;
|
vec3_t scale_origin;
|
||||||
float boundingradius;
|
float boundingradius;
|
||||||
vec3_t eyeposition;
|
vec3_t eyeposition;
|
||||||
int numskins;
|
int32_t numskins;
|
||||||
int skinwidth;
|
int32_t skinwidth;
|
||||||
int skinheight;
|
int32_t skinheight;
|
||||||
int numverts;
|
int32_t numverts;
|
||||||
int numtris;
|
int32_t numtris;
|
||||||
int numframes;
|
int32_t numframes;
|
||||||
synctype_t synctype;
|
uint32_t synctype; // was synctype_t
|
||||||
int flags;
|
int32_t flags;
|
||||||
float size;
|
float size;
|
||||||
} daliashdr_t;
|
} daliashdr_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliashdr_t ) == 84, "invalid daliashdr_t size" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int onseam;
|
int32_t onseam;
|
||||||
int s;
|
int32_t s;
|
||||||
int t;
|
int32_t t;
|
||||||
} stvert_t;
|
} stvert_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( stvert_t ) == 12, "invalid stvert_t size" );
|
||||||
|
|
||||||
typedef struct dtriangle_s
|
typedef struct dtriangle_s
|
||||||
{
|
{
|
||||||
int facesfront;
|
int32_t facesfront;
|
||||||
int vertindex[3];
|
int32_t vertindex[3];
|
||||||
} dtriangle_t;
|
} dtriangle_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( dtriangle_t ) == 16, "invalid dtriangle_t size" );
|
||||||
|
|
||||||
#define DT_FACES_FRONT 0x0010
|
#define DT_FACES_FRONT 0x0010
|
||||||
#define ALIAS_ONSEAM 0x0020
|
#define ALIAS_ONSEAM 0x0020
|
||||||
|
|
||||||
@@ -103,36 +103,50 @@ 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" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int numframes;
|
int32_t numframes;
|
||||||
trivertex_t bboxmin; // lightnormal isn't used
|
trivertex_t bboxmin; // lightnormal isn't used
|
||||||
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" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int numskins;
|
int32_t numskins;
|
||||||
} daliasskingroup_t;
|
} daliasskingroup_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliasskingroup_t ) == 4, "invalid daliasskingroup_t size" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float interval;
|
float interval;
|
||||||
} daliasinterval_t;
|
} daliasinterval_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliasinterval_t ) == 4, "invalid daliasinterval_t size" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float interval;
|
float interval;
|
||||||
} daliasskininterval_t;
|
} daliasskininterval_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliasskininterval_t ) == 4, "invalid daliasskininterval_t size" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
aliasframetype_t type;
|
uint32_t type; // was aliasframetype_t
|
||||||
} daliasframetype_t;
|
} daliasframetype_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliasframetype_t ) == 4, "invalid daliasframetype_t size" );
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
aliasskintype_t type;
|
uint32_t type; // was aliasskintype_t
|
||||||
} daliasskintype_t;
|
} daliasskintype_t;
|
||||||
|
|
||||||
|
STATIC_ASSERT( sizeof( daliasskintype_t ) == 4, "invalid daliasskintype_t size" );
|
||||||
|
|
||||||
#endif//ALIAS_H
|
#endif//ALIAS_H
|
||||||
|
|||||||
@@ -1,18 +1,22 @@
|
|||||||
/***
|
/*
|
||||||
*
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
****/
|
|
||||||
|
|
||||||
|
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 2
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
{-0.525731, 0.000000, 0.850651},
|
{-0.525731, 0.000000, 0.850651},
|
||||||
{-0.442863, 0.238856, 0.864188},
|
{-0.442863, 0.238856, 0.864188},
|
||||||
{-0.295242, 0.000000, 0.955423},
|
{-0.295242, 0.000000, 0.955423},
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/***
|
/***
|
||||||
*
|
*
|
||||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||||
*
|
*
|
||||||
* This product contains software technology licensed from Id
|
* This product contains software technology licensed from Id
|
||||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use, distribution, and modification of this source code and/or resulting
|
* Use, distribution, and modification of this source code and/or resulting
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
//
|
//
|
||||||
// cdll_int.h
|
// cdll_int.h
|
||||||
//
|
//
|
||||||
// 4-23-98
|
// 4-23-98
|
||||||
// JOHN: client dll interface declarations
|
// JOHN: client dll interface declarations
|
||||||
//
|
//
|
||||||
|
|
||||||
@@ -205,11 +205,11 @@ typedef struct cl_enginefuncs_s
|
|||||||
|
|
||||||
const struct model_s* (*GetSpritePointer)( HSPRITE hSprite );
|
const struct model_s* (*GetSpritePointer)( HSPRITE hSprite );
|
||||||
void (*pfnPlaySoundByNameAtLocation)( char *szSound, float volume, float *origin );
|
void (*pfnPlaySoundByNameAtLocation)( char *szSound, float volume, float *origin );
|
||||||
|
|
||||||
unsigned short (*pfnPrecacheEvent)( int type, const char* psz );
|
unsigned short (*pfnPrecacheEvent)( int type, const char* psz );
|
||||||
void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
void (*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
|
||||||
void (*pfnWeaponAnim)( int iAnim, int body );
|
void (*pfnWeaponAnim)( int iAnim, int body );
|
||||||
float (*pfnRandomFloat)( float flLow, float flHigh );
|
float (*pfnRandomFloat)( float flLow, float flHigh );
|
||||||
int (*pfnRandomLong)( int lLow, int lHigh );
|
int (*pfnRandomLong)( int lLow, int lHigh );
|
||||||
void (*pfnHookEvent)( const char *name, void ( *pfnEvent )( struct event_args_s *args ));
|
void (*pfnHookEvent)( const char *name, void ( *pfnEvent )( struct event_args_s *args ));
|
||||||
|
|
||||||
@@ -229,12 +229,12 @@ typedef struct cl_enginefuncs_s
|
|||||||
|
|
||||||
struct triangleapi_s *pTriAPI;
|
struct triangleapi_s *pTriAPI;
|
||||||
struct efx_api_s *pEfxAPI;
|
struct efx_api_s *pEfxAPI;
|
||||||
struct event_api_s *pEventAPI;
|
struct event_api_s *pEventAPI;
|
||||||
struct demo_api_s *pDemoAPI;
|
struct demo_api_s *pDemoAPI;
|
||||||
struct net_api_s *pNetAPI;
|
struct net_api_s *pNetAPI;
|
||||||
struct IVoiceTweak_s *pVoiceTweak;
|
struct IVoiceTweak_s *pVoiceTweak;
|
||||||
|
|
||||||
// returns 1 if the client is a spectator only (connected to a proxy), 0 otherwise or 2 if in dev_overview mode
|
// returns 1 if the client is a spectator only (connected to a proxy), 0 otherwise or 2 if in dev_overview mode
|
||||||
int (*IsSpectateOnly)( void );
|
int (*IsSpectateOnly)( void );
|
||||||
struct model_s *(*LoadMapSprite)( const char *filename );
|
struct model_s *(*LoadMapSprite)( const char *filename );
|
||||||
|
|
||||||
@@ -285,9 +285,9 @@ typedef struct cl_enginefuncs_s
|
|||||||
const char *(*LocalPlayerInfo_ValueForKey)( const char* key );
|
const char *(*LocalPlayerInfo_ValueForKey)( const char* key );
|
||||||
int (*pfnVGUI2DrawCharacter)( int x, int y, int ch, unsigned int font );
|
int (*pfnVGUI2DrawCharacter)( int x, int y, int ch, unsigned int font );
|
||||||
int (*pfnVGUI2DrawCharacterAdditive)( int x, int y, int ch, int r, int g, int b, unsigned int font );
|
int (*pfnVGUI2DrawCharacterAdditive)( int x, int y, int ch, int r, int g, int b, unsigned int font );
|
||||||
unsigned int (*pfnGetApproxWavePlayLen)( char *filename );
|
unsigned int (*pfnGetApproxWavePlayLen)( const char *filename );
|
||||||
void* (*GetCareerGameUI)( void ); // g-cont. !!!! potential crash-point!
|
void* (*GetCareerGameUI)( void ); // g-cont. !!!! potential crash-point!
|
||||||
void (*Cvar_Set)( char *name, char *value );
|
void (*Cvar_Set)( const char *name, const char *value );
|
||||||
int (*pfnIsPlayingCareerMatch)( void );
|
int (*pfnIsPlayingCareerMatch)( void );
|
||||||
void (*pfnPlaySoundVoiceByName)( char *szSound, float volume, int pitch );
|
void (*pfnPlaySoundVoiceByName)( char *szSound, float volume, int pitch );
|
||||||
void (*pfnPrimeMusicStream)( char *filename, int looping );
|
void (*pfnPrimeMusicStream)( char *filename, int looping );
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int leng
|
|||||||
void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audio, int quiet );
|
void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audio, int quiet );
|
||||||
movie_state_t *AVI_LoadVideo( const char *filename, qboolean load_audio );
|
movie_state_t *AVI_LoadVideo( const char *filename, qboolean load_audio );
|
||||||
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time );
|
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time );
|
||||||
int AVI_GetVideoFrameCount( movie_state_t *Avi );
|
|
||||||
void AVI_CloseVideo( movie_state_t *Avi );
|
void AVI_CloseVideo( movie_state_t *Avi );
|
||||||
qboolean AVI_IsActive( movie_state_t *Avi );
|
qboolean AVI_IsActive( movie_state_t *Avi );
|
||||||
void AVI_FreeVideo( movie_state_t *Avi );
|
void AVI_FreeVideo( movie_state_t *Avi );
|
||||||
|
|||||||
@@ -57,11 +57,6 @@ int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AVI_GetVideoFrameCount( movie_state_t *Avi )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AVI_CloseVideo( movie_state_t *Avi )
|
void AVI_CloseVideo( movie_state_t *Avi )
|
||||||
{
|
{
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
avi_win.c - playing AVI files (based on original AVIKit code, Win32 version)
|
avi_win.c - playing AVI files (based on original AVIKit code, Win32 version)
|
||||||
|
Copyright (c) 2003-2004, Ruari O'Sullivan
|
||||||
Copyright (C) 2010 Uncle Mike
|
Copyright (C) 2010 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
|
||||||
@@ -59,14 +60,14 @@ dll_info_t msacm_dll = { "msacm32.dll", msacm_funcs, false };
|
|||||||
static int (_stdcall *pAVIStreamInfo)( PAVISTREAM pavi, AVISTREAMINFO *psi, LONG lSize );
|
static int (_stdcall *pAVIStreamInfo)( PAVISTREAM pavi, AVISTREAMINFO *psi, LONG lSize );
|
||||||
static int (_stdcall *pAVIStreamRead)( PAVISTREAM pavi, LONG lStart, LONG lSamples, void *lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples );
|
static int (_stdcall *pAVIStreamRead)( PAVISTREAM pavi, LONG lStart, LONG lSamples, void *lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples );
|
||||||
static PGETFRAME (_stdcall *pAVIStreamGetFrameOpen)( PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted );
|
static PGETFRAME (_stdcall *pAVIStreamGetFrameOpen)( PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted );
|
||||||
static long (_stdcall *pAVIStreamTimeToSample)( PAVISTREAM pavi, LONG lTime );
|
static int (_stdcall *pAVIStreamTimeToSample)( PAVISTREAM pavi, LONG lTime );
|
||||||
static void* (_stdcall *pAVIStreamGetFrame)( PGETFRAME pg, LONG lPos );
|
static void* (_stdcall *pAVIStreamGetFrame)( PGETFRAME pg, LONG lPos );
|
||||||
static int (_stdcall *pAVIStreamGetFrameClose)( PGETFRAME pg );
|
static int (_stdcall *pAVIStreamGetFrameClose)( PGETFRAME pg );
|
||||||
static dword (_stdcall *pAVIStreamRelease)( PAVISTREAM pavi );
|
static dword (_stdcall *pAVIStreamRelease)( PAVISTREAM pavi );
|
||||||
static int (_stdcall *pAVIFileOpen)( PAVIFILE *ppfile, LPCSTR szFile, UINT uMode, LPCLSID lpHandler );
|
static int (_stdcall *pAVIFileOpenW)( PAVIFILE *ppfile, LPCWSTR szFile, UINT uMode, LPCLSID lpHandler );
|
||||||
static int (_stdcall *pAVIFileGetStream)( PAVIFILE pfile, PAVISTREAM *ppavi, DWORD fccType, LONG lParam );
|
static int (_stdcall *pAVIFileGetStream)( PAVIFILE pfile, PAVISTREAM *ppavi, DWORD fccType, LONG lParam );
|
||||||
static int (_stdcall *pAVIStreamReadFormat)( PAVISTREAM pavi, LONG lPos,LPVOID lpFormat, LONG *lpcbFormat );
|
static int (_stdcall *pAVIStreamReadFormat)( PAVISTREAM pavi, LONG lPos,LPVOID lpFormat, LONG *lpcbFormat );
|
||||||
static long (_stdcall *pAVIStreamStart)( PAVISTREAM pavi );
|
static int (_stdcall *pAVIStreamStart)( PAVISTREAM pavi );
|
||||||
static dword (_stdcall *pAVIFileRelease)( PAVIFILE pfile );
|
static dword (_stdcall *pAVIFileRelease)( PAVIFILE pfile );
|
||||||
static void (_stdcall *pAVIFileInit)( void );
|
static void (_stdcall *pAVIFileInit)( void );
|
||||||
static void (_stdcall *pAVIFileExit)( void );
|
static void (_stdcall *pAVIFileExit)( void );
|
||||||
@@ -76,7 +77,7 @@ static dllfunc_t avifile_funcs[] =
|
|||||||
{ "AVIFileExit", (void **) &pAVIFileExit },
|
{ "AVIFileExit", (void **) &pAVIFileExit },
|
||||||
{ "AVIFileGetStream", (void **) &pAVIFileGetStream },
|
{ "AVIFileGetStream", (void **) &pAVIFileGetStream },
|
||||||
{ "AVIFileInit", (void **) &pAVIFileInit },
|
{ "AVIFileInit", (void **) &pAVIFileInit },
|
||||||
{ "AVIFileOpenA", (void **) &pAVIFileOpen },
|
{ "AVIFileOpenW", (void **) &pAVIFileOpenW },
|
||||||
{ "AVIFileRelease", (void **) &pAVIFileRelease },
|
{ "AVIFileRelease", (void **) &pAVIFileRelease },
|
||||||
{ "AVIStreamGetFrame", (void **) &pAVIStreamGetFrame },
|
{ "AVIStreamGetFrame", (void **) &pAVIStreamGetFrame },
|
||||||
{ "AVIStreamGetFrameClose", (void **) &pAVIStreamGetFrameClose },
|
{ "AVIStreamGetFrameClose", (void **) &pAVIStreamGetFrameClose },
|
||||||
@@ -91,7 +92,7 @@ static dllfunc_t avifile_funcs[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
dll_info_t avifile_dll = { "avifil32.dll", avifile_funcs, false };
|
dll_info_t avifile_dll = { "avifil32.dll", avifile_funcs, false };
|
||||||
|
|
||||||
typedef struct movie_state_s
|
typedef struct movie_state_s
|
||||||
{
|
{
|
||||||
qboolean active;
|
qboolean active;
|
||||||
@@ -100,17 +101,17 @@ typedef struct movie_state_s
|
|||||||
PAVIFILE pfile; // avi file pointer
|
PAVIFILE pfile; // avi file pointer
|
||||||
PAVISTREAM video_stream; // video stream pointer
|
PAVISTREAM video_stream; // video stream pointer
|
||||||
PGETFRAME video_getframe; // pointer to getframe object for video stream
|
PGETFRAME video_getframe; // pointer to getframe object for video stream
|
||||||
long video_frames; // total frames
|
int video_frames; // total frames
|
||||||
long video_xres; // video stream resolution
|
int video_xres; // video stream resolution
|
||||||
long video_yres;
|
int video_yres;
|
||||||
float video_fps; // video stream fps
|
float video_fps; // video stream fps
|
||||||
|
|
||||||
PAVISTREAM audio_stream; // audio stream pointer
|
PAVISTREAM audio_stream; // audio stream pointer
|
||||||
WAVEFORMAT *audio_header; // audio stream header
|
WAVEFORMAT *audio_header; // audio stream header
|
||||||
long audio_header_size; // WAVEFORMAT is returned for PCM data; WAVEFORMATEX for others
|
int audio_header_size; // WAVEFORMAT is returned for PCM data; WAVEFORMATEX for others
|
||||||
long audio_codec; // WAVE_FORMAT_PCM is oldstyle: anything else needs conversion
|
int audio_codec; // WAVE_FORMAT_PCM is oldstyle: anything else needs conversion
|
||||||
long audio_length; // in converted samples
|
int audio_length; // in converted samples
|
||||||
long audio_bytes_per_sample; // guess.
|
int audio_bytes_per_sample; // guess.
|
||||||
|
|
||||||
// compressed audio specific data
|
// compressed audio specific data
|
||||||
dword cpa_blockalign; // block size to read
|
dword cpa_blockalign; // block size to read
|
||||||
@@ -278,14 +279,6 @@ int AVI_GetVideoFrameNumber( movie_state_t *Avi, float time )
|
|||||||
return (time * Avi->video_fps);
|
return (time * Avi->video_fps);
|
||||||
}
|
}
|
||||||
|
|
||||||
int AVI_GetVideoFrameCount( movie_state_t *Avi )
|
|
||||||
{
|
|
||||||
if( !Avi->active )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return Avi->video_frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
||||||
{
|
{
|
||||||
if( !Avi->active || !Avi->audio_stream )
|
if( !Avi->active || !Avi->audio_stream )
|
||||||
@@ -296,7 +289,7 @@ int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// gets the raw frame data
|
// gets the raw frame data
|
||||||
byte *AVI_GetVideoFrame( movie_state_t *Avi, long frame )
|
byte *AVI_GetVideoFrame( movie_state_t *Avi, int frame )
|
||||||
{
|
{
|
||||||
LPBITMAPINFOHEADER frame_info;
|
LPBITMAPINFOHEADER frame_info;
|
||||||
byte *frame_raw;
|
byte *frame_raw;
|
||||||
@@ -385,7 +378,7 @@ qboolean AVI_SeekPosition( movie_state_t *Avi, dword offset )
|
|||||||
// get a chunk of audio from the stream (in bytes)
|
// get a chunk of audio from the stream (in bytes)
|
||||||
int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int length )
|
int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int length )
|
||||||
{
|
{
|
||||||
long result = 0;
|
int result = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// zero data past the end of the file
|
// zero data past the end of the file
|
||||||
@@ -393,7 +386,7 @@ int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int leng
|
|||||||
{
|
{
|
||||||
if( offset <= Avi->audio_length )
|
if( offset <= Avi->audio_length )
|
||||||
{
|
{
|
||||||
long remaining_length = Avi->audio_length - offset;
|
int remaining_length = Avi->audio_length - offset;
|
||||||
|
|
||||||
AVI_GetAudioChunk( Avi, audiodata, offset, remaining_length );
|
AVI_GetAudioChunk( Avi, audiodata, offset, remaining_length );
|
||||||
|
|
||||||
@@ -423,12 +416,12 @@ int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int leng
|
|||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
// seek to correct chunk and all that stuff
|
// seek to correct chunk and all that stuff
|
||||||
if( !AVI_SeekPosition( Avi, offset ))
|
if( !AVI_SeekPosition( Avi, offset ))
|
||||||
return 0; // don't continue if we're waiting for the play pointer to catch up
|
return 0; // don't continue if we're waiting for the play pointer to catch up
|
||||||
|
|
||||||
while( length > 0 )
|
while( length > 0 )
|
||||||
{
|
{
|
||||||
long blockread = Avi->cpa_conversion_header.cbDstLengthUsed - Avi->cpa_blockpos;
|
int blockread = Avi->cpa_conversion_header.cbDstLengthUsed - Avi->cpa_blockpos;
|
||||||
|
|
||||||
if( blockread <= 0 ) // read next
|
if( blockread <= 0 ) // read next
|
||||||
{
|
{
|
||||||
@@ -491,8 +484,9 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
{
|
{
|
||||||
BITMAPINFOHEADER bmih;
|
BITMAPINFOHEADER bmih;
|
||||||
AVISTREAMINFO stream_info;
|
AVISTREAMINFO stream_info;
|
||||||
long opened_streams = 0;
|
int opened_streams = 0;
|
||||||
LONG hr;
|
LONG hr;
|
||||||
|
wchar_t pathBuffer[MAX_PATH];
|
||||||
|
|
||||||
// default state: non-working.
|
// default state: non-working.
|
||||||
Avi->active = false;
|
Avi->active = false;
|
||||||
@@ -501,8 +495,15 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
// can't load Video For Windows :-(
|
// can't load Video For Windows :-(
|
||||||
if( !avi_initialized ) return;
|
if( !avi_initialized ) return;
|
||||||
|
|
||||||
|
// convert to wide char
|
||||||
|
if( MultiByteToWideChar( CP_UTF8, 0, filename, -1, pathBuffer, ARRAYSIZE( pathBuffer )) <= 0 )
|
||||||
|
{
|
||||||
|
Con_DPrintf( S_ERROR "filename buffer limit exceeded\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// load the AVI
|
// load the AVI
|
||||||
hr = pAVIFileOpen( &Avi->pfile, filename, OF_SHARE_DENY_WRITE, 0L );
|
hr = pAVIFileOpenW( &Avi->pfile, pathBuffer, OF_SHARE_DENY_WRITE, 0L );
|
||||||
|
|
||||||
if( hr != 0 ) // error opening AVI:
|
if( hr != 0 ) // error opening AVI:
|
||||||
{
|
{
|
||||||
@@ -535,7 +536,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
|
|
||||||
Avi->video_stream = Avi->audio_stream = NULL;
|
Avi->video_stream = Avi->audio_stream = NULL;
|
||||||
|
|
||||||
// open the streams until a stream is not available.
|
// open the streams until a stream is not available.
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
PAVISTREAM stream = NULL;
|
PAVISTREAM stream = NULL;
|
||||||
@@ -558,7 +559,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
}
|
}
|
||||||
else if( stream_info.fccType == streamtypeAUDIO && Avi->audio_stream == NULL && load_audio )
|
else if( stream_info.fccType == streamtypeAUDIO && Avi->audio_stream == NULL && load_audio )
|
||||||
{
|
{
|
||||||
long size;
|
int size;
|
||||||
|
|
||||||
Avi->audio_stream = stream;
|
Avi->audio_stream = stream;
|
||||||
|
|
||||||
@@ -571,7 +572,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
Avi->audio_codec = Avi->audio_header->wFormatTag;
|
Avi->audio_codec = Avi->audio_header->wFormatTag;
|
||||||
|
|
||||||
// length of converted audio in samples
|
// length of converted audio in samples
|
||||||
Avi->audio_length = (long)((float)stream_info.dwLength / Avi->audio_header->nAvgBytesPerSec );
|
Avi->audio_length = (int)((float)stream_info.dwLength / Avi->audio_header->nAvgBytesPerSec );
|
||||||
Avi->audio_length *= Avi->audio_header->nSamplesPerSec;
|
Avi->audio_length *= Avi->audio_header->nSamplesPerSec;
|
||||||
|
|
||||||
if( Avi->audio_codec != WAVE_FORMAT_PCM )
|
if( Avi->audio_codec != WAVE_FORMAT_PCM )
|
||||||
@@ -585,17 +586,17 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
}
|
}
|
||||||
else Avi->audio_bytes_per_sample = Avi->audio_header->nBlockAlign;
|
else Avi->audio_bytes_per_sample = Avi->audio_header->nBlockAlign;
|
||||||
Avi->audio_length *= Avi->audio_bytes_per_sample;
|
Avi->audio_length *= Avi->audio_bytes_per_sample;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pAVIStreamRelease( stream );
|
pAVIStreamRelease( stream );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// display error message-stream not found.
|
// display error message-stream not found.
|
||||||
if( Avi->video_stream == NULL )
|
if( Avi->video_stream == NULL )
|
||||||
{
|
{
|
||||||
if( Avi->pfile ) // if file is open, close it
|
if( Avi->pfile ) // if file is open, close it
|
||||||
pAVIFileRelease( Avi->pfile );
|
pAVIFileRelease( Avi->pfile );
|
||||||
if( !Avi->quiet )
|
if( !Avi->quiet )
|
||||||
Con_DPrintf( S_ERROR "couldn't find a valid video stream.\n" );
|
Con_DPrintf( S_ERROR "couldn't find a valid video stream.\n" );
|
||||||
@@ -613,9 +614,9 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
|||||||
}
|
}
|
||||||
|
|
||||||
bmih.biSize = sizeof( BITMAPINFOHEADER );
|
bmih.biSize = sizeof( BITMAPINFOHEADER );
|
||||||
bmih.biPlanes = 1;
|
bmih.biPlanes = 1;
|
||||||
bmih.biBitCount = 32;
|
bmih.biBitCount = 32;
|
||||||
bmih.biCompression = BI_RGB;
|
bmih.biCompression = BI_RGB;
|
||||||
bmih.biWidth = Avi->video_xres;
|
bmih.biWidth = Avi->video_xres;
|
||||||
bmih.biHeight = -Avi->video_yres; // invert height to flip image upside down
|
bmih.biHeight = -Avi->video_yres; // invert height to flip image upside down
|
||||||
|
|
||||||
@@ -657,7 +658,7 @@ movie_state_t *AVI_LoadVideo( const char *filename, qboolean load_audio )
|
|||||||
|
|
||||||
// open cinematic
|
// open cinematic
|
||||||
Q_snprintf( path, sizeof( path ), "media/%s", filename );
|
Q_snprintf( path, sizeof( path ), "media/%s", filename );
|
||||||
COM_DefaultExtension( path, ".avi" );
|
COM_DefaultExtension( path, ".avi", sizeof( path ));
|
||||||
fullpath = FS_GetDiskPath( path, false );
|
fullpath = FS_GetDiskPath( path, false );
|
||||||
|
|
||||||
if( FS_FileExists( path, false ) && !fullpath )
|
if( FS_FileExists( path, false ) && !fullpath )
|
||||||
|
|||||||
@@ -85,6 +85,12 @@ void CL_PlayCDTrack_f( void )
|
|||||||
paused = false;
|
paused = false;
|
||||||
looped = false;
|
looped = false;
|
||||||
}
|
}
|
||||||
|
else if( !Q_stricmp( command, "playfile" ))
|
||||||
|
{
|
||||||
|
S_StartBackgroundTrack( pszTrack, NULL, 0, true );
|
||||||
|
paused = false;
|
||||||
|
looped = false;
|
||||||
|
}
|
||||||
else if( !Q_stricmp( command, "loop" ))
|
else if( !Q_stricmp( command, "loop" ))
|
||||||
{
|
{
|
||||||
if( Q_isdigit( pszTrack ))
|
if( Q_isdigit( pszTrack ))
|
||||||
@@ -96,6 +102,12 @@ void CL_PlayCDTrack_f( void )
|
|||||||
paused = false;
|
paused = false;
|
||||||
looped = true;
|
looped = true;
|
||||||
}
|
}
|
||||||
|
else if( !Q_stricmp( command, "loopfile" ))
|
||||||
|
{
|
||||||
|
S_StartBackgroundTrack( pszTrack, pszTrack, 0, true );
|
||||||
|
paused = false;
|
||||||
|
looped = true;
|
||||||
|
}
|
||||||
else if( !Q_stricmp( command, "pause" ))
|
else if( !Q_stricmp( command, "pause" ))
|
||||||
{
|
{
|
||||||
S_StreamSetPause( true );
|
S_StreamSetPause( true );
|
||||||
@@ -126,8 +138,8 @@ void CL_PlayCDTrack_f( void )
|
|||||||
int i, maxTrack;
|
int i, maxTrack;
|
||||||
|
|
||||||
for( maxTrack = i = 0; i < MAX_CDTRACKS; i++ )
|
for( maxTrack = i = 0; i < MAX_CDTRACKS; i++ )
|
||||||
if( Q_strlen( clgame.cdtracks[i] )) maxTrack++;
|
if( COM_CheckStringEmpty( clgame.cdtracks[i] ) ) maxTrack++;
|
||||||
|
|
||||||
Con_Printf( "%u tracks\n", maxTrack );
|
Con_Printf( "%u tracks\n", maxTrack );
|
||||||
if( track )
|
if( track )
|
||||||
{
|
{
|
||||||
@@ -140,178 +152,33 @@ void CL_PlayCDTrack_f( void )
|
|||||||
else Con_Printf( "%s: unknown command %s\n", Cmd_Argv( 0 ), command );
|
else Con_Printf( "%s: unknown command %s\n", Cmd_Argv( 0 ), command );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CL_ScreenshotGetName
|
CL_ScreenshotGetName
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_ScreenshotGetName( int lastnum, char *filename )
|
static qboolean CL_ScreenshotGetName( const char *fmt, int lastnum, char *filename, size_t size )
|
||||||
{
|
{
|
||||||
if( lastnum < 0 || lastnum > 9999 )
|
if( lastnum < 0 || lastnum > 9999 )
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "unable to write screenshot\n" );
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
Q_sprintf( filename, "scrshots/%s_shot%0004d.png", clgame.mapname, lastnum );
|
return Q_snprintf( filename, size, fmt, clgame.mapname, lastnum ) > 0;
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==============================================================================
|
||||||
CL_SnapshotGetName
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
qboolean CL_SnapshotGetName( int lastnum, char *filename )
|
|
||||||
{
|
|
||||||
if( lastnum < 0 || lastnum > 9999 )
|
|
||||||
{
|
|
||||||
Con_Printf( S_ERROR "unable to write snapshot\n" );
|
|
||||||
FS_AllowDirectPaths( false );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_sprintf( filename, "../%s_%0004d.png", clgame.mapname, lastnum );
|
SCREEN SHOTS
|
||||||
|
|
||||||
return true;
|
==============================================================================
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
SCREEN SHOTS
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CL_ScreenShot_f
|
|
||||||
|
|
||||||
normal screenshot
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void CL_ScreenShot_f( void )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
string checkname;
|
|
||||||
|
|
||||||
if( CL_IsDevOverviewMode() == 1 )
|
|
||||||
{
|
|
||||||
// special case for write overview image and script file
|
|
||||||
Q_snprintf( cls.shotname, sizeof( cls.shotname ), "overviews/%s.bmp", clgame.mapname );
|
|
||||||
cls.scrshot_action = scrshot_mapshot; // build new frame for mapshot
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// scan for a free filename
|
|
||||||
for( i = 0; i < 9999; i++ )
|
|
||||||
{
|
|
||||||
if( !CL_ScreenshotGetName( i, checkname ))
|
|
||||||
return; // no namespace
|
|
||||||
|
|
||||||
if( !FS_FileExists( checkname, false ))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_strncpy( cls.shotname, checkname, sizeof( cls.shotname ));
|
|
||||||
cls.scrshot_action = scrshot_normal; // build new frame for screenshot
|
|
||||||
}
|
|
||||||
|
|
||||||
cls.envshot_vieworg = NULL; // no custom view
|
|
||||||
cls.envshot_viewsize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
CL_SnapShot_f
|
|
||||||
|
|
||||||
save screenshots into root dir
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void CL_SnapShot_f( void )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
string checkname;
|
|
||||||
|
|
||||||
if( CL_IsDevOverviewMode() == 1 )
|
|
||||||
{
|
|
||||||
// special case for write overview image and script file
|
|
||||||
Q_snprintf( cls.shotname, sizeof( cls.shotname ), "overviews/%s.bmp", clgame.mapname );
|
|
||||||
cls.scrshot_action = scrshot_mapshot; // build new frame for mapshot
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FS_AllowDirectPaths( true );
|
|
||||||
|
|
||||||
// scan for a free filename
|
|
||||||
for( i = 0; i < 9999; i++ )
|
|
||||||
{
|
|
||||||
if( !CL_SnapshotGetName( i, checkname ))
|
|
||||||
return; // no namespace
|
|
||||||
|
|
||||||
if( !FS_FileExists( checkname, false ))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FS_AllowDirectPaths( false );
|
|
||||||
Q_strncpy( cls.shotname, checkname, sizeof( cls.shotname ));
|
|
||||||
cls.scrshot_action = scrshot_snapshot; // build new frame for screenshot
|
|
||||||
}
|
|
||||||
|
|
||||||
cls.envshot_vieworg = NULL; // no custom view
|
|
||||||
cls.envshot_viewsize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
CL_EnvShot_f
|
|
||||||
|
|
||||||
cubemap view
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void CL_EnvShot_f( void )
|
|
||||||
{
|
|
||||||
if( Cmd_Argc() < 2 )
|
|
||||||
{
|
|
||||||
Con_Printf( S_USAGE "envshot <shotname>\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_sprintf( cls.shotname, "gfx/env/%s", Cmd_Argv( 1 ));
|
|
||||||
cls.scrshot_action = scrshot_envshot; // build new frame for envshot
|
|
||||||
cls.envshot_vieworg = NULL; // no custom view
|
|
||||||
cls.envshot_viewsize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
CL_SkyShot_f
|
|
||||||
|
|
||||||
skybox view
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void CL_SkyShot_f( void )
|
|
||||||
{
|
|
||||||
if( Cmd_Argc() < 2 )
|
|
||||||
{
|
|
||||||
Con_Printf( S_USAGE "skyshot <shotname>\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_sprintf( cls.shotname, "gfx/env/%s", Cmd_Argv( 1 ));
|
|
||||||
cls.scrshot_action = scrshot_skyshot; // build new frame for skyshot
|
|
||||||
cls.envshot_vieworg = NULL; // no custom view
|
|
||||||
cls.envshot_viewsize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
CL_LevelShot_f
|
CL_LevelShot_f
|
||||||
|
|
||||||
splash logo while map is loading
|
splash logo while map is loading
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_LevelShot_f( void )
|
void CL_LevelShot_f( void )
|
||||||
{
|
{
|
||||||
size_t ft1, ft2;
|
size_t ft1, ft2;
|
||||||
@@ -323,7 +190,8 @@ void CL_LevelShot_f( void )
|
|||||||
// check for exist
|
// check for exist
|
||||||
if( cls.demoplayback && ( cls.demonum != -1 ))
|
if( cls.demoplayback && ( cls.demonum != -1 ))
|
||||||
{
|
{
|
||||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", cls.demoname, refState.wideScreen ? "16x9" : "4x3" );
|
Q_snprintf( cls.shotname, sizeof( cls.shotname ),
|
||||||
|
"levelshots/%s_%s.bmp", cls.demoname, refState.wideScreen ? "16x9" : "4x3" );
|
||||||
Q_snprintf( filename, sizeof( filename ), "%s.dem", cls.demoname );
|
Q_snprintf( filename, sizeof( filename ), "%s.dem", cls.demoname );
|
||||||
|
|
||||||
// make sure what levelshot is newer than demo
|
// make sure what levelshot is newer than demo
|
||||||
@@ -332,7 +200,8 @@ void CL_LevelShot_f( void )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", clgame.mapname, refState.wideScreen ? "16x9" : "4x3" );
|
Q_snprintf( cls.shotname, sizeof( cls.shotname ),
|
||||||
|
"levelshots/%s_%s.bmp", clgame.mapname, refState.wideScreen ? "16x9" : "4x3" );
|
||||||
|
|
||||||
// make sure what levelshot is newer than bsp
|
// make sure what levelshot is newer than bsp
|
||||||
ft1 = FS_FileTime( cl.worldmodel->name, false );
|
ft1 = FS_FileTime( cl.worldmodel->name, false );
|
||||||
@@ -345,23 +214,100 @@ void CL_LevelShot_f( void )
|
|||||||
else cls.scrshot_action = scrshot_inactive; // disable - not needs
|
else cls.scrshot_action = scrshot_inactive; // disable - not needs
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static scrshot_t CL_GetScreenshotTypeFromString( const char *string )
|
||||||
==================
|
|
||||||
CL_SaveShot_f
|
|
||||||
|
|
||||||
mini-pic in loadgame menu
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void CL_SaveShot_f( void )
|
|
||||||
{
|
{
|
||||||
if( Cmd_Argc() < 2 )
|
if( !Q_stricmp( string, "snapshot" ))
|
||||||
|
return scrshot_snapshot;
|
||||||
|
|
||||||
|
if( !Q_stricmp( string, "screenshot" ))
|
||||||
|
return scrshot_normal;
|
||||||
|
|
||||||
|
if( !Q_stricmp( string, "saveshot" ))
|
||||||
|
return scrshot_savegame;
|
||||||
|
|
||||||
|
if( !Q_stricmp( string, "envshot" ))
|
||||||
|
return scrshot_envshot;
|
||||||
|
|
||||||
|
if( !Q_stricmp( string, "skyshot" ))
|
||||||
|
return scrshot_skyshot;
|
||||||
|
|
||||||
|
return scrshot_inactive;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_GenericShot_f( void )
|
||||||
|
{
|
||||||
|
const char *argv0 = Cmd_Argv( 0 );
|
||||||
|
scrshot_t type;
|
||||||
|
|
||||||
|
type = CL_GetScreenshotTypeFromString( argv0 );
|
||||||
|
|
||||||
|
if( type == scrshot_normal || type == scrshot_snapshot )
|
||||||
{
|
{
|
||||||
Con_Printf( S_USAGE "saveshot <savename>\n" );
|
if( CL_IsDevOverviewMode() == 1 )
|
||||||
return;
|
type = scrshot_mapshot;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( Cmd_Argc() < 2 )
|
||||||
|
{
|
||||||
|
Con_Printf( S_USAGE "%s <shotname>\n", argv0 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_sprintf( cls.shotname, "%s%s.bmp", DEFAULT_SAVE_DIRECTORY, Cmd_Argv( 1 ));
|
switch( type )
|
||||||
cls.scrshot_action = scrshot_savegame; // build new frame for saveshot
|
{
|
||||||
|
case scrshot_envshot:
|
||||||
|
case scrshot_skyshot:
|
||||||
|
Q_snprintf( cls.shotname, sizeof( cls.shotname ), "gfx/env/%s", Cmd_Argv( 1 ));
|
||||||
|
break;
|
||||||
|
case scrshot_savegame:
|
||||||
|
Q_snprintf( cls.shotname, sizeof( cls.shotname ), DEFAULT_SAVE_DIRECTORY "%s.bmp", Cmd_Argv( 1 ));
|
||||||
|
break;
|
||||||
|
case scrshot_mapshot:
|
||||||
|
Q_snprintf( cls.shotname, sizeof( cls.shotname ), "overviews/%s.bmp", clgame.mapname );
|
||||||
|
break;
|
||||||
|
case scrshot_normal:
|
||||||
|
case scrshot_snapshot:
|
||||||
|
{
|
||||||
|
const char *fmt;
|
||||||
|
string checkname;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( type == scrshot_snapshot )
|
||||||
|
{
|
||||||
|
fmt = "../%s_%04d.png";
|
||||||
|
FS_AllowDirectPaths( true );
|
||||||
|
}
|
||||||
|
else fmt = "scrshots/%s_shot%04d.png";
|
||||||
|
|
||||||
|
for( i = 0; i < 9999; i++ )
|
||||||
|
{
|
||||||
|
if( !CL_ScreenshotGetName( fmt, i, checkname, sizeof( checkname )))
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "unable to write %s\n", argv0 );
|
||||||
|
FS_AllowDirectPaths( false );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !FS_FileExists( checkname, true ))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FS_AllowDirectPaths( false );
|
||||||
|
|
||||||
|
Q_strncpy( cls.shotname, checkname, sizeof( cls.shotname ));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case scrshot_inactive:
|
||||||
|
case scrshot_plaque:
|
||||||
|
default:
|
||||||
|
return; // shouldn't happen
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.scrshot_action = type; // build new frame for saveshot
|
||||||
|
cls.envshot_vieworg = NULL;
|
||||||
|
cls.envshot_viewsize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -418,3 +364,32 @@ void SCR_Viewpos_f( void )
|
|||||||
Con_Printf( "org ( %g %g %g )\n", refState.vieworg[0], refState.vieworg[1], refState.vieworg[2] );
|
Con_Printf( "org ( %g %g %g )\n", refState.vieworg[0], refState.vieworg[1], refState.vieworg[2] );
|
||||||
Con_Printf( "ang ( %g %g %g )\n", refState.viewangles[0], refState.viewangles[1], refState.viewangles[2] );
|
Con_Printf( "ang ( %g %g %g )\n", refState.viewangles[0], refState.viewangles[1], refState.viewangles[2] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============
|
||||||
|
CL_WavePlayLen_f
|
||||||
|
|
||||||
|
=============
|
||||||
|
*/
|
||||||
|
void CL_WavePlayLen_f( void )
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
uint msecs;
|
||||||
|
|
||||||
|
if( Cmd_Argc() != 2 )
|
||||||
|
{
|
||||||
|
Con_Printf( "waveplaylen <wave file name>: returns approximate number of milliseconds a wave file will take to play.\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
name = Cmd_Argv( 1 );
|
||||||
|
msecs = Sound_GetApproxWavePlayLen( name );
|
||||||
|
|
||||||
|
if( msecs == 0 )
|
||||||
|
{
|
||||||
|
Con_Printf( "Unable to read %s, file may be missing or incorrectly formatted.\n", name );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Con_Printf( "Play time is approximately %dms\n", msecs );
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ qboolean CL_CheckFile( sizebuf_t *msg, resource_t *pResource )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( pResource->type == t_sound )
|
if( pResource->type == t_sound )
|
||||||
Q_strncpy( filepath, va( "%s%s", DEFAULT_SOUNDPATH, pResource->szFileName ), sizeof( filepath ));
|
Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", pResource->szFileName );
|
||||||
else Q_strncpy( filepath, pResource->szFileName, sizeof( filepath ));
|
else Q_strncpy( filepath, pResource->szFileName, sizeof( filepath ));
|
||||||
|
|
||||||
if( !COM_IsSafeFileToDownload( filepath ))
|
if( !COM_IsSafeFileToDownload( filepath ))
|
||||||
{
|
{
|
||||||
Con_Reportf( "refusing to download %s\n", filepath );
|
Con_Reportf( "refusing to download %s\n", filepath );
|
||||||
@@ -78,7 +78,7 @@ qboolean CL_CheckFile( sizebuf_t *msg, resource_t *pResource )
|
|||||||
}
|
}
|
||||||
|
|
||||||
MSG_BeginClientCmd( msg, clc_stringcmd );
|
MSG_BeginClientCmd( msg, clc_stringcmd );
|
||||||
MSG_WriteString( msg, va( "dlfile %s", filepath ));
|
MSG_WriteStringf( msg, "dlfile %s", filepath );
|
||||||
host.downloadcount++;
|
host.downloadcount++;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -106,7 +106,7 @@ 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 CL_RemoveFromResourceList\n" );
|
||||||
|
|
||||||
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" );
|
||||||
|
|
||||||
pResource->pPrev->pNext = pResource->pNext;
|
pResource->pPrev->pNext = pResource->pNext;
|
||||||
@@ -127,7 +127,7 @@ void CL_MoveToOnHandList( resource_t *pResource )
|
|||||||
CL_AddToResourceList( pResource, &cl.resourcesonhand );
|
CL_AddToResourceList( pResource, &cl.resourcesonhand );
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_ClearResourceList( resource_t *pList )
|
static void CL_ClearResourceList( resource_t *pList )
|
||||||
{
|
{
|
||||||
resource_t *p, *n;
|
resource_t *p, *n;
|
||||||
|
|
||||||
|
|||||||
@@ -25,69 +25,6 @@ GNU General Public License for more details.
|
|||||||
#define MSG_COUNT 32 // last 32 messages parsed
|
#define MSG_COUNT 32 // last 32 messages parsed
|
||||||
#define MSG_MASK (MSG_COUNT - 1)
|
#define MSG_MASK (MSG_COUNT - 1)
|
||||||
|
|
||||||
const char *svc_strings[svc_lastmsg+1] =
|
|
||||||
{
|
|
||||||
"svc_bad",
|
|
||||||
"svc_nop",
|
|
||||||
"svc_disconnect",
|
|
||||||
"svc_event",
|
|
||||||
"svc_changing",
|
|
||||||
"svc_setview",
|
|
||||||
"svc_sound",
|
|
||||||
"svc_time",
|
|
||||||
"svc_print",
|
|
||||||
"svc_stufftext",
|
|
||||||
"svc_setangle",
|
|
||||||
"svc_serverdata",
|
|
||||||
"svc_lightstyle",
|
|
||||||
"svc_updateuserinfo",
|
|
||||||
"svc_deltatable",
|
|
||||||
"svc_clientdata",
|
|
||||||
"svc_resource",
|
|
||||||
"svc_pings",
|
|
||||||
"svc_particle",
|
|
||||||
"svc_restoresound",
|
|
||||||
"svc_spawnstatic",
|
|
||||||
"svc_event_reliable",
|
|
||||||
"svc_spawnbaseline",
|
|
||||||
"svc_temp_entity",
|
|
||||||
"svc_setpause",
|
|
||||||
"svc_signonnum",
|
|
||||||
"svc_centerprint",
|
|
||||||
"svc_unused27",
|
|
||||||
"svc_unused28",
|
|
||||||
"svc_unused29",
|
|
||||||
"svc_intermission",
|
|
||||||
"svc_finale",
|
|
||||||
"svc_cdtrack",
|
|
||||||
"svc_restore",
|
|
||||||
"svc_cutscene",
|
|
||||||
"svc_weaponanim",
|
|
||||||
"svc_bspdecal",
|
|
||||||
"svc_roomtype",
|
|
||||||
"svc_addangle",
|
|
||||||
"svc_usermessage",
|
|
||||||
"svc_packetentities",
|
|
||||||
"svc_deltapacketentities",
|
|
||||||
"svc_choke",
|
|
||||||
"svc_resourcelist",
|
|
||||||
"svc_deltamovevars",
|
|
||||||
"svc_resourcerequest",
|
|
||||||
"svc_customization",
|
|
||||||
"svc_crosshairangle",
|
|
||||||
"svc_soundfade",
|
|
||||||
"svc_filetxferfailed",
|
|
||||||
"svc_hltv",
|
|
||||||
"svc_director",
|
|
||||||
"svc_voiceinit",
|
|
||||||
"svc_voicedata",
|
|
||||||
"svc_deltapacketbones",
|
|
||||||
"svc_unused55",
|
|
||||||
"svc_resourcelocation",
|
|
||||||
"svc_querycvarvalue",
|
|
||||||
"svc_querycvarvalue2",
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int command;
|
int command;
|
||||||
@@ -97,7 +34,7 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
oldcmd_t oldcmd[MSG_COUNT];
|
oldcmd_t oldcmd[MSG_COUNT];
|
||||||
int currentcmd;
|
int currentcmd;
|
||||||
qboolean parsing;
|
qboolean parsing;
|
||||||
} msg_debug_t;
|
} msg_debug_t;
|
||||||
@@ -108,7 +45,7 @@ const char *CL_MsgInfo( int cmd )
|
|||||||
{
|
{
|
||||||
static string sz;
|
static string sz;
|
||||||
|
|
||||||
Q_strcpy( sz, "???" );
|
Q_strncpy( sz, "???", sizeof( sz ));
|
||||||
|
|
||||||
if( cmd >= 0 && cmd <= svc_lastmsg )
|
if( cmd >= 0 && cmd <= svc_lastmsg )
|
||||||
{
|
{
|
||||||
@@ -155,7 +92,7 @@ void CL_Parse_RecordCommand( int cmd, int startoffset )
|
|||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
if( cmd == svc_nop ) return;
|
if( cmd == svc_nop ) return;
|
||||||
|
|
||||||
slot = ( cls_message_debug.currentcmd++ & MSG_MASK );
|
slot = ( cls_message_debug.currentcmd++ & MSG_MASK );
|
||||||
cls_message_debug.oldcmd[slot].command = cmd;
|
cls_message_debug.oldcmd[slot].command = cmd;
|
||||||
cls_message_debug.oldcmd[slot].starting_offset = startoffset;
|
cls_message_debug.oldcmd[slot].starting_offset = startoffset;
|
||||||
@@ -187,7 +124,7 @@ write net_message into buffer.dat for debugging
|
|||||||
static void CL_WriteErrorMessage( int current_count, sizebuf_t *msg )
|
static void CL_WriteErrorMessage( int current_count, sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
const char *buffer_file = "buffer.dat";
|
const char *buffer_file = "buffer.dat";
|
||||||
file_t *fp;
|
file_t *fp;
|
||||||
|
|
||||||
fp = FS_Open( buffer_file, "wb", false );
|
fp = FS_Open( buffer_file, "wb", false );
|
||||||
if( !fp ) return;
|
if( !fp ) return;
|
||||||
|
|||||||
@@ -107,6 +107,8 @@ struct
|
|||||||
int angle_position;
|
int angle_position;
|
||||||
} demo;
|
} demo;
|
||||||
|
|
||||||
|
static qboolean CL_NextDemo( void );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
CL_StartupDemoHeader
|
CL_StartupDemoHeader
|
||||||
@@ -156,7 +158,7 @@ CL_GetDemoRecordClock
|
|||||||
write time while demo is recording
|
write time while demo is recording
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
float CL_GetDemoRecordClock( void )
|
static float CL_GetDemoRecordClock( void )
|
||||||
{
|
{
|
||||||
return cl.mtime[0];
|
return cl.mtime[0];
|
||||||
}
|
}
|
||||||
@@ -168,7 +170,7 @@ CL_GetDemoPlaybackClock
|
|||||||
overwrite host.realtime
|
overwrite host.realtime
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
float CL_GetDemoPlaybackClock( void )
|
static float CL_GetDemoPlaybackClock( void )
|
||||||
{
|
{
|
||||||
return host.realtime + host.frametime;
|
return host.realtime + host.frametime;
|
||||||
}
|
}
|
||||||
@@ -194,7 +196,7 @@ CL_WriteDemoCmdHeader
|
|||||||
Writes the demo command header and time-delta
|
Writes the demo command header and time-delta
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
void CL_WriteDemoCmdHeader( byte cmd, file_t *file )
|
static void CL_WriteDemoCmdHeader( byte cmd, file_t *file )
|
||||||
{
|
{
|
||||||
float dt;
|
float dt;
|
||||||
|
|
||||||
@@ -267,7 +269,7 @@ Save state of cls.netchan sequences
|
|||||||
so that we can play the demo correctly.
|
so that we can play the demo correctly.
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
void CL_WriteDemoSequence( file_t *file )
|
static void CL_WriteDemoSequence( file_t *file )
|
||||||
{
|
{
|
||||||
Assert( file != NULL );
|
Assert( file != NULL );
|
||||||
|
|
||||||
@@ -348,12 +350,12 @@ CL_WriteDemoHeader
|
|||||||
Write demo header
|
Write demo header
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
void CL_WriteDemoHeader( const char *name )
|
static void CL_WriteDemoHeader( const char *name )
|
||||||
{
|
{
|
||||||
int copysize;
|
int copysize;
|
||||||
int savepos;
|
int savepos;
|
||||||
int curpos;
|
int curpos;
|
||||||
|
|
||||||
Con_Printf( "recording to %s.\n", name );
|
Con_Printf( "recording to %s.\n", name );
|
||||||
cls.demofile = FS_Open( name, "wb", false );
|
cls.demofile = FS_Open( name, "wb", false );
|
||||||
cls.demotime = 0.0;
|
cls.demotime = 0.0;
|
||||||
@@ -371,8 +373,8 @@ 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 = PROTOCOL_VERSION;
|
demo.header.net_protocol = cls.legacymode ? PROTOCOL_LEGACY_VERSION : PROTOCOL_VERSION;
|
||||||
demo.header.host_fps = bound( MIN_FPS, host_maxfps->value, 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 ));
|
||||||
Q_strncpy( demo.header.gamedir, FS_Gamedir(), sizeof( demo.header.gamedir ));
|
Q_strncpy( demo.header.gamedir, FS_Gamedir(), sizeof( demo.header.gamedir ));
|
||||||
@@ -436,7 +438,7 @@ CL_StopRecord
|
|||||||
finish recording demo
|
finish recording demo
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_StopRecord( void )
|
static void CL_StopRecord( void )
|
||||||
{
|
{
|
||||||
int i, curpos;
|
int i, curpos;
|
||||||
float stoptime;
|
float stoptime;
|
||||||
@@ -467,7 +469,7 @@ void CL_StopRecord( void )
|
|||||||
demo.header.directory_offset = curpos;
|
demo.header.directory_offset = curpos;
|
||||||
FS_Seek( cls.demofile, 0, SEEK_SET );
|
FS_Seek( cls.demofile, 0, SEEK_SET );
|
||||||
FS_Write( cls.demofile, &demo.header, sizeof( demo.header ));
|
FS_Write( cls.demofile, &demo.header, sizeof( demo.header ));
|
||||||
|
|
||||||
FS_Close( cls.demofile );
|
FS_Close( cls.demofile );
|
||||||
cls.demofile = NULL;
|
cls.demofile = NULL;
|
||||||
cls.demorecording = false;
|
cls.demorecording = false;
|
||||||
@@ -518,14 +520,26 @@ CL_ReadDemoCmdHeader
|
|||||||
read the demo command
|
read the demo command
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_ReadDemoCmdHeader( byte *cmd, float *dt )
|
static qboolean CL_ReadDemoCmdHeader( byte *cmd, float *dt )
|
||||||
{
|
{
|
||||||
// read the command
|
// read the command
|
||||||
FS_Read( cls.demofile, cmd, sizeof( byte ));
|
// HACKHACK: skip NOPs
|
||||||
Assert( *cmd >= 1 && *cmd <= dem_lastcmd );
|
do
|
||||||
|
{
|
||||||
|
FS_Read( cls.demofile, cmd, sizeof( byte ));
|
||||||
|
} while( *cmd == dem_unknown );
|
||||||
|
|
||||||
|
if( *cmd > dem_lastcmd )
|
||||||
|
{
|
||||||
|
Con_Printf( S_ERROR "Demo cmd %d > %d, file offset = %d\n", *cmd, dem_lastcmd, (int)FS_Tell( cls.demofile ));
|
||||||
|
CL_DemoCompleted();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// read the timestamp
|
// read the timestamp
|
||||||
FS_Read( cls.demofile, dt, sizeof( float ));
|
FS_Read( cls.demofile, dt, sizeof( float ));
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -536,7 +550,7 @@ read the demo usercmd for predicting
|
|||||||
and smooth movement during playback the demo
|
and smooth movement during playback the demo
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_ReadDemoUserCmd( qboolean discard )
|
static void CL_ReadDemoUserCmd( qboolean discard )
|
||||||
{
|
{
|
||||||
byte data[1024];
|
byte data[1024];
|
||||||
int cmdnumber;
|
int cmdnumber;
|
||||||
@@ -558,6 +572,9 @@ void CL_ReadDemoUserCmd( qboolean discard )
|
|||||||
memset( &nullcmd, 0, sizeof( nullcmd ));
|
memset( &nullcmd, 0, sizeof( nullcmd ));
|
||||||
MSG_Init( &buf, "UserCmd", data, sizeof( data ));
|
MSG_Init( &buf, "UserCmd", data, sizeof( data ));
|
||||||
|
|
||||||
|
// a1ba: I have no proper explanation why
|
||||||
|
cmdnumber++;
|
||||||
|
|
||||||
pcmd = &cl.commands[cmdnumber & CL_UPDATE_MASK];
|
pcmd = &cl.commands[cmdnumber & CL_UPDATE_MASK];
|
||||||
pcmd->processedfuncs = false;
|
pcmd->processedfuncs = false;
|
||||||
pcmd->senttime = 0.0f;
|
pcmd->senttime = 0.0f;
|
||||||
@@ -598,7 +615,7 @@ CL_ReadDemoSequence
|
|||||||
read netchan sequences
|
read netchan sequences
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_ReadDemoSequence( qboolean discard )
|
static void CL_ReadDemoSequence( qboolean discard )
|
||||||
{
|
{
|
||||||
int incoming_sequence;
|
int incoming_sequence;
|
||||||
int incoming_acknowledged;
|
int incoming_acknowledged;
|
||||||
@@ -632,15 +649,17 @@ void CL_ReadDemoSequence( qboolean discard )
|
|||||||
CL_DemoStartPlayback
|
CL_DemoStartPlayback
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_DemoStartPlayback( int mode )
|
static void CL_DemoStartPlayback( int mode )
|
||||||
{
|
{
|
||||||
if( cls.changedemo )
|
if( cls.changedemo )
|
||||||
{
|
{
|
||||||
|
int maxclients = cl.maxclients;
|
||||||
|
|
||||||
S_StopAllSounds( true );
|
S_StopAllSounds( true );
|
||||||
SCR_BeginLoadingPlaque( false );
|
SCR_BeginLoadingPlaque( false );
|
||||||
|
|
||||||
CL_ClearState ();
|
CL_ClearState( );
|
||||||
CL_InitEdicts (); // re-arrange edicts
|
CL_InitEdicts( maxclients ); // re-arrange edicts
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -675,7 +694,7 @@ void CL_DemoStartPlayback( int mode )
|
|||||||
CL_DemoAborted
|
CL_DemoAborted
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_DemoAborted( void )
|
static void CL_DemoAborted( void )
|
||||||
{
|
{
|
||||||
if( cls.demofile )
|
if( cls.demofile )
|
||||||
FS_Close( cls.demofile );
|
FS_Close( cls.demofile );
|
||||||
@@ -686,7 +705,7 @@ void CL_DemoAborted( void )
|
|||||||
cls.demofile = NULL;
|
cls.demofile = NULL;
|
||||||
cls.demonum = -1;
|
cls.demonum = -1;
|
||||||
|
|
||||||
Cvar_SetValue( "v_dark", 0.0f );
|
Cvar_DirectSet( &v_dark, "0" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -704,7 +723,7 @@ void CL_DemoCompleted( void )
|
|||||||
if( !CL_NextDemo() && !cls.changedemo )
|
if( !CL_NextDemo() && !cls.changedemo )
|
||||||
UI_SetActiveMenu( true );
|
UI_SetActiveMenu( true );
|
||||||
|
|
||||||
Cvar_SetValue( "v_dark", 0.0f );
|
Cvar_DirectSet( &v_dark, "0" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -715,7 +734,7 @@ returns true on success, false on failure
|
|||||||
g-cont. probably captain obvious mode is ON
|
g-cont. probably captain obvious mode is ON
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean CL_DemoMoveToNextSection( void )
|
static qboolean CL_DemoMoveToNextSection( void )
|
||||||
{
|
{
|
||||||
if( ++demo.entryIndex >= demo.directory.numentries )
|
if( ++demo.entryIndex >= demo.directory.numentries )
|
||||||
{
|
{
|
||||||
@@ -726,9 +745,9 @@ qboolean CL_DemoMoveToNextSection( void )
|
|||||||
|
|
||||||
// switch to next section, we got a dem_stop
|
// switch to next section, we got a dem_stop
|
||||||
demo.entry = &demo.directory.entries[demo.entryIndex];
|
demo.entry = &demo.directory.entries[demo.entryIndex];
|
||||||
|
|
||||||
// ready to continue reading, reset clock.
|
// ready to continue reading, reset clock.
|
||||||
FS_Seek( cls.demofile, demo.entry->offset, SEEK_SET );
|
FS_Seek( cls.demofile, demo.entry->offset, SEEK_SET );
|
||||||
|
|
||||||
// time is now relative to this chunk's clock.
|
// time is now relative to this chunk's clock.
|
||||||
demo.starttime = CL_GetDemoPlaybackClock();
|
demo.starttime = CL_GetDemoPlaybackClock();
|
||||||
@@ -737,9 +756,9 @@ qboolean CL_DemoMoveToNextSection( void )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean CL_ReadRawNetworkData( byte *buffer, size_t *length )
|
static qboolean CL_ReadRawNetworkData( byte *buffer, size_t *length )
|
||||||
{
|
{
|
||||||
int msglen = 0;
|
int msglen = 0;
|
||||||
|
|
||||||
Assert( buffer != NULL );
|
Assert( buffer != NULL );
|
||||||
Assert( length != NULL );
|
Assert( length != NULL );
|
||||||
@@ -788,15 +807,15 @@ CL_DemoReadMessageQuake
|
|||||||
reads demo data and write it to client
|
reads demo data and write it to client
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean CL_DemoReadMessageQuake( byte *buffer, size_t *length )
|
static qboolean CL_DemoReadMessageQuake( byte *buffer, size_t *length )
|
||||||
{
|
{
|
||||||
vec3_t viewangles;
|
vec3_t viewangles;
|
||||||
int msglen = 0;
|
int msglen = 0;
|
||||||
demoangle_t *a;
|
demoangle_t *a;
|
||||||
|
|
||||||
*length = 0; // assume we fail
|
*length = 0; // assume we fail
|
||||||
|
|
||||||
// decide if it is time to grab the next message
|
// decide if it is time to grab the next message
|
||||||
if( cls.signon == SIGNONS ) // allways grab until fully connected
|
if( cls.signon == SIGNONS ) // allways grab until fully connected
|
||||||
{
|
{
|
||||||
if( cls.timedemo )
|
if( cls.timedemo )
|
||||||
@@ -888,7 +907,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
|||||||
qboolean swallowmessages = true;
|
qboolean swallowmessages = true;
|
||||||
static int tdlastdemoframe = 0;
|
static int tdlastdemoframe = 0;
|
||||||
byte *userbuf = NULL;
|
byte *userbuf = NULL;
|
||||||
size_t size;
|
size_t size = 0;
|
||||||
byte cmd;
|
byte cmd;
|
||||||
|
|
||||||
if( !cls.demofile )
|
if( !cls.demofile )
|
||||||
@@ -913,7 +932,8 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
|||||||
if( !cls.demofile ) break;
|
if( !cls.demofile ) break;
|
||||||
curpos = FS_Tell( cls.demofile );
|
curpos = FS_Tell( cls.demofile );
|
||||||
|
|
||||||
CL_ReadDemoCmdHeader( &cmd, &demo.timestamp );
|
if( !CL_ReadDemoCmdHeader( &cmd, &demo.timestamp ))
|
||||||
|
return false;
|
||||||
|
|
||||||
fElapsedTime = CL_GetDemoPlaybackClock() - demo.starttime;
|
fElapsedTime = CL_GetDemoPlaybackClock() - demo.starttime;
|
||||||
if( !cls.timedemo ) bSkipMessage = ((demo.timestamp - cl_serverframetime()) >= fElapsedTime) ? true : false;
|
if( !cls.timedemo ) bSkipMessage = ((demo.timestamp - cl_serverframetime()) >= fElapsedTime) ? true : false;
|
||||||
@@ -971,7 +991,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
|||||||
}
|
}
|
||||||
} while( swallowmessages );
|
} while( swallowmessages );
|
||||||
|
|
||||||
// If we are playing back a timedemo, and we've already passed on a
|
// If we are playing back a timedemo, and we've already passed on a
|
||||||
// frame update for this host_frame tag, then we'll just skip this message.
|
// frame update for this host_frame tag, then we'll just skip this message.
|
||||||
if( cls.timedemo && ( tdlastdemoframe == host.framecount ))
|
if( cls.timedemo && ( tdlastdemoframe == host.framecount ))
|
||||||
{
|
{
|
||||||
@@ -993,7 +1013,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
|||||||
{
|
{
|
||||||
// cheat by moving the relative start time forward.
|
// cheat by moving the relative start time forward.
|
||||||
demo.starttime = CL_GetDemoPlaybackClock();
|
demo.starttime = CL_GetDemoPlaybackClock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
demo.framecount++;
|
demo.framecount++;
|
||||||
@@ -1002,7 +1022,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
|||||||
return CL_ReadRawNetworkData( buffer, length );
|
return CL_ReadRawNetworkData( buffer, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_DemoFindInterpolatedViewAngles( float t, float *frac, demoangle_t **prev, demoangle_t **next )
|
static void CL_DemoFindInterpolatedViewAngles( float t, float *frac, demoangle_t **prev, demoangle_t **next )
|
||||||
{
|
{
|
||||||
int i, i0, i1, imod;
|
int i, i0, i1, imod;
|
||||||
float at;
|
float at;
|
||||||
@@ -1097,19 +1117,22 @@ CL_FinishTimeDemo
|
|||||||
show stats
|
show stats
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void CL_FinishTimeDemo( void )
|
static void CL_FinishTimeDemo( void )
|
||||||
{
|
{
|
||||||
int frames;
|
int frames;
|
||||||
double time;
|
double time;
|
||||||
|
|
||||||
cls.timedemo = false;
|
cls.timedemo = false;
|
||||||
|
|
||||||
// the first frame didn't count
|
// the first frame didn't count
|
||||||
frames = (host.framecount - cls.td_startframe) - 1;
|
frames = (host.framecount - cls.td_startframe) - 1;
|
||||||
time = host.realtime - cls.td_starttime;
|
time = host.realtime - cls.td_starttime;
|
||||||
if( !time ) time = 1.0;
|
if( !time ) time = 1.0;
|
||||||
|
|
||||||
Con_Printf( "%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 );
|
||||||
|
|
||||||
|
if( Sys_CheckParm( "-timedemo" ))
|
||||||
|
CL_Quit_f();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1151,7 +1174,7 @@ void CL_StopPlayback( void )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// let game known about demo state
|
// let game known about demo state
|
||||||
Cvar_FullSet( "cl_background", "0", FCVAR_READ_ONLY );
|
Cvar_FullSet( "cl_background", "0", FCVAR_READ_ONLY );
|
||||||
cls.state = ca_disconnected;
|
cls.state = ca_disconnected;
|
||||||
memset( &cls.serveradr, 0, sizeof( cls.serveradr ) );
|
memset( &cls.serveradr, 0, sizeof( cls.serveradr ) );
|
||||||
@@ -1166,12 +1189,12 @@ void CL_StopPlayback( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CL_GetDemoComment
|
CL_GetDemoComment
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
int CL_GetDemoComment( const char *demoname, char *comment )
|
int GAME_EXPORT CL_GetDemoComment( const char *demoname, char *comment )
|
||||||
{
|
{
|
||||||
file_t *demfile;
|
file_t *demfile;
|
||||||
demoheader_t demohdr;
|
demoheader_t demohdr;
|
||||||
@@ -1179,13 +1202,13 @@ int CL_GetDemoComment( const char *demoname, char *comment )
|
|||||||
demoentry_t entry;
|
demoentry_t entry;
|
||||||
float playtime = 0.0f;
|
float playtime = 0.0f;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !comment ) return false;
|
if( !comment ) return false;
|
||||||
|
|
||||||
demfile = FS_Open( demoname, "rb", false );
|
demfile = FS_Open( demoname, "rb", false );
|
||||||
if( !demfile )
|
if( !demfile )
|
||||||
{
|
{
|
||||||
Q_strncpy( comment, "", MAX_STRING );
|
comment[0] = '\0';
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1199,7 +1222,9 @@ int CL_GetDemoComment( const char *demoname, char *comment )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( demohdr.net_protocol != PROTOCOL_VERSION || demohdr.dem_protocol != DEMO_PROTOCOL )
|
if(( demohdr.net_protocol != PROTOCOL_VERSION &&
|
||||||
|
demohdr.net_protocol != PROTOCOL_LEGACY_VERSION ) ||
|
||||||
|
demohdr.dem_protocol != DEMO_PROTOCOL )
|
||||||
{
|
{
|
||||||
FS_Close( demfile );
|
FS_Close( demfile );
|
||||||
Q_strncpy( comment, "<invalid protocol>", MAX_STRING );
|
Q_strncpy( comment, "<invalid protocol>", MAX_STRING );
|
||||||
@@ -1226,11 +1251,11 @@ int CL_GetDemoComment( const char *demoname, char *comment )
|
|||||||
// split comment to sections
|
// split comment to sections
|
||||||
Q_strncpy( comment, demohdr.mapname, CS_SIZE );
|
Q_strncpy( comment, demohdr.mapname, CS_SIZE );
|
||||||
Q_strncpy( comment + CS_SIZE, demohdr.comment, CS_SIZE );
|
Q_strncpy( comment + CS_SIZE, demohdr.comment, CS_SIZE );
|
||||||
Q_strncpy( comment + CS_SIZE * 2, va( "%g sec", playtime ), CS_TIME );
|
Q_snprintf( comment + CS_SIZE * 2, CS_TIME, "%g sec", playtime );
|
||||||
|
|
||||||
// all done
|
// all done
|
||||||
FS_Close( demfile );
|
FS_Close( demfile );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1241,7 +1266,7 @@ CL_NextDemo
|
|||||||
Called when a demo finishes
|
Called when a demo finishes
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_NextDemo( void )
|
static qboolean CL_NextDemo( void )
|
||||||
{
|
{
|
||||||
char str[MAX_QPATH];
|
char str[MAX_QPATH];
|
||||||
|
|
||||||
@@ -1267,12 +1292,12 @@ qboolean CL_NextDemo( void )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CL_CheckStartupDemos
|
CL_CheckStartupDemos
|
||||||
|
|
||||||
queue demos loop after movie playing
|
queue demos loop after movie playing
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_CheckStartupDemos( void )
|
void CL_CheckStartupDemos( void )
|
||||||
{
|
{
|
||||||
@@ -1291,27 +1316,27 @@ void CL_CheckStartupDemos( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// run demos loop in background mode
|
// run demos loop in background mode
|
||||||
Cvar_SetValue( "v_dark", 1.0f );
|
Cvar_DirectSet( &v_dark, "1" );
|
||||||
cls.demos_pending = false;
|
cls.demos_pending = false;
|
||||||
cls.demonum = 0;
|
cls.demonum = 0;
|
||||||
CL_NextDemo ();
|
CL_NextDemo ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CL_DemoGetName
|
CL_DemoGetName
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
static void CL_DemoGetName( int lastnum, char *filename )
|
static void CL_DemoGetName( int lastnum, char *filename, size_t size )
|
||||||
{
|
{
|
||||||
if( lastnum < 0 || lastnum > 9999 )
|
if( lastnum < 0 || lastnum > 9999 )
|
||||||
{
|
{
|
||||||
// bound
|
// bound
|
||||||
Q_strcpy( filename, "demo9999" );
|
Q_strncpy( filename, "demo9999", size );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_sprintf( filename, "demo%0004d", lastnum );
|
Q_snprintf( filename, size, "demo%04d", lastnum );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1365,8 +1390,10 @@ void CL_Record_f( void )
|
|||||||
// scan for a free filename
|
// scan for a free filename
|
||||||
for( n = 0; n < 10000; n++ )
|
for( n = 0; n < 10000; n++ )
|
||||||
{
|
{
|
||||||
CL_DemoGetName( n, demoname );
|
CL_DemoGetName( n, demoname, sizeof( demoname ));
|
||||||
if( !FS_FileExists( va( "%s.dem", demoname ), true ))
|
Q_snprintf( demopath, sizeof( demopath ), "%s.dem", demoname );
|
||||||
|
|
||||||
|
if( !FS_FileExists( demopath, true ))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1379,15 +1406,15 @@ void CL_Record_f( void )
|
|||||||
else Q_strncpy( demoname, name, sizeof( demoname ));
|
else Q_strncpy( demoname, name, sizeof( demoname ));
|
||||||
|
|
||||||
// open the demo file
|
// open the demo file
|
||||||
Q_sprintf( demopath, "%s.dem", demoname );
|
Q_snprintf( demopath, sizeof( demopath ), "%s.dem", demoname );
|
||||||
|
|
||||||
// make sure what old demo is removed
|
// make sure that old demo is removed
|
||||||
if( FS_FileExists( demopath, false ))
|
if( FS_FileExists( demopath, false ))
|
||||||
FS_Delete( demopath );
|
FS_Delete( demopath );
|
||||||
|
|
||||||
Q_strncpy( cls.demoname, demoname, sizeof( cls.demoname ));
|
Q_strncpy( cls.demoname, demoname, sizeof( cls.demoname ));
|
||||||
Q_strncpy( gameui.globals->demoname, demoname, sizeof( gameui.globals->demoname ));
|
Q_strncpy( gameui.globals->demoname, demoname, sizeof( gameui.globals->demoname ));
|
||||||
|
|
||||||
CL_WriteDemoHeader( demopath );
|
CL_WriteDemoHeader( demopath );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1406,7 +1433,7 @@ void CL_PlayDemo_f( void )
|
|||||||
|
|
||||||
if( Cmd_Argc() < 2 )
|
if( Cmd_Argc() < 2 )
|
||||||
{
|
{
|
||||||
Con_Printf( S_USAGE "playdemo <demoname>\n" );
|
Con_Printf( S_USAGE "%s <demoname>\n", Cmd_Argv( 0 ));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1453,7 +1480,7 @@ void CL_PlayDemo_f( void )
|
|||||||
{
|
{
|
||||||
int c, neg = false;
|
int c, neg = false;
|
||||||
|
|
||||||
demo.header.host_fps = host_maxfps->value;
|
demo.header.host_fps = host_maxfps.value;
|
||||||
|
|
||||||
while(( c = FS_Getc( cls.demofile )) != '\n' )
|
while(( c = FS_Getc( cls.demofile )) != '\n' )
|
||||||
{
|
{
|
||||||
@@ -1476,13 +1503,17 @@ void CL_PlayDemo_f( void )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( demo.header.net_protocol != PROTOCOL_VERSION || demo.header.dem_protocol != DEMO_PROTOCOL )
|
if( demo.header.dem_protocol != DEMO_PROTOCOL )
|
||||||
{
|
{
|
||||||
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 );
|
||||||
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 )
|
if( demo.header.net_protocol != PROTOCOL_VERSION &&
|
||||||
Con_Printf( S_ERROR "playdemo: net protocol outdated (%i should be %i)\n", 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();
|
CL_DemoAborted();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1515,6 +1546,7 @@ void CL_PlayDemo_f( void )
|
|||||||
|
|
||||||
// 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
|
||||||
}
|
}
|
||||||
@@ -1528,12 +1560,6 @@ timedemo <demoname>
|
|||||||
*/
|
*/
|
||||||
void CL_TimeDemo_f( void )
|
void CL_TimeDemo_f( void )
|
||||||
{
|
{
|
||||||
if( Cmd_Argc() != 2 )
|
|
||||||
{
|
|
||||||
Con_Printf( S_USAGE "timedemo <demoname>\n" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CL_PlayDemo_f ();
|
CL_PlayDemo_f ();
|
||||||
|
|
||||||
// cls.td_starttime will be grabbed at the second frame of the demo, so
|
// cls.td_starttime will be grabbed at the second frame of the demo, so
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ GNU General Public License for more details.
|
|||||||
#include "studio.h"
|
#include "studio.h"
|
||||||
#include "world.h" // BOX_ON_PLANE_SIDE
|
#include "world.h" // BOX_ON_PLANE_SIDE
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "mathlib.h"
|
#include "xash3d_mathlib.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============================================================================
|
===============================================================================
|
||||||
@@ -33,46 +33,6 @@ 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;
|
||||||
|
|
||||||
/*
|
|
||||||
================
|
|
||||||
R_RemoveEfrags
|
|
||||||
|
|
||||||
Call when removing an object from the world or moving it to another position
|
|
||||||
================
|
|
||||||
*/
|
|
||||||
void R_RemoveEfrags( cl_entity_t *ent )
|
|
||||||
{
|
|
||||||
efrag_t *ef, *old, *walk, **prev;
|
|
||||||
|
|
||||||
ef = ent->efrag;
|
|
||||||
|
|
||||||
while( ef )
|
|
||||||
{
|
|
||||||
prev = &ef->leaf->efrags;
|
|
||||||
while( 1 )
|
|
||||||
{
|
|
||||||
walk = *prev;
|
|
||||||
if( !walk ) break;
|
|
||||||
|
|
||||||
if( walk == ef )
|
|
||||||
{
|
|
||||||
// remove this fragment
|
|
||||||
*prev = ef->leafnext;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else prev = &walk->leafnext;
|
|
||||||
}
|
|
||||||
|
|
||||||
old = ef;
|
|
||||||
ef = ef->entnext;
|
|
||||||
|
|
||||||
// put it on the free list
|
|
||||||
old->entnext = clgame.free_efrags;
|
|
||||||
clgame.free_efrags = old;
|
|
||||||
}
|
|
||||||
ent->efrag = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===================
|
===================
|
||||||
R_SplitEntityOnNode
|
R_SplitEntityOnNode
|
||||||
@@ -83,10 +43,10 @@ static void R_SplitEntityOnNode( mnode_t *node )
|
|||||||
efrag_t *ef;
|
efrag_t *ef;
|
||||||
mleaf_t *leaf;
|
mleaf_t *leaf;
|
||||||
int sides;
|
int sides;
|
||||||
|
|
||||||
if( node->contents == CONTENTS_SOLID )
|
if( node->contents == CONTENTS_SOLID )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// add an efrag if the node is a leaf
|
// add an efrag if the node is a leaf
|
||||||
if( node->contents < 0 )
|
if( node->contents < 0 )
|
||||||
{
|
{
|
||||||
@@ -105,29 +65,29 @@ static void R_SplitEntityOnNode( mnode_t *node )
|
|||||||
|
|
||||||
clgame.free_efrags = ef->entnext;
|
clgame.free_efrags = ef->entnext;
|
||||||
ef->entity = r_addent;
|
ef->entity = r_addent;
|
||||||
|
|
||||||
// add the entity link
|
// add the entity link
|
||||||
*lastlink = ef;
|
*lastlink = ef;
|
||||||
lastlink = &ef->entnext;
|
lastlink = &ef->entnext;
|
||||||
ef->entnext = NULL;
|
ef->entnext = NULL;
|
||||||
|
|
||||||
// set the leaf links
|
// set the leaf links
|
||||||
ef->leaf = leaf;
|
ef->leaf = leaf;
|
||||||
ef->leafnext = leaf->efrags;
|
ef->leafnext = leaf->efrags;
|
||||||
leaf->efrags = ef;
|
leaf->efrags = ef;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NODE_MIXED
|
// NODE_MIXED
|
||||||
sides = BOX_ON_PLANE_SIDE( r_emins, r_emaxs, node->plane );
|
sides = BOX_ON_PLANE_SIDE( r_emins, r_emaxs, node->plane );
|
||||||
|
|
||||||
if( sides == 3 )
|
if( sides == 3 )
|
||||||
{
|
{
|
||||||
// split on this plane
|
// split on this plane
|
||||||
// if this is the first splitter of this bmodel, remember it
|
// if this is the first splitter of this bmodel, remember it
|
||||||
if( !r_pefragtopnode ) r_pefragtopnode = node;
|
if( !r_pefragtopnode ) r_pefragtopnode = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
// recurse down the contacted sides
|
// recurse down the contacted sides
|
||||||
if( sides & 1 ) R_SplitEntityOnNode( node->children[0] );
|
if( sides & 1 ) R_SplitEntityOnNode( node->children[0] );
|
||||||
if( sides & 2 ) R_SplitEntityOnNode( node->children[1] );
|
if( sides & 2 ) R_SplitEntityOnNode( node->children[1] );
|
||||||
@@ -143,7 +103,7 @@ void R_AddEfrags( cl_entity_t *ent )
|
|||||||
matrix3x4 transform;
|
matrix3x4 transform;
|
||||||
vec3_t outmins, outmaxs;
|
vec3_t outmins, outmaxs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( !ent->model )
|
if( !ent->model )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -188,8 +148,6 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
|||||||
case mod_brush:
|
case mod_brush:
|
||||||
case mod_studio:
|
case mod_studio:
|
||||||
case mod_sprite:
|
case mod_sprite:
|
||||||
pent = pefrag->entity;
|
|
||||||
|
|
||||||
if( pent->visframe != framecount )
|
if( pent->visframe != framecount )
|
||||||
{
|
{
|
||||||
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
||||||
@@ -202,7 +160,7 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
|||||||
|
|
||||||
ppefrag = &pefrag->leafnext;
|
ppefrag = &pefrag->leafnext;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include "r_efx.h"
|
#include "r_efx.h"
|
||||||
#include "cl_tent.h"
|
#include "cl_tent.h"
|
||||||
#include "pm_local.h"
|
#include "pm_local.h"
|
||||||
#define PART_SIZE Q_max( 0.5f, cl_draw_particles->value )
|
#define PART_SIZE Q_max( 0.5f, cl_draw_particles.value )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================
|
==============================================================
|
||||||
@@ -21,9 +21,9 @@ static int ramp2[8] = { 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66 };
|
|||||||
static int ramp3[6] = { 0x6d, 0x6b, 6, 5, 4, 3 };
|
static int ramp3[6] = { 0x6d, 0x6b, 6, 5, 4, 3 };
|
||||||
static int gSparkRamp[9] = { 0xfe, 0xfd, 0xfc, 0x6f, 0x6e, 0x6d, 0x6c, 0x67, 0x60 };
|
static int gSparkRamp[9] = { 0xfe, 0xfd, 0xfc, 0x6f, 0x6e, 0x6d, 0x6c, 0x67, 0x60 };
|
||||||
|
|
||||||
convar_t *tracerspeed;
|
static CVAR_DEFINE_AUTO( tracerspeed, "6000", 0, "tracer speed" );
|
||||||
convar_t *tracerlength;
|
static CVAR_DEFINE_AUTO( tracerlength, "0.8", 0, "tracer length factor" );
|
||||||
convar_t *traceroffset;
|
static CVAR_DEFINE_AUTO( traceroffset, "30", 0, "tracer starting offset" );
|
||||||
|
|
||||||
particle_t *cl_active_particles;
|
particle_t *cl_active_particles;
|
||||||
particle_t *cl_active_tracers;
|
particle_t *cl_active_tracers;
|
||||||
@@ -39,14 +39,14 @@ R_LookupColor
|
|||||||
find nearest color in particle palette
|
find nearest color in particle palette
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
short R_LookupColor( byte r, byte g, byte b )
|
short GAME_EXPORT R_LookupColor( byte r, byte g, byte b )
|
||||||
{
|
{
|
||||||
int i, best;
|
int i, best;
|
||||||
float diff, bestdiff;
|
float diff, bestdiff;
|
||||||
float rf, gf, bf;
|
float rf, gf, bf;
|
||||||
|
|
||||||
bestdiff = 999999;
|
bestdiff = 999999;
|
||||||
best = 65535;
|
best = -1;
|
||||||
|
|
||||||
for( i = 0; i < 256; i++ )
|
for( i = 0; i < 256; i++ )
|
||||||
{
|
{
|
||||||
@@ -74,7 +74,7 @@ R_GetPackedColor
|
|||||||
in hardware mode does nothing
|
in hardware mode does nothing
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void R_GetPackedColor( short *packed, short color )
|
void GAME_EXPORT R_GetPackedColor( short *packed, short color )
|
||||||
{
|
{
|
||||||
if( packed ) *packed = 0;
|
if( packed ) *packed = 0;
|
||||||
}
|
}
|
||||||
@@ -100,9 +100,9 @@ void CL_InitParticles( void )
|
|||||||
cl_avelocities[i][2] = COM_RandomFloat( 0.0f, 2.55f );
|
cl_avelocities[i][2] = COM_RandomFloat( 0.0f, 2.55f );
|
||||||
}
|
}
|
||||||
|
|
||||||
tracerspeed = Cvar_Get( "tracerspeed", "6000", 0, "tracer speed" );
|
Cvar_RegisterVariable( &tracerspeed );
|
||||||
tracerlength = Cvar_Get( "tracerlength", "0.8", 0, "tracer length factor" );
|
Cvar_RegisterVariable( &tracerlength );
|
||||||
traceroffset = Cvar_Get( "traceroffset", "30", 0, "tracer starting offset" );
|
Cvar_RegisterVariable( &traceroffset );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -140,26 +140,6 @@ void CL_FreeParticles( void )
|
|||||||
cl_particles = NULL;
|
cl_particles = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
================
|
|
||||||
CL_FreeParticle
|
|
||||||
|
|
||||||
move particle to freelist
|
|
||||||
================
|
|
||||||
*/
|
|
||||||
void CL_FreeParticle( particle_t *p )
|
|
||||||
{
|
|
||||||
if( p->deathfunc )
|
|
||||||
{
|
|
||||||
// call right the deathfunc before die
|
|
||||||
p->deathfunc( p );
|
|
||||||
p->deathfunc = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->next = cl_free_particles;
|
|
||||||
cl_free_particles = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
CL_AllocParticleFast
|
CL_AllocParticleFast
|
||||||
@@ -187,15 +167,15 @@ R_AllocParticle
|
|||||||
can return NULL if particles is out
|
can return NULL if particles is out
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
particle_t *R_AllocParticle( void (*callback)( particle_t*, float ))
|
particle_t * GAME_EXPORT R_AllocParticle( void (*callback)( particle_t*, float ))
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
|
|
||||||
if( !cl_draw_particles->value )
|
if( !cl_draw_particles.value )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// never alloc particles when we not in game
|
// never alloc particles when we not in game
|
||||||
// if( tr.frametime == 0.0 ) return NULL;
|
if( cl_clientframetime() == 0.0 ) return NULL;
|
||||||
|
|
||||||
if( !cl_free_particles )
|
if( !cl_free_particles )
|
||||||
{
|
{
|
||||||
@@ -238,15 +218,15 @@ R_AllocTracer
|
|||||||
can return NULL if particles is out
|
can return NULL if particles is out
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
particle_t *R_AllocTracer( const vec3_t org, const vec3_t vel, float life )
|
static particle_t *R_AllocTracer( const vec3_t org, const vec3_t vel, float life )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
|
|
||||||
if( !cl_draw_tracers->value )
|
if( !cl_draw_tracers.value )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// never alloc particles when we not in game
|
// never alloc particles when we not in game
|
||||||
//if( tr.frametime == 0.0 ) return NULL;
|
if( cl_clientframetime() == 0.0 ) return NULL;
|
||||||
|
|
||||||
if( !cl_free_particles )
|
if( !cl_free_particles )
|
||||||
{
|
{
|
||||||
@@ -269,7 +249,7 @@ particle_t *R_AllocTracer( const vec3_t org, const vec3_t vel, float life )
|
|||||||
VectorCopy( org, p->org );
|
VectorCopy( org, p->org );
|
||||||
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 = 4; // select custom color
|
||||||
p->packedColor = 255; // alpha
|
p->packedColor = 255; // alpha
|
||||||
|
|
||||||
@@ -320,7 +300,7 @@ R_BeamAlloc
|
|||||||
|
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamAlloc( void )
|
static BEAM *R_BeamAlloc( void )
|
||||||
{
|
{
|
||||||
BEAM *pBeam;
|
BEAM *pBeam;
|
||||||
|
|
||||||
@@ -343,7 +323,7 @@ R_BeamFree
|
|||||||
|
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void R_BeamFree( BEAM *pBeam )
|
static void R_BeamFree( BEAM *pBeam )
|
||||||
{
|
{
|
||||||
// free particles that have died off.
|
// free particles that have died off.
|
||||||
R_FreeDeadParticles( &pBeam->particles );
|
R_FreeDeadParticles( &pBeam->particles );
|
||||||
@@ -513,19 +493,19 @@ void CL_ReadLineFile_f( void )
|
|||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p1[0] = Q_atof( token );
|
p1[0] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p1[1] = Q_atof( token );
|
p1[1] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p1[2] = Q_atof( token );
|
p1[2] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
|
|
||||||
if( token[0] != '-' )
|
if( token[0] != '-' )
|
||||||
@@ -534,15 +514,15 @@ void CL_ReadLineFile_f( void )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p2[0] = Q_atof( token );
|
p2[0] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p2[1] = Q_atof( token );
|
p2[1] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
p2[2] = Q_atof( token );
|
p2[2] = Q_atof( token );
|
||||||
|
|
||||||
@@ -625,7 +605,7 @@ CL_BeamAttemptToDie
|
|||||||
Check for expired beams
|
Check for expired beams
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
qboolean CL_BeamAttemptToDie( BEAM *pBeam )
|
static qboolean CL_BeamAttemptToDie( BEAM *pBeam )
|
||||||
{
|
{
|
||||||
Assert( pBeam != NULL );
|
Assert( pBeam != NULL );
|
||||||
|
|
||||||
@@ -654,7 +634,7 @@ Remove beam attached to specified entity
|
|||||||
and all particle trails (if this is a beamfollow)
|
and all particle trails (if this is a beamfollow)
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void R_BeamKill( int deadEntity )
|
void GAME_EXPORT R_BeamKill( int deadEntity )
|
||||||
{
|
{
|
||||||
cl_entity_t *pDeadEntity;
|
cl_entity_t *pDeadEntity;
|
||||||
|
|
||||||
@@ -683,42 +663,46 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
|
|||||||
switch( beamType )
|
switch( beamType )
|
||||||
{
|
{
|
||||||
case TE_BEAMPOINTS:
|
case TE_BEAMPOINTS:
|
||||||
start[0] = MSG_ReadCoord( msg );
|
|
||||||
start[1] = MSG_ReadCoord( msg );
|
|
||||||
start[2] = MSG_ReadCoord( msg );
|
|
||||||
end[0] = MSG_ReadCoord( msg );
|
|
||||||
end[1] = MSG_ReadCoord( msg );
|
|
||||||
end[2] = MSG_ReadCoord( msg );
|
|
||||||
modelIndex = MSG_ReadShort( msg );
|
|
||||||
startFrame = MSG_ReadByte( msg );
|
|
||||||
frameRate = (float)MSG_ReadByte( msg );
|
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
width = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.01f);
|
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
speed = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
R_BeamPoints( start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
|
||||||
break;
|
|
||||||
case TE_BEAMENTPOINT:
|
case TE_BEAMENTPOINT:
|
||||||
startEnt = MSG_ReadShort( msg );
|
case TE_BEAMENTS:
|
||||||
end[0] = MSG_ReadCoord( msg );
|
if( beamType == TE_BEAMENTS )
|
||||||
end[1] = MSG_ReadCoord( msg );
|
{
|
||||||
end[2] = MSG_ReadCoord( msg );
|
startEnt = MSG_ReadShort( msg );
|
||||||
|
endEnt = MSG_ReadShort( msg );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( beamType == TE_BEAMENTPOINT )
|
||||||
|
{
|
||||||
|
startEnt = MSG_ReadShort( msg );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
start[0] = MSG_ReadCoord( msg );
|
||||||
|
start[1] = MSG_ReadCoord( msg );
|
||||||
|
start[2] = MSG_ReadCoord( msg );
|
||||||
|
}
|
||||||
|
end[0] = MSG_ReadCoord( msg );
|
||||||
|
end[1] = MSG_ReadCoord( msg );
|
||||||
|
end[2] = MSG_ReadCoord( msg );
|
||||||
|
}
|
||||||
modelIndex = MSG_ReadShort( msg );
|
modelIndex = MSG_ReadShort( msg );
|
||||||
startFrame = MSG_ReadByte( msg );
|
startFrame = MSG_ReadByte( msg );
|
||||||
frameRate = (float)MSG_ReadByte( msg );
|
frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
life = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
width = (float)(MSG_ReadByte( msg ) * 0.1f);
|
width = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.01f);
|
noise = (float)MSG_ReadByte( msg ) * 0.01f;
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
speed = (float)(MSG_ReadByte( msg ) * 0.1f);
|
speed = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
R_BeamEntPoint( startEnt, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
if( beamType == TE_BEAMENTS )
|
||||||
|
R_BeamEnts( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
||||||
|
else if( beamType == TE_BEAMENTPOINT )
|
||||||
|
R_BeamEntPoint( startEnt, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
||||||
|
else
|
||||||
|
R_BeamPoints( start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
||||||
break;
|
break;
|
||||||
case TE_LIGHTNING:
|
case TE_LIGHTNING:
|
||||||
start[0] = MSG_ReadCoord( msg );
|
start[0] = MSG_ReadCoord( msg );
|
||||||
@@ -727,27 +711,11 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
|
|||||||
end[0] = MSG_ReadCoord( msg );
|
end[0] = MSG_ReadCoord( msg );
|
||||||
end[1] = MSG_ReadCoord( msg );
|
end[1] = MSG_ReadCoord( msg );
|
||||||
end[2] = MSG_ReadCoord( msg );
|
end[2] = MSG_ReadCoord( msg );
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
life = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
width = (float)(MSG_ReadByte( msg ) * 0.1f);
|
width = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.01f);
|
noise = (float)MSG_ReadByte( msg ) * 0.01f;
|
||||||
modelIndex = MSG_ReadShort( msg );
|
modelIndex = MSG_ReadShort( msg );
|
||||||
R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6F, 3.5f );
|
R_BeamLightning( start, end, modelIndex, life, width, noise, 0.6f, 3.5f );
|
||||||
break;
|
|
||||||
case TE_BEAMENTS:
|
|
||||||
startEnt = MSG_ReadShort( msg );
|
|
||||||
endEnt = MSG_ReadShort( msg );
|
|
||||||
modelIndex = MSG_ReadShort( msg );
|
|
||||||
startFrame = MSG_ReadByte( msg );
|
|
||||||
frameRate = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
width = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.01f);
|
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
|
||||||
speed = (float)(MSG_ReadByte( msg ) * 0.1f);
|
|
||||||
R_BeamEnts( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
|
||||||
break;
|
break;
|
||||||
case TE_BEAM:
|
case TE_BEAM:
|
||||||
break;
|
break;
|
||||||
@@ -773,21 +741,21 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
|
|||||||
end[2] = MSG_ReadCoord( msg );
|
end[2] = MSG_ReadCoord( msg );
|
||||||
modelIndex = MSG_ReadShort( msg );
|
modelIndex = MSG_ReadShort( msg );
|
||||||
startFrame = MSG_ReadByte( msg );
|
startFrame = MSG_ReadByte( msg );
|
||||||
frameRate = (float)(MSG_ReadByte( msg ));
|
frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
life = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
width = (float)(MSG_ReadByte( msg ));
|
width = (float)MSG_ReadByte( msg );
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.1f);
|
noise = (float)MSG_ReadByte( msg ) * 0.01f;
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
speed = (float)(MSG_ReadByte( msg ) / 0.1f);
|
speed = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
R_BeamCirclePoints( beamType, start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
R_BeamCirclePoints( beamType, start, end, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
||||||
break;
|
break;
|
||||||
case TE_BEAMFOLLOW:
|
case TE_BEAMFOLLOW:
|
||||||
startEnt = MSG_ReadShort( msg );
|
startEnt = MSG_ReadShort( msg );
|
||||||
modelIndex = MSG_ReadShort( msg );
|
modelIndex = MSG_ReadShort( msg );
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
life = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
width = (float)MSG_ReadByte( msg );
|
width = (float)MSG_ReadByte( msg );
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
@@ -800,15 +768,15 @@ void CL_ParseViewBeam( sizebuf_t *msg, int beamType )
|
|||||||
endEnt = MSG_ReadShort( msg );
|
endEnt = MSG_ReadShort( msg );
|
||||||
modelIndex = MSG_ReadShort( msg );
|
modelIndex = MSG_ReadShort( msg );
|
||||||
startFrame = MSG_ReadByte( msg );
|
startFrame = MSG_ReadByte( msg );
|
||||||
frameRate = (float)MSG_ReadByte( msg );
|
frameRate = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
life = (float)(MSG_ReadByte( msg ) * 0.1f);
|
life = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
width = (float)(MSG_ReadByte( msg ) * 0.1f);
|
width = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
noise = (float)(MSG_ReadByte( msg ) * 0.01f);
|
noise = (float)MSG_ReadByte( msg ) * 0.01f;
|
||||||
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
r = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
g = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
b = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
a = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||||
speed = (float)(MSG_ReadByte( msg ) * 0.1f);
|
speed = (float)MSG_ReadByte( msg ) * 0.1f;
|
||||||
R_BeamRing( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
R_BeamRing( startEnt, endEnt, modelIndex, life, width, noise, a, speed, startFrame, frameRate, r, g, b );
|
||||||
break;
|
break;
|
||||||
case TE_BEAMHOSE:
|
case TE_BEAMHOSE:
|
||||||
@@ -828,7 +796,7 @@ R_BeamEnts
|
|||||||
Create beam between two ents
|
Create beam between two ents
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamEnts( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness,
|
BEAM * GAME_EXPORT R_BeamEnts( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness,
|
||||||
float speed, int startFrame, float framerate, float r, float g, float b )
|
float speed, int startFrame, float framerate, float r, float g, float b )
|
||||||
{
|
{
|
||||||
cl_entity_t *start, *end;
|
cl_entity_t *start, *end;
|
||||||
@@ -873,7 +841,7 @@ R_BeamPoints
|
|||||||
Create beam between two points
|
Create beam between two points
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamPoints( vec3_t start, vec3_t end, int modelIndex, float life, float width, float amplitude,
|
BEAM * GAME_EXPORT R_BeamPoints( vec3_t start, vec3_t end, int modelIndex, float life, float width, float amplitude,
|
||||||
float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
||||||
{
|
{
|
||||||
BEAM *pbeam;
|
BEAM *pbeam;
|
||||||
@@ -904,7 +872,7 @@ R_BeamCirclePoints
|
|||||||
Create beam cicrle
|
Create beam cicrle
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamCirclePoints( int type, vec3_t start, vec3_t end, int modelIndex, float life, float width,
|
BEAM * GAME_EXPORT R_BeamCirclePoints( int type, vec3_t start, vec3_t end, int modelIndex, float life, float width,
|
||||||
float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
float amplitude, float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
||||||
{
|
{
|
||||||
BEAM *pbeam = R_BeamLightning( start, end, modelIndex, life, width, amplitude, brightness, speed );
|
BEAM *pbeam = R_BeamLightning( start, end, modelIndex, life, width, amplitude, brightness, speed );
|
||||||
@@ -925,7 +893,7 @@ R_BeamEntPoint
|
|||||||
Create beam between entity and point
|
Create beam between entity and point
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamEntPoint( int startEnt, vec3_t end, int modelIndex, float life, float width, float amplitude,
|
BEAM *GAME_EXPORT R_BeamEntPoint( int startEnt, vec3_t end, int modelIndex, float life, float width, float amplitude,
|
||||||
float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
float brightness, float speed, int startFrame, float framerate, float r, float g, float b )
|
||||||
{
|
{
|
||||||
BEAM *pbeam;
|
BEAM *pbeam;
|
||||||
@@ -965,7 +933,7 @@ R_BeamRing
|
|||||||
Create beam between two ents
|
Create beam between two ents
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamRing( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness,
|
BEAM * GAME_EXPORT R_BeamRing( int startEnt, int endEnt, int modelIndex, float life, float width, float amplitude, float brightness,
|
||||||
float speed, int startFrame, float framerate, float r, float g, float b )
|
float speed, int startFrame, float framerate, float r, float g, float b )
|
||||||
{
|
{
|
||||||
BEAM *pbeam;
|
BEAM *pbeam;
|
||||||
@@ -1001,7 +969,7 @@ R_BeamFollow
|
|||||||
Create beam following with entity
|
Create beam following with entity
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamFollow( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness )
|
BEAM *GAME_EXPORT R_BeamFollow( int startEnt, int modelIndex, float life, float width, float r, float g, float b, float brightness )
|
||||||
{
|
{
|
||||||
BEAM *pbeam = R_BeamAlloc();
|
BEAM *pbeam = R_BeamAlloc();
|
||||||
|
|
||||||
@@ -1030,7 +998,7 @@ R_BeamLightning
|
|||||||
template for new beams
|
template for new beams
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
BEAM *R_BeamLightning( vec3_t start, vec3_t end, int modelIndex, float life, float width, float amplitude, float brightness, float speed )
|
BEAM *GAME_EXPORT R_BeamLightning( vec3_t start, vec3_t end, int modelIndex, float life, float width, float amplitude, float brightness, float speed )
|
||||||
{
|
{
|
||||||
BEAM *pbeam = R_BeamAlloc();
|
BEAM *pbeam = R_BeamAlloc();
|
||||||
|
|
||||||
@@ -1054,7 +1022,7 @@ R_EntityParticles
|
|||||||
set EF_BRIGHTFIELD effect
|
set EF_BRIGHTFIELD effect
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_EntityParticles( cl_entity_t *ent )
|
void GAME_EXPORT R_EntityParticles( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
float angle;
|
float angle;
|
||||||
float sr, sp, sy, cr, cp, cy;
|
float sr, sp, sy, cr, cp, cy;
|
||||||
@@ -1089,7 +1057,7 @@ R_ParticleExplosion
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_ParticleExplosion( const vec3_t org )
|
void GAME_EXPORT R_ParticleExplosion( const vec3_t org )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i, j;
|
int i, j;
|
||||||
@@ -1120,12 +1088,16 @@ R_ParticleExplosion2
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_ParticleExplosion2( const vec3_t org, int colorStart, int colorLength )
|
void GAME_EXPORT R_ParticleExplosion2( const vec3_t org, int colorStart, int colorLength )
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int colorMod = 0;
|
int colorMod = 0, packedColor;
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
|
|
||||||
|
if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE ))
|
||||||
|
packedColor = 255; // use old code for blob particles
|
||||||
|
else packedColor = 0;
|
||||||
|
|
||||||
for( i = 0; i < 512; i++ )
|
for( i = 0; i < 512; i++ )
|
||||||
{
|
{
|
||||||
p = R_AllocParticle( NULL );
|
p = R_AllocParticle( NULL );
|
||||||
@@ -1133,7 +1105,7 @@ void R_ParticleExplosion2( const vec3_t org, int colorStart, int colorLength )
|
|||||||
|
|
||||||
p->die = cl.time + 0.3f;
|
p->die = cl.time + 0.3f;
|
||||||
p->color = colorStart + ( colorMod % colorLength );
|
p->color = colorStart + ( colorMod % colorLength );
|
||||||
p->packedColor = 255; // use old code for blob particles
|
p->packedColor = packedColor;
|
||||||
colorMod++;
|
colorMod++;
|
||||||
|
|
||||||
p->type = pt_blob;
|
p->type = pt_blob;
|
||||||
@@ -1152,18 +1124,22 @@ R_BlobExplosion
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_BlobExplosion( const vec3_t org )
|
void GAME_EXPORT R_BlobExplosion( const vec3_t org )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i, j;
|
int i, j, packedColor;
|
||||||
|
|
||||||
|
if( FBitSet( host.features, ENGINE_QUAKE_COMPATIBLE ))
|
||||||
|
packedColor = 255; // use old code for blob particles
|
||||||
|
else packedColor = 0;
|
||||||
|
|
||||||
for( i = 0; i < 1024; i++ )
|
for( i = 0; i < 1024; i++ )
|
||||||
{
|
{
|
||||||
p = R_AllocParticle( NULL );
|
p = R_AllocParticle( NULL );
|
||||||
if( !p ) return;
|
if( !p ) return;
|
||||||
|
|
||||||
p->die = cl.time + COM_RandomFloat( 2.0f, 2.4f );
|
p->die = cl.time + COM_RandomFloat( 1.0f, 1.4f );
|
||||||
p->packedColor = 255; // use old code for blob particles
|
p->packedColor = packedColor;
|
||||||
|
|
||||||
if( i & 1 )
|
if( i & 1 )
|
||||||
{
|
{
|
||||||
@@ -1191,7 +1167,7 @@ ParticleEffect
|
|||||||
PARTICLE_EFFECT on server
|
PARTICLE_EFFECT on server
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_RunParticleEffect( const vec3_t org, const vec3_t dir, int color, int count )
|
void GAME_EXPORT R_RunParticleEffect( const vec3_t org, const vec3_t dir, int color, int count )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i;
|
int i;
|
||||||
@@ -1224,7 +1200,7 @@ R_Blood
|
|||||||
particle spray
|
particle spray
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_Blood( const vec3_t org, const vec3_t ndir, int pcolor, int speed )
|
void GAME_EXPORT R_Blood( const vec3_t org, const vec3_t ndir, int pcolor, int speed )
|
||||||
{
|
{
|
||||||
vec3_t pos, dir, vec;
|
vec3_t pos, dir, vec;
|
||||||
float pspeed = speed * 3.0f;
|
float pspeed = speed * 3.0f;
|
||||||
@@ -1260,12 +1236,15 @@ R_BloodStream
|
|||||||
particle spray 2
|
particle spray 2
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_BloodStream( const vec3_t org, const vec3_t dir, int pcolor, int speed )
|
void GAME_EXPORT R_BloodStream( const vec3_t org, const vec3_t ndir, int pcolor, int speed )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i, j;
|
int i, j;
|
||||||
float arc;
|
float arc;
|
||||||
float accel = speed;
|
int accel = speed; // must be integer due to bug in GoldSrc
|
||||||
|
vec3_t dir;
|
||||||
|
|
||||||
|
VectorNormalize2( ndir, dir );
|
||||||
|
|
||||||
for( arc = 0.05f, i = 0; i < 100; i++ )
|
for( arc = 0.05f, i = 0; i < 100; i++ )
|
||||||
{
|
{
|
||||||
@@ -1337,7 +1316,7 @@ R_LavaSplash
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_LavaSplash( const vec3_t org )
|
void GAME_EXPORT R_LavaSplash( const vec3_t org )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
float vel;
|
float vel;
|
||||||
@@ -1379,7 +1358,7 @@ R_ParticleBurst
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_ParticleBurst( const vec3_t org, int size, int color, float life )
|
void GAME_EXPORT R_ParticleBurst( const vec3_t org, int size, int color, float life )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
vec3_t dir, dest;
|
vec3_t dir, dest;
|
||||||
@@ -1412,7 +1391,7 @@ R_LargeFunnel
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_LargeFunnel( const vec3_t org, int reverse )
|
void GAME_EXPORT R_LargeFunnel( const vec3_t org, int reverse )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
float vel, dist;
|
float vel, dist;
|
||||||
@@ -1459,7 +1438,7 @@ R_TeleportSplash
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_TeleportSplash( const vec3_t org )
|
void GAME_EXPORT R_TeleportSplash( const vec3_t org )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
vec3_t dir;
|
vec3_t dir;
|
||||||
@@ -1501,7 +1480,7 @@ R_RocketTrail
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_RocketTrail( vec3_t start, vec3_t end, int type )
|
void GAME_EXPORT R_RocketTrail( vec3_t start, vec3_t end, int type )
|
||||||
{
|
{
|
||||||
vec3_t vec, right, up;
|
vec3_t vec, right, up;
|
||||||
static int tracercount;
|
static int tracercount;
|
||||||
@@ -1620,7 +1599,7 @@ R_ParticleLine
|
|||||||
|
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void R_ParticleLine( const vec3_t start, const vec3_t end, byte r, byte g, byte b, float life )
|
void GAME_EXPORT R_ParticleLine( const vec3_t start, const vec3_t end, byte r, byte g, byte b, float life )
|
||||||
{
|
{
|
||||||
int pcolor;
|
int pcolor;
|
||||||
|
|
||||||
@@ -1634,7 +1613,7 @@ R_ParticleBox
|
|||||||
|
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void R_ParticleBox( const vec3_t absmin, const vec3_t absmax, byte r, byte g, byte b, float life )
|
void GAME_EXPORT R_ParticleBox( const vec3_t absmin, const vec3_t absmax, byte r, byte g, byte b, float life )
|
||||||
{
|
{
|
||||||
vec3_t mins, maxs;
|
vec3_t mins, maxs;
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
@@ -1655,7 +1634,7 @@ R_ShowLine
|
|||||||
|
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void R_ShowLine( const vec3_t start, const vec3_t end )
|
void GAME_EXPORT R_ShowLine( const vec3_t start, const vec3_t end )
|
||||||
{
|
{
|
||||||
vec3_t dir, org;
|
vec3_t dir, org;
|
||||||
float len;
|
float len;
|
||||||
@@ -1687,7 +1666,7 @@ R_BulletImpactParticles
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_BulletImpactParticles( const vec3_t pos )
|
void GAME_EXPORT R_BulletImpactParticles( const vec3_t pos )
|
||||||
{
|
{
|
||||||
int i, quantity;
|
int i, quantity;
|
||||||
int color;
|
int color;
|
||||||
@@ -1729,7 +1708,7 @@ R_FlickerParticles
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_FlickerParticles( const vec3_t org )
|
void GAME_EXPORT R_FlickerParticles( const vec3_t org )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
int i;
|
int i;
|
||||||
@@ -1757,7 +1736,7 @@ R_StreakSplash
|
|||||||
create a splash of streaks
|
create a splash of streaks
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_StreakSplash( const vec3_t pos, const vec3_t dir, int color, int count, float speed, int velocityMin, int velocityMax )
|
void GAME_EXPORT R_StreakSplash( const vec3_t pos, const vec3_t dir, int color, int count, float speed, int velocityMin, int velocityMax )
|
||||||
{
|
{
|
||||||
vec3_t vel, vel2;
|
vec3_t vel, vel2;
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
@@ -1822,20 +1801,20 @@ R_TracerEffect
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_TracerEffect( const vec3_t start, const vec3_t end )
|
void GAME_EXPORT R_TracerEffect( const vec3_t start, const vec3_t end )
|
||||||
{
|
{
|
||||||
vec3_t pos, vel, dir;
|
vec3_t pos, vel, dir;
|
||||||
float len, speed;
|
float len, speed;
|
||||||
float offset;
|
float offset;
|
||||||
|
|
||||||
speed = Q_max( tracerspeed->value, 3.0f );
|
speed = Q_max( tracerspeed.value, 3.0f );
|
||||||
|
|
||||||
VectorSubtract( end, start, dir );
|
VectorSubtract( end, start, dir );
|
||||||
len = VectorLength( dir );
|
len = VectorLength( dir );
|
||||||
if( len == 0.0f ) return;
|
if( len == 0.0f ) return;
|
||||||
|
|
||||||
VectorScale( dir, 1.0f / len, dir ); // normalize
|
VectorScale( dir, 1.0f / len, dir ); // normalize
|
||||||
offset = COM_RandomFloat( -10.0f, 9.0f ) + traceroffset->value;
|
offset = COM_RandomFloat( -10.0f, 9.0f ) + traceroffset.value;
|
||||||
VectorScale( dir, offset, vel );
|
VectorScale( dir, offset, vel );
|
||||||
VectorAdd( start, vel, pos );
|
VectorAdd( start, vel, pos );
|
||||||
VectorScale( dir, speed, vel );
|
VectorScale( dir, speed, vel );
|
||||||
@@ -1849,7 +1828,7 @@ R_UserTracerParticle
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_UserTracerParticle( float *org, float *vel, float life, int colorIndex, float length, byte deathcontext, void (*deathfunc)( particle_t *p ))
|
void GAME_EXPORT R_UserTracerParticle( float *org, float *vel, float life, int colorIndex, float length, byte deathcontext, void (*deathfunc)( particle_t *p ))
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
|
|
||||||
@@ -1884,7 +1863,7 @@ R_SparkStreaks
|
|||||||
create a streak tracers
|
create a streak tracers
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_SparkStreaks( const vec3_t pos, int count, int velocityMin, int velocityMax )
|
void GAME_EXPORT R_SparkStreaks( const vec3_t pos, int count, int velocityMin, int velocityMax )
|
||||||
{
|
{
|
||||||
particle_t *p;
|
particle_t *p;
|
||||||
vec3_t vel;
|
vec3_t vel;
|
||||||
@@ -1912,7 +1891,7 @@ R_Implosion
|
|||||||
make implosion tracers
|
make implosion tracers
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void R_Implosion( const vec3_t end, float radius, int count, float life )
|
void GAME_EXPORT R_Implosion( const vec3_t end, float radius, int count, float life )
|
||||||
{
|
{
|
||||||
float dist = ( radius / 100.0f );
|
float dist = ( radius / 100.0f );
|
||||||
vec3_t start, temp, vel;
|
vec3_t start, temp, vel;
|
||||||
@@ -2020,15 +1999,15 @@ void CL_ReadPointFile_f( void )
|
|||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
org[0] = Q_atof( token );
|
org[0] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
org[1] = Q_atof( token );
|
org[1] = Q_atof( token );
|
||||||
|
|
||||||
pfile = COM_ParseFile( pfile, token );
|
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||||
if( !pfile ) break;
|
if( !pfile ) break;
|
||||||
org[2] = Q_atof( token );
|
org[2] = Q_atof( token );
|
||||||
|
|
||||||
@@ -2061,7 +2040,7 @@ void CL_ReadPointFile_f( void )
|
|||||||
else Con_Printf( "map %s has no leaks!\n", clgame.mapname );
|
else Con_Printf( "map %s has no leaks!\n", clgame.mapname );
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_FreeDeadBeams( void )
|
static void CL_FreeDeadBeams( void )
|
||||||
{
|
{
|
||||||
BEAM *pBeam, *pNext, *pPrev = NULL;
|
BEAM *pBeam, *pNext, *pPrev = NULL;
|
||||||
// draw temporary entity beams
|
// draw temporary entity beams
|
||||||
@@ -2091,16 +2070,16 @@ void CL_FreeDeadBeams( void )
|
|||||||
void CL_DrawEFX( float time, qboolean fTrans )
|
void CL_DrawEFX( float time, qboolean fTrans )
|
||||||
{
|
{
|
||||||
CL_FreeDeadBeams();
|
CL_FreeDeadBeams();
|
||||||
if( CVAR_TO_BOOL( cl_draw_beams ))
|
if( cl_draw_beams.value )
|
||||||
ref.dllFuncs.CL_DrawBeams( fTrans, cl_active_beams );
|
ref.dllFuncs.CL_DrawBeams( fTrans, cl_active_beams );
|
||||||
|
|
||||||
if( fTrans )
|
if( fTrans )
|
||||||
{
|
{
|
||||||
R_FreeDeadParticles( &cl_active_particles );
|
R_FreeDeadParticles( &cl_active_particles );
|
||||||
if( CVAR_TO_BOOL( cl_draw_particles ))
|
if( cl_draw_particles.value )
|
||||||
ref.dllFuncs.CL_DrawParticles( time, cl_active_particles, PART_SIZE );
|
ref.dllFuncs.CL_DrawParticles( time, cl_active_particles, PART_SIZE );
|
||||||
R_FreeDeadParticles( &cl_active_tracers );
|
R_FreeDeadParticles( &cl_active_tracers );
|
||||||
if( CVAR_TO_BOOL( cl_draw_tracers ))
|
if( cl_draw_tracers.value )
|
||||||
ref.dllFuncs.CL_DrawTracers( time, cl_active_tracers );
|
ref.dllFuncs.CL_DrawTracers( time, cl_active_tracers );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2152,6 +2131,7 @@ void CL_ThinkParticle( double frametime, particle_t *p )
|
|||||||
p->vel[2] -= grav;
|
p->vel[2] -= grav;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// intentionally fallthrough
|
||||||
case pt_blob2:
|
case pt_blob2:
|
||||||
if( p->packedColor == 255 )
|
if( p->packedColor == 255 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ CL_CalcPlayerVelocity
|
|||||||
compute velocity for a given client
|
compute velocity for a given client
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_CalcPlayerVelocity( int idx, vec3_t velocity )
|
static void CL_CalcPlayerVelocity( int idx, vec3_t velocity )
|
||||||
{
|
{
|
||||||
clientdata_t *pcd;
|
clientdata_t *pcd;
|
||||||
vec3_t delta;
|
vec3_t delta;
|
||||||
@@ -78,23 +78,48 @@ CL_DescribeEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_DescribeEvent( int slot, int flags, const char *eventname )
|
static void CL_DescribeEvent( event_info_t *ei, int slot )
|
||||||
{
|
{
|
||||||
int idx = (slot & 31);
|
int idx = (slot & 63) * 2;
|
||||||
con_nprint_t info;
|
con_nprint_t info;
|
||||||
|
string origin_str = { 0 }; //, angles_str = { 0 };
|
||||||
|
|
||||||
if( !eventname || !cl_showevents->value )
|
if( !cl_showevents.value )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// mark reliable as green and unreliable as red
|
info.time_to_live = 1.0f;
|
||||||
if( FBitSet( flags, FEV_RELIABLE ))
|
|
||||||
VectorSet( info.color, 0.0f, 1.0f, 0.0f );
|
|
||||||
else VectorSet( info.color, 1.0f, 0.0f, 0.0f );
|
|
||||||
|
|
||||||
info.time_to_live = 0.5f;
|
|
||||||
info.index = idx;
|
info.index = idx;
|
||||||
|
|
||||||
Con_NXPrintf( &info, "%i %f %s", slot, cl.time, eventname );
|
// mark reliable as green and unreliable as red
|
||||||
|
if( FBitSet( ei->flags, FEV_RELIABLE ))
|
||||||
|
VectorSet( info.color, 0.5f, 1.0f, 0.5f );
|
||||||
|
else VectorSet( info.color, 1.0f, 0.5f, 0.5f );
|
||||||
|
|
||||||
|
if( !VectorIsNull( ei->args.origin ))
|
||||||
|
{
|
||||||
|
Q_snprintf( origin_str, sizeof( origin_str ), "(%.2f,%.2f,%.2f)",
|
||||||
|
ei->args.origin[0], ei->args.origin[1], ei->args.origin[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if( !VectorIsNull( ei->args.angles ))
|
||||||
|
{
|
||||||
|
Q_snprintf( angles_str, sizeof( angles_str ), "ang %.2f %.2f %.2f",
|
||||||
|
ei->args.angles[0], ei->args.angles[1], ei->args.angles[2]);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
Con_NXPrintf( &info, "%i %.2f %c %s %s",
|
||||||
|
slot, cl.time,
|
||||||
|
(FBitSet( ei->flags, FEV_CLIENT ) ? 'c' :
|
||||||
|
FBitSet( ei->flags, FEV_SERVER ) ? 's' : '?'),
|
||||||
|
cl.event_precache[ei->index],
|
||||||
|
origin_str);
|
||||||
|
|
||||||
|
info.index++;
|
||||||
|
|
||||||
|
Con_NXPrintf( &info, "b(%i,%i) i(%i,%i) f(%.2f,%.2f)",
|
||||||
|
ei->args.bparam1, ei->args.bparam2,
|
||||||
|
ei->args.iparam1, ei->args.iparam2,
|
||||||
|
ei->args.fparam1, ei->args.fparam2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -133,8 +158,8 @@ CL_EventIndex
|
|||||||
*/
|
*/
|
||||||
word CL_EventIndex( const char *name )
|
word CL_EventIndex( const char *name )
|
||||||
{
|
{
|
||||||
int i;
|
word i;
|
||||||
|
|
||||||
if( !COM_CheckString( name ))
|
if( !COM_CheckString( name ))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -177,7 +202,7 @@ CL_FireEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
qboolean CL_FireEvent( event_info_t *ei, int slot )
|
static qboolean CL_FireEvent( event_info_t *ei, int slot )
|
||||||
{
|
{
|
||||||
cl_user_event_t *ev;
|
cl_user_event_t *ev;
|
||||||
const char *name;
|
const char *name;
|
||||||
@@ -189,7 +214,7 @@ qboolean CL_FireEvent( event_info_t *ei, int slot )
|
|||||||
// get the func pointer
|
// get the func pointer
|
||||||
for( i = 0; i < MAX_EVENTS; i++ )
|
for( i = 0; i < MAX_EVENTS; i++ )
|
||||||
{
|
{
|
||||||
ev = clgame.events[i];
|
ev = clgame.events[i];
|
||||||
|
|
||||||
if( !ev )
|
if( !ev )
|
||||||
{
|
{
|
||||||
@@ -200,16 +225,27 @@ qboolean CL_FireEvent( event_info_t *ei, int slot )
|
|||||||
|
|
||||||
if( ev->index == ei->index )
|
if( ev->index == ei->index )
|
||||||
{
|
{
|
||||||
|
name = cl.event_precache[ei->index];
|
||||||
|
|
||||||
|
if( cl_trace_events.value )
|
||||||
|
{
|
||||||
|
Con_Printf( "^3EVENT %s AT %.2f %.2f %.2f\n" // event name
|
||||||
|
"\t%.2f %.2f %i %i %s %s\n", // bool params
|
||||||
|
name, ei->args.origin[0], ei->args.origin[1], ei->args.origin[2],
|
||||||
|
ei->args.fparam1, ei->args.fparam2,
|
||||||
|
ei->args.iparam1, ei->args.iparam2,
|
||||||
|
ei->args.bparam1 ? "TRUE" : "FALSE", ei->args.bparam2 ? "TRUE" : "FALSE" );
|
||||||
|
}
|
||||||
|
|
||||||
if( ev->func )
|
if( ev->func )
|
||||||
{
|
{
|
||||||
CL_DescribeEvent( slot, ei->flags, cl.event_precache[ei->index] );
|
CL_DescribeEvent( ei, slot );
|
||||||
ev->func( &ei->args );
|
ev->func( &ei->args );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = cl.event_precache[ei->index];
|
|
||||||
Con_Reportf( S_ERROR "CL_FireEvent: %s not hooked\n", name );
|
Con_Reportf( S_ERROR "CL_FireEvent: %s not hooked\n", name );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,7 +292,7 @@ CL_FindEvent
|
|||||||
find first empty event
|
find first empty event
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
event_info_t *CL_FindEmptyEvent( void )
|
static event_info_t *CL_FindEmptyEvent( void )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
event_state_t *es;
|
event_state_t *es;
|
||||||
@@ -284,7 +320,7 @@ CL_FindEvent
|
|||||||
replace only unreliable events
|
replace only unreliable events
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
event_info_t *CL_FindUnreliableEvent( void )
|
static event_info_t *CL_FindUnreliableEvent( void )
|
||||||
{
|
{
|
||||||
event_state_t *es;
|
event_state_t *es;
|
||||||
event_info_t *ei;
|
event_info_t *ei;
|
||||||
@@ -314,7 +350,7 @@ CL_QueueEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_QueueEvent( int flags, int index, float delay, event_args_t *args )
|
static void CL_QueueEvent( int flags, int index, float delay, event_args_t *args )
|
||||||
{
|
{
|
||||||
event_info_t *ei;
|
event_info_t *ei;
|
||||||
|
|
||||||
@@ -437,7 +473,7 @@ void CL_ParseEvent( sizebuf_t *msg )
|
|||||||
args.angles[PITCH] /= -3.0f;
|
args.angles[PITCH] /= -3.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Place event on queue
|
// Place event on queue
|
||||||
CL_QueueEvent( FEV_SERVER, event_index, delay, &args );
|
CL_QueueEvent( FEV_SERVER, event_index, delay, &args );
|
||||||
}
|
}
|
||||||
@@ -450,7 +486,7 @@ CL_PlaybackEvent
|
|||||||
|
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, float delay, float *origin,
|
void GAME_EXPORT 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 )
|
||||||
{
|
{
|
||||||
event_args_t args;
|
event_args_t args;
|
||||||
@@ -459,7 +495,7 @@ void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, floa
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// 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 "CL_PlaybackEvent: invalid eventindex %i\n", eventindex );
|
||||||
return;
|
return;
|
||||||
@@ -469,7 +505,7 @@ void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, floa
|
|||||||
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 "CL_PlaybackEvent: event %i was not precached\n", eventindex );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetBits( flags, FEV_CLIENT ); // it's a client event
|
SetBits( flags, FEV_CLIENT ); // it's a client event
|
||||||
|
|||||||
377
engine/client/cl_font.c
Normal file
377
engine/client/cl_font.c
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
/*
|
||||||
|
cl_font.c - bare bones engine font manager
|
||||||
|
Copyright (C) 2023 Alibek Omarov
|
||||||
|
|
||||||
|
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 "filesystem.h"
|
||||||
|
#include "client.h"
|
||||||
|
#include "qfont.h"
|
||||||
|
|
||||||
|
qboolean CL_FixedFont( cl_font_t *font )
|
||||||
|
{
|
||||||
|
return font && font->valid && font->type == FONT_FIXED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CL_LoadFontTexture( const char *fontname, uint texFlags, int *width )
|
||||||
|
{
|
||||||
|
int font_width;
|
||||||
|
int tex;
|
||||||
|
|
||||||
|
if( !g_fsapi.FileExists( fontname, false ))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
tex = ref.dllFuncs.GL_LoadTexture( fontname, NULL, 0, texFlags );
|
||||||
|
if( !tex )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
font_width = REF_GET_PARM( PARM_TEX_WIDTH, tex );
|
||||||
|
if( !font_width )
|
||||||
|
{
|
||||||
|
ref.dllFuncs.GL_FreeTexture( tex );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*width = font_width;
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CL_FontRenderMode( convar_t *fontrender )
|
||||||
|
{
|
||||||
|
switch((int)fontrender->value )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return kRenderTransAdd;
|
||||||
|
case 1:
|
||||||
|
return kRenderTransAlpha;
|
||||||
|
case 2:
|
||||||
|
return kRenderTransTexture;
|
||||||
|
default:
|
||||||
|
Cvar_DirectSet( fontrender, fontrender->def_string );
|
||||||
|
}
|
||||||
|
|
||||||
|
return kRenderTransTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_SetFontRendermode( cl_font_t *font )
|
||||||
|
{
|
||||||
|
ref.dllFuncs.GL_SetRenderMode( CL_FontRenderMode( font->rendermode ));
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean Con_LoadFixedWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags )
|
||||||
|
{
|
||||||
|
int font_width, i;
|
||||||
|
|
||||||
|
if( !rendermode )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( font->valid )
|
||||||
|
return true; // already loaded
|
||||||
|
|
||||||
|
font->hFontTexture = CL_LoadFontTexture( fontname, texFlags, &font_width );
|
||||||
|
if( !font->hFontTexture )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
font->type = FONT_FIXED;
|
||||||
|
font->valid = true;
|
||||||
|
font->scale = scale;
|
||||||
|
font->rendermode = rendermode;
|
||||||
|
font->charHeight = Q_rint( font_width / 16 * scale );
|
||||||
|
|
||||||
|
for( i = 0; i < ARRAYSIZE( font->fontRc ); i++ )
|
||||||
|
{
|
||||||
|
font->fontRc[i].left = ( i * font_width / 16 ) % font_width;
|
||||||
|
font->fontRc[i].right = font->fontRc[i].left + font_width / 16;
|
||||||
|
font->fontRc[i].top = ( i / 16 ) * ( font_width / 16 );
|
||||||
|
font->fontRc[i].bottom = font->fontRc[i].top + font_width / 16;
|
||||||
|
|
||||||
|
font->charWidths[i] = Q_rint( font_width / 16 * scale );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean Con_LoadVariableWidthFont( const char *fontname, cl_font_t *font, float scale, convar_t *rendermode, uint texFlags )
|
||||||
|
{
|
||||||
|
fs_offset_t length;
|
||||||
|
qfont_t src;
|
||||||
|
byte *pfile;
|
||||||
|
int font_width, i;
|
||||||
|
|
||||||
|
if( !rendermode )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( font->valid )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
pfile = g_fsapi.LoadFile( fontname, &length, false );
|
||||||
|
if( !pfile )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( length < sizeof( src ))
|
||||||
|
{
|
||||||
|
Mem_Free( pfile );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( &src, pfile, sizeof( src ));
|
||||||
|
Mem_Free( pfile );
|
||||||
|
|
||||||
|
font->hFontTexture = CL_LoadFontTexture( fontname, texFlags, &font_width );
|
||||||
|
if( !font->hFontTexture )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
font->type = FONT_VARIABLE;
|
||||||
|
font->valid = true;
|
||||||
|
font->scale = scale ? scale : 1.0f;
|
||||||
|
font->rendermode = rendermode;
|
||||||
|
font->charHeight = Q_rint( src.rowheight * scale );
|
||||||
|
|
||||||
|
for( i = 0; i < ARRAYSIZE( font->fontRc ); i++ )
|
||||||
|
{
|
||||||
|
const charinfo *ci = &src.fontinfo[i];
|
||||||
|
|
||||||
|
font->fontRc[i].left = (word)ci->startoffset % font_width;
|
||||||
|
font->fontRc[i].right = font->fontRc[i].left + ci->charwidth;
|
||||||
|
font->fontRc[i].top = (word)ci->startoffset / font_width;
|
||||||
|
font->fontRc[i].bottom = font->fontRc[i].top + src.rowheight;
|
||||||
|
|
||||||
|
font->charWidths[i] = Q_rint( src.fontinfo[i].charwidth * scale );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_FreeFont( cl_font_t *font )
|
||||||
|
{
|
||||||
|
if( !font || !font->valid )
|
||||||
|
return;
|
||||||
|
|
||||||
|
ref.dllFuncs.GL_FreeTexture( font->hFontTexture );
|
||||||
|
memset( font, 0, sizeof( *font ));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CL_CalcTabStop( const cl_font_t *font, int x )
|
||||||
|
{
|
||||||
|
int space = font->charWidths[' '];
|
||||||
|
int tab = space * 6; // 6 spaces
|
||||||
|
int stop = tab - x % tab;
|
||||||
|
|
||||||
|
if( stop < space )
|
||||||
|
return tab * 2 - x % tab; // select next
|
||||||
|
|
||||||
|
return stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CL_DrawCharacter( float x, float y, int number, rgba_t color, cl_font_t *font, int flags )
|
||||||
|
{
|
||||||
|
wrect_t *rc;
|
||||||
|
float w, h;
|
||||||
|
float s1, t1, s2, t2, half = 0.5f;
|
||||||
|
int texw, texh;
|
||||||
|
|
||||||
|
if( !font || !font->valid || y < -font->charHeight )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// check if printable
|
||||||
|
if( number <= 32 )
|
||||||
|
{
|
||||||
|
if( number == ' ' )
|
||||||
|
return font->charWidths[' '];
|
||||||
|
else if( number == '\t' )
|
||||||
|
return CL_CalcTabStop( font, x );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_UTF8 ))
|
||||||
|
number = Con_UtfProcessChar( number & 255 );
|
||||||
|
else number &= 255;
|
||||||
|
|
||||||
|
if( !number || !font->charWidths[number])
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
R_GetTextureParms( &texw, &texh, font->hFontTexture );
|
||||||
|
if( !texw || !texh )
|
||||||
|
return font->charWidths[number];
|
||||||
|
|
||||||
|
rc = &font->fontRc[number];
|
||||||
|
|
||||||
|
if( font->scale <= 1.f || !REF_GET_PARM( PARM_TEX_FILTERING, font->hFontTexture ))
|
||||||
|
half = 0;
|
||||||
|
|
||||||
|
s1 = ((float)rc->left + half ) / texw;
|
||||||
|
t1 = ((float)rc->top + half ) / texh;
|
||||||
|
s2 = ((float)rc->right - half ) / texw;
|
||||||
|
t2 = ((float)rc->bottom - half ) / texh;
|
||||||
|
w = ( rc->right - rc->left ) * font->scale;
|
||||||
|
h = ( rc->bottom - rc->top ) * font->scale;
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_HUD ))
|
||||||
|
SPR_AdjustSize( &x, &y, &w, &h );
|
||||||
|
|
||||||
|
if( !FBitSet( flags, FONT_DRAW_NORENDERMODE ))
|
||||||
|
CL_SetFontRendermode( font );
|
||||||
|
|
||||||
|
// don't apply color to fixed fonts it's already colored
|
||||||
|
if( font->type != FONT_FIXED || REF_GET_PARM( PARM_TEX_GLFORMAT, font->hFontTexture ) == 0x8045 ) // GL_LUMINANCE8_ALPHA8
|
||||||
|
ref.dllFuncs.Color4ub( color[0], color[1], color[2], color[3] );
|
||||||
|
else ref.dllFuncs.Color4ub( 255, 255, 255, color[3] );
|
||||||
|
ref.dllFuncs.R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, font->hFontTexture );
|
||||||
|
|
||||||
|
return font->charWidths[number];
|
||||||
|
}
|
||||||
|
|
||||||
|
int CL_DrawString( float x, float y, const char *s, rgba_t color, cl_font_t *font, int flags )
|
||||||
|
{
|
||||||
|
rgba_t current_color;
|
||||||
|
int draw_len = 0;
|
||||||
|
|
||||||
|
if( !font || !font->valid )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_UTF8 ))
|
||||||
|
Con_UtfProcessChar( 0 ); // clear utf state
|
||||||
|
|
||||||
|
if( !FBitSet( flags, FONT_DRAW_NORENDERMODE ))
|
||||||
|
CL_SetFontRendermode( font );
|
||||||
|
|
||||||
|
Vector4Copy( color, current_color );
|
||||||
|
|
||||||
|
while( *s )
|
||||||
|
{
|
||||||
|
if( *s == '\n' )
|
||||||
|
{
|
||||||
|
s++;
|
||||||
|
|
||||||
|
if( !*s )
|
||||||
|
break;
|
||||||
|
|
||||||
|
// some client functions ignore newlines
|
||||||
|
if( !FBitSet( flags, FONT_DRAW_NOLF ))
|
||||||
|
{
|
||||||
|
draw_len = 0;
|
||||||
|
y += font->charHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_RESETCOLORONLF ))
|
||||||
|
Vector4Copy( color, current_color );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( IsColorString( s ))
|
||||||
|
{
|
||||||
|
// don't copy alpha
|
||||||
|
if( !FBitSet( flags, FONT_DRAW_FORCECOL ))
|
||||||
|
VectorCopy( g_color_table[ColorIndex(*( s + 1 ))], current_color );
|
||||||
|
|
||||||
|
s += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip setting rendermode, it was changed for this string already
|
||||||
|
draw_len += CL_DrawCharacter( x + draw_len, y, (byte)*s, current_color, font, flags | FONT_DRAW_NORENDERMODE );
|
||||||
|
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return draw_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CL_DrawStringf( cl_font_t *font, float x, float y, rgba_t color, int flags, const char *fmt, ... )
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
char buf[MAX_VA_STRING];
|
||||||
|
|
||||||
|
va_start( va, fmt );
|
||||||
|
Q_vsnprintf( buf, sizeof( buf ), fmt, va );
|
||||||
|
va_end( va );
|
||||||
|
|
||||||
|
return CL_DrawString( x, y, buf, color, font, flags );
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_DrawCharacterLen( cl_font_t *font, int number, int *width, int *height )
|
||||||
|
{
|
||||||
|
if( !font || !font->valid ) return;
|
||||||
|
if( width )
|
||||||
|
{
|
||||||
|
if( number == '\t' )
|
||||||
|
*width = CL_CalcTabStop( font, 0 ); // at least return max tabstop
|
||||||
|
else *width = font->charWidths[number & 255];
|
||||||
|
}
|
||||||
|
if( height ) *height = font->charHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CL_DrawStringLen( cl_font_t *font, const char *s, int *width, int *height, int flags )
|
||||||
|
{
|
||||||
|
int draw_len = 0;
|
||||||
|
|
||||||
|
if( !font || !font->valid )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( height )
|
||||||
|
*height = font->charHeight;
|
||||||
|
|
||||||
|
if( width )
|
||||||
|
*width = 0;
|
||||||
|
|
||||||
|
if( !COM_CheckString( s ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_UTF8 ))
|
||||||
|
Con_UtfProcessChar( 0 ); // reset utf state
|
||||||
|
|
||||||
|
while( *s )
|
||||||
|
{
|
||||||
|
int number;
|
||||||
|
|
||||||
|
if( *s == '\n' )
|
||||||
|
{
|
||||||
|
// BUG: no check for end string here
|
||||||
|
// but high chances somebody's relying on this
|
||||||
|
s++;
|
||||||
|
draw_len = 0;
|
||||||
|
if( !FBitSet( flags, FONT_DRAW_NOLF ))
|
||||||
|
{
|
||||||
|
if( height )
|
||||||
|
*height += font->charHeight;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if( *s == '\t' )
|
||||||
|
{
|
||||||
|
draw_len += CL_CalcTabStop( font, 0 ); // at least return max tabstop
|
||||||
|
s++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( IsColorString( s ))
|
||||||
|
{
|
||||||
|
s += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FBitSet( flags, FONT_DRAW_UTF8 ))
|
||||||
|
number = Con_UtfProcessChar( (byte)*s );
|
||||||
|
else number = (byte)*s;
|
||||||
|
|
||||||
|
if( number )
|
||||||
|
{
|
||||||
|
draw_len += font->charWidths[number];
|
||||||
|
|
||||||
|
if( draw_len > *width )
|
||||||
|
*width = draw_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,7 +24,7 @@ GNU General Public License for more details.
|
|||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
|
||||||
#define STUDIO_INTERPOLATION_FIX
|
// #define STUDIO_INTERPOLATION_FIX
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
@@ -52,16 +52,30 @@ CL_UpdatePositions
|
|||||||
Store another position into interpolation circular buffer
|
Store another position into interpolation circular buffer
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_UpdatePositions( cl_entity_t *ent )
|
static void CL_UpdatePositions( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
position_history_t *ph;
|
position_history_t *ph, *prev;
|
||||||
|
|
||||||
|
prev = &ent->ph[ent->current_position];
|
||||||
|
|
||||||
ent->current_position = (ent->current_position + 1) & HISTORY_MASK;
|
ent->current_position = (ent->current_position + 1) & HISTORY_MASK;
|
||||||
ph = &ent->ph[ent->current_position];
|
ph = &ent->ph[ent->current_position];
|
||||||
|
|
||||||
VectorCopy( ent->curstate.origin, ph->origin );
|
VectorCopy( ent->curstate.origin, ph->origin );
|
||||||
VectorCopy( ent->curstate.angles, ph->angles );
|
VectorCopy( ent->curstate.angles, ph->angles );
|
||||||
ph->animtime = ent->curstate.animtime; // !!!
|
|
||||||
|
ph->animtime = ent->curstate.animtime;
|
||||||
|
|
||||||
|
// a1ba: for some reason, this sometimes still may happen
|
||||||
|
// at this time, I'm not sure whether this bug happens in delta readwrite code
|
||||||
|
// or server just decides to go backwards and really sends these values
|
||||||
|
if( ph->animtime < prev->animtime )
|
||||||
|
{
|
||||||
|
// try to deduce real animtime by looking up the difference between
|
||||||
|
// server messages (cl.mtime is never modified ny the interpolation code)
|
||||||
|
float diff = Q_max( 0, ent->curstate.msg_time - ent->prevstate.msg_time );
|
||||||
|
|
||||||
|
ph->animtime = prev->animtime + diff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -71,7 +85,7 @@ CL_ResetPositions
|
|||||||
Interpolation init or reset after teleporting
|
Interpolation init or reset after teleporting
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_ResetPositions( cl_entity_t *ent )
|
static void CL_ResetPositions( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
position_history_t store;
|
position_history_t store;
|
||||||
|
|
||||||
@@ -93,7 +107,7 @@ check for instant movement in case
|
|||||||
we don't want interpolate this
|
we don't want interpolate this
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_EntityTeleported( cl_entity_t *ent )
|
static qboolean CL_EntityTeleported( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
float len, maxlen;
|
float len, maxlen;
|
||||||
vec3_t delta;
|
vec3_t delta;
|
||||||
@@ -114,7 +128,7 @@ CL_CompareTimestamps
|
|||||||
round-off floating errors
|
round-off floating errors
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_CompareTimestamps( float t1, float t2 )
|
static qboolean CL_CompareTimestamps( float t1, float t2 )
|
||||||
{
|
{
|
||||||
int iTime1 = t1 * 1000;
|
int iTime1 = t1 * 1000;
|
||||||
int iTime2 = t2 * 1000;
|
int iTime2 = t2 * 1000;
|
||||||
@@ -129,8 +143,11 @@ CL_EntityIgnoreLerp
|
|||||||
some ents will be ignore lerping
|
some ents will be ignore lerping
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_EntityIgnoreLerp( cl_entity_t *e )
|
static qboolean CL_EntityIgnoreLerp( cl_entity_t *e )
|
||||||
{
|
{
|
||||||
|
if( cl_nointerp.value > 0.f )
|
||||||
|
return true;
|
||||||
|
|
||||||
if( e->model && e->model->type == mod_alias )
|
if( e->model && e->model->type == mod_alias )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -143,7 +160,7 @@ CL_EntityCustomLerp
|
|||||||
|
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_EntityCustomLerp( cl_entity_t *e )
|
static qboolean CL_EntityCustomLerp( cl_entity_t *e )
|
||||||
{
|
{
|
||||||
switch( e->curstate.movetype )
|
switch( e->curstate.movetype )
|
||||||
{
|
{
|
||||||
@@ -153,6 +170,13 @@ qboolean CL_EntityCustomLerp( cl_entity_t *e )
|
|||||||
case MOVETYPE_FLY:
|
case MOVETYPE_FLY:
|
||||||
case MOVETYPE_COMPOUND:
|
case MOVETYPE_COMPOUND:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// ABSOLUTELY STUPID HACK TO ALLOW MONSTERS
|
||||||
|
// INTERPOLATION IN GRAVGUNMOD COOP
|
||||||
|
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
||||||
|
case MOVETYPE_TOSS:
|
||||||
|
if( cls.legacymode && e->model && e->model->type == mod_studio )
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -165,7 +189,7 @@ CL_ParametricMove
|
|||||||
check for parametrical moved entities
|
check for parametrical moved entities
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_ParametricMove( cl_entity_t *ent )
|
static qboolean CL_ParametricMove( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
float frac, dt, t;
|
float frac, dt, t;
|
||||||
vec3_t delta;
|
vec3_t delta;
|
||||||
@@ -202,7 +226,7 @@ CL_UpdateLatchedVars
|
|||||||
|
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
void CL_UpdateLatchedVars( cl_entity_t *ent )
|
static void CL_UpdateLatchedVars( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
if( !ent->model || ( ent->model->type != mod_alias && ent->model->type != mod_studio ))
|
if( !ent->model || ( ent->model->type != mod_alias && ent->model->type != mod_studio ))
|
||||||
return; // below fields used only for alias and studio interpolation
|
return; // below fields used only for alias and studio interpolation
|
||||||
@@ -216,7 +240,7 @@ void CL_UpdateLatchedVars( cl_entity_t *ent )
|
|||||||
|
|
||||||
if( ent->curstate.sequence != ent->prevstate.sequence )
|
if( ent->curstate.sequence != ent->prevstate.sequence )
|
||||||
{
|
{
|
||||||
memcpy( ent->prevstate.blending, ent->latched.prevseqblending, sizeof( ent->prevstate.blending ));
|
memcpy( ent->latched.prevseqblending, ent->prevstate.blending, sizeof( ent->latched.prevseqblending ));
|
||||||
ent->latched.prevsequence = ent->prevstate.sequence;
|
ent->latched.prevsequence = ent->prevstate.sequence;
|
||||||
ent->latched.sequencetime = ent->curstate.animtime;
|
ent->latched.sequencetime = ent->curstate.animtime;
|
||||||
}
|
}
|
||||||
@@ -235,7 +259,7 @@ CL_GetStudioEstimatedFrame
|
|||||||
|
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
float CL_GetStudioEstimatedFrame( cl_entity_t *ent )
|
static float CL_GetStudioEstimatedFrame( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
studiohdr_t *pstudiohdr;
|
studiohdr_t *pstudiohdr;
|
||||||
mstudioseqdesc_t *pseqdesc;
|
mstudioseqdesc_t *pseqdesc;
|
||||||
@@ -249,7 +273,7 @@ float CL_GetStudioEstimatedFrame( cl_entity_t *ent )
|
|||||||
{
|
{
|
||||||
sequence = bound( 0, ent->curstate.sequence, pstudiohdr->numseq - 1 );
|
sequence = bound( 0, ent->curstate.sequence, pstudiohdr->numseq - 1 );
|
||||||
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + sequence;
|
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + sequence;
|
||||||
return ref.dllFuncs.R_StudioEstimateFrame( ent, pseqdesc );
|
return ref.dllFuncs.R_StudioEstimateFrame( ent, pseqdesc, cl.time );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,7 +321,7 @@ CL_ProcessEntityUpdate
|
|||||||
apply changes since new frame received
|
apply changes since new frame received
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
static void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
qboolean parametric;
|
qboolean parametric;
|
||||||
|
|
||||||
@@ -307,7 +331,7 @@ void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
|||||||
if( FBitSet( ent->curstate.entityType, ENTITY_NORMAL ))
|
if( FBitSet( ent->curstate.entityType, ENTITY_NORMAL ))
|
||||||
COM_NormalizeAngles( ent->curstate.angles );
|
COM_NormalizeAngles( ent->curstate.angles );
|
||||||
|
|
||||||
parametric = CL_ParametricMove( ent );
|
parametric = ent->curstate.starttime != 0.0f && ent->curstate.impacttime != 0.0f;
|
||||||
|
|
||||||
// allow interpolation on bmodels too
|
// allow interpolation on bmodels too
|
||||||
if( ent->model && ent->model->type == mod_brush )
|
if( ent->model && ent->model->type == mod_brush )
|
||||||
@@ -323,7 +347,7 @@ void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// g-cont. it should be done for all the players?
|
// g-cont. it should be done for all the players?
|
||||||
if( ent->player && !FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
if( ent->player && !FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||||
ent->curstate.angles[PITCH] /= -3.0f;
|
ent->curstate.angles[PITCH] /= -3.0f;
|
||||||
|
|
||||||
VectorCopy( ent->curstate.origin, ent->origin );
|
VectorCopy( ent->curstate.origin, ent->origin );
|
||||||
@@ -343,11 +367,10 @@ CL_FindInterpolationUpdates
|
|||||||
find two timestamps
|
find two timestamps
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qboolean CL_FindInterpolationUpdates( cl_entity_t *ent, float targettime, position_history_t **ph0, position_history_t **ph1 )
|
static qboolean CL_FindInterpolationUpdates( cl_entity_t *ent, double targettime, position_history_t **ph0, position_history_t **ph1 )
|
||||||
{
|
{
|
||||||
qboolean extrapolate = true;
|
qboolean extrapolate = true;
|
||||||
int i, i0, i1, imod;
|
uint i, i0, i1, imod;
|
||||||
float at;
|
|
||||||
|
|
||||||
imod = ent->current_position;
|
imod = ent->current_position;
|
||||||
i0 = (imod - 0) & HISTORY_MASK; // curpos (lerp end)
|
i0 = (imod - 0) & HISTORY_MASK; // curpos (lerp end)
|
||||||
@@ -355,8 +378,10 @@ qboolean CL_FindInterpolationUpdates( cl_entity_t *ent, float targettime, positi
|
|||||||
|
|
||||||
for( i = 1; i < HISTORY_MAX - 1; i++ )
|
for( i = 1; i < HISTORY_MAX - 1; i++ )
|
||||||
{
|
{
|
||||||
at = ent->ph[( imod - i ) & HISTORY_MASK].animtime;
|
double at = ent->ph[( imod - i ) & HISTORY_MASK].animtime;
|
||||||
if( at == 0.0f ) break;
|
|
||||||
|
if( at == 0.0f )
|
||||||
|
break;
|
||||||
|
|
||||||
if( targettime > at )
|
if( targettime > at )
|
||||||
{
|
{
|
||||||
@@ -381,15 +406,14 @@ CL_PureOrigin
|
|||||||
non-local players interpolation
|
non-local players interpolation
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void CL_PureOrigin( cl_entity_t *ent, float t, vec3_t outorigin, vec3_t outangles )
|
static void CL_PureOrigin( cl_entity_t *ent, double t, vec3_t outorigin, vec3_t outangles )
|
||||||
{
|
{
|
||||||
qboolean extrapolate;
|
double t1, t0, frac;
|
||||||
float t1, t0, frac;
|
|
||||||
position_history_t *ph0, *ph1;
|
position_history_t *ph0, *ph1;
|
||||||
vec3_t delta;
|
vec3_t delta;
|
||||||
|
|
||||||
// NOTE: ph0 is next, ph1 is a prev
|
// NOTE: ph0 is next, ph1 is a prev
|
||||||
extrapolate = CL_FindInterpolationUpdates( ent, t, &ph0, &ph1 );
|
CL_FindInterpolationUpdates( ent, t, &ph0, &ph1 );
|
||||||
|
|
||||||
if ( !ph0 || !ph1 )
|
if ( !ph0 || !ph1 )
|
||||||
return;
|
return;
|
||||||
@@ -397,17 +421,17 @@ void CL_PureOrigin( cl_entity_t *ent, float t, vec3_t outorigin, vec3_t outangle
|
|||||||
t0 = ph0->animtime;
|
t0 = ph0->animtime;
|
||||||
t1 = ph1->animtime;
|
t1 = ph1->animtime;
|
||||||
|
|
||||||
if( t0 != 0.0f )
|
if( t0 != 0.0 )
|
||||||
{
|
{
|
||||||
vec4_t q, q1, q2;
|
vec4_t q, q1, q2;
|
||||||
|
|
||||||
VectorSubtract( ph0->origin, ph1->origin, delta );
|
VectorSubtract( ph0->origin, ph1->origin, delta );
|
||||||
|
|
||||||
if( t0 != t1 )
|
if( !Q_equal( t0, t1 ))
|
||||||
frac = ( t - t1 ) / ( t0 - t1 );
|
frac = ( t - t1 ) / ( t0 - t1 );
|
||||||
else frac = 1.0f;
|
else frac = 1.0;
|
||||||
|
|
||||||
frac = bound( 0.0f, frac, 1.2f );
|
frac = bound( 0.0, frac, 1.2 );
|
||||||
|
|
||||||
VectorMA( ph1->origin, frac, delta, outorigin );
|
VectorMA( ph1->origin, frac, delta, outorigin );
|
||||||
|
|
||||||
@@ -431,11 +455,11 @@ CL_InterpolateModel
|
|||||||
non-players interpolation
|
non-players interpolation
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
int CL_InterpolateModel( cl_entity_t *e )
|
static int CL_InterpolateModel( cl_entity_t *e )
|
||||||
{
|
{
|
||||||
position_history_t *ph0 = NULL, *ph1 = NULL;
|
position_history_t *ph0 = NULL, *ph1 = NULL;
|
||||||
vec3_t origin, angles, delta;
|
vec3_t origin, angles, delta;
|
||||||
float t, t1, t2, frac;
|
double t, t1, t2, frac;
|
||||||
vec4_t q, q1, q2;
|
vec4_t q, q1, q2;
|
||||||
|
|
||||||
VectorCopy( e->curstate.origin, e->origin );
|
VectorCopy( e->curstate.origin, e->origin );
|
||||||
@@ -458,13 +482,13 @@ int CL_InterpolateModel( cl_entity_t *e )
|
|||||||
if( cl.maxclients <= 1 )
|
if( cl.maxclients <= 1 )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if( e->model->type == mod_brush && !cl_bmodelinterp->value )
|
if( e->model->type == mod_brush && !cl_bmodelinterp.value )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if( cl.local.moving && cl.local.onground == e->index )
|
if( cl.local.moving && cl.local.onground == e->index )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
t = cl.time - cl_interp->value;
|
t = cl.time - cl_interp.value;
|
||||||
CL_FindInterpolationUpdates( e, t, &ph0, &ph1 );
|
CL_FindInterpolationUpdates( e, t, &ph0, &ph1 );
|
||||||
|
|
||||||
if( ph0 == NULL || ph1 == NULL )
|
if( ph0 == NULL || ph1 == NULL )
|
||||||
@@ -483,7 +507,7 @@ int CL_InterpolateModel( cl_entity_t *e )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( t2 == t1 )
|
if( Q_equal( t2, t1 ))
|
||||||
{
|
{
|
||||||
VectorCopy( ph0->origin, e->origin );
|
VectorCopy( ph0->origin, e->origin );
|
||||||
VectorCopy( ph0->angles, e->angles );
|
VectorCopy( ph0->angles, e->angles );
|
||||||
@@ -521,14 +545,21 @@ interpolate non-local clients
|
|||||||
*/
|
*/
|
||||||
void CL_ComputePlayerOrigin( cl_entity_t *ent )
|
void CL_ComputePlayerOrigin( cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
float targettime;
|
double targettime;
|
||||||
vec4_t q, q1, q2;
|
vec4_t q, q1, q2;
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
|
|
||||||
if( !ent->player || ent->index == ( cl.playernum + 1 ))
|
if( !ent->player )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if( cl_nointerp.value > 0.f )
|
||||||
|
{
|
||||||
|
VectorCopy( ent->curstate.angles, ent->angles );
|
||||||
|
VectorCopy( ent->curstate.origin, ent->origin );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if( cls.demoplayback == DEMO_QUAKE1 )
|
if( cls.demoplayback == DEMO_QUAKE1 )
|
||||||
{
|
{
|
||||||
// quake lerping is easy
|
// quake lerping is easy
|
||||||
@@ -540,7 +571,7 @@ void CL_ComputePlayerOrigin( cl_entity_t *ent )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
targettime = cl.time - cl_interp->value;
|
targettime = cl.time - cl_interp.value;
|
||||||
CL_PureOrigin( ent, targettime, origin, angles );
|
CL_PureOrigin( ent, targettime, origin, angles );
|
||||||
|
|
||||||
VectorCopy( angles, ent->angles );
|
VectorCopy( angles, ent->angles );
|
||||||
@@ -554,7 +585,7 @@ CL_ProcessPlayerState
|
|||||||
process player states after the new packet has received
|
process player states after the new packet has received
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_ProcessPlayerState( int playerindex, entity_state_t *state )
|
static void CL_ProcessPlayerState( int playerindex, entity_state_t *state )
|
||||||
{
|
{
|
||||||
entity_state_t *ps;
|
entity_state_t *ps;
|
||||||
|
|
||||||
@@ -574,7 +605,7 @@ reset latched state if this frame entity was teleported
|
|||||||
or just EF_NOINTERP was set
|
or just EF_NOINTERP was set
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_ResetLatchedState( int pnum, frame_t *frame, cl_entity_t *ent )
|
static void CL_ResetLatchedState( int pnum, frame_t *frame, cl_entity_t *ent )
|
||||||
{
|
{
|
||||||
if( CHECKVISBIT( frame->flags, pnum ))
|
if( CHECKVISBIT( frame->flags, pnum ))
|
||||||
{
|
{
|
||||||
@@ -639,6 +670,24 @@ FRAME PARSING
|
|||||||
|
|
||||||
=========================================================================
|
=========================================================================
|
||||||
*/
|
*/
|
||||||
|
static qboolean CL_ParseEntityNumFromPacket( sizebuf_t *msg, int *newnum )
|
||||||
|
{
|
||||||
|
if( cls.legacymode )
|
||||||
|
{
|
||||||
|
*newnum = MSG_ReadWord( msg );
|
||||||
|
if( *newnum == 0 )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*newnum = MSG_ReadUBitLong( msg, MAX_ENTITY_BITS );
|
||||||
|
if( *newnum == LAST_EDICT )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
CL_FlushEntityPacket
|
CL_FlushEntityPacket
|
||||||
@@ -646,7 +695,7 @@ CL_FlushEntityPacket
|
|||||||
Read and ignore whole entity packet.
|
Read and ignore whole entity packet.
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_FlushEntityPacket( sizebuf_t *msg )
|
static void CL_FlushEntityPacket( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
int newnum;
|
int newnum;
|
||||||
entity_state_t from, to;
|
entity_state_t from, to;
|
||||||
@@ -659,8 +708,8 @@ void CL_FlushEntityPacket( sizebuf_t *msg )
|
|||||||
// read it all, but ignore it
|
// read it all, but ignore it
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
newnum = MSG_ReadUBitLong( msg, MAX_ENTITY_BITS );
|
if( !CL_ParseEntityNumFromPacket( msg, &newnum ))
|
||||||
if( newnum == LAST_EDICT ) break; // done
|
break; // done
|
||||||
|
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
Host_Error( "CL_FlushEntityPacket: overflow\n" );
|
Host_Error( "CL_FlushEntityPacket: overflow\n" );
|
||||||
@@ -676,7 +725,7 @@ CL_DeltaEntity
|
|||||||
processing delta update
|
processing delta update
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t *old, qboolean has_update )
|
static void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t *old, qboolean has_update )
|
||||||
{
|
{
|
||||||
cl_entity_t *ent;
|
cl_entity_t *ent;
|
||||||
entity_state_t *state;
|
entity_state_t *state;
|
||||||
@@ -782,7 +831,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( subtracted >= CL_UPDATE_MASK )
|
if( subtracted >= CL_UPDATE_MASK )
|
||||||
{
|
{
|
||||||
// we can't use this, it is too old
|
// we can't use this, it is too old
|
||||||
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
||||||
CL_FlushEntityPacket( msg );
|
CL_FlushEntityPacket( msg );
|
||||||
@@ -832,25 +881,16 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
int lastedict;
|
if( !CL_ParseEntityNumFromPacket( msg, &newnum ))
|
||||||
if( cls.legacymode )
|
break; // done
|
||||||
{
|
|
||||||
newnum = MSG_ReadWord( msg );
|
|
||||||
lastedict = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
newnum = MSG_ReadUBitLong( msg, MAX_ENTITY_BITS );
|
|
||||||
lastedict = LAST_EDICT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( newnum == lastedict ) break; // end of packet entities
|
|
||||||
if( MSG_CheckOverflow( msg ))
|
if( MSG_CheckOverflow( msg ))
|
||||||
Host_Error( "CL_ParsePacketEntities: overflow\n" );
|
Host_Error( "CL_ParsePacketEntities: overflow\n" );
|
||||||
|
|
||||||
player = CL_IsPlayerIndex( newnum );
|
player = CL_IsPlayerIndex( newnum );
|
||||||
|
|
||||||
while( oldnum < newnum )
|
while( oldnum < newnum )
|
||||||
{
|
{
|
||||||
// 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++;
|
oldindex++;
|
||||||
@@ -867,7 +907,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( oldnum == newnum )
|
if( oldnum == newnum )
|
||||||
{
|
{
|
||||||
// delta from previous state
|
// delta from previous state
|
||||||
bufStart = MSG_GetNumBytesRead( msg );
|
bufStart = MSG_GetNumBytesRead( msg );
|
||||||
CL_DeltaEntity( msg, newframe, newnum, oldent, true );
|
CL_DeltaEntity( msg, newframe, newnum, oldent, true );
|
||||||
@@ -887,7 +927,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( oldnum > newnum )
|
if( oldnum > newnum )
|
||||||
{
|
{
|
||||||
// delta from baseline ?
|
// delta from baseline ?
|
||||||
bufStart = MSG_GetNumBytesRead( msg );
|
bufStart = MSG_GetNumBytesRead( msg );
|
||||||
CL_DeltaEntity( msg, newframe, newnum, NULL, true );
|
CL_DeltaEntity( msg, newframe, newnum, NULL, true );
|
||||||
@@ -898,7 +938,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
|
|
||||||
// any remaining entities in the old frame are copied over
|
// any remaining entities in the old frame are copied over
|
||||||
while( oldnum != MAX_ENTNUMBER )
|
while( oldnum != MAX_ENTNUMBER )
|
||||||
{
|
{
|
||||||
// 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++;
|
oldindex++;
|
||||||
@@ -928,10 +968,10 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
|||||||
|
|
||||||
// first update is the final signon stage where we actually receive an entity (i.e., the world at least)
|
// first update is the final signon stage where we actually receive an entity (i.e., the world at least)
|
||||||
if( cls.signon == ( SIGNONS - 1 ))
|
if( cls.signon == ( SIGNONS - 1 ))
|
||||||
{
|
{
|
||||||
// we are done with signon sequence.
|
// we are done with signon sequence.
|
||||||
cls.signon = SIGNONS;
|
cls.signon = SIGNONS;
|
||||||
|
|
||||||
// Clear loading plaque.
|
// Clear loading plaque.
|
||||||
CL_SignonReply ();
|
CL_SignonReply ();
|
||||||
}
|
}
|
||||||
@@ -955,9 +995,25 @@ all the visible entities should pass this filter
|
|||||||
*/
|
*/
|
||||||
qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
|
qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
|
||||||
{
|
{
|
||||||
|
qboolean draw_player = true;
|
||||||
|
|
||||||
if( !ent || !ent->model )
|
if( !ent || !ent->model )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// don't add the player in firstperson mode
|
||||||
|
if( RP_LOCALCLIENT( ent ))
|
||||||
|
{
|
||||||
|
cl.local.apply_effects = true;
|
||||||
|
|
||||||
|
if( !CL_IsThirdPerson( ) && ( ent->index == cl.viewentity ))
|
||||||
|
{
|
||||||
|
// we don't draw player in default renderer in firstperson mode
|
||||||
|
// but let the client.dll know about player entity anyway
|
||||||
|
// for use in custom renderers
|
||||||
|
draw_player = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check for adding this entity
|
// check for adding this entity
|
||||||
if( !clgame.dllFuncs.pfnAddEntity( entityType, ent, ent->model->name ))
|
if( !clgame.dllFuncs.pfnAddEntity( entityType, ent, ent->model->name ))
|
||||||
{
|
{
|
||||||
@@ -967,8 +1023,7 @@ qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't add the player in firstperson mode
|
if( !draw_player )
|
||||||
if( RP_LOCALCLIENT( ent ) && !CL_IsThirdPerson( ) && ( ent->index == cl.viewentity ))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if( entityType == ET_BEAM )
|
if( entityType == ET_BEAM )
|
||||||
@@ -983,12 +1038,8 @@ qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
|
|||||||
|
|
||||||
// because pTemp->entity.curstate.effects
|
// because pTemp->entity.curstate.effects
|
||||||
// is already occupied by FTENT_FLICKER
|
// is already occupied by FTENT_FLICKER
|
||||||
if( entityType != ET_TEMPENTITY )
|
if( entityType != ET_TEMPENTITY && !RP_LOCALCLIENT( ent ) )
|
||||||
{
|
{
|
||||||
// no reason to do it twice
|
|
||||||
if( RP_LOCALCLIENT( ent ))
|
|
||||||
cl.local.apply_effects = false;
|
|
||||||
|
|
||||||
// apply client-side effects
|
// apply client-side effects
|
||||||
CL_AddEntityEffects( ent );
|
CL_AddEntityEffects( ent );
|
||||||
|
|
||||||
@@ -1006,7 +1057,7 @@ CL_LinkCustomEntity
|
|||||||
Add server beam to draw list
|
Add server beam to draw list
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_LinkCustomEntity( cl_entity_t *ent, entity_state_t *state )
|
static void CL_LinkCustomEntity( cl_entity_t *ent, entity_state_t *state )
|
||||||
{
|
{
|
||||||
ent->curstate.movetype = state->modelindex; // !!!
|
ent->curstate.movetype = state->modelindex; // !!!
|
||||||
|
|
||||||
@@ -1029,7 +1080,7 @@ Create visible entities in the correct position
|
|||||||
for all current players
|
for all current players
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
void CL_LinkPlayers( frame_t *frame )
|
static void CL_LinkPlayers( frame_t *frame )
|
||||||
{
|
{
|
||||||
entity_state_t *state;
|
entity_state_t *state;
|
||||||
cl_entity_t *ent;
|
cl_entity_t *ent;
|
||||||
@@ -1040,7 +1091,6 @@ void CL_LinkPlayers( frame_t *frame )
|
|||||||
// apply muzzleflash to weaponmodel
|
// apply muzzleflash to weaponmodel
|
||||||
if( ent && FBitSet( ent->curstate.effects, EF_MUZZLEFLASH ))
|
if( ent && FBitSet( ent->curstate.effects, EF_MUZZLEFLASH ))
|
||||||
SetBits( clgame.viewent.curstate.effects, EF_MUZZLEFLASH );
|
SetBits( clgame.viewent.curstate.effects, EF_MUZZLEFLASH );
|
||||||
cl.local.apply_effects = true;
|
|
||||||
|
|
||||||
// check all the clients but add only visible
|
// check all the clients but add only visible
|
||||||
for( i = 0, state = frame->playerstate; i < MAX_CLIENTS; i++, state++ )
|
for( i = 0, state = frame->playerstate; i < MAX_CLIENTS; i++, state++ )
|
||||||
@@ -1079,6 +1129,9 @@ void CL_LinkPlayers( frame_t *frame )
|
|||||||
|
|
||||||
if ( i == cl.playernum )
|
if ( i == cl.playernum )
|
||||||
{
|
{
|
||||||
|
// using interpolation only for local player angles
|
||||||
|
CL_ComputePlayerOrigin( ent );
|
||||||
|
|
||||||
if( cls.demoplayback == DEMO_QUAKE1 )
|
if( cls.demoplayback == DEMO_QUAKE1 )
|
||||||
VectorLerp( ent->prevstate.origin, cl.lerpFrac, ent->curstate.origin, cl.simorg );
|
VectorLerp( ent->prevstate.origin, cl.lerpFrac, ent->curstate.origin, cl.simorg );
|
||||||
VectorCopy( cl.simorg, ent->origin );
|
VectorCopy( cl.simorg, ent->origin );
|
||||||
@@ -1110,7 +1163,7 @@ CL_LinkPacketEntities
|
|||||||
|
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void CL_LinkPacketEntities( frame_t *frame )
|
static void CL_LinkPacketEntities( frame_t *frame )
|
||||||
{
|
{
|
||||||
cl_entity_t *ent;
|
cl_entity_t *ent;
|
||||||
entity_state_t *state;
|
entity_state_t *state;
|
||||||
@@ -1175,17 +1228,33 @@ void CL_LinkPacketEntities( frame_t *frame )
|
|||||||
#else
|
#else
|
||||||
if( ent->lastmove >= cl.time )
|
if( ent->lastmove >= cl.time )
|
||||||
{
|
{
|
||||||
|
float at = ent->curstate.animtime;
|
||||||
|
|
||||||
CL_ResetLatchedVars( ent, true );
|
CL_ResetLatchedVars( ent, true );
|
||||||
|
|
||||||
|
if( cl_fixmodelinterpolationartifacts.value )
|
||||||
|
ent->latched.prevanimtime = ent->curstate.animtime = at;
|
||||||
|
|
||||||
VectorCopy( ent->curstate.origin, ent->latched.prevorigin );
|
VectorCopy( ent->curstate.origin, ent->latched.prevorigin );
|
||||||
VectorCopy( ent->curstate.angles, ent->latched.prevangles );
|
VectorCopy( ent->curstate.angles, ent->latched.prevangles );
|
||||||
|
|
||||||
// disable step interpolation in client.dll
|
if( !FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||||
ent->curstate.movetype = MOVETYPE_NONE;
|
{
|
||||||
|
// disable step interpolation in client.dll
|
||||||
|
ent->curstate.movetype = MOVETYPE_NONE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// restore step interpolation in client.dll
|
if( FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||||
ent->curstate.movetype = MOVETYPE_STEP;
|
{
|
||||||
|
interpolate = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// restore step interpolation in client.dll
|
||||||
|
ent->curstate.movetype = MOVETYPE_STEP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1210,11 +1279,24 @@ void CL_LinkPacketEntities( frame_t *frame )
|
|||||||
if ( !CL_InterpolateModel( ent ))
|
if ( !CL_InterpolateModel( ent ))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if( ent->curstate.movetype == MOVETYPE_STEP && !NET_IsLocalAddress( cls.netchan.remote_address ))
|
// a1ba: in GoldSrc this is done for cstrike and czero
|
||||||
|
// but let modders use this as an engine feature
|
||||||
|
else if( FBitSet( host.features, ENGINE_STEP_POSHISTORY_LERP ) &&
|
||||||
|
ent->curstate.movetype == MOVETYPE_STEP && !NET_IsLocalAddress( cls.netchan.remote_address ))
|
||||||
{
|
{
|
||||||
if( !CL_InterpolateModel( ent ))
|
if( !CL_InterpolateModel( ent ))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
|
// ABSOLUTELY STUPID HACK TO ALLOW MONSTERS
|
||||||
|
// INTERPOLATION IN GRAVGUNMOD COOP
|
||||||
|
// MUST BE REMOVED ONCE WE REMOVE 48 PROTO SUPPORT
|
||||||
|
else if( cls.legacymode && ent->model->type == mod_studio && ent->curstate.movetype == MOVETYPE_TOSS )
|
||||||
|
{
|
||||||
|
if( !CL_InterpolateModel( ent ))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no interpolation right now
|
// no interpolation right now
|
||||||
@@ -1224,7 +1306,7 @@ void CL_LinkPacketEntities( frame_t *frame )
|
|||||||
|
|
||||||
if( ent->model->type == mod_studio )
|
if( ent->model->type == mod_studio )
|
||||||
{
|
{
|
||||||
if( interpolate && FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
if( interpolate && FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||||
ref.dllFuncs.R_StudioLerpMovement( ent, cl.time, ent->origin, ent->angles );
|
ref.dllFuncs.R_StudioLerpMovement( ent, cl.time, ent->origin, ent->angles );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1368,17 +1450,19 @@ qboolean CL_GetEntitySpatialization( channel_t *ch )
|
|||||||
ent = CL_GetEntityByIndex( ch->entnum );
|
ent = CL_GetEntityByIndex( ch->entnum );
|
||||||
|
|
||||||
// entity is not present on the client but has valid origin
|
// entity is not present on the client but has valid origin
|
||||||
if( !ent || !ent->index || ent->curstate.messagenum == 0 )
|
if( !ent || !ent->model || ent->curstate.messagenum != cl.parsecount )
|
||||||
return valid_origin;
|
return valid_origin;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// uncomment this if you want enable additional check by PVS
|
|
||||||
if( ent->curstate.messagenum != cl.parsecount )
|
|
||||||
return valid_origin;
|
|
||||||
#endif
|
|
||||||
// setup origin
|
// setup origin
|
||||||
VectorAverage( ent->curstate.mins, ent->curstate.maxs, ch->origin );
|
if( ent->model->type == mod_brush )
|
||||||
VectorAdd( ch->origin, ent->curstate.origin, ch->origin );
|
{
|
||||||
|
VectorAverage( ent->model->mins, ent->model->maxs, ch->origin );
|
||||||
|
VectorAdd( ent->origin, ch->origin, ch->origin );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VectorCopy( ent->origin, ch->origin );
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1396,18 +1480,15 @@ qboolean CL_GetMovieSpatialization( rawchan_t *ch )
|
|||||||
return valid_origin;
|
return valid_origin;
|
||||||
|
|
||||||
// setup origin
|
// setup origin
|
||||||
VectorAverage( ent->curstate.mins, ent->curstate.maxs, ch->origin );
|
if( ent->model->type == mod_brush )
|
||||||
VectorAdd( ch->origin, ent->curstate.origin, ch->origin );
|
{
|
||||||
|
VectorAverage( ent->model->mins, ent->model->maxs, ch->origin );
|
||||||
// setup radius
|
VectorAdd( ent->origin, ch->origin, ch->origin );
|
||||||
if( ent->model != NULL && ent->model->radius ) ch->radius = ent->model->radius;
|
}
|
||||||
else ch->radius = RadiusFromBounds( ent->curstate.mins, ent->curstate.maxs );
|
else
|
||||||
|
{
|
||||||
|
VectorCopy( ent->origin, ch->origin );
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_ExtraUpdate( void )
|
|
||||||
{
|
|
||||||
clgame.dllFuncs.IN_Accumulate();
|
|
||||||
S_ExtraUpdate();
|
|
||||||
}
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user