mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 11:35:05 +08:00
Compare commits
2014 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc31c6588e | ||
|
|
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 | ||
|
|
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 | ||
|
|
da65cc99d9 | ||
|
|
7dde4c03a7 | ||
|
|
326a7d79f0 | ||
|
|
dd3fcb6461 | ||
|
|
fa90dbbd5e | ||
|
|
dd1daa5bff | ||
|
|
154dd5c9ae | ||
|
|
2ee7367567 | ||
|
|
3da10f28c4 | ||
|
|
612e7560ae | ||
|
|
fe362a1ab5 | ||
|
|
8399107826 | ||
|
|
077bc7323c | ||
|
|
6f2b559c5a | ||
|
|
fec0a6baf6 | ||
|
|
ac75bdf2d4 | ||
|
|
56859e03c3 | ||
|
|
959e10f720 | ||
|
|
0991255534 | ||
|
|
199d3fd422 | ||
|
|
c07109e69c | ||
|
|
08e7bb1bf4 | ||
|
|
d0010cf9cb | ||
|
|
ecd675926a | ||
|
|
0c3be639c5 | ||
|
|
3a9801853d | ||
|
|
3907be3c8f | ||
|
|
9421457b3a | ||
|
|
ac4a14ef6c | ||
|
|
c613118199 | ||
|
|
755db4d56b | ||
|
|
2e180d5548 | ||
|
|
bf9840c2a8 | ||
|
|
f56887bde9 | ||
|
|
23fe1c0985 | ||
|
|
5266f17d56 | ||
|
|
744f75d4a3 | ||
|
|
37435365e2 | ||
|
|
94fc0febc7 | ||
|
|
6f58ef2394 | ||
|
|
177f8ed653 | ||
|
|
09203dc512 | ||
|
|
3c3d5d472e | ||
|
|
4c6e64c89b | ||
|
|
7afee98f99 | ||
|
|
f562926aaa | ||
|
|
b25c83edc4 | ||
|
|
c42b5e043d | ||
|
|
1e5921d33f | ||
|
|
663344eeaa | ||
|
|
e4e34cc835 | ||
|
|
b36fc0e2ae | ||
|
|
924d6ada60 | ||
|
|
8343cadd30 | ||
|
|
0636dc45bd | ||
|
|
611ee64cd9 | ||
|
|
5a17e7f425 | ||
|
|
db39f0cc88 | ||
|
|
3f48bce7da | ||
|
|
936b491248 | ||
|
|
428e8ef427 | ||
|
|
934dffd273 | ||
|
|
0c34a5081c | ||
|
|
f09682131f | ||
|
|
32ddc2a47f | ||
|
|
729f534614 | ||
|
|
6937d0c17e | ||
|
|
4dba8219ca | ||
|
|
f8b0ec8c4b | ||
|
|
ce20da28e1 | ||
|
|
40ed87d8de | ||
|
|
5bae732818 | ||
|
|
08b3de08e7 | ||
|
|
a51c5d93fc | ||
|
|
55dbb2ca3f | ||
|
|
4b930c7854 | ||
|
|
d68823708f | ||
|
|
4b5d09a968 | ||
|
|
7e4a7ac23d | ||
|
|
62cdf2ae5b | ||
|
|
94c42160b7 | ||
|
|
18bbfebc5d | ||
|
|
d18cb1f74c | ||
|
|
2807841511 | ||
|
|
13ed8d4529 | ||
|
|
1ff06c2c1e | ||
|
|
0cb591821a | ||
|
|
8700f44175 | ||
|
|
6ba73a732a | ||
|
|
4b97d8bcda | ||
|
|
0dc6f1674f | ||
|
|
6bc6f0dd70 | ||
|
|
39abd82e5d | ||
|
|
15924aebaa | ||
|
|
b79c95d295 | ||
|
|
453c0d890d | ||
|
|
60f0f68e68 | ||
|
|
79adaa11e0 | ||
|
|
6819050d91 | ||
|
|
d2740f78c1 | ||
|
|
d4efb55492 | ||
|
|
6953e829c4 | ||
|
|
ef270eb642 | ||
|
|
d1af73bfcb | ||
|
|
1365020302 | ||
|
|
0e7013eeb0 | ||
|
|
a3a0db447b | ||
|
|
a46e459124 | ||
|
|
dfed24c290 | ||
|
|
1f308a43c8 | ||
|
|
2062e55c6a | ||
|
|
90038d2924 | ||
|
|
9aff6ca633 | ||
|
|
6aa61657e0 | ||
|
|
2958b14cc2 | ||
|
|
aa6674b032 | ||
|
|
7a7bca2991 | ||
|
|
7e9f90a09d | ||
|
|
5e8373fa46 | ||
|
|
9d826016b0 | ||
|
|
7f1dd248c2 | ||
|
|
4d5e7c0557 | ||
|
|
9e99a2bc37 | ||
|
|
8dafbaeda2 | ||
|
|
ae35f15f15 | ||
|
|
0dd91ceda2 | ||
|
|
d6f8112860 | ||
|
|
3589537147 | ||
|
|
26b8a1fe1d | ||
|
|
a1db6c6a9b | ||
|
|
271d15f989 | ||
|
|
00e5d42459 | ||
|
|
291fdfac68 | ||
|
|
5e31e3fad0 | ||
|
|
609235b4f1 | ||
|
|
b3ad557dd2 | ||
|
|
7f6395fa7d | ||
|
|
aee9f454fc | ||
|
|
e3c3b05396 | ||
|
|
6e637456ef | ||
|
|
9c7c279a5b | ||
|
|
5e5ffec67d | ||
|
|
06cadacb59 | ||
|
|
cb8e0a50bc | ||
|
|
b3a5283517 | ||
|
|
5348046109 | ||
|
|
57d48b64eb | ||
|
|
5145b1956c | ||
|
|
bb48e5209e | ||
|
|
37cba10c14 | ||
|
|
1decb1c7fb | ||
|
|
ba1347a8ce | ||
|
|
feb01b270e | ||
|
|
114a256675 | ||
|
|
2897e5f17e | ||
|
|
6723758edc | ||
|
|
23956a0b82 | ||
|
|
93a43ae9a5 | ||
|
|
8905e7cbb7 | ||
|
|
bf8b87c29d | ||
|
|
803c396fa2 | ||
|
|
0933261898 | ||
|
|
e93d362391 | ||
|
|
2b13de80bf | ||
|
|
2c67f4cb39 | ||
|
|
4705683ebc | ||
|
|
78baf568ae | ||
|
|
1218f4aeb6 | ||
|
|
531c6cc375 | ||
|
|
edf3fcd398 | ||
|
|
c67f065d90 | ||
|
|
148846c02d | ||
|
|
8afb2dbdec | ||
|
|
14be566401 | ||
|
|
0577ecbccf | ||
|
|
880dd2546f | ||
|
|
c2063c869d | ||
|
|
49a133514a | ||
|
|
94dc801150 | ||
|
|
fe118e9683 | ||
|
|
e0d993a5a8 | ||
|
|
cf35943f51 | ||
|
|
cd715178d2 | ||
|
|
869b684536 | ||
|
|
bc56ce754b | ||
|
|
32897450fc | ||
|
|
e0e9942bd5 | ||
|
|
fdbd1c5658 | ||
|
|
eaf983c054 | ||
|
|
e11eeb24fc | ||
|
|
6dcd8c3af8 | ||
|
|
d68eab6b65 | ||
|
|
8ec6eaa49a | ||
|
|
a38f561d7c | ||
|
|
cb404b2730 | ||
|
|
83d3c02e53 | ||
|
|
f376d5d59c | ||
|
|
2493659b23 | ||
|
|
e1efacb399 | ||
|
|
05d793c34b | ||
|
|
86867dcbe3 | ||
|
|
8be58bcd21 | ||
|
|
06e38b45c8 | ||
|
|
d3dd671759 | ||
|
|
e0b8c338a8 | ||
|
|
ee363ebb74 | ||
|
|
e4bb3ecd12 | ||
|
|
d05bfb55c5 | ||
|
|
9c26983136 | ||
|
|
fa622168a0 | ||
|
|
eff814b148 | ||
|
|
11c373a183 | ||
|
|
898b697b70 | ||
|
|
6d8026cd81 | ||
|
|
1e7abdc144 | ||
|
|
ff1b28244b | ||
|
|
7782fa09ac | ||
|
|
ae624801ac | ||
|
|
8889bda261 | ||
|
|
c8eac04e9b | ||
|
|
a5fa4df37c | ||
|
|
d96dcfba59 | ||
|
|
690a317f4f | ||
|
|
9c4a0d2397 | ||
|
|
2183240221 | ||
|
|
33800954ec | ||
|
|
67cb5a4dde | ||
|
|
9fd7e333df | ||
|
|
a9628cc0f0 | ||
|
|
f33de46508 | ||
|
|
595d452c23 | ||
|
|
911e670be6 | ||
|
|
9ea973dad6 | ||
|
|
fcdd45341c | ||
|
|
53d2d10932 | ||
|
|
88772a1c34 | ||
|
|
1c21590e96 | ||
|
|
d2a8cfe614 | ||
|
|
39ff3b199a | ||
|
|
ddf070b63d | ||
|
|
4c559a4a08 | ||
|
|
fa16c49246 | ||
|
|
d382f6886d | ||
|
|
02e111c5e1 | ||
|
|
73516eea4c | ||
|
|
6e2dbd4e1c | ||
|
|
67cdbef833 | ||
|
|
d6bb72f772 | ||
|
|
e6dd4882cc | ||
|
|
cb62e65f9f | ||
|
|
cb5e282af4 | ||
|
|
b175d8a0cb | ||
|
|
fbb88a55cb | ||
|
|
f3a40ac794 | ||
|
|
dc207a449c | ||
|
|
5a8de90918 | ||
|
|
2d6b770e7c | ||
|
|
409eee3bb4 | ||
|
|
ac5bb86301 | ||
|
|
530d376c44 | ||
|
|
b777ba9549 | ||
|
|
bc39b707d4 | ||
|
|
cb0791c915 | ||
|
|
03c73f56d2 | ||
|
|
94d0c78913 | ||
|
|
34463dcddc | ||
|
|
da11da97ad | ||
|
|
c0043a5467 | ||
|
|
7770b1a82b | ||
|
|
faf592adb4 | ||
|
|
0aa57854ca | ||
|
|
fd8c1becec | ||
|
|
0afc3d83c6 | ||
|
|
d633fe5deb | ||
|
|
5040cb83d0 | ||
|
|
2b385ff1f4 | ||
|
|
cd5028eed1 | ||
|
|
3ce014d5f5 | ||
|
|
75aaf1c66d | ||
|
|
26401a4fbf | ||
|
|
dba757f0c2 | ||
|
|
7f3ee9ca71 | ||
|
|
9a1414505a | ||
|
|
13c1e807ad | ||
|
|
6e95e19589 | ||
|
|
8f47596ad0 | ||
|
|
4f4c63b1dd | ||
|
|
66323fe9ca | ||
|
|
16e60bbb5f | ||
|
|
0389d2495f | ||
|
|
4049c54511 | ||
|
|
e8006c3253 | ||
|
|
07aa9595c0 | ||
|
|
b91e97ca53 | ||
|
|
cd0f7af38a | ||
|
|
ac1bf4a9f8 | ||
|
|
af0046f401 | ||
|
|
43575b485d | ||
|
|
67c6cfce71 | ||
|
|
5986874be2 | ||
|
|
cf17b4f63c | ||
|
|
d1ac48b2a1 | ||
|
|
3032ce3bee | ||
|
|
ba69f9e62a | ||
|
|
8323df240b | ||
|
|
a1ae770f70 | ||
|
|
56938344b8 | ||
|
|
a862e641f1 | ||
|
|
00b9ac676e | ||
|
|
8bb6aa2c51 | ||
|
|
505392c2f8 | ||
|
|
37f9c25212 | ||
|
|
ee2c1ad8fa | ||
|
|
7771356e66 | ||
|
|
cb417a3d51 | ||
|
|
01dcb52b4c | ||
|
|
24adb6e3e0 | ||
|
|
d992f8525b | ||
|
|
7be094b563 | ||
|
|
386a68e334 | ||
|
|
ca57c8424d | ||
|
|
214f53b8a7 | ||
|
|
143310bdb7 | ||
|
|
dc8b8ccab3 | ||
|
|
e3c095a3fa | ||
|
|
61f49938e5 | ||
|
|
d697421d81 | ||
|
|
f71619d541 | ||
|
|
0eb1d4c7c0 | ||
|
|
5cfe9ef181 | ||
|
|
d790292829 | ||
|
|
fce0ef6ad2 | ||
|
|
f9269dcc1c | ||
|
|
4b163e6d30 | ||
|
|
147c702f2f | ||
|
|
b1f23f9ff6 | ||
|
|
53eb569216 | ||
|
|
7c8105247c | ||
|
|
35ae421ac1 | ||
|
|
e3e161f281 | ||
|
|
8f9800eb3c | ||
|
|
a5593963c5 | ||
|
|
e308281b0b | ||
|
|
0ce8d92f27 | ||
|
|
938a9f372f | ||
|
|
a0514c242b | ||
|
|
b96eb14cf7 | ||
|
|
1636d36dc2 | ||
|
|
9bb2870e38 | ||
|
|
d9545e5e78 | ||
|
|
827105405f | ||
|
|
2f8fec6b70 | ||
|
|
20ecfcd8e0 | ||
|
|
b539ed5a3d | ||
|
|
4eab7d6503 | ||
|
|
8a4239d48d | ||
|
|
cedc1e0eb2 | ||
|
|
4beba75159 | ||
|
|
a0cbac4fc7 | ||
|
|
9662ab106f | ||
|
|
4e4a9827b1 | ||
|
|
04ee7c3a55 | ||
|
|
a85a856215 | ||
|
|
9e30fc253f | ||
|
|
b2895770b8 | ||
|
|
37255354d4 | ||
|
|
661b53d0b3 | ||
|
|
56e256fc86 | ||
|
|
1f7dfecf89 | ||
|
|
6f121b90c1 | ||
|
|
2d48e73f9d | ||
|
|
58a747e8ac | ||
|
|
3bf5f19446 | ||
|
|
da4062ede9 | ||
|
|
e700a7498e | ||
|
|
6f27d05361 | ||
|
|
baefab7e3d | ||
|
|
7dda1c28f4 | ||
|
|
364c96f45c | ||
|
|
7aa163f713 | ||
|
|
62fb743a20 | ||
|
|
40211efa9a | ||
|
|
be98a228a7 | ||
|
|
1f7171462b | ||
|
|
511d728337 | ||
|
|
61b39f4257 | ||
|
|
3e4bd20919 | ||
|
|
7d10660b87 | ||
|
|
6aa4765c3e | ||
|
|
fa68108907 | ||
|
|
771c09226e | ||
|
|
8d0ea1d03e | ||
|
|
83953c7fb3 | ||
|
|
8b94443ba2 | ||
|
|
5e8d3acc51 | ||
|
|
d347096396 | ||
|
|
54920f13df | ||
|
|
d01a33814c | ||
|
|
efd2e434b4 | ||
|
|
2202e13a61 | ||
|
|
7702a7a8d0 | ||
|
|
8320f0598f | ||
|
|
165c1622f8 | ||
|
|
b8c0d7f59e | ||
|
|
6197ba8af6 | ||
|
|
89a3fd6323 | ||
|
|
ec18dd9535 | ||
|
|
bb4c73b25c | ||
|
|
90e0c070ac | ||
|
|
83b7f795c1 | ||
|
|
0366035237 | ||
|
|
a8f7b4fc5c | ||
|
|
f2d588574c | ||
|
|
0579ecd30f | ||
|
|
b5d9bf5dc8 | ||
|
|
413882a8d5 | ||
|
|
c92f8f71a7 | ||
|
|
a378379ac5 | ||
|
|
bcb4c9a722 | ||
|
|
eb22ff53c4 | ||
|
|
b1406e8ecd | ||
|
|
4eee187f1b | ||
|
|
76a8fe4873 | ||
|
|
f010e2be12 | ||
|
|
7484c51490 | ||
|
|
96c4044a6c | ||
|
|
3d9a97348e | ||
|
|
81b6c1c333 | ||
|
|
a62cb2a93f | ||
|
|
e9f26fe29d | ||
|
|
3ae7ecaeb3 | ||
|
|
75e690791d | ||
|
|
f2c927906f | ||
|
|
61751cc306 | ||
|
|
ba11b849ed | ||
|
|
014a09e222 | ||
|
|
b535c24edb | ||
|
|
8d2bea03e0 | ||
|
|
497ae6d269 | ||
|
|
e7eeba1de0 | ||
|
|
d14ce5ac39 | ||
|
|
76dae35955 | ||
|
|
70d45f23de | ||
|
|
9735dedf2f | ||
|
|
a8cc5b7cef | ||
|
|
003bbea358 | ||
|
|
5be28ce93d | ||
|
|
647b2658d1 | ||
|
|
85240f0145 | ||
|
|
9119635ed3 | ||
|
|
ab16867f6b | ||
|
|
73cf465ce4 | ||
|
|
37181e410f | ||
|
|
1ffc593993 | ||
|
|
8ef383a4d3 | ||
|
|
3023c8a72b | ||
|
|
9b68b0c1e2 | ||
|
|
01a33dcf7e | ||
|
|
4000654deb | ||
|
|
90ff7f24b3 | ||
|
|
b42f020ad5 | ||
|
|
6422005716 | ||
|
|
efc9048b43 | ||
|
|
12bc507156 | ||
|
|
f9a7ffa5e8 | ||
|
|
b9a2f58e23 | ||
|
|
b146f495fc | ||
|
|
4a1f441151 | ||
|
|
94ec8cb997 | ||
|
|
621e33fde2 | ||
|
|
db72378806 | ||
|
|
d596f4ea52 | ||
|
|
6f2016db06 | ||
|
|
27e742df12 | ||
|
|
86d823b877 | ||
|
|
82697ca2a9 | ||
|
|
4606a18b25 | ||
|
|
9145589414 | ||
|
|
1d78d7c720 | ||
|
|
1cc2ec9095 | ||
|
|
5cf4e34607 | ||
|
|
b32de42ab7 | ||
|
|
b04a48f126 | ||
|
|
3c0a34926a | ||
|
|
039b42868d | ||
|
|
671c247381 | ||
|
|
9048c108c4 | ||
|
|
b797e0af1a | ||
|
|
85b5b4e965 | ||
|
|
74062fab12 | ||
|
|
67ce4cfbef | ||
|
|
fe464af3ff | ||
|
|
45b091028b | ||
|
|
00619d5795 | ||
|
|
a2cba95a3a | ||
|
|
fd962869e6 | ||
|
|
2e953bd1a9 | ||
|
|
57f9e7dda6 | ||
|
|
d14ce61520 | ||
|
|
5af6506d86 | ||
|
|
e9e4a1296d | ||
|
|
85c2126775 | ||
|
|
a1391f3d0b | ||
|
|
bb8ba4225c | ||
|
|
7d3e8c0a57 | ||
|
|
55c3040db1 | ||
|
|
90e4fbed31 | ||
|
|
4819790272 | ||
|
|
f904ba53e2 | ||
|
|
e06b7412ac | ||
|
|
dec1b8dfb4 | ||
|
|
c9b5332d16 | ||
|
|
fe14a360b4 | ||
|
|
ab7a67464b | ||
|
|
29a48cb34c | ||
|
|
3fef353291 | ||
|
|
1a700fd06b | ||
|
|
e3e2f3afe5 | ||
|
|
87f380b90c | ||
|
|
3ebb4d0ea3 | ||
|
|
d4b4a4a864 | ||
|
|
7663da80c3 | ||
|
|
bd6532fae4 | ||
|
|
25235b5296 | ||
|
|
103077b686 | ||
|
|
fbef500fb3 | ||
|
|
37ee9752e1 | ||
|
|
2c17af4850 | ||
|
|
7d8b63fd88 | ||
|
|
5be982cc72 | ||
|
|
2d968cf328 | ||
|
|
4d9563ea03 | ||
|
|
a6572dd042 | ||
|
|
d62a12dd9a | ||
|
|
8a99d64139 | ||
|
|
99478ba9bd | ||
|
|
1c0262a8c4 | ||
|
|
211d3c5213 | ||
|
|
20c7c36996 | ||
|
|
228dab5965 | ||
|
|
4b955a320b | ||
|
|
ee67d350e3 | ||
|
|
60e3a78221 | ||
|
|
b2105a113c | ||
|
|
c293a7a26d | ||
|
|
d5911b33b1 | ||
|
|
f1638b09c5 | ||
|
|
741fcfb202 | ||
|
|
54d54b1457 | ||
|
|
d5b6ccb3e2 | ||
|
|
6448964c37 | ||
|
|
46378e3738 | ||
|
|
b2038e76d3 | ||
|
|
eb650b71ad | ||
|
|
968994bba5 | ||
|
|
3c1c13850e | ||
|
|
459f4a9788 | ||
|
|
d17fdea884 | ||
|
|
b20efff57c | ||
|
|
36159e6622 | ||
|
|
c953ba0852 | ||
|
|
b38ef43260 | ||
|
|
fea2395a80 | ||
|
|
ffaab11da9 | ||
|
|
f6b3603934 | ||
|
|
9421963b29 | ||
|
|
239c13da28 | ||
|
|
eb6f67ed07 | ||
|
|
c206e72f7b | ||
|
|
79e6ebbe23 | ||
|
|
d4638a9cf4 | ||
|
|
7ccc9b0795 | ||
|
|
6c1d911193 | ||
|
|
9587aacee3 | ||
|
|
777562aea8 | ||
|
|
a40d64d3a6 | ||
|
|
7704d9b2ef | ||
|
|
d87dd2a60a | ||
|
|
6403a265de | ||
|
|
3fa4a36983 | ||
|
|
8b16c30fb8 | ||
|
|
20a177c783 | ||
|
|
0840d9ec25 | ||
|
|
4124e01d65 | ||
|
|
129325f3a4 | ||
|
|
9cd22a98bd | ||
|
|
6a6d21ed32 | ||
|
|
041315da44 | ||
|
|
aa30661c26 | ||
|
|
031bac8d13 | ||
|
|
4dae13d7bc | ||
|
|
5140bb8d7f | ||
|
|
320a3b0834 | ||
|
|
79405c7cc9 | ||
|
|
99fa5d0252 | ||
|
|
b584e89d90 | ||
|
|
7f1491f884 | ||
|
|
0cf1e3b1da | ||
|
|
441795943b | ||
|
|
a9cf3357c7 | ||
|
|
9fbb8a8201 | ||
|
|
4aa5778606 | ||
|
|
338b404055 | ||
|
|
500ff629bf | ||
|
|
033a947631 | ||
|
|
c08c35df69 | ||
|
|
cefe42fd66 | ||
|
|
e0cd5edddb | ||
|
|
ebd1da2730 | ||
|
|
4bbcd5daef | ||
|
|
8d88ecb951 | ||
|
|
b5e1382232 | ||
|
|
8f5c72c510 | ||
|
|
c52453faa3 | ||
|
|
8c9aa2588c | ||
|
|
d03d29f6f5 | ||
|
|
77f8da275a | ||
|
|
84761e62ff | ||
|
|
60a1c4f0cc | ||
|
|
0c6c0003b1 | ||
|
|
1c49d76fb7 | ||
|
|
714084bf5b | ||
|
|
2efdf56317 | ||
|
|
7fc09da482 | ||
|
|
d315a838bd | ||
|
|
6879c1f097 | ||
|
|
25860f6263 | ||
|
|
c52d4b7998 | ||
|
|
0c62967d8a | ||
|
|
f34db62940 | ||
|
|
77b23eec9f | ||
|
|
f4bcea6182 | ||
|
|
ea6a86a83d | ||
|
|
47879942bb | ||
|
|
6c006e087d | ||
|
|
8385563bef | ||
|
|
f9f96552b7 | ||
|
|
b0ed8a5ba3 | ||
|
|
ca3913cd88 | ||
|
|
8b07916598 | ||
|
|
5f122a7435 | ||
|
|
50c656df94 | ||
|
|
5436658ce7 | ||
|
|
d7ea40d850 | ||
|
|
184ca6517c | ||
|
|
f4c36f49db | ||
|
|
ae26783902 | ||
|
|
45fdd74dd2 | ||
|
|
880a9651d8 | ||
|
|
95ff769020 | ||
|
|
9b158f5926 | ||
|
|
29c2169012 | ||
|
|
db30358d06 | ||
|
|
ebbe22b09a | ||
|
|
752dd13c04 | ||
|
|
469a080000 | ||
|
|
efc12f1045 | ||
|
|
becb58223a | ||
|
|
56ef16b0f9 | ||
|
|
eeda097603 | ||
|
|
77e296ffef | ||
|
|
f48335f2f2 | ||
|
|
8b5926f9b1 | ||
|
|
72d5dfed34 | ||
|
|
7f8caf1634 | ||
|
|
1871f39b2b | ||
|
|
6eae7acd34 | ||
|
|
36a5247181 | ||
|
|
153b8cbcc3 | ||
|
|
44a8ede94d | ||
|
|
529bb53d52 | ||
|
|
b35415637b | ||
|
|
35e42a2295 | ||
|
|
0b13bf393f | ||
|
|
58b5e1a9df | ||
|
|
dbabb861f2 | ||
|
|
224bf07930 | ||
|
|
870ae030ca | ||
|
|
9ba39f65b3 | ||
|
|
3d8fe065b5 | ||
|
|
513381a322 | ||
|
|
c36f415793 | ||
|
|
17f719558c | ||
|
|
3617e8e7a1 | ||
|
|
70abee3e28 | ||
|
|
37defbbd14 | ||
|
|
65cf77c32b | ||
|
|
e0ce5640d1 | ||
|
|
e7f369a765 | ||
|
|
58429bbc79 | ||
|
|
5fc39662ec | ||
|
|
4c73f026b2 | ||
|
|
932ad73441 | ||
|
|
bf0d694c71 | ||
|
|
a2e689aba3 | ||
|
|
c82eb39d54 | ||
|
|
a00256a61c | ||
|
|
842a15ee45 | ||
|
|
e7785c9ccb | ||
|
|
62f04137a5 | ||
|
|
5f849c4823 | ||
|
|
b09242e41c | ||
|
|
1538bc609d | ||
|
|
26616314f8 | ||
|
|
1483b21f00 | ||
|
|
743c5ca8d5 | ||
|
|
92b89936b3 | ||
|
|
2b521ee201 | ||
|
|
8abbef8dbd | ||
|
|
59f3b63e0a | ||
|
|
6a6f341c07 | ||
|
|
ce27aad67b | ||
|
|
6784b9062e | ||
|
|
f23ecc6895 | ||
|
|
ae6b460f35 | ||
|
|
402a596415 | ||
|
|
52eb84d34b | ||
|
|
f3a2f46fb3 | ||
|
|
4880ca3ca2 | ||
|
|
121c72c9e0 | ||
|
|
e20e114643 | ||
|
|
7e08104631 | ||
|
|
7aa7f4dbbd | ||
|
|
fb6fd61cd9 | ||
|
|
1ca28badad | ||
|
|
34da3e0ccd | ||
|
|
0a22040c6e | ||
|
|
c55b7dcda7 | ||
|
|
78f8932313 | ||
|
|
f00181223f | ||
|
|
bf2f829382 | ||
|
|
297ca08e81 | ||
|
|
8339096ad8 | ||
|
|
3d39d78e53 | ||
|
|
00ce909fc8 | ||
|
|
aabf5f5621 | ||
|
|
9c6352ec57 | ||
|
|
7382fc7c49 | ||
|
|
5fa9632ec0 | ||
|
|
db78726656 | ||
|
|
57320c0c25 | ||
|
|
31ab710485 | ||
|
|
4247af8fa8 | ||
|
|
e5000742f1 | ||
|
|
971f9b6de5 | ||
|
|
199ebfed48 | ||
|
|
97aba69ed0 | ||
|
|
234507b7f1 | ||
|
|
d0d5fd1a3f | ||
|
|
e7234bada2 | ||
|
|
94cbb4e1e0 | ||
|
|
437ba6d7a2 | ||
|
|
574f03c139 | ||
|
|
c3abec5127 | ||
|
|
a69bda0b9b | ||
|
|
576b78799e | ||
|
|
faee030740 | ||
|
|
8b5c5826a8 | ||
|
|
e193ac2c04 | ||
|
|
ee4744e7cd | ||
|
|
142a38f3dc | ||
|
|
e50b91b559 | ||
|
|
2bf2b95b3a | ||
|
|
94cfe1217a | ||
|
|
dbb4b2c1f9 | ||
|
|
6ede01ea05 | ||
|
|
2ecfa20f94 | ||
|
|
48808e4ede | ||
|
|
955dde6d5f | ||
|
|
7299ee9f11 | ||
|
|
5e17b4bf17 | ||
|
|
2c17dce25b | ||
|
|
1b372115a5 | ||
|
|
99bd7c81da | ||
|
|
2b1ed2b20a | ||
|
|
f7c60ea9d1 | ||
|
|
119b458b0f | ||
|
|
d913ef0fc4 | ||
|
|
bccc0e63d5 | ||
|
|
23d0f33ad1 | ||
|
|
ddd17fe238 | ||
|
|
b1e3fa5f4d | ||
|
|
e99ca5947b | ||
|
|
932cf03a29 | ||
|
|
c09190f66e | ||
|
|
1d9b5d4611 | ||
|
|
e05c1ed912 | ||
|
|
7b36796f41 | ||
|
|
69bb25bb18 | ||
|
|
398d6007be | ||
|
|
4d63eb4413 | ||
|
|
8770bdc694 | ||
|
|
74f935d94f | ||
|
|
cd30812607 | ||
|
|
8b30a7631d | ||
|
|
a169f93b9f | ||
|
|
f786ea65f5 | ||
|
|
b578d44ea2 | ||
|
|
40574d9be0 | ||
|
|
7bb8124b69 | ||
|
|
2b1d4f4377 | ||
|
|
31a53f4842 | ||
|
|
f3468c0321 | ||
|
|
23af5dcaf1 | ||
|
|
097974bde2 | ||
|
|
a97d8c119b | ||
|
|
480ef0a468 | ||
|
|
f044a59984 | ||
|
|
f3ae5159cb | ||
|
|
52fca4ac0c | ||
|
|
98bf05b948 | ||
|
|
bbd4c1315e | ||
|
|
35869586c9 | ||
|
|
ed049ea539 | ||
|
|
6ba406be7d | ||
|
|
860d3be42d | ||
|
|
0801922466 | ||
|
|
103a2fccaa | ||
|
|
cb7820b45b | ||
|
|
1a6fd72d19 | ||
|
|
5e65df3c2a | ||
|
|
b534422aed | ||
|
|
1866c00789 | ||
|
|
1162e5a65b | ||
|
|
5da11291a2 | ||
|
|
042d2e436c | ||
|
|
2da65ab122 | ||
|
|
8c668b29c6 | ||
|
|
75643895ef | ||
|
|
6a02a571c1 | ||
|
|
1e5f12a0ae | ||
|
|
a297a0b5ad | ||
|
|
9da413b2cc | ||
|
|
0ca0dc9731 | ||
|
|
7205f2d4fa | ||
|
|
196c311113 | ||
|
|
0409107ee2 | ||
|
|
c8035c1adf | ||
|
|
5fda638edf | ||
|
|
ed05519c60 | ||
|
|
ac77bab967 | ||
|
|
9935e2c8d3 | ||
|
|
80fc7209ed | ||
|
|
908082097f | ||
|
|
245533defa | ||
|
|
b8c4c31e02 | ||
|
|
626df3673c | ||
|
|
3a288ffe4a | ||
|
|
422e511aac | ||
|
|
621cdba53c | ||
|
|
e7ddc6d6c5 | ||
|
|
b1a06baf83 | ||
|
|
c3c0954613 | ||
|
|
463a339a09 | ||
|
|
71cae6b02b | ||
|
|
ccac3e9cfc | ||
|
|
aac44ef866 | ||
|
|
5d6d6c766e | ||
|
|
28e6dec4b0 | ||
|
|
e2606cf97f | ||
|
|
cfea381c84 | ||
|
|
bd7e2fe88d | ||
|
|
30c32b0088 | ||
|
|
95ce9fc00f | ||
|
|
a580e98f28 | ||
|
|
2072f5c276 | ||
|
|
28c47a5c86 | ||
|
|
08dd632d87 | ||
|
|
bbde1394e1 | ||
|
|
ede52d7808 | ||
|
|
9ce9fa8cb5 | ||
|
|
6debd84a2e | ||
|
|
62995b0769 | ||
|
|
ec50c4571c | ||
|
|
09938b978b | ||
|
|
6eb327eac2 | ||
|
|
cbb8db0089 | ||
|
|
154ef82719 | ||
|
|
ec80b0884f | ||
|
|
6a78b4ed1f | ||
|
|
239c6759cb | ||
|
|
017714f3a0 | ||
|
|
16aa5a78fe | ||
|
|
baa94e2064 | ||
|
|
f9b13472b5 | ||
|
|
2922267ae1 | ||
|
|
3c4e75f1b2 | ||
|
|
130a7b3c42 | ||
|
|
17b0c23f2e | ||
|
|
4b58b0b168 | ||
|
|
298393b653 | ||
|
|
aed53c4fda | ||
|
|
7ad7af76dd | ||
|
|
0964fb11e4 | ||
|
|
f173ce11f7 | ||
|
|
3046c9e68e | ||
|
|
137836348b | ||
|
|
05eab0b5b0 | ||
|
|
a1edbaced4 | ||
|
|
3fe737058f | ||
|
|
9c3e8f7e48 | ||
|
|
dcf64c6b33 | ||
|
|
b9945d62a3 | ||
|
|
776d1cb52c | ||
|
|
81e142936d | ||
|
|
a6fba0cb96 | ||
|
|
1b9bfd8906 | ||
|
|
e9d988f5d6 | ||
|
|
7852192fc4 | ||
|
|
4db01487ba | ||
|
|
7b806add63 | ||
|
|
d3c310628f | ||
|
|
62af116654 | ||
|
|
2b085cb69e | ||
|
|
27ee4337fe | ||
|
|
f0297fc448 | ||
|
|
d74743ac1d | ||
|
|
28471aee97 | ||
|
|
deb537c1bb | ||
|
|
9d93eca572 | ||
|
|
66d1a632a7 | ||
|
|
847be54457 | ||
|
|
9d156b4285 | ||
|
|
edde871eb5 | ||
|
|
7c772d6bfd | ||
|
|
f0d0861160 | ||
|
|
1ef0b44a41 | ||
|
|
25d8a94c1c | ||
|
|
b60b3f7d18 | ||
|
|
b1db062fbc | ||
|
|
d4e5e609af | ||
|
|
f36d1f5621 | ||
|
|
f350683e83 | ||
|
|
3c5f7de747 | ||
|
|
d81288d281 | ||
|
|
d18708acf5 | ||
|
|
18353d9ae6 | ||
|
|
ef39f9c9cf | ||
|
|
a03aa3ddb3 | ||
|
|
c09aff8bd7 | ||
|
|
70518a873c | ||
|
|
95e64f3997 | ||
|
|
2fab2d9f7e | ||
|
|
de838ec5e8 | ||
|
|
90d2434bb0 | ||
|
|
96e0167e47 | ||
|
|
68ed732928 | ||
|
|
c603abfebf | ||
|
|
85960b2c90 | ||
|
|
ca501c0378 | ||
|
|
e9e364f054 | ||
|
|
7c9af89620 | ||
|
|
f4567b2c9d | ||
|
|
7390d11505 | ||
|
|
960e46c564 | ||
|
|
265f79fc72 | ||
|
|
a5258bea65 | ||
|
|
25f07ddb97 | ||
|
|
6ba7781a61 | ||
|
|
23a7dce3be | ||
|
|
880d3de53a | ||
|
|
5af7a19b40 | ||
|
|
da094fa04e | ||
|
|
bff9ca8438 | ||
|
|
e50d22bce7 | ||
|
|
216b4f4147 | ||
|
|
4ced29ee8f | ||
|
|
844b3a39a7 | ||
|
|
9e618ce3e1 | ||
|
|
abda3b52ab | ||
|
|
649f32a185 | ||
|
|
8710922a61 | ||
|
|
8ea5536b42 | ||
|
|
48d1aa5115 | ||
|
|
eafe5d6c68 | ||
|
|
f1d9034546 | ||
|
|
b0c077ccf8 | ||
|
|
a0f0eca77c | ||
|
|
e74513556a | ||
|
|
891c984c56 | ||
|
|
491188a0f3 | ||
|
|
9dadc0de93 | ||
|
|
1dedf0e208 | ||
|
|
e123499e23 | ||
|
|
7601a4cd29 | ||
|
|
c8b78b4124 | ||
|
|
fdb2055b62 | ||
|
|
2c0a03704c | ||
|
|
2edbcb996d | ||
|
|
76e01f490c | ||
|
|
f23029efe0 | ||
|
|
e70dea54c0 | ||
|
|
ca28332c6c | ||
|
|
f15e2c2dcf | ||
|
|
572705bc08 | ||
|
|
473810fc0c | ||
|
|
d0ff201da2 | ||
|
|
b5c621ae36 | ||
|
|
7cdead7bac | ||
|
|
f26ac52102 | ||
|
|
5d48708615 | ||
|
|
0561ac2076 | ||
|
|
ae5257c654 | ||
|
|
5a449a56ea | ||
|
|
69549787bc | ||
|
|
0db8d95bc9 | ||
|
|
236c16e35f | ||
|
|
79d8bc2cdd | ||
|
|
fac536f8c4 | ||
|
|
aa5d52cebc | ||
|
|
7e372645da | ||
|
|
0c058f2eca | ||
|
|
d9320f964e | ||
|
|
b29adf752c | ||
|
|
43b746d2f8 | ||
|
|
817206815d | ||
|
|
37aa201ed7 | ||
|
|
d3a0146b5a | ||
|
|
30771fefa6 | ||
|
|
6ae44d7577 | ||
|
|
42b4e456a2 | ||
|
|
290b9cae0b | ||
|
|
ec6bfa2421 | ||
|
|
46a3e729db | ||
|
|
5ca7bb5f12 | ||
|
|
86dfaf9930 | ||
|
|
7d37ff33aa | ||
|
|
415e517107 | ||
|
|
0b0ec876a5 | ||
|
|
34f6f6d539 | ||
|
|
0681209114 | ||
|
|
becd0eba03 | ||
|
|
063eb151c4 | ||
|
|
3f2a8f7704 | ||
|
|
c8b83385df | ||
|
|
ac1c8594b7 | ||
|
|
0c903c1e56 | ||
|
|
dcc19aeafb | ||
|
|
faf15df62f | ||
|
|
a3c90248a7 | ||
|
|
78365d2bc6 | ||
|
|
176b31b4a2 | ||
|
|
efe8ddf151 | ||
|
|
e1f80fba3d | ||
|
|
fd649905ea | ||
|
|
bd4988e588 | ||
|
|
4ef527a92d | ||
|
|
e8d13cd0d5 | ||
|
|
501985be48 | ||
|
|
ebe3a203ba | ||
|
|
63513ec475 | ||
|
|
545b781934 | ||
|
|
0d035746d5 | ||
|
|
ec41db7ef8 | ||
|
|
362217935f | ||
|
|
8704c07e4b | ||
|
|
7d1df4c097 | ||
|
|
2c755778f4 | ||
|
|
9ab3300b76 | ||
|
|
535b00d98f | ||
|
|
de35262a3b | ||
|
|
314a6deba9 | ||
|
|
d3990e03e6 | ||
|
|
cec7bf8488 | ||
|
|
32aa9a9f54 | ||
|
|
b7622e6009 | ||
|
|
fd1f0e685a | ||
|
|
a015d6b915 | ||
|
|
7350be6e7f | ||
|
|
926b909f3d | ||
|
|
c1076f43f7 | ||
|
|
af7123f7dd | ||
|
|
5d13112e25 | ||
|
|
40094f2867 | ||
|
|
6db7c191eb | ||
|
|
a2e2dd5bdf | ||
|
|
7fdabb73a8 | ||
|
|
86337db5b3 | ||
|
|
8e3c748f12 | ||
|
|
b825e584f3 | ||
|
|
13fe097318 | ||
|
|
5af7eb6c18 | ||
|
|
be4b885254 | ||
|
|
b70fab5384 | ||
|
|
92c321848d | ||
|
|
2de6d00a82 | ||
|
|
5744aa8d9e | ||
|
|
fc7ed1ab75 | ||
|
|
7c9b724531 | ||
|
|
64257ef428 | ||
|
|
4a0add4063 | ||
|
|
45c0eaa26c | ||
|
|
15096aa15a | ||
|
|
36f756feeb | ||
|
|
4d4a7d49d5 | ||
|
|
4189af8b50 | ||
|
|
990d526a07 | ||
|
|
5a1b03ac20 | ||
|
|
158db1c454 | ||
|
|
7ace83eeab | ||
|
|
b940a62f02 | ||
|
|
d564a062ce | ||
|
|
7671365c92 | ||
|
|
f7a58ec04d | ||
|
|
8e508cf065 | ||
|
|
e5b0473e4a | ||
|
|
136123eeb3 | ||
|
|
32b07cda86 | ||
|
|
25325e6150 | ||
|
|
a639b72e90 | ||
|
|
08984bd549 | ||
|
|
bf08a8261b |
35
.cirrus.yml
Normal file
35
.cirrus.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
task:
|
||||
name: freebsd-12-amd64
|
||||
freebsd_instance:
|
||||
image_family: freebsd-12-3
|
||||
setup_script:
|
||||
- pkg update
|
||||
- pkg install -y git sdl2 python fontconfig
|
||||
- git submodule update --init --recursive
|
||||
test_script:
|
||||
- ./scripts/cirrus/build_freebsd.sh dedicated
|
||||
- ./scripts/cirrus/build_freebsd.sh full
|
||||
|
||||
task:
|
||||
name: freebsd-13-amd64
|
||||
freebsd_instance:
|
||||
image_family: freebsd-13-1
|
||||
setup_script:
|
||||
- pkg update
|
||||
- pkg install -y git sdl2 python fontconfig
|
||||
- git submodule update --init --recursive
|
||||
test_script:
|
||||
- ./scripts/cirrus/build_freebsd.sh dedicated
|
||||
- ./scripts/cirrus/build_freebsd.sh full
|
||||
|
||||
task:
|
||||
name: freebsd-14-amd64
|
||||
freebsd_instance:
|
||||
image_family: freebsd-14-0-snap
|
||||
setup_script:
|
||||
- pkg update
|
||||
- pkg install -y git sdl2 python fontconfig
|
||||
- git submodule update --init --recursive
|
||||
test_script:
|
||||
- ./scripts/cirrus/build_freebsd.sh dedicated
|
||||
- ./scripts/cirrus/build_freebsd.sh full
|
||||
9
.editorconfig
Normal file
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = latin1
|
||||
end_of_line = lf
|
||||
indent_style = tab
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
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
|
||||
72
.github/workflows/c-cpp.yml
vendored
Normal file
72
.github/workflows/c-cpp.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
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:
|
||||
- os: ubuntu-18.04
|
||||
targetos: linux
|
||||
targetarch: amd64
|
||||
- os: ubuntu-18.04
|
||||
targetos: linux
|
||||
targetarch: i386
|
||||
# - os: ubuntu-aarch64-20.04
|
||||
# targetos: linux
|
||||
# targetarch: aarch64
|
||||
|
||||
- os: ubuntu-18.04
|
||||
targetos: android
|
||||
targetarch: 32
|
||||
- os: ubuntu-18.04
|
||||
targetos: android
|
||||
targetarch: 64
|
||||
|
||||
- os: ubuntu-18.04
|
||||
targetos: motomagx
|
||||
targetarch: armv6
|
||||
|
||||
- os: windows-latest
|
||||
targetos: win32
|
||||
targetarch: amd64
|
||||
- os: windows-latest
|
||||
targetos: win32
|
||||
targetarch: i386
|
||||
env:
|
||||
SDL_VERSION: 2.0.14
|
||||
GH_CPU_ARCH: ${{ matrix.targetarch }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ANDROID_SDK_TOOLS_VER: 4333796
|
||||
UPLOADTOOL_ISPRERELEASE: true
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Checkout xash-extras
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: FWGS/xash-extras
|
||||
path: xash-extras
|
||||
|
||||
- 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 (prereleases)
|
||||
run: bash scripts/continious_upload.sh artifacts/*
|
||||
- name: Upload engine (artifacts)
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: artifact-${{ matrix.targetos }}-${{ matrix.targetarch }}
|
||||
path: artifacts/*
|
||||
335
.gitignore
vendored
Normal file
335
.gitignore
vendored
Normal file
@@ -0,0 +1,335 @@
|
||||
# Binaries
|
||||
*.o
|
||||
*.so
|
||||
*.a
|
||||
*.framework
|
||||
|
||||
# Other
|
||||
*.save
|
||||
|
||||
# Qt Creator for some reason creates *.user.$version files, so exclude it too
|
||||
*.user*
|
||||
*~
|
||||
|
||||
### Xcode ###
|
||||
build/
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.xcuserstate
|
||||
|
||||
|
||||
### OSX ###
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear on external disk
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### CMake ###
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
# makedepend
|
||||
Makefile.dep
|
||||
*.bak
|
||||
ALL_BUILD.*
|
||||
INSTALL.*
|
||||
ZERO_CHECK.*
|
||||
|
||||
# Visual Studio
|
||||
*.obj
|
||||
*.dll
|
||||
*.exp
|
||||
*.lib
|
||||
*.suo
|
||||
*.sdf
|
||||
Debug/
|
||||
Release/
|
||||
ipch/
|
||||
*.opensdf
|
||||
# Use CMake for generating projects
|
||||
*.vcxproj.filters
|
||||
*.vcxproj
|
||||
*.sln
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
build/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
project.lock.json
|
||||
artifacts/
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# PVS Studio for Linux output
|
||||
*.cl.cfg
|
||||
|
||||
# Kate
|
||||
*.kate-swp
|
||||
*.swp
|
||||
|
||||
# QtCreator
|
||||
build-*
|
||||
|
||||
# Android
|
||||
*.apk
|
||||
*.config
|
||||
*.creator
|
||||
*.includes
|
||||
*.files
|
||||
|
||||
# Waf
|
||||
build_current
|
||||
*waf-*/
|
||||
*waf3-*/
|
||||
.lock-waf*
|
||||
*.lastbuildstate
|
||||
*.unsuccessfulbuild
|
||||
__pycache__
|
||||
*.pyc
|
||||
|
||||
# MSVC projects
|
||||
*.vcproj
|
||||
*.sln
|
||||
*.vcxproj
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode/*
|
||||
*.code-workspace
|
||||
.history/*
|
||||
.cache/*
|
||||
enc_temp_folder/
|
||||
18
.gitmodules
vendored
Normal file
18
.gitmodules
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
[submodule "mainui"]
|
||||
path = 3rdparty/mainui
|
||||
url = https://github.com/FWGS/mainui_cpp
|
||||
[submodule "ref_gl/nanogl"]
|
||||
path = 3rdparty/nanogl
|
||||
url = https://github.com/FWGS/nanogl
|
||||
[submodule "ref_gl/gl-wes-v2"]
|
||||
path = 3rdparty/gl-wes-v2
|
||||
url = https://github.com/FWGS/gl-wes-v2
|
||||
[submodule "ref_gl/gl4es"]
|
||||
path = 3rdparty/gl4es/gl4es
|
||||
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
|
||||
1
3rdparty/gl-wes-v2
vendored
Submodule
1
3rdparty/gl-wes-v2
vendored
Submodule
Submodule 3rdparty/gl-wes-v2 added at 7f567393d4
1
3rdparty/gl4es/gl4es
vendored
Submodule
1
3rdparty/gl4es/gl4es
vendored
Submodule
Submodule 3rdparty/gl4es/gl4es added at 5c28420a38
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', 'EXTERNAL_GETPROCADDRESS=GL4ES_GetProcAddress', '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 14c0922af7
1
3rdparty/nanogl
vendored
Submodule
1
3rdparty/nanogl
vendored
Submodule
Submodule 3rdparty/nanogl added at 5a22eab534
1
3rdparty/opus/opus
vendored
Submodule
1
3rdparty/opus/opus
vendored
Submodule
Submodule 3rdparty/opus/opus added at 997fdf54e7
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 63c134f188
47
CONTRIBUTING.md
Normal file
47
CONTRIBUTING.md
Normal file
@@ -0,0 +1,47 @@
|
||||
## If you are reporting bugs
|
||||
|
||||
1. Check you are using latest version. You can build latest Xash3D FWGS for yourself, look to README.md.
|
||||
2. Check open issues is your bug is already reported and closed issues if it reported and fixed. Don't send bug if it's already reported.
|
||||
3. Re-run engine with `-dev 2 -log` arguments, reproduce bug and post engine.log which can be found in your working directory.
|
||||
3. Describe steps to reproduce bug.
|
||||
4. Describe which OS and architecture you are using.
|
||||
6. Attach screenshot if it will help clarify the situation.
|
||||
|
||||
## If you are contributing code
|
||||
|
||||
### Which branch?
|
||||
|
||||
* We recommend using `master` branch.
|
||||
|
||||
### Third-party libraries
|
||||
|
||||
* Philosophy of any Xash Project by Uncle Mike: don't be bloated. We follow it too.
|
||||
* Adding new library is allowed only if there is a REAL reason to use it. It's will be nice, if you will leave a possibility to remove new dependency at build-time.
|
||||
* Adding new dependencies for Waf Build System is not welcomed.
|
||||
|
||||
### Portability level
|
||||
|
||||
* Xash3D have it's own crt library. It's recommended to use it. It most cases it's just a wrappers around standart C library.
|
||||
* If your feature need platform-specific code, move it to `engine/platform` and try to implement to every supported OS and every supported compiler or at least leave a stubs.
|
||||
* You must put it under appopriate macro. It's a rule: Xash3D FWGS must compile everywhere. For list of platforms we support, refer to public/build.h file.
|
||||
|
||||
### Code style
|
||||
|
||||
* This project uses mixed Quake's and HLSDK's C/C++ code style convention.
|
||||
* In short:
|
||||
* Use spaces in parenthesis.
|
||||
* Only tabs for indentation.
|
||||
* Any brace must have it's own line.
|
||||
* Short blocks, if statements and loops on single line are allowed.
|
||||
* Avoid magic numbers.
|
||||
* While macros are powerful, it's better to avoid overusing them.
|
||||
* If you unsure, try to mimic code style from anywhere else of engine source code.
|
||||
* **ANY** commit message should start from declaring a tags, in format:
|
||||
|
||||
`tag: added some bugs`
|
||||
|
||||
`tag: subtag: fixed some features`
|
||||
|
||||
Tags can be any: subsystem, simple feature name or even just a filename, without extension.
|
||||
Just keep them always same, it helps keep history clean and commit messages short.
|
||||
|
||||
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
|
||||
71
Documentation/engine-porting-guide.md
Normal file
71
Documentation/engine-porting-guide.md
Normal file
@@ -0,0 +1,71 @@
|
||||
## Abstract
|
||||
|
||||
Before start, I would recommend you to compile and run engine for already supported and well-spread platform, such as GNU/Linux or Windows. Hack it, get familiar with engine.
|
||||
|
||||
One beauties of Xash3D FWGS Engine is it modularity, so game logic, UI and renderers are located in platform-independent libraries. Every library is loaded at run time and may or may be not optional. For example, if your platform doesn't have OpenGL of any kind, you can skip it and use our software renderer! Of course, there is no real reason to run game engine, if you don't have game logic of any kind, so the minimal build of Xash3D FWGS is headless dedicated server.
|
||||
|
||||
Historically, Xash3D Engine was even more modular(see github.com/a1batross/Xash3D_ancient), but we thought that to fulfill our crossplatform needs we will keep all platform-specific stuff in the engine itself and libraries must import or expose platform-independent APIs.
|
||||
|
||||
Ok, get to the point!
|
||||
|
||||
## Porting guidelines
|
||||
|
||||
It will not be a complete tutorial as covering everything in one article is probably just impossible. Instead, I will give you hints on how engine can be ported, how to get your port to upstreamed and how you should maintain your port.
|
||||
|
||||
0) Get to know your platform. Maybe I asked for this lately, but you MUST KNOW YOUR PLATFORM, i.e. what's this capable of.
|
||||
|
||||
The one of unsupported configurations at this time is when platform can't load dynamic libraries(`*.so` or DLLs). We can't help you as supporting full-static ports are violating the GPL license in various ways.
|
||||
|
||||
The other yet unsupported configuration is the big endian.
|
||||
|
||||
1) Setup toolchain. For dirty port, you can write Makefile for yourself, engine is written that way, so **it doesn't relies** on any generated data or any special processing. But I recommend you to use Waf anyway, it's better integrated to engine and self-documentable. Also, I will cover only our Waf build options.
|
||||
|
||||
2) Open `public/build.h` file. Add appropriate checks for your operating system and/or CPU architecture. It shouldn't be hard.
|
||||
|
||||
Also, you'll need to build [Half-Life SDK](https://github.com/FWGS/hlsdk-xash3d/). It has same `public/build.h` so reflect changes into it. Note that to be compatible with HLSDK proprietary license, it's relicensed as public domain under [Unlicense](https://unlicense.org).
|
||||
|
||||
We have a library naming scheme that allows us and game creators to distribute binaries for different platforms in one archive. Read `Documentation/extensions/library-naming.md` for more information.
|
||||
|
||||
In short, you need to call your platform in unique way. For engine side it's done in `engine/common/build.c` file in engine source code, for HLSDK side it's done in `cmake/LibraryNaming.cmake` and `scripts/waifulib/library-naming.py` files in HLSDK source code.
|
||||
|
||||
You can use [predef project wiki](https://sourceforge.net/p/predef/wiki/Home/) for reference.
|
||||
|
||||
2) Look at the `engine/platform` directory. We usually try to have all platform-specific stuff inside this folder.
|
||||
|
||||
* Functions that must be available on your platform are declared in `platform.h` header. Most of them aren't used in headless dedicated build, but I will cover that later.
|
||||
|
||||
* The POSIX-compliant(for *nix operating systems) goes into `posix` subdirectory.
|
||||
|
||||
* The SDL-specific code goes into `sdl` subdirectory. Note that even I said before that platform-specific code is in `platform` directory, SDL obviously isn't a __platform__, so you can met checks for XASH_SDL inside whole engine, usually in input.
|
||||
|
||||
* Custom SWAP implementation for *nix-based systems is in `swap` subdirectory. It's used when hardware may not have enough memory and you can't add swap memory. I will cover that later
|
||||
It relies on a fact that systems with paged memory will load pages into RAM and move unused to mmap()-ed by custom swap area.
|
||||
That allowed to run game engine on music player with MIPS CPU, Linux without SWAP support and
|
||||
|
||||
* Other folders as `win32`, `android`, `linux` and so on are self-descriptive.
|
||||
|
||||
3) As proof of concept, you can try to test that network features and dynamic library loading are implemented correctly. Build a dedicated server with XASH_DEDICATED or `--dedicated` passed to `waf configure`.
|
||||
|
||||
Start a server and try to connect to it from PC. If everything is fine, then you can move to next step.
|
||||
|
||||
If you get out of memory issues, you can try Low Memory Mode, it's enabled with `--low-memory-mode=N` passed to `waf configure` where N is 1 or 2. Low Memory Mode 1 means that we will NOT break a network compatibility. 2 is deeper and doesn't guarantee protocol compatibility and available multiplayer. Of course, with Low Memory Mode 2 you can't test your port dedicated server.
|
||||
|
||||
If you got anything compiling, it's nice time to make a commit. Commit your changes into git and push them somewhere(GitHub, GitLab or what you prefer), so you will not lose them accidentally.
|
||||
|
||||
4) Here is most interesting, building the client part.
|
||||
|
||||
There are three possible situations for you, by increasing difficulty.
|
||||
|
||||
1. Do you have SDL2 for your platform? If yes, go ahead and compile engine with client part enabled.
|
||||
|
||||
2. Do you have SDL1.2 for your platform? If yes, try to compile it, but SDL1.2 support is very limited and not tested well.
|
||||
|
||||
3. You don't have SDL and you can't port it for some reason by yourself or SDL port just don't stable for your platform? Then you need to implement an engine backend.
|
||||
|
||||
How to implement engine backend? Well, we have a backends system that was introduced in Old Engine. It's simply two files: backends.h and defaults.h in `common` folder in repository root. You will need to add a macros for your backends in `backends.h` and define a logic in `defaults.h`. We have already have some, check them out, as they may be handy for you.
|
||||
|
||||
Once you did it, go back to `platform` directory and open `platform.h` headers. Create new subdirectory in `platform` folder and start implementing missing platform-specific backends one by one. I can't explain this as for obvious reasons it's too specific. You can use macros you defined before in `build.h` to check that you're compiling for your platform and `backends.h` macros to check if platform-specific backend must be enabled.
|
||||
|
||||
As you finished, compile engine, fix errors and commit your changes and push to repository.
|
||||
|
||||
Remember, if something doesn't work and you can't figure out why, you can join our Discord server at discord.me/fwgs. Ping me (@a1batross) or other engine developer and attach link to your repository, so we can discuss and help you in porting.
|
||||
68
Documentation/extensions/console-scripting.md
Normal file
68
Documentation/extensions/console-scripting.md
Normal file
@@ -0,0 +1,68 @@
|
||||
## Console variables
|
||||
|
||||
Console variables (or CVars) are present in all quake-based games.
|
||||
|
||||
By default, it is settings, created by engine, server or client libraries.
|
||||
|
||||
But you can use `set` command to define variables even if they are not created by the engine.
|
||||
|
||||
For example, you can set cvar before it is registered in code.
|
||||
|
||||
`set defaultmap crossfire`
|
||||
|
||||
This works even in server.cfg before server cvars initialization and the engine will reuse its value on cvar creation
|
||||
|
||||
## Aliases
|
||||
|
||||
An alias allows to define new commands.
|
||||
|
||||
`alias wnext "invnext;wait;wait;+attack;wait;-attack"`
|
||||
|
||||
You can hook any command by adding an alias to it and unaliasing it, when you want to use original command.
|
||||
|
||||
```
|
||||
alias invnext1 "unalias invnext;wnext;alias invnext invnext1"
|
||||
alias invnext invnext1
|
||||
```
|
||||
|
||||
## Scripting extensions
|
||||
|
||||
This is an extensions of Xash3D FWGS(merged to original Xash3D since build 3887), that can be enabled by cmd_scripting cvar.
|
||||
|
||||
Enabling scripting: `cmd_scripting 1`
|
||||
|
||||
This is an archive cvar and it will be saved.
|
||||
|
||||
### CVar substitution
|
||||
|
||||
You can substitute cvar value to any command by adding \$ symbol:
|
||||
|
||||
`echo $sv_cheats`
|
||||
|
||||
### Condition checking
|
||||
|
||||
Allows checking cvar values.
|
||||
|
||||
```
|
||||
if <value1> <operator> <value2>
|
||||
:<action1>
|
||||
:if <value3>
|
||||
::<action2>
|
||||
:<action3>
|
||||
else
|
||||
:<action4>
|
||||
```
|
||||
|
||||
* Values are any string or numeric values (for example, substituted cvars).
|
||||
* Operator is = (or ==), \!=, \<, \>, \<=, \>=. == is same to =.
|
||||
* If single value specified, condition is true when value is non-zero
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
if $sv_cheats == 1
|
||||
:echo Cheats enabled, adding cheat menu
|
||||
:exec cheatmenu.cfg
|
||||
else
|
||||
:echo Please enable cheats to use this!
|
||||
```
|
||||
48
Documentation/extensions/input-interface-ru.md
Normal file
48
Documentation/extensions/input-interface-ru.md
Normal file
@@ -0,0 +1,48 @@
|
||||
## Цель
|
||||
|
||||
На текущий момент клиенты имеют некоторые части платформозависимого кода внутри себя. Это плохо, т.к. мы не можем использовать одинаковые функции (если не перепишем почти половину кода SDL) на разных платформах.
|
||||
|
||||
## Клиентская часть
|
||||
|
||||
* Клиент будет иметь возможность полностью реализовать touch-ввод. Отрисовка может быть произведена через HUD.
|
||||
* Клиент получит простые события движения и обзора от движка
|
||||
|
||||
### Клиентская реализация
|
||||
|
||||
#### Клиент будет экспортировать некоторые функции движку (опционально):
|
||||
|
||||
* `int IN_ClientTouchEvent ( int fingerID, float x, float y, float dx, float dy );`
|
||||
|
||||
Вернёт 1 если касание активно, иначе 0.
|
||||
|
||||
* `void IN_ClientMoveEvent ( float forwardmove, float sidemove );`
|
||||
|
||||
Клиент будет накапливать значения величин для команд движения перед созданием команд и очищать их при CreateMove.
|
||||
|
||||
* `void IN_ClientLookEvent ( float relyaw, float relpitch );`
|
||||
|
||||
Клиент будет вращать камерой когда нужно, прямо как в реализации мыши
|
||||
|
||||
## Движковая часть
|
||||
|
||||
* Движок будет управлять событиями платформы и вызывать клиентские функции
|
||||
* Движок реализует стандартную систему взгляда и движения если её нет в клиенте
|
||||
|
||||
### Движковая реализация
|
||||
|
||||
#### События касания
|
||||
|
||||
Перед вызовом ClientMove движок обязан получить события о касании.
|
||||
|
||||
Если из клиента экспортирована функция IN_ClientTouchEvent, событие будет отправлено клиенту.
|
||||
|
||||
Иначе, движок будет рисовать свой touch-интерфейс.
|
||||
|
||||
#### Другие события
|
||||
|
||||
Интерфейс прикосновений и код джойстика в движке будут генерировать следующие два типа событий:
|
||||
* События движения (функция IN_ClientMoveEvent)
|
||||
* События просмотра (функция IN_ClientLookEvent)
|
||||
|
||||
Если клиент экспортирует эти функции, события будут отправляться клиенту перед CreateMove
|
||||
Иначе события просмотра будут происходить перед CreateMove, но после MoveEvent. Они будут применены к генерируемым командам
|
||||
48
Documentation/extensions/input-interface.md
Normal file
48
Documentation/extensions/input-interface.md
Normal file
@@ -0,0 +1,48 @@
|
||||
## Purpose
|
||||
|
||||
Clients have different platform-depended input code now.
|
||||
It is bad because we cannot use same functions (if we won't rewrite almost half of SDL) on different platforms.
|
||||
|
||||
## Client part
|
||||
|
||||
* Client will have ability to fully implement touch input. Drawing may be done by HUD.
|
||||
* Client will receive basic motion and look events from engine
|
||||
|
||||
### Client implementation
|
||||
|
||||
#### Client will optionally export some functions to Engine:
|
||||
* `int IN_ClientTouchEvent ( int fingerID, float x, float y, float dx, float dy );`
|
||||
|
||||
Return 1 if touch is active, 0 otherwise.
|
||||
|
||||
* `void IN_ClientMoveEvent ( float forwardmove, float sidemove );`
|
||||
|
||||
Client wil accumulate move values before creating commands and flush it on CreateMove.
|
||||
|
||||
* `void IN_ClientLookEvent ( float relyaw, float relpitch );`
|
||||
|
||||
Client will rotate camera when needed as in mouse implementation
|
||||
|
||||
## Engine part
|
||||
|
||||
* Engine will handle platform events and call client functions.
|
||||
* Engine will implement fallback look and movement system when client interface not present
|
||||
|
||||
### Engine implementation
|
||||
|
||||
#### Touch events
|
||||
|
||||
Before calling ClientMove engine must get touch events.
|
||||
|
||||
If client exported IN_ClientTouchEvent, event will be sent to client.
|
||||
|
||||
Otherwise engine will draw own touch interface.
|
||||
|
||||
#### Other events
|
||||
|
||||
Engine touch interface and joystick support code will generate two types of events:
|
||||
* Move events (IN_ClientMoveEvent function)
|
||||
* Look events (IN_ClientLookEvent function)
|
||||
|
||||
If client exported these functions, events will be sent to client before CreateMove
|
||||
Otherwise Look Event will be processed before CreateMove, but MoveEvent after. It will be applied to generated command
|
||||
41
Documentation/extensions/library-naming.md
Normal file
41
Documentation/extensions/library-naming.md
Normal file
@@ -0,0 +1,41 @@
|
||||
I propose a new library naming scheme, which will allow to distribute mods and games in single archive to different operating systems and CPUs:
|
||||
|
||||
Legend:
|
||||
* $os -- Q_buildos() return value, in lower case.
|
||||
* $arch -- Q_buildarch() return value, in lower case.
|
||||
* $ext -- OS-specific extension: dll, so, dylib, etc.
|
||||
|
||||
The scheme will be:
|
||||
|
||||
1. Client library:
|
||||
* ```client.$ext``` for **Win/Lin/Mac** with **x86**.
|
||||
* ```client_$arch.$ext``` for **Win/Lin/Mac** with **NON-x86**.
|
||||
* ```client_$os_$arch.$ext``` for everything else.
|
||||
|
||||
2. Menu library:
|
||||
* ```menu.$ext``` for **Win/Lin/Mac** with **x86**.
|
||||
* ```menu_$arch.$ext``` for **Win/Lin/Mac** with **NON-x86**.
|
||||
* ```menu_$os_$arch.$ext``` for everything else.
|
||||
|
||||
3. Server library:
|
||||
* On **Win/Lin/Mac** with **x86**, it **MUST** use the raw gamedll name for corresponding OS field from `gameinfo.txt`.
|
||||
* On **Win/Lin/Mac** with **NON-x86**, it **MUST** use the raw gamedll name for corresponding OS field from `gameinfo.txt`, but append ```_$arch``` before file extension. Like: ```hl_amd64.so``` or ```cs_e2k.so```.
|
||||
* On everything else, it must use gamedll name from ```gamedll_linux``` field, but append ```_$os_$arch``` before file extension. Like: ```hl_haiku_amd64.so``` or ```cs_freebsd_armhf.so```.
|
||||
Why ```gamedll_linux``` and not ```gamedll```? Because it looks more logic that way, most operating systems are *nix-like and share code with Linux, rather than Windows.
|
||||
|
||||
4. Refresh library: not needed, as RefAPI is not stable and it's not intended to distribute with mods.
|
||||
|
||||
For any libraries distributed **with** engine, naming scheme should be used more convenient for OS port.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
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`.
|
||||
|
||||
See discussion: https://github.com/FWGS/xash3d-fwgs/issues/39
|
||||
75
Documentation/mod-porting-guide.md
Normal file
75
Documentation/mod-porting-guide.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Server porting
|
||||
Original valve's server code was compatible with linux and gcc 2.x.
|
||||
Newer gcc versions have restriction which breaks build.
|
||||
Now, to make it building with gcc 4.x, you need do following:
|
||||
* Go to cbase.h and redefine macros as following
|
||||
```
|
||||
#define SetThink( a ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (&a)
|
||||
#define SetTouch( a ) m_pfnTouch = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (&a)
|
||||
#define SetUse( a ) m_pfnUse = static_cast <void (CBaseEntity::*)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )> (&a)
|
||||
#define SetBlocked( a ) m_pfnBlocked = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (&a)
|
||||
#define ResetThink( ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (NULL)
|
||||
#define ResetTouch( ) m_pfnTouch = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (NULL)
|
||||
#define ResetUse( ) m_pfnUse = static_cast <void (CBaseEntity::*)( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )> (NULL)
|
||||
#define ResetBlocked( ) m_pfnBlocked = static_cast <void (CBaseEntity::*)(CBaseEntity *)> (NULL)
|
||||
...
|
||||
#define SetMoveDone( a ) m_pfnCallWhenMoveDone = static_cast <void (CBaseToggle::*)(void)> (&a)
|
||||
```
|
||||
* 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
|
||||
|
||||
# Client porting
|
||||
|
||||
## 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).
|
||||
* Remove hud_servers.cpp and Servers_Init/Servers_Shutdown from hud.cpp
|
||||
* 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)
|
||||
* Add ctype.h where it is need (tolower, isspace functions)
|
||||
* Add string.h where it is need (memcpy, strcpy, etc)
|
||||
* Use in_defs.h from hlsdk_client
|
||||
* Add scoreboard_stub.cpp and input_stub.cpp from hlsdk-xash3d to fix linking.
|
||||
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)
|
||||
Look at hlsdk-xash3d project.
|
||||
|
||||
Main changes are:
|
||||
* Add MOTD.cpp, scoreboard.cpp and input_xash3d.cpp
|
||||
* 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
|
||||
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 may use diff with original HLSDK you used and apply it as patch to hlsdk-xash3d.
|
||||
|
||||
Files must have same line endings (use dos2unix on all files).
|
||||
|
||||
I recommend to enable ignoring space changes in diff.
|
||||
### Writing Makefiles
|
||||
|
||||
Use Makefile from hlsdk-xash3d as Makefile example.
|
||||
|
||||
Get .c and .cpp file lists from Visual Studio project and fill SRCS and SRCS_C variables to Makefile.
|
||||
|
||||
Remove all files containing vgui in name from list, add missing include dirs.
|
||||
|
||||
Do same for Android.mk if you are building for android.
|
||||
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 |
|
||||
|
||||
350
Documentation/opensource-mods.md
Normal file
350
Documentation/opensource-mods.md
Normal file
@@ -0,0 +1,350 @@
|
||||
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 - http://www.bubblemod.org/dl_default.php (dead link!)
|
||||
|
||||
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: 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
|
||||
|
||||
## 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
|
||||
|
||||
## 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
|
||||
|
||||
## 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
|
||||
|
||||
## Wizard Wars
|
||||
Download page on official site - http://www.thothie.com/ww/
|
||||
|
||||
## XashXT
|
||||
Mirrored on github - https://github.com/a1batross/XashXT_original
|
||||
|
||||
## 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/FWGS/cs16-client/tree/v1.32
|
||||
|
||||
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
|
||||
|
||||
## 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: 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
|
||||
|
||||
## Threewave CTF
|
||||
Branch **dmc** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/dmc
|
||||
|
||||
## Zombie-X
|
||||
Branch **zombie-x** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/zombie-x
|
||||
|
||||
38
Documentation/ports.md
Normal file
38
Documentation/ports.md
Normal file
@@ -0,0 +1,38 @@
|
||||
Xash3D FWGS is intended to be easily ported to specific platform, however main issue is maintaining such ports.
|
||||
|
||||
This page is about merged ports to main source tree and responsible for it developers.
|
||||
|
||||
For porting guidelines, look here(TODO!)
|
||||
|
||||
Status:
|
||||
* **Supported**: active, confirmed to be fully functional.
|
||||
* **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
|
||||
* **Not maintained**: lack of human resources
|
||||
* **Not merged**: was done in third-party fork, real status unknown
|
||||
* **Deprecated**: not supported anymore
|
||||
|
||||
Table is sorted by status.
|
||||
|
||||
| Platform | Status | Maintainer | Note
|
||||
| -------- | ------ | ---------- | ----
|
||||
| Windows | Supported | @a1batross, @SNMetamorph |
|
||||
| *BSD | Supported | @nekonomicon |
|
||||
| GNU/Linux(x86, amd64, arm) | Supported | @a1batross, @mittorn |
|
||||
| Android | Supported | @a1batross, @mittorn |
|
||||
| MotoMAGX | Supported | @a1batross |
|
||||
| GNU/Linux(elbrus) | Supported | @a1batross, @mittorn | Rare and eventual access to e2k machine
|
||||
| Haiku | Supported | not maintained | Was added by #478 and #483
|
||||
| DOS4GW | Supported | @mittorn |
|
||||
| GNU/Linux(mipsel) | Supported | @mittorn |
|
||||
| Switch | In progress | @fgsfdsfgs | [GitHub Repository](https://github.com/fgsfdsfgs/xash3d-fwgs/tree/switch_new)
|
||||
| Wii | In progress | Collaborative effort | [GitHub Repository](https://github.com/saucesaft/xash3d-wii)
|
||||
| PSP | In progress | @Crow_bar, @Velaron | [GitHub Repository](https://github.com/Crow-bar/xash3d-fwgs)
|
||||
| Emscripten | Old Engine | not maintained |
|
||||
| Oculus Quest | Old Engine fork | @DrBeef | [GitHub Repository](https://github.com/DrBeef/Lambda1VR)
|
||||
| PSVita | Old Engine fork | not maintained | [GitHub Repository](https://github.com/fgsfdsfgs/vitaXash3D)
|
||||
| Switch | Old Engine fork | not maintained | [GitHub Repository](https://github.com/switchports/xash3d-switch)
|
||||
| 3DS | Old Engine fork | not maintained | [GitHub Repository](https://github.com/masterfeizz/Xash3DS)
|
||||
| macOS | Deprecated | not maintained | See GitHub issue #61
|
||||
| iOS | Deprecated | not maintained | See GitHub issue #61
|
||||
15
Documentation/public-servers-rules-and-recommendations.md
Normal file
15
Documentation/public-servers-rules-and-recommendations.md
Normal file
@@ -0,0 +1,15 @@
|
||||
As online community is growing, we don't want to keep bad or invalid servers on the Internet Games list. It's a common rules for all Xash3D server owners who are using default master server.
|
||||
|
||||
1. Breaking master server or clients is prohibited in any way. If you found a serious bug, contact us at contact 'at' fwgs.ru or post an issue at GitHub.
|
||||
|
||||
2. Changing settings, exploiting vulnerabilities of clients is prohibited in any way. If you found a serious bug, contact us at contact 'at' fwgs.ru or post an issue at GitHub.
|
||||
|
||||
2. Agressive advertisement and spam on other servers is prohibited in any way.
|
||||
|
||||
3. If your server is require downloading custom content, it should be available for everyone. Recommended way to deliver custom content is FastDL.
|
||||
|
||||
4. It's recommended to keep your server is up-to-date. You may use our public Debian/Ubuntu/Arch Linux [repository](https://github.com/FWGS/xash3d/wiki/How-to-set-up-a-Xash3D-Dedicated-Server-on-Debian-or-Ubuntu) to simplify updating process.
|
||||
|
||||
Just follow these rules to not get banned on our master server. Good luck, have fun!
|
||||
|
||||
|
||||
1226
Documentation/supported-mod-list.md
Normal file
1226
Documentation/supported-mod-list.md
Normal file
File diff suppressed because it is too large
Load Diff
95
README.md
Normal file
95
README.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# Xash3D FWGS Engine
|
||||
[](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 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
|
||||
```
|
||||
|
||||
## Fork features
|
||||
* HLSDK 2.4 support.
|
||||
* Crossplatform: supported x86 and ARM on Windows/Linux/BSD/Android. ([see docs for more info](Documentation/ports.md))
|
||||
* Modern compilers support: say no more to MSVC6.
|
||||
* Better multiplayer support: multiple master servers, headless dedicated server.
|
||||
* Mobility API: allows better game integration on mobile devices(vibration, touch controls)
|
||||
* Different input methods: touch, gamepad and classic mouse & keyboard.
|
||||
* TrueType font rendering, as a part of mainui_cpp.
|
||||
* Multiple renderers support: OpenGL, GLESv1, GLESv2, Software
|
||||
* A set of small improvements, without broken compatibility.
|
||||
|
||||
## Planned fork features
|
||||
* Virtual Reality support and game API
|
||||
* Voice support
|
||||
* Vulkan renderer
|
||||
|
||||
## Installation & Running
|
||||
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.
|
||||
1) Copy engine binaries to some directory.
|
||||
2) Copy `valve` directory from [Half-Life](https://store.steampowered.com/app/70/HalfLife/) to directory with engine binaries.
|
||||
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-xash3d).
|
||||
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
|
||||
* Before sending an issue, check if someone already reported your issue. Make sure you're following "How To Ask Questions The Smart Way" guide by Eric Steven Raymond. Read more: http://www.catb.org/~esr/faqs/smart-questions.html
|
||||
* Issues are accepted in both English and Russian
|
||||
* Before sending a PR, check if you followed our contribution guide in CONTRIBUTING.md file.
|
||||
|
||||
## Build instructions
|
||||
We are using Waf build system. If you have some Waf-related questions, I recommend you to read https://waf.io/book/
|
||||
|
||||
NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
|
||||
|
||||
### Prerequisites
|
||||
|
||||
If your CPU is x86 compatible, we are building 32-bit code by default. This was dont 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!
|
||||
|
||||
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-xash3d).
|
||||
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 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.
|
||||
* Download [SDL2](https://libsdl.org/download-2.0.php) development package for Visual Studio.
|
||||
* Clone this repository: `git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
|
||||
* 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
|
||||
##### Debian/Ubuntu
|
||||
* Enable i386 on your system, if you're compiling 32-bit engine on amd64. If not, skip this
|
||||
|
||||
`$ sudo dpkg --add-architecture i386`
|
||||
* Install development tools
|
||||
* 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`
|
||||
* For everything else: \
|
||||
`$ sudo apt install build-essential python libsdl2-dev libfontconfig-dev libfreetype6-dev`
|
||||
* Clone this repostory:
|
||||
`$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`
|
||||
|
||||
### Building
|
||||
#### Windows (Visual Studio)
|
||||
0) Open command line
|
||||
1) Navigate to `xash3d-fwgs` directory.
|
||||
2) Carefully examine which build options are available: `waf --help`
|
||||
3) Configure build: `waf configure -T release --sdl2=c:/path/to/SDL2`
|
||||
4) Compile: `waf build`
|
||||
5) Install: `waf install --destdir=c:/path/to/any/output/directory`
|
||||
|
||||
#### 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`
|
||||
1) Configure build: `./waf configure -T release`
|
||||
(You need to pass `-8` to compile 64-bit engine on 64-bit x86 processor)
|
||||
2) Compile: `./waf build`
|
||||
3) Install(optional): `./waf install --destdir=/path/to/any/output/directory`
|
||||
65
common/backends.h
Normal file
65
common/backends.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
backends.h - backend macro definitions
|
||||
Copyright (C) 2016 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.
|
||||
*/
|
||||
#ifndef BACKENDS_H
|
||||
#define BACKENDS_H
|
||||
|
||||
// video backends (XASH_VIDEO)
|
||||
#define VIDEO_NULL 0
|
||||
#define VIDEO_SDL 1
|
||||
#define VIDEO_ANDROID 2
|
||||
#define VIDEO_FBDEV 3
|
||||
#define VIDEO_DOS 4
|
||||
|
||||
|
||||
// audio backends (XASH_SOUND)
|
||||
#define SOUND_NULL 0
|
||||
#define SOUND_SDL 1
|
||||
#define SOUND_OPENSLES 2
|
||||
#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)
|
||||
#define INPUT_NULL 0
|
||||
#define INPUT_SDL 1
|
||||
#define INPUT_ANDROID 2
|
||||
#define INPUT_EVDEV 3
|
||||
|
||||
// timer (XASH_TIMER)
|
||||
#define TIMER_NULL 0 // not used
|
||||
#define TIMER_SDL 1
|
||||
#define TIMER_POSIX 2
|
||||
#define TIMER_WIN32 3
|
||||
#define TIMER_DOS 4
|
||||
|
||||
// messageboxes (XASH_MESSAGEBOX)
|
||||
#define MSGBOX_STDERR 0
|
||||
#define MSGBOX_SDL 1
|
||||
#define MSGBOX_ANDROID 2
|
||||
#define MSGBOX_WIN32 3
|
||||
|
||||
|
||||
// library loading (XASH_LIB)
|
||||
#define LIB_NULL 0
|
||||
#define LIB_POSIX 1
|
||||
#define LIB_WIN32 2
|
||||
#define LIB_STATIC 3
|
||||
|
||||
|
||||
#endif /* BACKENDS_H */
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -57,4 +57,4 @@ struct beam_s
|
||||
struct particle_s *particles;
|
||||
};
|
||||
|
||||
#endif//BEAMDEF_H
|
||||
#endif//BEAMDEF_H
|
||||
|
||||
@@ -22,4 +22,4 @@ typedef struct
|
||||
vec3_t origin;
|
||||
} boneinfo_t;
|
||||
|
||||
#endif//BONEINFO_H
|
||||
#endif//BONEINFO_H
|
||||
|
||||
@@ -48,7 +48,7 @@ BRUSH MODELS
|
||||
|
||||
#define SURF_PLANEBACK BIT( 1 ) // plane should be negated
|
||||
#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_DRAWTILED BIT( 5 ) // face without lighmap
|
||||
#define SURF_CONVEYOR BIT( 6 ) // scrolled texture (was SURF_DRAWBACKGROUND)
|
||||
@@ -73,7 +73,8 @@ BRUSH MODELS
|
||||
#define MAX_MAP_FACES 262144 // can be increased without problems
|
||||
#define MAX_MAP_MARKSURFACES 524288 // can be increased without problems
|
||||
#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_PLANES 65536 // can be increased without problems
|
||||
#define MAX_MAP_NODES 32767 // because negative shorts are leafs
|
||||
@@ -166,7 +167,7 @@ typedef struct
|
||||
{
|
||||
int id; // must be little endian XASH
|
||||
int version;
|
||||
dlump_t lumps[EXTRA_LUMPS];
|
||||
dlump_t lumps[EXTRA_LUMPS];
|
||||
} dextrahdr_t;
|
||||
|
||||
typedef struct
|
||||
@@ -321,4 +322,4 @@ typedef struct
|
||||
int lightofs; // start of [numstyles*surfsize] samples
|
||||
} dface32_t;
|
||||
|
||||
#endif//BSPFILE_H
|
||||
#endif//BSPFILE_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -33,7 +33,7 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float prevanimtime;
|
||||
float prevanimtime;
|
||||
float sequencetime;
|
||||
byte prevseqblending[2];
|
||||
vec3_t prevorigin;
|
||||
@@ -102,4 +102,4 @@ struct cl_entity_s
|
||||
colorVec cvFloorColor;
|
||||
};
|
||||
|
||||
#endif//CL_ENTITY_H
|
||||
#endif//CL_ENTITY_H
|
||||
|
||||
113
common/com_image.h
Normal file
113
common/com_image.h
Normal file
@@ -0,0 +1,113 @@
|
||||
#pragma once
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
internal image format
|
||||
|
||||
typically expanded to rgba buffer
|
||||
NOTE: number at end of pixelformat name it's a total bitscount e.g. PF_RGB_24 == PF_RGB_888
|
||||
========================================================================
|
||||
*/
|
||||
#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 || type == PF_BC6H_SIGNED || type == PF_BC6H_UNSIGNED || type == PF_BC7)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PF_UNKNOWN = 0,
|
||||
PF_INDEXED_24, // inflated palette (768 bytes)
|
||||
PF_INDEXED_32, // deflated palette (1024 bytes)
|
||||
PF_RGBA_32, // normal rgba buffer
|
||||
PF_BGRA_32, // big endian RGBA (MacOS)
|
||||
PF_RGB_24, // uncompressed dds or another 24-bit image
|
||||
PF_BGR_24, // big-endian RGB (MacOS)
|
||||
PF_LUMINANCE,
|
||||
PF_DXT1, // s3tc DXT1/BC1 format
|
||||
PF_DXT3, // s3tc DXT3/BC2 format
|
||||
PF_DXT5, // s3tc DXT5/BC3 format
|
||||
PF_ATI2, // latc ATI2N/BC5 format
|
||||
PF_BC6H_SIGNED, // bptc BC6H signed FP16 format
|
||||
PF_BC6H_UNSIGNED, // bptc BC6H unsigned FP16 format
|
||||
PF_BC7, // bptc BC7 format
|
||||
PF_TOTALCOUNT, // must be last
|
||||
} pixformat_t;
|
||||
|
||||
typedef struct bpc_desc_s
|
||||
{
|
||||
int format; // pixelformat
|
||||
char name[16]; // used for debug
|
||||
uint glFormat; // RGBA format
|
||||
int bpp; // channels (e.g. rgb = 3, rgba = 4)
|
||||
} bpc_desc_t;
|
||||
|
||||
// imagelib global settings
|
||||
typedef enum
|
||||
{
|
||||
IL_USE_LERPING = BIT(0), // lerping images during resample
|
||||
IL_KEEP_8BIT = BIT(1), // don't expand paletted images
|
||||
IL_ALLOW_OVERWRITE = BIT(2), // allow to overwrite stored images
|
||||
IL_DONTFLIP_TGA = BIT(3), // Steam background completely ignore tga attribute 0x20 (stupid lammers!)
|
||||
IL_DDS_HARDWARE = BIT(4), // DXT compression is support
|
||||
IL_LOAD_DECAL = BIT(5), // special mode for load gradient decals
|
||||
IL_OVERVIEW = BIT(6), // overview required some unque operations
|
||||
} ilFlags_t;
|
||||
|
||||
// goes into rgbdata_t->encode
|
||||
#define DXT_ENCODE_DEFAULT 0 // don't use custom encoders
|
||||
#define DXT_ENCODE_COLOR_YCoCg 0x1A01 // make sure that value dosn't collide with anything
|
||||
#define DXT_ENCODE_ALPHA_1BIT 0x1A02 // normal 1-bit alpha
|
||||
#define DXT_ENCODE_ALPHA_8BIT 0x1A03 // normal 8-bit alpha
|
||||
#define DXT_ENCODE_ALPHA_SDF 0x1A04 // signed distance field
|
||||
#define DXT_ENCODE_NORMAL_AG_ORTHO 0x1A05 // orthographic projection
|
||||
#define DXT_ENCODE_NORMAL_AG_STEREO 0x1A06 // stereographic projection
|
||||
#define DXT_ENCODE_NORMAL_AG_PARABOLOID 0x1A07 // paraboloid projection
|
||||
#define DXT_ENCODE_NORMAL_AG_QUARTIC 0x1A08 // newton method
|
||||
#define DXT_ENCODE_NORMAL_AG_AZIMUTHAL 0x1A09 // Lambert Azimuthal Equal-Area
|
||||
|
||||
// rgbdata output flags
|
||||
typedef enum
|
||||
{
|
||||
// rgbdata->flags
|
||||
IMAGE_CUBEMAP = BIT(0), // it's 6-sides cubemap buffer
|
||||
IMAGE_HAS_ALPHA = BIT(1), // image contain alpha-channel
|
||||
IMAGE_HAS_COLOR = BIT(2), // image contain RGB-channel
|
||||
IMAGE_COLORINDEX = BIT(3), // all colors in palette is gradients of last color (decals)
|
||||
IMAGE_HAS_LUMA = BIT(4), // image has luma pixels (q1-style maps)
|
||||
IMAGE_SKYBOX = BIT(5), // only used by FS_SaveImage - for write right suffixes
|
||||
IMAGE_QUAKESKY = BIT(6), // it's a quake sky double layered clouds (so keep it as 8 bit)
|
||||
IMAGE_DDS_FORMAT = BIT(7), // a hint for GL loader
|
||||
IMAGE_MULTILAYER = BIT(8), // to differentiate from 3D texture
|
||||
IMAGE_ONEBIT_ALPHA = BIT(9), // binary alpha
|
||||
IMAGE_QUAKEPAL = BIT(10), // image has quake1 palette
|
||||
|
||||
// Image_Process manipulation flags
|
||||
IMAGE_FLIP_X = BIT(16), // flip the image by width
|
||||
IMAGE_FLIP_Y = BIT(17), // flip the image by height
|
||||
IMAGE_ROT_90 = BIT(18), // flip from upper left corner to down right corner
|
||||
IMAGE_ROT180 = IMAGE_FLIP_X|IMAGE_FLIP_Y,
|
||||
IMAGE_ROT270 = IMAGE_FLIP_X|IMAGE_FLIP_Y|IMAGE_ROT_90,
|
||||
// reserved
|
||||
IMAGE_RESAMPLE = BIT(20), // resample image to specified dims
|
||||
// reserved
|
||||
// reserved
|
||||
IMAGE_FORCE_RGBA = BIT(23), // force image to RGBA buffer
|
||||
IMAGE_MAKE_LUMA = BIT(24), // create luma texture from indexed
|
||||
IMAGE_QUANTIZE = BIT(25), // make indexed image from 24 or 32- bit image
|
||||
IMAGE_LIGHTGAMMA = BIT(26), // apply gamma for image
|
||||
IMAGE_REMAP = BIT(27), // interpret width and height as top and bottom color
|
||||
} imgFlags_t;
|
||||
|
||||
typedef struct rgbdata_s
|
||||
{
|
||||
word width; // image width
|
||||
word height; // image height
|
||||
word depth; // image depth
|
||||
uint type; // compression type
|
||||
uint flags; // misc image flags
|
||||
word encode; // DXT may have custom encoder, that will be decoded in GLSL-side
|
||||
byte numMips; // mipmap count
|
||||
byte *palette; // palette if present
|
||||
byte *buffer; // image buffer
|
||||
rgba_t fogParams; // some water textures in hl1 has info about fog color and alpha
|
||||
size_t size; // for bounds checking
|
||||
} rgbdata_t;
|
||||
|
||||
@@ -16,11 +16,9 @@ GNU General Public License for more details.
|
||||
#ifndef COM_MODEL_H
|
||||
#define COM_MODEL_H
|
||||
|
||||
#include "xash3d_types.h"
|
||||
#include "bspfile.h" // we need some declarations from it
|
||||
|
||||
typedef vec_t vec2_t[2];
|
||||
typedef vec_t vec4_t[4];
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
@@ -34,16 +32,17 @@ typedef vec_t vec4_t[4];
|
||||
|
||||
#define MIPLEVELS 4
|
||||
#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
|
||||
|
||||
// model types
|
||||
typedef enum
|
||||
{
|
||||
mod_bad = -1,
|
||||
mod_brush,
|
||||
mod_sprite,
|
||||
mod_alias,
|
||||
mod_brush,
|
||||
mod_sprite,
|
||||
mod_alias,
|
||||
mod_studio
|
||||
} modtype_t;
|
||||
|
||||
@@ -94,7 +93,7 @@ typedef struct texture_s
|
||||
struct texture_s *alternate_anims; // bmodels in frame 1 use these
|
||||
unsigned short fb_texturenum; // auto-luma texturenum
|
||||
unsigned short dt_texturenum; // detail-texture binding
|
||||
unsigned int unused[3]; // reserved
|
||||
unsigned int unused[3]; // reserved
|
||||
} texture_t;
|
||||
|
||||
typedef struct
|
||||
@@ -148,7 +147,7 @@ typedef struct mnode_s
|
||||
|
||||
// node specific
|
||||
mplane_t *plane;
|
||||
struct mnode_s *children[2];
|
||||
struct mnode_s *children[2];
|
||||
#ifdef SUPPORT_BSP2_FORMAT
|
||||
int firstsurface;
|
||||
int numsurfaces;
|
||||
@@ -167,7 +166,7 @@ struct decal_s
|
||||
decal_t *pnext; // linked list for each surface
|
||||
msurface_t *psurface; // Surface id for persistence / unlinking
|
||||
float dx; // local texture coordinates
|
||||
float dy; //
|
||||
float dy; //
|
||||
float scale; // Pixel scale
|
||||
short texture; // Decal texture
|
||||
short flags; // Decal flags FDECAL_*
|
||||
@@ -232,7 +231,7 @@ typedef struct mextrasurf_s
|
||||
int reserved[32]; // just for future expansions or mod-makers
|
||||
} mextrasurf_t;
|
||||
|
||||
typedef struct msurface_s
|
||||
struct msurface_s
|
||||
{
|
||||
int visframe; // should be drawn when node is crossed
|
||||
|
||||
@@ -264,7 +263,7 @@ typedef struct msurface_s
|
||||
|
||||
color24 *samples; // note: this is the actual lightmap data for this surface
|
||||
decal_t *pdecals;
|
||||
} msurface_t;
|
||||
};
|
||||
|
||||
typedef struct hull_s
|
||||
{
|
||||
@@ -292,7 +291,7 @@ typedef struct model_s
|
||||
// shared modelinfo
|
||||
modtype_t type; // model type
|
||||
int numframes; // sprite's framecount
|
||||
byte *mempool; // private mempool (was synctype)
|
||||
poolhandle_t mempool; // private mempool (was synctype)
|
||||
int flags; // hl compatibility
|
||||
|
||||
//
|
||||
@@ -300,7 +299,7 @@ typedef struct model_s
|
||||
//
|
||||
vec3_t mins, maxs; // bounding box at angles '0 0 0'
|
||||
float radius;
|
||||
|
||||
|
||||
// brush model
|
||||
int firstmodelsurface;
|
||||
int nummodelsurfaces;
|
||||
@@ -387,7 +386,7 @@ typedef struct player_info_s
|
||||
int bottomcolor;
|
||||
|
||||
// last frame rendered
|
||||
int renderframe;
|
||||
int renderframe;
|
||||
|
||||
// Gait frame estimation
|
||||
int gaitsequence;
|
||||
@@ -504,4 +503,36 @@ typedef struct
|
||||
maliasframedesc_t frames[1]; // variable sized
|
||||
} aliashdr_t;
|
||||
|
||||
#endif//COM_MODEL_H
|
||||
|
||||
|
||||
// remapping info
|
||||
#define SUIT_HUE_START 192
|
||||
#define SUIT_HUE_END 223
|
||||
#define PLATE_HUE_START 160
|
||||
#define PLATE_HUE_END 191
|
||||
|
||||
#define SHIRT_HUE_START 16
|
||||
#define SHIRT_HUE_END 32
|
||||
#define PANTS_HUE_START 96
|
||||
#define PANTS_HUE_END 112
|
||||
|
||||
|
||||
// 1/32 epsilon to keep floating point happy
|
||||
#define DIST_EPSILON (1.0f / 32.0f)
|
||||
#define FRAC_EPSILON (1.0f / 1024.0f)
|
||||
#define BACKFACE_EPSILON 0.01f
|
||||
#define MAX_BOX_LEAFS 256
|
||||
#define ANIM_CYCLE 2
|
||||
#define MOD_FRAMES 20
|
||||
|
||||
|
||||
|
||||
#define MAX_DEMOS 32
|
||||
#define MAX_MOVIES 8
|
||||
#define MAX_CDTRACKS 32
|
||||
#define MAX_CLIENT_SPRITES 512 // SpriteTextures (0-256 hud, 256-512 client)
|
||||
#define MAX_EFRAGS 8192 // Arcane Dimensions required
|
||||
#define MAX_REQUESTS 64
|
||||
|
||||
|
||||
#endif//COM_MODEL_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -22,4 +22,4 @@ typedef struct con_nprint_s
|
||||
float color[3]; // RGB colors ( 0.0 -> 1.0 scale )
|
||||
} con_nprint_t;
|
||||
|
||||
#endif//CON_NPRINT_H
|
||||
#endif//CON_NPRINT_H
|
||||
|
||||
367
common/const.h
367
common/const.h
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -20,45 +20,45 @@
|
||||
// Most came from server.h
|
||||
|
||||
// edict->flags
|
||||
#define FL_FLY (1<<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_CONVEYOR (1<<2)
|
||||
#define FL_CLIENT (1<<3)
|
||||
#define FL_INWATER (1<<4)
|
||||
#define FL_MONSTER (1<<5)
|
||||
#define FL_GODMODE (1<<6)
|
||||
#define FL_NOTARGET (1<<7)
|
||||
#define FL_SKIPLOCALHOST (1<<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_PARTIALGROUND (1<<10) // not all corners are valid
|
||||
#define FL_WATERJUMP (1<<11) // player jumping out of water
|
||||
#define FL_FROZEN (1<<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_DUCKING (1<<14) // Player flag -- Player is fully crouched
|
||||
#define FL_FLOAT (1<<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_FLY (1U<<0) // Changes the SV_Movestep() behavior to not need to be on ground
|
||||
#define FL_SWIM (1U<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
|
||||
#define FL_CONVEYOR (1U<<2)
|
||||
#define FL_CLIENT (1U<<3)
|
||||
#define FL_INWATER (1U<<4)
|
||||
#define FL_MONSTER (1U<<5)
|
||||
#define FL_GODMODE (1U<<6)
|
||||
#define FL_NOTARGET (1U<<7)
|
||||
#define FL_SKIPLOCALHOST (1U<<8) // Don't send entity to local host, it's predicting this entity itself
|
||||
#define FL_ONGROUND (1U<<9) // At rest / on the ground
|
||||
#define FL_PARTIALGROUND (1U<<10) // not all corners are valid
|
||||
#define FL_WATERJUMP (1U<<11) // player jumping out of water
|
||||
#define FL_FROZEN (1U<<12) // Player is frozen for 3rd person camera
|
||||
#define FL_FAKECLIENT (1U<<13) // JAC: fake client, simulated server side; don't send network messages to them
|
||||
#define FL_DUCKING (1U<<14) // Player flag -- Player is fully crouched
|
||||
#define FL_FLOAT (1U<<15) // Apply floating force to this entity when in water
|
||||
#define FL_GRAPHED (1U<<16) // worldgraph has this ent listed as something that blocks a connection
|
||||
|
||||
// UNDONE: Do we need these?
|
||||
#define FL_IMMUNE_WATER (1<<17)
|
||||
#define FL_IMMUNE_SLIME (1<<18)
|
||||
#define FL_IMMUNE_LAVA (1<<19)
|
||||
#define FL_IMMUNE_WATER (1U<<17)
|
||||
#define FL_IMMUNE_SLIME (1U<<18)
|
||||
#define FL_IMMUNE_LAVA (1U<<19)
|
||||
|
||||
#define FL_PROXY (1<<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_BASEVELOCITY (1<<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_ONTRAIN (1<<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_SPECTATOR (1<<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_PROXY (1U<<20) // This is a spectator proxy
|
||||
#define FL_ALWAYSTHINK (1U<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path)
|
||||
#define FL_BASEVELOCITY (1U<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum)
|
||||
#define FL_MONSTERCLIP (1U<<23) // Only collide in with monsters who have FL_MONSTERCLIP set
|
||||
#define FL_ONTRAIN (1U<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
|
||||
#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 (1U<<26) // This client is a spectator, don't run touch functions, etc.
|
||||
#define FL_LASERDOT (1U<<27) // Predicted laser spot from rocket launcher
|
||||
|
||||
#define FL_CUSTOMENTITY (1<<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_DORMANT (1<<31) // Entity is dormant, no updates to client
|
||||
#define FL_CUSTOMENTITY (1U<<29) // This is a custom entity
|
||||
#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 (1U<<31) // Entity is dormant, no updates to client
|
||||
|
||||
// Goes into globalvars_t.trace_flags
|
||||
#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box
|
||||
#define FTRACE_IGNORE_GLASS (1<<1) // traceline will be ignored entities with rendermode != kRenderNormal
|
||||
#define FTRACE_SIMPLEBOX (1U<<0) // Traceline with a simple box
|
||||
#define FTRACE_IGNORE_GLASS (1U<<1) // traceline will be ignored entities with rendermode != kRenderNormal
|
||||
|
||||
// walkmove modes
|
||||
#define WALKMOVE_NORMAL 0 // normal walkmove
|
||||
@@ -114,50 +114,50 @@
|
||||
#define EF_LIGHT 64 // rocket flare glow sprite
|
||||
#define EF_NODRAW 128 // don't draw entity
|
||||
|
||||
#define EF_WATERSIDES (1<<26) // Do not remove sides for func_water entity
|
||||
#define EF_FULLBRIGHT (1<<27) // Just get fullbright
|
||||
#define EF_NOSHADOW (1<<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_REQUEST_PHS (1<<30) // This entity requested phs bitvector instead of pvsbitvector in AddToFullPack calls
|
||||
#define EF_WATERSIDES (1U<<26) // Do not remove sides for func_water entity
|
||||
#define EF_FULLBRIGHT (1U<<27) // Just get fullbright
|
||||
#define EF_NOSHADOW (1U<<28) // ignore shadow for this entity
|
||||
#define EF_MERGE_VISIBILITY (1U<<29) // this entity allowed to merge vis (e.g. env_sky or portal camera)
|
||||
#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
|
||||
|
||||
// entity flags
|
||||
#define EFLAG_SLERP 1 // do studio interpolation of this entity
|
||||
|
||||
|
||||
//
|
||||
// temp entity events
|
||||
//
|
||||
#define TE_BEAMPOINTS 0 // beam effect between two points
|
||||
// coord coord coord (start position)
|
||||
// coord coord coord (end position)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// coord coord coord (start position)
|
||||
// coord coord coord (end position)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#define TE_BEAMENTPOINT 1 // beam effect between point and entity
|
||||
// short (start entity)
|
||||
// coord coord coord (end position)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// short (start entity)
|
||||
// coord coord coord (end position)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#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
|
||||
// coord coord coord (position)
|
||||
// coord coord coord (position)
|
||||
// short (sprite index)
|
||||
// byte (scale in 0.1's)
|
||||
// byte (framerate)
|
||||
@@ -173,54 +173,54 @@
|
||||
#define TE_EXPLFLAG_ROTATE 32 // rotate the sprite randomly
|
||||
|
||||
#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
|
||||
// coord coord coord (position)
|
||||
// coord coord coord (position)
|
||||
// short (sprite index)
|
||||
// byte (scale in 0.1's)
|
||||
// byte (framerate)
|
||||
|
||||
#define TE_TRACER 6 // tracer effect from point to point
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (end)
|
||||
|
||||
#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (end)
|
||||
// byte (life in 0.1's)
|
||||
// byte (width in 0.1's)
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (end)
|
||||
// byte (life in 0.1's)
|
||||
// byte (width in 0.1's)
|
||||
// byte (amplitude in 0.01's)
|
||||
// short (sprite model index)
|
||||
|
||||
#define TE_BEAMENTS 8
|
||||
// short (start entity)
|
||||
// short (end entity)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
#define TE_BEAMENTS 8
|
||||
// short (start entity)
|
||||
// short (end entity)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#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
|
||||
// coord coord coord (position)
|
||||
// coord coord coord (position)
|
||||
|
||||
#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
|
||||
// coord coord coord (position)
|
||||
// coord coord coord (position)
|
||||
// byte (starting color)
|
||||
// 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)
|
||||
// short (texture index of precached decal texture name)
|
||||
// short (entity index)
|
||||
@@ -230,67 +230,67 @@
|
||||
// coord, coord, coord (position)
|
||||
// byte (radius)
|
||||
// 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
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (end)
|
||||
// coord, coord, coord (start)
|
||||
// coord, coord, coord (end)
|
||||
// short (sprite index)
|
||||
// byte (count)
|
||||
// byte (life in 0.1's)
|
||||
// byte (scale in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (scale in 0.1's)
|
||||
// byte (velocity along vector in 10's)
|
||||
// byte (randomness of velocity in 10's)
|
||||
|
||||
#define TE_BEAM 16 // obsolete
|
||||
|
||||
#define TE_SPRITE 17 // additive sprite, plays 1 cycle
|
||||
// coord, coord, coord (position)
|
||||
// short (sprite index)
|
||||
// byte (scale in 0.1's)
|
||||
// coord, coord, coord (position)
|
||||
// short (sprite index)
|
||||
// byte (scale in 0.1's)
|
||||
// byte (brightness)
|
||||
|
||||
#define TE_BEAMSPRITE 18 // A beam with a sprite at the end
|
||||
// coord, coord, coord (start position)
|
||||
// coord, coord, coord (end position)
|
||||
// short (beam sprite index)
|
||||
// short (end sprite index)
|
||||
// coord, coord, coord (start position)
|
||||
// coord, coord, coord (end position)
|
||||
// short (beam sprite index)
|
||||
// short (end sprite index)
|
||||
|
||||
#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// coord coord coord (center position)
|
||||
// coord coord coord (axis and radius)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// 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
|
||||
// short (entity:attachment to follow)
|
||||
// short (sprite index)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
|
||||
#define TE_GLOWSPRITE 23
|
||||
#define TE_GLOWSPRITE 23
|
||||
// coord, coord, coord (pos) short (model index) byte (scale / 10)
|
||||
|
||||
#define TE_BEAMRING 24 // connect a beam ring to two entities
|
||||
// short (start entity)
|
||||
// short (end entity)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// short (start entity)
|
||||
// short (end entity)
|
||||
// short (sprite index)
|
||||
// byte (starting frame)
|
||||
// byte (frame rate in 0.1's)
|
||||
// byte (life in 0.1's)
|
||||
// byte (line width in 0.1's)
|
||||
// byte (noise amplitude in 0.01's)
|
||||
// byte,byte,byte (color)
|
||||
// byte (brightness)
|
||||
// byte (scroll speed in 0.1's)
|
||||
|
||||
#define TE_STREAK_SPLASH 25 // oriented shower of tracers
|
||||
// coord coord coord (start position)
|
||||
// coord coord coord (direction vector)
|
||||
// coord coord coord (start position)
|
||||
// coord coord coord (direction vector)
|
||||
// byte (color)
|
||||
// short (count)
|
||||
// short (base speed)
|
||||
@@ -330,15 +330,15 @@
|
||||
#define TE_BEAMHOSE 26 // obsolete
|
||||
|
||||
#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect
|
||||
// coord, coord, coord (pos)
|
||||
// byte (radius in 10's)
|
||||
// coord, coord, coord (pos)
|
||||
// byte (radius in 10's)
|
||||
// byte byte byte (color)
|
||||
// byte (life in 10's)
|
||||
// byte (decay rate in 10's)
|
||||
|
||||
#define TE_ELIGHT 28 // point entity light, no world effect
|
||||
// short (entity:attachment to follow)
|
||||
// coord coord coord (initial position)
|
||||
// coord coord coord (initial position)
|
||||
// coord (radius)
|
||||
// byte byte byte (color)
|
||||
// byte (life in 0.1's)
|
||||
@@ -374,8 +374,8 @@
|
||||
|
||||
#define TE_LARGEFUNNEL 100
|
||||
// coord coord coord (funnel position)
|
||||
// short (sprite index)
|
||||
// short (flags)
|
||||
// short (sprite index)
|
||||
// short (flags)
|
||||
|
||||
#define TE_BLOODSTREAM 101 // particle spray
|
||||
// coord coord coord (start position)
|
||||
@@ -404,7 +404,7 @@
|
||||
// byte (density)
|
||||
|
||||
#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)
|
||||
// angle (initial yaw)
|
||||
// short (model index)
|
||||
@@ -441,7 +441,7 @@
|
||||
// byte (speed)
|
||||
// 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)
|
||||
// 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_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_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 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_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
|
||||
#define CHAN_AUTO 0
|
||||
#define CHAN_WEAPON 1
|
||||
@@ -620,7 +613,7 @@
|
||||
#define CHAN_ITEM 3
|
||||
#define CHAN_BODY 4
|
||||
#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_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
|
||||
|
||||
@@ -628,7 +621,7 @@
|
||||
#define ATTN_NONE 0
|
||||
#define ATTN_NORM (float)0.8
|
||||
#define ATTN_IDLE (float)2
|
||||
#define ATTN_STATIC (float)1.25
|
||||
#define ATTN_STATIC (float)1.25
|
||||
|
||||
// pitch values
|
||||
#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
|
||||
|
||||
// buttons
|
||||
#define IN_ATTACK (1<<0)
|
||||
#define IN_JUMP (1<<1)
|
||||
#define IN_DUCK (1<<2)
|
||||
#define IN_FORWARD (1<<3)
|
||||
#define IN_BACK (1<<4)
|
||||
#define IN_USE (1<<5)
|
||||
#define IN_CANCEL (1<<6)
|
||||
#define IN_LEFT (1<<7)
|
||||
#define IN_RIGHT (1<<8)
|
||||
#define IN_MOVELEFT (1<<9)
|
||||
#define IN_MOVERIGHT (1<<10)
|
||||
#define IN_ATTACK2 (1<<11)
|
||||
#define IN_RUN (1<<12)
|
||||
#define IN_RELOAD (1<<13)
|
||||
#define IN_ALT1 (1<<14)
|
||||
#define IN_SCORE (1<<15) // Used by client.dll for when scoreboard is held down
|
||||
#define IN_ATTACK (1U<<0)
|
||||
#define IN_JUMP (1U<<1)
|
||||
#define IN_DUCK (1U<<2)
|
||||
#define IN_FORWARD (1U<<3)
|
||||
#define IN_BACK (1U<<4)
|
||||
#define IN_USE (1U<<5)
|
||||
#define IN_CANCEL (1U<<6)
|
||||
#define IN_LEFT (1U<<7)
|
||||
#define IN_RIGHT (1U<<8)
|
||||
#define IN_MOVELEFT (1U<<9)
|
||||
#define IN_MOVERIGHT (1U<<10)
|
||||
#define IN_ATTACK2 (1U<<11)
|
||||
#define IN_RUN (1U<<12)
|
||||
#define IN_RELOAD (1U<<13)
|
||||
#define IN_ALT1 (1U<<14)
|
||||
#define IN_SCORE (1U<<15) // Used by client.dll for when scoreboard is held down
|
||||
|
||||
// Break Model Defines
|
||||
#define BREAK_TYPEMASK 0x4F
|
||||
@@ -691,8 +684,8 @@
|
||||
#define TE_BOUNCE_SHOTSHELL 2
|
||||
|
||||
// Rendering constants
|
||||
enum
|
||||
{
|
||||
enum
|
||||
{
|
||||
kRenderNormal, // src
|
||||
kRenderTransColor, // c*a+dest*(1-a)
|
||||
kRenderTransTexture, // src*a+dest*(1-a)
|
||||
@@ -701,21 +694,21 @@ enum
|
||||
kRenderTransAdd, // src*a+dest
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
kRenderFxNone = 0,
|
||||
kRenderFxPulseSlow,
|
||||
kRenderFxPulseFast,
|
||||
kRenderFxPulseSlowWide,
|
||||
kRenderFxPulseFastWide,
|
||||
kRenderFxFadeSlow,
|
||||
kRenderFxFadeFast,
|
||||
kRenderFxSolidSlow,
|
||||
kRenderFxSolidFast,
|
||||
kRenderFxStrobeSlow,
|
||||
kRenderFxStrobeFast,
|
||||
kRenderFxStrobeFaster,
|
||||
kRenderFxFlickerSlow,
|
||||
enum
|
||||
{
|
||||
kRenderFxNone = 0,
|
||||
kRenderFxPulseSlow,
|
||||
kRenderFxPulseFast,
|
||||
kRenderFxPulseSlowWide,
|
||||
kRenderFxPulseFastWide,
|
||||
kRenderFxFadeSlow,
|
||||
kRenderFxFadeFast,
|
||||
kRenderFxSolidSlow,
|
||||
kRenderFxSolidFast,
|
||||
kRenderFxStrobeSlow,
|
||||
kRenderFxStrobeFast,
|
||||
kRenderFxStrobeFaster,
|
||||
kRenderFxFlickerSlow,
|
||||
kRenderFxFlickerFast,
|
||||
kRenderFxNoDissipation,
|
||||
kRenderFxDistort, // Distort/scale/translate flicker
|
||||
@@ -729,19 +722,9 @@ enum
|
||||
typedef int func_t;
|
||||
typedef int string_t;
|
||||
|
||||
typedef unsigned char byte;
|
||||
typedef unsigned short word;
|
||||
|
||||
#define Q_isspace( ch ) (ch < 32 || ch > 255)
|
||||
|
||||
#undef true
|
||||
#undef false
|
||||
|
||||
#ifndef __cplusplus
|
||||
typedef enum { false, true } qboolean;
|
||||
#else
|
||||
typedef int qboolean;
|
||||
#endif
|
||||
#include "xash3d_types.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -778,4 +761,4 @@ typedef struct
|
||||
int hitgroup; // 0 == generic, non zero is specific body part
|
||||
} trace_t;
|
||||
|
||||
#endif//CONST_H
|
||||
#endif//CONST_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -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_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
|
||||
#define FCVAR_NOEXTRAWHITEPACE (1<<9) // strip trailing/leading white space from this cvar
|
||||
#define FCVAR_PRIVILEGED (1<<10) // only available in privileged mode
|
||||
#define FCVAR_FILTERABLE (1<<11) // filtered in unprivileged mode if cl_filterstuffcmd is 1
|
||||
|
||||
#define FCVAR_MOVEVARS (1<<10) // this cvar is a part of movevars_t struct that shared between client and server
|
||||
#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 opengl.cfg
|
||||
// Xash3D extensions
|
||||
#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_GAMEUIDLL (1<<14) // defined by the menu DLL
|
||||
#define FCVAR_CHEAT (1<<15) // can not be changed if cheats are disabled
|
||||
|
||||
|
||||
// a1ba: let's reuse higher bits for flags extensions from now on
|
||||
#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
|
||||
{
|
||||
char *name;
|
||||
@@ -42,4 +46,4 @@ typedef struct cvar_s
|
||||
struct cvar_s *next;
|
||||
} cvar_t;
|
||||
|
||||
#endif//CVARDEF_H
|
||||
#endif//CVARDEF_H
|
||||
|
||||
195
common/defaults.h
Normal file
195
common/defaults.h
Normal file
@@ -0,0 +1,195 @@
|
||||
/*
|
||||
defaults.h - set up default configuration
|
||||
Copyright (C) 2016 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.
|
||||
*/
|
||||
|
||||
#ifndef DEFAULTS_H
|
||||
#define DEFAULTS_H
|
||||
|
||||
#include "backends.h"
|
||||
#include "build.h"
|
||||
|
||||
/*
|
||||
===================================================================
|
||||
|
||||
SETUP BACKENDS DEFINITIONS
|
||||
|
||||
===================================================================
|
||||
*/
|
||||
#if !XASH_DEDICATED
|
||||
#if XASH_SDL
|
||||
// we are building using libSDL
|
||||
#ifndef XASH_VIDEO
|
||||
#define XASH_VIDEO VIDEO_SDL
|
||||
#endif // XASH_VIDEO
|
||||
|
||||
#ifndef XASH_INPUT
|
||||
#define XASH_INPUT INPUT_SDL
|
||||
#endif // XASH_INPUT
|
||||
|
||||
#ifndef XASH_SOUND
|
||||
#define XASH_SOUND SOUND_SDL
|
||||
#endif // XASH_SOUND
|
||||
|
||||
#if XASH_SDL == 2
|
||||
#ifndef XASH_TIMER
|
||||
#define XASH_TIMER TIMER_SDL
|
||||
#endif // XASH_TIMER
|
||||
|
||||
#ifndef XASH_MESSAGEBOX
|
||||
#define XASH_MESSAGEBOX MSGBOX_SDL
|
||||
#endif // XASH_MESSAGEBOX
|
||||
#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
|
||||
#define XASH_DYNAMIC_DLADDR
|
||||
#elif XASH_LINUX
|
||||
// we are building for Linux without SDL2, can draw only to framebuffer yet
|
||||
#ifndef XASH_VIDEO
|
||||
#define XASH_VIDEO VIDEO_FBDEV
|
||||
#endif // XASH_VIDEO
|
||||
|
||||
#ifndef XASH_INPUT
|
||||
#define XASH_INPUT INPUT_EVDEV
|
||||
#endif // XASH_INPUT
|
||||
|
||||
#ifndef XASH_SOUND
|
||||
#define XASH_SOUND SOUND_ALSA
|
||||
#endif // XASH_SOUND
|
||||
|
||||
#define XASH_USE_EVDEV
|
||||
#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
|
||||
|
||||
//
|
||||
// select messagebox implementation
|
||||
//
|
||||
#ifndef XASH_MESSAGEBOX
|
||||
#if XASH_WIN32
|
||||
#define XASH_MESSAGEBOX MSGBOX_WIN32
|
||||
#else // !XASH_WIN32
|
||||
#define XASH_MESSAGEBOX MSGBOX_STDERR
|
||||
#endif // !XASH_WIN32
|
||||
#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
|
||||
#endif // !(XASH_LINUX || XASH_BSD || XASH_WIN32)
|
||||
#endif
|
||||
|
||||
//
|
||||
// no timer - no xash
|
||||
//
|
||||
#ifndef XASH_TIMER
|
||||
#if XASH_WIN32
|
||||
#define XASH_TIMER TIMER_WIN32
|
||||
#else // !XASH_WIN32
|
||||
#define XASH_TIMER TIMER_POSIX
|
||||
#endif // !XASH_WIN32
|
||||
#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
|
||||
//
|
||||
#ifndef XASH_VIDEO
|
||||
#define XASH_VIDEO VIDEO_NULL
|
||||
#endif // XASH_VIDEO
|
||||
|
||||
#ifndef XASH_SOUND
|
||||
#define XASH_SOUND SOUND_NULL
|
||||
#endif // XASH_SOUND
|
||||
|
||||
#ifndef XASH_INPUT
|
||||
#define XASH_INPUT INPUT_NULL
|
||||
#endif // XASH_INPUT
|
||||
|
||||
#ifndef XASH_CRASHHANDLER
|
||||
#define XASH_CRASHHANDLER CRASHHANDLER_NULL
|
||||
#endif // XASH_CRASHHANDLER
|
||||
|
||||
/*
|
||||
=========================================================================
|
||||
|
||||
Default build-depended cvar and constant values
|
||||
|
||||
=========================================================================
|
||||
*/
|
||||
|
||||
#if XASH_MOBILE_PLATFORM
|
||||
#define DEFAULT_TOUCH_ENABLE "1"
|
||||
#define DEFAULT_M_IGNORE "1"
|
||||
#else // !XASH_MOBILE_PLATFORM
|
||||
#define DEFAULT_TOUCH_ENABLE "0"
|
||||
#define DEFAULT_M_IGNORE "0"
|
||||
#endif // !XASH_MOBILE_PLATFORM
|
||||
|
||||
#if XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
||||
#define XASH_INTERNAL_GAMELIBS
|
||||
// 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
|
||||
#endif // XASH_ANDROID || XASH_IOS || XASH_EMSCRIPTEN
|
||||
|
||||
// allow override for developer/debug builds
|
||||
#ifndef DEFAULT_DEV
|
||||
#define DEFAULT_DEV 0
|
||||
#endif // DEFAULT_DEV
|
||||
|
||||
#ifndef DEFAULT_FULLSCREEN
|
||||
#define DEFAULT_FULLSCREEN 1
|
||||
#endif // DEFAULT_FULLSCREEN
|
||||
|
||||
#endif // DEFAULTS_H
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -24,4 +24,4 @@ typedef struct demo_api_s
|
||||
void (*WriteBuffer)( int size, unsigned char *buffer );
|
||||
} demo_api_t;
|
||||
|
||||
#endif//DEMO_API_H
|
||||
#endif//DEMO_API_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -28,4 +28,4 @@ typedef struct dlight_s
|
||||
qboolean dark; // subtracts light instead of adding
|
||||
} dlight_t;
|
||||
|
||||
#endif//DLIGHT_H
|
||||
#endif//DLIGHT_H
|
||||
|
||||
@@ -17,7 +17,7 @@ GNU General Public License for more details.
|
||||
#define FEATURES_H
|
||||
|
||||
// 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_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
|
||||
@@ -25,5 +25,6 @@ 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_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_LINEAR_GAMMA_SPACE (1<<8) // disable influence of gamma/brightness cvars to textures/lightmaps, for mods with custom renderer
|
||||
|
||||
#endif//FEATURES_H
|
||||
#endif//FEATURES_H
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -19,7 +19,7 @@
|
||||
#define ENTITY_NORMAL (1<<0)
|
||||
#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.
|
||||
typedef struct entity_state_s entity_state_t;
|
||||
|
||||
@@ -28,7 +28,7 @@ struct entity_state_s
|
||||
// Fields which are filled in by routines outside of delta compression
|
||||
int entityType;
|
||||
// Index into cl_entities array for this entity.
|
||||
int number;
|
||||
int number;
|
||||
float msg_time;
|
||||
|
||||
// Message number last time the player/entity state was updated.
|
||||
@@ -63,36 +63,36 @@ struct entity_state_s
|
||||
vec3_t velocity;
|
||||
|
||||
// Send bbox down to client for use during prediction.
|
||||
vec3_t mins;
|
||||
vec3_t mins;
|
||||
vec3_t maxs;
|
||||
|
||||
int aiment;
|
||||
// If owned by a player, the index of that player ( for projectiles ).
|
||||
int owner;
|
||||
int owner;
|
||||
|
||||
// Friction, for prediction.
|
||||
float friction;
|
||||
float friction;
|
||||
// Gravity multiplier
|
||||
float gravity;
|
||||
float gravity;
|
||||
|
||||
// PLAYER SPECIFIC
|
||||
int team;
|
||||
int playerclass;
|
||||
int health;
|
||||
qboolean spectator;
|
||||
qboolean spectator;
|
||||
int weaponmodel;
|
||||
int gaitsequence;
|
||||
// If standing on conveyor, e.g.
|
||||
vec3_t basevelocity;
|
||||
vec3_t basevelocity;
|
||||
// Use the crouched hull, or the regular player hull.
|
||||
int usehull;
|
||||
int usehull;
|
||||
// Latched buttons last time state updated.
|
||||
int oldbuttons;
|
||||
int oldbuttons;
|
||||
// -1 = in air, else pmove entity number
|
||||
int onground;
|
||||
int onground;
|
||||
int iStepLeft;
|
||||
// How fast we are falling
|
||||
float flFallVelocity;
|
||||
float flFallVelocity;
|
||||
|
||||
float fov;
|
||||
int weaponanim;
|
||||
@@ -135,7 +135,7 @@ typedef struct clientdata_s
|
||||
|
||||
int bInDuck;
|
||||
int weapons; // remove?
|
||||
|
||||
|
||||
int flTimeStepSound;
|
||||
int flDuckTime;
|
||||
int flSwimTime;
|
||||
@@ -152,7 +152,7 @@ typedef struct clientdata_s
|
||||
int ammo_cells;
|
||||
int ammo_rockets;
|
||||
float m_flNextAttack;
|
||||
|
||||
|
||||
int tfstate;
|
||||
int pushmsec;
|
||||
int deadflag;
|
||||
@@ -185,4 +185,4 @@ typedef struct local_state_s
|
||||
weapon_data_t weapondata[MAX_LOCAL_WEAPONS];
|
||||
} local_state_t;
|
||||
|
||||
#endif//ENTITY_STATE_H
|
||||
#endif//ENTITY_STATE_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -22,4 +22,4 @@
|
||||
#define ET_BEAM 3
|
||||
#define ET_FRAGMENTED 4 // BMODEL or SPRITE that was split across BSP nodes
|
||||
|
||||
#endif//ENTITY_TYPES_H
|
||||
#endif//ENTITY_TYPES_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -55,4 +55,4 @@ typedef struct event_api_s
|
||||
void ( *EV_PopTraceBounds)( void );
|
||||
} event_api_t;
|
||||
|
||||
#endif//EVENT_API_H
|
||||
#endif//EVENT_API_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -44,4 +44,4 @@ typedef struct event_args_s
|
||||
int bparam2;
|
||||
} event_args_t;
|
||||
|
||||
#endif//EVENT_ARGS_H
|
||||
#endif//EVENT_ARGS_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -17,13 +17,13 @@
|
||||
#define EVENT_FLAGS_H
|
||||
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// sounds started by client event when client is not in PVS anymore ( hwguy in TFC e.g. ).
|
||||
@@ -42,4 +42,4 @@
|
||||
// Only issue event client side ( from shared code )
|
||||
#define FEV_CLIENT (1<<6)
|
||||
|
||||
#endif//EVENT_FLAGS_H
|
||||
#endif//EVENT_FLAGS_H
|
||||
|
||||
@@ -18,6 +18,7 @@ GNU General Public License for more details.
|
||||
|
||||
#define GFL_NOMODELS (1<<0)
|
||||
#define GFL_NOSKILLS (1<<1)
|
||||
#define GFL_RENDER_PICBUTTON_TEXT (1<<2)
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
@@ -47,4 +48,4 @@ typedef struct
|
||||
int gamemode;
|
||||
} GAMEINFO;
|
||||
|
||||
#endif//GAMEINFO_H
|
||||
#endif//GAMEINFO_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
// sub commands of svc_hltv:
|
||||
#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
|
||||
|
||||
// sub commands of svc_director:
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
// HLTV_EVENT event flags
|
||||
#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_SLOWMOTION (1<<6) // would look good in SloMo
|
||||
#define DRC_FLAG_FACEPLAYER (1<<7) // player is doning something (reload/defuse bomb etc)
|
||||
@@ -56,4 +56,4 @@
|
||||
#define MAX_DIRECTOR_CMD_PARAMETERS 4
|
||||
#define MAX_DIRECTOR_CMD_STRING 128
|
||||
|
||||
#endif//HLTV_H
|
||||
#endif//HLTV_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -26,13 +26,13 @@ typedef enum
|
||||
typedef struct IVoiceTweak_s
|
||||
{
|
||||
// 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.
|
||||
void (*EndVoiceTweakMode)( void );
|
||||
|
||||
|
||||
// Get/set control values.
|
||||
void (*SetControlFloat)( VoiceTweakControl iControl, float value );
|
||||
float (*GetControlFloat)( VoiceTweakControl iControl );
|
||||
} IVoiceTweak;
|
||||
|
||||
#endif//IVOICETWEAK_H
|
||||
#endif//IVOICETWEAK_H
|
||||
|
||||
18
common/kbutton.h
Normal file
18
common/kbutton.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================
|
||||
|
||||
#if !defined( KBUTTONH )
|
||||
#define KBUTTONH
|
||||
#pragma once
|
||||
|
||||
typedef struct kbutton_s
|
||||
{
|
||||
int down[2]; // key nums holding it down
|
||||
int state; // low bit is down state
|
||||
} kbutton_t;
|
||||
|
||||
#endif // !KBUTTONH
|
||||
@@ -26,4 +26,4 @@ typedef struct
|
||||
float time; // local time is gurantee what new style begins from the start, not mid or end of the sequence
|
||||
} lightstyle_t;
|
||||
|
||||
#endif//LIGHTSTYLE_H
|
||||
#endif//LIGHTSTYLE_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -28,6 +28,7 @@
|
||||
// kill the request hook after receiving the first response
|
||||
#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 )
|
||||
|
||||
struct net_response_s;
|
||||
typedef void (*net_api_response_func_t) ( struct net_response_s *response );
|
||||
|
||||
#define NET_SUCCESS ( 0 )
|
||||
@@ -63,7 +64,7 @@ typedef struct net_response_s
|
||||
typedef struct net_status_s
|
||||
{
|
||||
// Connected to remote server? 1 == yes, 0 otherwise
|
||||
int connected;
|
||||
int connected;
|
||||
// Client's IP address
|
||||
netadr_t local_address;
|
||||
// Address of remote server
|
||||
@@ -86,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 (*CancelRequest)( int context );
|
||||
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 ( *StringToAdr)( char *s, struct netadr_s *a );
|
||||
const char *(*ValueForKey)( const char *s, const char *key );
|
||||
@@ -94,4 +95,4 @@ typedef struct net_api_s
|
||||
void (*SetValueForKey)( char *s, const char *key, const char *value, int maxsize );
|
||||
} net_api_t;
|
||||
|
||||
#endif//NET_APIH
|
||||
#endif//NET_APIH
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -34,4 +34,4 @@ typedef struct netadr_s
|
||||
unsigned short port;
|
||||
} netadr_t;
|
||||
|
||||
#endif//NETADR_H
|
||||
#endif//NETADR_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
typedef enum
|
||||
{
|
||||
pt_static,
|
||||
pt_static,
|
||||
pt_grav,
|
||||
pt_slowgrav,
|
||||
pt_fire,
|
||||
@@ -45,9 +45,9 @@ typedef struct particle_s
|
||||
|
||||
// for pt_clientcusttom, we'll call this function each frame
|
||||
void (*callback)( struct particle_s *particle, float frametime );
|
||||
|
||||
|
||||
// For deathfunc, etc.
|
||||
unsigned char context;
|
||||
} particle_t;
|
||||
|
||||
#endif//PARTICLEDEF_H
|
||||
#endif//PARTICLEDEF_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -33,9 +33,9 @@ struct pmtrace_s
|
||||
vec3_t endpos; // final position
|
||||
pmplane_t plane; // surface normal 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.
|
||||
int hitgroup;
|
||||
};
|
||||
|
||||
#endif//PM_TRACE_H
|
||||
#endif//PM_TRACE_H
|
||||
|
||||
98
common/port.h
Normal file
98
common/port.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
port.h -- Portability Layer for Windows types
|
||||
Copyright (C) 2015 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef PORT_H
|
||||
#define PORT_H
|
||||
|
||||
#include "build.h"
|
||||
|
||||
#if !XASH_WIN32
|
||||
#if XASH_APPLE
|
||||
#include <sys/syslimits.h>
|
||||
#define OS_LIB_EXT "dylib"
|
||||
#define OPEN_COMMAND "open"
|
||||
#else
|
||||
#define OS_LIB_EXT "so"
|
||||
#define OPEN_COMMAND "xdg-open"
|
||||
#endif
|
||||
#define OS_LIB_PREFIX "lib"
|
||||
#define VGUI_SUPPORT_DLL "libvgui_support." OS_LIB_EXT
|
||||
|
||||
// Windows-specific
|
||||
#define __cdecl
|
||||
#define __stdcall
|
||||
#define _inline static inline
|
||||
#define FORCEINLINE inline __attribute__((always_inline))
|
||||
|
||||
#if XASH_POSIX
|
||||
#include <unistd.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#define PATH_SPLITTER "/"
|
||||
#define HAVE_DUP
|
||||
|
||||
#define O_BINARY 0
|
||||
#define O_TEXT 0
|
||||
#define _mkdir( x ) mkdir( x, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH )
|
||||
#elif XASH_DOS4GW
|
||||
#define PATH_SPLITTER "\\"
|
||||
#endif
|
||||
|
||||
typedef void* HANDLE;
|
||||
typedef void* HINSTANCE;
|
||||
|
||||
typedef struct tagPOINT
|
||||
{
|
||||
int x, y;
|
||||
} POINT;
|
||||
#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 read _read
|
||||
#define alloca _alloca
|
||||
|
||||
#define HSPRITE WINAPI_HSPRITE
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#undef HSPRITE
|
||||
|
||||
#define OS_LIB_PREFIX ""
|
||||
#define OS_LIB_EXT "dll"
|
||||
#define VGUI_SUPPORT_DLL "../vgui_support." OS_LIB_EXT
|
||||
#define HAVE_DUP
|
||||
#endif //WIN32
|
||||
|
||||
#ifndef XASH_LOW_MEMORY
|
||||
#define XASH_LOW_MEMORY 0
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if defined XASH_SDL && !defined REF_DLL
|
||||
#include <SDL.h>
|
||||
#endif
|
||||
|
||||
#endif // PORT_H
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -35,4 +35,4 @@ typedef struct qfont_s
|
||||
byte data[4];
|
||||
} qfont_t;
|
||||
|
||||
#endif//QFONT_H
|
||||
#endif//QFONT_H
|
||||
|
||||
104
common/r_efx.h
104
common/r_efx.h
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -17,7 +17,7 @@
|
||||
#define R_EFX_H
|
||||
|
||||
// particle_t
|
||||
#if !defined( PARTICLEDEFH )
|
||||
#if !defined( PARTICLEDEFH )
|
||||
#include "particledef.h"
|
||||
#endif
|
||||
|
||||
@@ -75,7 +75,7 @@ color24 gTracerColors[] =
|
||||
#define FTENT_SPIRAL 0x00000400
|
||||
#define FTENT_SPRCYCLE 0x00000800
|
||||
#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_PLYRATTACHMENT 0x00008000 // tent is attached to a player (owner)
|
||||
#define FTENT_SPRANIMATELOOP 0x00010000 // animating sprite doesn't die when last frame is displayed
|
||||
@@ -84,7 +84,7 @@ color24 gTracerColors[] =
|
||||
#define FTENT_CLIENTCUSTOM 0x00080000 // Must specify callback. Callback function is responsible for killing tempent and updating fields ( unless other flags specify how to do things )
|
||||
#define FTENT_SCALE 0x00100000 // An experiment
|
||||
|
||||
typedef struct tempent_s TEMPENTITY;
|
||||
struct pmtrace_s;
|
||||
typedef struct tempent_s
|
||||
{
|
||||
int flags;
|
||||
@@ -98,11 +98,11 @@ typedef struct tempent_s
|
||||
int hitSound;
|
||||
void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr );
|
||||
void (*callback)( struct tempent_s *ent, float frametime, float currenttime );
|
||||
TEMPENTITY *next;
|
||||
struct tempent_s *next;
|
||||
int priority;
|
||||
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
|
||||
// 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.
|
||||
cl_entity_t entity;
|
||||
@@ -117,58 +117,58 @@ typedef struct efx_api_s efx_api_t;
|
||||
struct efx_api_s
|
||||
{
|
||||
particle_t *(*R_AllocParticle)( void (*callback)( struct particle_s *particle, float frametime ));
|
||||
void (*R_BlobExplosion)( float *org );
|
||||
void (*R_Blood)( float *org, float *dir, int pcolor, int speed );
|
||||
void (*R_BloodSprite)( float *org, int colorindex, int modelIndex, int modelIndex2, float size );
|
||||
void (*R_BloodStream)( float *org, float *dir, int pcolor, int speed );
|
||||
void (*R_BreakModel)( float *pos, float *size, float *dir, float random, float life, int count, int modelIndex, char flags );
|
||||
void (*R_Bubbles)( float *mins, float *maxs, float height, int modelIndex, int count, float speed );
|
||||
void (*R_BubbleTrail)( float *start, float *end, float height, int modelIndex, int count, float speed );
|
||||
void (*R_BulletImpactParticles)( float *pos );
|
||||
void (*R_BlobExplosion)( const float *org );
|
||||
void (*R_Blood)( const float *org, const float *dir, int pcolor, int speed );
|
||||
void (*R_BloodSprite)( const float *org, int colorindex, int modelIndex, int modelIndex2, float size );
|
||||
void (*R_BloodStream)( const float *org, const float *dir, int pcolor, int speed );
|
||||
void (*R_BreakModel)( const float *pos, const float *size, const float *dir, float random, float life, int count, int modelIndex, char flags );
|
||||
void (*R_Bubbles)( const float *mins, const float *maxs, float height, int modelIndex, int count, float speed );
|
||||
void (*R_BubbleTrail)( const float *start, const float *end, float height, int modelIndex, int count, float speed );
|
||||
void (*R_BulletImpactParticles)( const float *pos );
|
||||
void (*R_EntityParticles)( struct cl_entity_s *ent );
|
||||
void (*R_Explosion)( float *pos, int model, float scale, float framerate, int flags );
|
||||
void (*R_FizzEffect)( struct cl_entity_s *pent, int modelIndex, int density );
|
||||
void (*R_FireField)( float *org, int radius, int modelIndex, int count, int flags, float life );
|
||||
void (*R_FlickerParticles)( float *org );
|
||||
void (*R_FunnelSprite)( float *org, int modelIndex, int reverse );
|
||||
void (*R_Implosion)( float *end, float radius, int count, float life );
|
||||
void (*R_LargeFunnel)( float *org, int reverse );
|
||||
void (*R_LavaSplash)( float *org );
|
||||
void (*R_MultiGunshot)( float *org, float *dir, float *noise, int count, int decalCount, int *decalIndices );
|
||||
void (*R_MuzzleFlash)( float *pos1, int type );
|
||||
void (*R_ParticleBox)( float *mins, float *maxs, unsigned char r, unsigned char g, unsigned char b, float life );
|
||||
void (*R_ParticleBurst)( float *pos, int size, int color, float life );
|
||||
void (*R_ParticleExplosion)( float *org );
|
||||
void (*R_ParticleExplosion2)( float *org, int colorStart, int colorLength );
|
||||
void (*R_ParticleLine)( float *start, float *end, unsigned char r, unsigned char g, unsigned char b, float life );
|
||||
void (*R_FlickerParticles)( const float *org );
|
||||
void (*R_FunnelSprite)( const float *org, int modelIndex, int reverse );
|
||||
void (*R_Implosion)( const float *end, float radius, int count, float life );
|
||||
void (*R_LargeFunnel)( const float *org, int reverse );
|
||||
void (*R_LavaSplash)( const float *org );
|
||||
void (*R_MultiGunshot)( const float *org, const float *dir, const float *noise, int count, int decalCount, int *decalIndices );
|
||||
void (*R_MuzzleFlash)( const float *pos1, int type );
|
||||
void (*R_ParticleBox)( const float *mins, const float *maxs, unsigned char r, unsigned char g, unsigned char b, float life );
|
||||
void (*R_ParticleBurst)( const float *pos, int size, int color, float life );
|
||||
void (*R_ParticleExplosion)( const float *org );
|
||||
void (*R_ParticleExplosion2)( const float *org, int colorStart, int colorLength );
|
||||
void (*R_ParticleLine)( const float *start, const float *end, unsigned char r, unsigned char g, unsigned char b, float life );
|
||||
void (*R_PlayerSprites)( int client, int modelIndex, int count, int size );
|
||||
void (*R_Projectile)( float *origin, float *velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) );
|
||||
void (*R_RicochetSound)( float *pos );
|
||||
void (*R_RicochetSprite)( float *pos, struct model_s *pmodel, float duration, float scale );
|
||||
void (*R_RocketFlare)( float *pos );
|
||||
void (*R_Projectile)( const float *origin, const float *velocity, int modelIndex, int life, int owner, void (*hitcallback)( struct tempent_s *ent, struct pmtrace_s *ptr ) );
|
||||
void (*R_RicochetSound)( const float *pos );
|
||||
void (*R_RicochetSprite)( const float *pos, struct model_s *pmodel, float duration, float scale );
|
||||
void (*R_RocketFlare)( const float *pos );
|
||||
void (*R_RocketTrail)( float *start, float *end, int type );
|
||||
void (*R_RunParticleEffect)( float *org, float *dir, int color, int count );
|
||||
void (*R_ShowLine)( float *start, float *end );
|
||||
void (*R_SparkEffect)( float *pos, int count, int velocityMin, int velocityMax );
|
||||
void (*R_SparkShower)( float *pos );
|
||||
void (*R_SparkStreaks)( float *pos, int count, int velocityMin, int velocityMax );
|
||||
void (*R_Spray)( float *pos, float *dir, int modelIndex, int count, int speed, int spread, int rendermode );
|
||||
void (*R_RunParticleEffect)( const float *org, const float *dir, int color, int count );
|
||||
void (*R_ShowLine)( const float *start, const float *end );
|
||||
void (*R_SparkEffect)( const float *pos, int count, int velocityMin, int velocityMax );
|
||||
void (*R_SparkShower)( const float *pos );
|
||||
void (*R_SparkStreaks)( const float *pos, int count, int velocityMin, int velocityMax );
|
||||
void (*R_Spray)( const float *pos, const float *dir, int modelIndex, int count, int speed, int spread, int rendermode );
|
||||
void (*R_Sprite_Explode)( TEMPENTITY *pTemp, float scale, int flags );
|
||||
void (*R_Sprite_Smoke)( TEMPENTITY *pTemp, float scale );
|
||||
void (*R_Sprite_Spray)( float *pos, float *dir, int modelIndex, int count, int speed, int iRand );
|
||||
void (*R_Sprite_Spray)( const float *pos, const float *dir, int modelIndex, int count, int speed, int iRand );
|
||||
void (*R_Sprite_Trail)( int type, float *start, float *end, int modelIndex, int count, float life, float size, float amplitude, int renderamt, float speed );
|
||||
void (*R_Sprite_WallPuff)( TEMPENTITY *pTemp, float scale );
|
||||
void (*R_StreakSplash)( float *pos, float *dir, int color, int count, float speed, int velocityMin, int velocityMax );
|
||||
void (*R_TracerEffect)( float *start, float *end );
|
||||
void (*R_StreakSplash)( const float *pos, const float *dir, int color, int count, float speed, int velocityMin, int velocityMax );
|
||||
void (*R_TracerEffect)( const float *start, const float *end );
|
||||
void (*R_UserTracerParticle)( float *org, float *vel, float life, int colorIndex, float length, unsigned char deathcontext, void (*deathfunc)( struct particle_s *particle ));
|
||||
particle_t *(*R_TracerParticles)( float *org, float *vel, float life );
|
||||
void (*R_TeleportSplash)( float *org );
|
||||
void (*R_TempSphereModel)( float *pos, float speed, float life, int count, int modelIndex );
|
||||
TEMPENTITY *(*R_TempModel)( float *pos, float *dir, float *angles, float life, int modelIndex, int soundtype );
|
||||
TEMPENTITY *(*R_DefaultSprite)( float *pos, int spriteIndex, float framerate );
|
||||
TEMPENTITY *(*R_TempSprite)( float *pos, float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags );
|
||||
void (*R_TeleportSplash)( const float *org );
|
||||
void (*R_TempSphereModel)( const float *pos, float speed, float life, int count, int modelIndex );
|
||||
TEMPENTITY *(*R_TempModel)( const float *pos, const float *dir, const float *angles, float life, int modelIndex, int soundtype );
|
||||
TEMPENTITY *(*R_DefaultSprite)( const float *pos, int spriteIndex, float framerate );
|
||||
TEMPENTITY *(*R_TempSprite)( float *pos, const float *dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags );
|
||||
int (*Draw_DecalIndex)( int id );
|
||||
int (*Draw_DecalIndexFromName)( char *name );
|
||||
int (*Draw_DecalIndexFromName)( const char *name );
|
||||
void (*R_DecalShoot)( int textureIndex, int entity, int modelIndex, float *position, int flags );
|
||||
void (*R_AttachTentToPlayer)( int client, int modelIndex, float zoffset, float life );
|
||||
void (*R_KillAttachedTents)( int client );
|
||||
@@ -182,14 +182,14 @@ struct efx_api_s
|
||||
BEAM *(*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 );
|
||||
dlight_t *(*CL_AllocDlight)( int key );
|
||||
dlight_t *(*CL_AllocElight)( int key );
|
||||
TEMPENTITY *(*CL_TempEntAlloc)( float *org, struct model_s *model );
|
||||
TEMPENTITY *(*CL_TempEntAllocNoModel)( float *org );
|
||||
TEMPENTITY *(*CL_TempEntAllocHigh)( float *org, struct model_s *model );
|
||||
TEMPENTITY *(*CL_TentEntAllocCustom)( float *origin, struct model_s *model, int high, void (*callback)( struct tempent_s *ent, float frametime, float currenttime ));
|
||||
TEMPENTITY *(*CL_TempEntAlloc)( const float *org, struct model_s *model );
|
||||
TEMPENTITY *(*CL_TempEntAllocNoModel)( const float *org );
|
||||
TEMPENTITY *(*CL_TempEntAllocHigh)( const float *org, struct model_s *model );
|
||||
TEMPENTITY *(*CL_TentEntAllocCustom)( const float *origin, struct model_s *model, int high, void (*callback)( struct tempent_s *ent, float frametime, float currenttime ));
|
||||
void (*R_GetPackedColor)( short *packed, short color );
|
||||
short (*R_LookupColor)( unsigned char r, unsigned char g, unsigned char b );
|
||||
void (*R_DecalRemoveAll)( int textureIndex ); // textureIndex points to the decal index in the array, not the actual texture index.
|
||||
void (*R_FireCustomDecal)( int textureIndex, int entity, int modelIndex, float *position, int flags, float scale );
|
||||
};
|
||||
|
||||
#endif//R_EFX_H
|
||||
#endif//R_EFX_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -26,7 +26,7 @@ typedef struct engine_studio_api_s
|
||||
// Check to see if pointer is in the cache
|
||||
void *( *Cache_Check )( struct cache_user_s *c );
|
||||
// Load file into cache ( can be swapped out on demand )
|
||||
void ( *LoadCacheFile )( char *path, struct cache_user_s *cu );
|
||||
void ( *LoadCacheFile )( const char *path, struct cache_user_s *cu );
|
||||
// Retrieve model pointer for the named model
|
||||
struct model_s *( *Mod_ForName )( const char *name, int crash_if_missing );
|
||||
// Retrieve pointer to studio model data block from a model
|
||||
@@ -103,7 +103,7 @@ typedef struct engine_studio_api_s
|
||||
|
||||
// True if using D3D/OpenGL
|
||||
int ( *IsHardware )( void );
|
||||
|
||||
|
||||
// Only called by hardware interface
|
||||
void ( *GL_StudioDrawShadow )( void );
|
||||
void ( *GL_SetRenderMode )( int mode );
|
||||
@@ -120,7 +120,7 @@ typedef struct server_studio_api_s
|
||||
// Check to see if pointer is in the cache
|
||||
void *( *Cache_Check )( struct cache_user_s *c );
|
||||
// Load file into cache ( can be swapped out on demand )
|
||||
void ( *LoadCacheFile )( char *path, struct cache_user_s *cu );
|
||||
void ( *LoadCacheFile )( const char *path, struct cache_user_s *cu );
|
||||
// Retrieve pointer to studio model data block from a model
|
||||
void *( *Mod_Extradata )( struct model_s *mod );
|
||||
} server_studio_api_t;
|
||||
@@ -140,7 +140,7 @@ typedef struct sv_blending_interface_s
|
||||
{
|
||||
int version;
|
||||
|
||||
void ( *SV_StudioSetupBones )( struct model_s *pModel,
|
||||
void ( *SV_StudioSetupBones )( struct model_s *pModel,
|
||||
float frame,
|
||||
int sequence,
|
||||
const vec3_t angles,
|
||||
@@ -151,4 +151,4 @@ typedef struct sv_blending_interface_s
|
||||
const edict_t *pEdict );
|
||||
} sv_blending_interface_t;
|
||||
|
||||
#endif//R_STUDIOINT_H
|
||||
#endif//R_STUDIOINT_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -25,7 +25,7 @@ typedef struct ref_params_s
|
||||
vec3_t forward;
|
||||
vec3_t right;
|
||||
vec3_t up;
|
||||
|
||||
|
||||
// Client frametime;
|
||||
float frametime;
|
||||
// Client time
|
||||
@@ -54,7 +54,7 @@ typedef struct ref_params_s
|
||||
int viewentity;
|
||||
int playernum;
|
||||
int max_entities;
|
||||
int demoplayback;
|
||||
int demoplayback;
|
||||
int hardware;
|
||||
int smoothing;
|
||||
|
||||
@@ -102,4 +102,4 @@ typedef struct ref_viewpass_s
|
||||
int flags; // if !=0 nothing is drawn by the engine except clientDraw functions
|
||||
} ref_viewpass_t;
|
||||
|
||||
#endif//REF_PARAMS_H
|
||||
#endif//REF_PARAMS_H
|
||||
|
||||
@@ -82,7 +82,7 @@ typedef enum
|
||||
TF_KEEP_SOURCE = (1<<1), // some images keep source
|
||||
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_ALLOW_EMBOSS = (1<<4), // Allow emboss-mapping for this image
|
||||
// reserved
|
||||
TF_RECTANGLE = (1<<5), // this is GL_TEXTURE_RECTANGLE
|
||||
TF_CUBEMAP = (1<<6), // it's cubemap texture
|
||||
TF_DEPTHMAP = (1<<7), // custom texture filter used
|
||||
@@ -107,19 +107,23 @@ typedef enum
|
||||
TF_ARB_FLOAT = (1<<26), // float textures
|
||||
TF_NOCOMPARE = (1<<27), // disable comparing for depth textures
|
||||
TF_ARB_16BIT = (1<<28), // keep image as 16-bit (not 24)
|
||||
TF_MULTISAMPLE = (1<<29) // multisampling texture
|
||||
} texFlags_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CONTEXT_TYPE_GL = 0,
|
||||
CONTEXT_TYPE_GL = 0, // compatibility profile
|
||||
CONTEXT_TYPE_GLES_1_X,
|
||||
CONTEXT_TYPE_GLES_2_X
|
||||
CONTEXT_TYPE_GLES_2_X,
|
||||
CONTEXT_TYPE_GL_CORE
|
||||
} gl_context_type_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GLES_WRAPPER_NONE = 0, // native GLES
|
||||
GLES_WRAPPER_NONE = 0, // native GL
|
||||
GLES_WRAPPER_NANOGL, // used on GLES platforms
|
||||
GLES_WRAPPER_WES, // used on GLES platforms
|
||||
GLES_WRAPPER_GL4ES, // used on GLES platforms
|
||||
} gles_wrapper_t;
|
||||
|
||||
// 30 bytes here
|
||||
@@ -129,7 +133,7 @@ typedef struct modelstate_s
|
||||
short frame; // 10 bits multiple by 4, should be enough
|
||||
byte blending[2];
|
||||
byte controller[4];
|
||||
byte poseparam[16];
|
||||
byte poseparam[16];
|
||||
byte body;
|
||||
byte skin;
|
||||
short scale; // model scale (multiplied by 16)
|
||||
@@ -152,13 +156,15 @@ typedef struct decallist_s
|
||||
modelstate_t studio_state; // studio decals only
|
||||
} decallist_t;
|
||||
|
||||
struct ref_viewpass_s;
|
||||
|
||||
typedef struct render_api_s
|
||||
{
|
||||
// Get renderer info (doesn't changes engine state at all)
|
||||
int (*RenderGetParm)( int parm, int arg ); // generic
|
||||
void (*GetDetailScaleForTexture)( int texture, float *xScale, float *yScale );
|
||||
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* (*GetEntityLight)( int number );
|
||||
byte (*LightToTexGamma)( byte color ); // software gamma support
|
||||
@@ -175,9 +181,9 @@ typedef struct render_api_s
|
||||
const char* (*GL_TextureName)( unsigned int texnum );
|
||||
const byte* (*GL_TextureData)( unsigned int texnum ); // may be NULL
|
||||
int (*GL_LoadTexture)( const char *name, const byte *buf, size_t size, int flags );
|
||||
int (*GL_CreateTexture)( const char *name, int width, int height, const void *buffer, int flags );
|
||||
int (*GL_CreateTexture)( const char *name, int width, int height, const void *buffer, texFlags_t flags );
|
||||
int (*GL_LoadTextureArray)( const char **names, int flags );
|
||||
int (*GL_CreateTextureArray)( const char *name, int width, int height, int depth, const void *buffer, int flags );
|
||||
int (*GL_CreateTextureArray)( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags );
|
||||
void (*GL_FreeTexture)( unsigned int texnum );
|
||||
|
||||
// Decals manipulating (draw & remove)
|
||||
@@ -187,9 +193,9 @@ typedef struct render_api_s
|
||||
|
||||
// AVIkit support
|
||||
void *(*AVI_LoadVideo)( const char *filename, qboolean load_audio );
|
||||
int (*AVI_GetVideoInfo)( void *Avi, long *xres, long *yres, float *duration );
|
||||
long (*AVI_GetVideoFrameNumber)( void *Avi, float time );
|
||||
byte *(*AVI_GetVideoFrame)( void *Avi, long frame );
|
||||
int (*AVI_GetVideoInfo)( void *Avi, int *xres, int *yres, float *duration ); // a1ba: changed longs to int
|
||||
int (*AVI_GetVideoFrameNumber)( void *Avi, float time );
|
||||
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_FreeVideo)( void *Avi );
|
||||
int (*AVI_IsActive)( void *Avi );
|
||||
@@ -219,7 +225,7 @@ typedef struct render_api_s
|
||||
struct mstudiotex_s *( *StudioGetTexture )( struct cl_entity_s *e );
|
||||
const struct ref_overview_s *( *GetOverviewParms )( void );
|
||||
const char *( *GetFileByIndex )( int fileindex );
|
||||
int (*pfnSaveFile)( const char *filename, const void *data, long len );
|
||||
int (*pfnSaveFile)( const char *filename, const void *data, int len );
|
||||
void (*R_Reserved0)( void );
|
||||
|
||||
// static allocations
|
||||
@@ -228,14 +234,15 @@ typedef struct render_api_s
|
||||
|
||||
// engine utils (not related with render API but placed here)
|
||||
char **(*pfnGetFilesList)( const char *pattern, int *numFiles, int gamedironly );
|
||||
unsigned long (*pfnFileBufferCRC32)( const void *buffer, const int length );
|
||||
unsigned int (*pfnFileBufferCRC32)( const void *buffer, const int length );
|
||||
int (*COM_CompareFileTime)( const char *filename1, const char *filename2, int *iCompare );
|
||||
void (*Host_Error)( const char *error, ... ); // cause Host Error
|
||||
void* ( *pfnGetModel )( int modelindex );
|
||||
float (*pfnTime)( void ); // Sys_DoubleTime
|
||||
void (*Cvar_Set)( char *name, char *value );
|
||||
void (*Cvar_Set)( const char *name, const char *value );
|
||||
void (*S_FadeMusicVolume)( float fadePercent ); // fade background track (0-100 percents)
|
||||
void (*SetRandomSeed)( long lSeed ); // set custom seed for RANDOM_FLOAT\RANDOM_LONG for predictable random
|
||||
// a1ba: changed long to int
|
||||
void (*SetRandomSeed)( int lSeed ); // set custom seed for RANDOM_FLOAT\RANDOM_LONG for predictable random
|
||||
// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 37
|
||||
} render_api_t;
|
||||
|
||||
@@ -254,7 +261,7 @@ typedef struct render_interface_s
|
||||
// clear decals by engine request (e.g. for demo recording or vid_restart)
|
||||
void (*R_ClearStudioDecals)( void );
|
||||
// grab r_speeds message
|
||||
qboolean (*R_SpeedsMessage)( char *out, size_t size );
|
||||
qboolean (*R_SpeedsMessage)( char *out, size_t size );
|
||||
// alloc or destroy model custom data
|
||||
void (*Mod_ProcessUserData)( struct model_s *mod, qboolean create, const byte *buffer );
|
||||
// alloc or destroy entity custom data
|
||||
@@ -269,4 +276,4 @@ typedef struct render_interface_s
|
||||
void (*CL_UpdateLatchedVars)( struct cl_entity_s *e, qboolean reset );
|
||||
} render_interface_t;
|
||||
|
||||
#endif//RENDER_API_H
|
||||
#endif//RENDER_API_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -26,4 +26,4 @@ typedef struct screenfade_s
|
||||
int fadeFlags; // Fading flags
|
||||
} screenfade_t;
|
||||
|
||||
#endif//SCREENFADE_H
|
||||
#endif//SCREENFADE_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -12,16 +12,26 @@
|
||||
* without written permission from Valve LLC.
|
||||
*
|
||||
****/
|
||||
|
||||
#pragma once
|
||||
#ifndef STUDIO_EVENT_H
|
||||
#define STUDIO_EVENT_H
|
||||
|
||||
#define MAXEVENTSTRING 64
|
||||
|
||||
typedef struct mstudioevent_s
|
||||
{
|
||||
int frame;
|
||||
int event;
|
||||
int type;
|
||||
char options[64];
|
||||
// the frame at which this animation event occurs
|
||||
int32_t frame;
|
||||
|
||||
// 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;
|
||||
|
||||
#endif//STUDIO_EVENT_H
|
||||
#endif // STUDIO_EVENT_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -16,7 +16,7 @@
|
||||
#ifndef TRIANGLEAPI_H
|
||||
#define TRIANGLEAPI_H
|
||||
|
||||
typedef enum
|
||||
typedef enum
|
||||
{
|
||||
TRI_FRONT = 0,
|
||||
TRI_NONE = 1,
|
||||
@@ -44,14 +44,14 @@ typedef struct triangleapi_s
|
||||
void (*Color4f)( float r, float g, float b, float a );
|
||||
void (*Color4ub)( unsigned char r, unsigned char g, unsigned char b, unsigned char a );
|
||||
void (*TexCoord2f)( float u, float v );
|
||||
void (*Vertex3fv)( float *worldPnt );
|
||||
void (*Vertex3fv)( const float *worldPnt );
|
||||
void (*Vertex3f)( float x, float y, float z );
|
||||
void (*Brightness)( float brightness );
|
||||
void (*CullFace)( TRICULLSTYLE style );
|
||||
void (*CullFace)( TRICULLSTYLE style );
|
||||
int (*SpriteTexture)( struct model_s *pSpriteModel, int frame );
|
||||
int (*WorldToScreen)( 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 (*ScreenToWorld)( float *screen, float *world );
|
||||
void (*ScreenToWorld)( const float *screen, float *world );
|
||||
void (*GetMatrix)( const int pname, float *matrix );
|
||||
int (*BoxInPVS)( float *mins, float *maxs );
|
||||
void (*LightAtPoint)( float *pos, float *value );
|
||||
@@ -59,4 +59,4 @@ typedef struct triangleapi_s
|
||||
void (*FogParams)( float flDensity, int iFogSkybox );
|
||||
} triangleapi_t;
|
||||
|
||||
#endif//TRIANGLEAPI_H
|
||||
#endif//TRIANGLEAPI_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -36,4 +36,4 @@ typedef struct usercmd_s
|
||||
vec3_t impact_position;
|
||||
} usercmd_t;
|
||||
|
||||
#endif//USERCMD_H
|
||||
#endif//USERCMD_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -83,4 +83,4 @@ typedef struct mip_s
|
||||
unsigned int offsets[4]; // four mip maps stored
|
||||
} mip_t;
|
||||
|
||||
#endif//WADFILE_H
|
||||
#endif//WADFILE_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -47,4 +47,4 @@ typedef struct weapon_data_s
|
||||
float fuser4;
|
||||
} weapon_data_t;
|
||||
|
||||
#endif//WEAPONINFO_H
|
||||
#endif//WEAPONINFO_H
|
||||
|
||||
@@ -21,4 +21,4 @@ typedef struct wrect_s
|
||||
int left, right, top, bottom;
|
||||
} wrect_t;
|
||||
|
||||
#endif//WRECT_H
|
||||
#endif//WRECT_H
|
||||
|
||||
179
common/xash3d_types.h
Normal file
179
common/xash3d_types.h
Normal file
@@ -0,0 +1,179 @@
|
||||
// basic typedefs
|
||||
#ifndef XASH_TYPES_H
|
||||
#define XASH_TYPES_H
|
||||
|
||||
#include "build.h"
|
||||
|
||||
#if XASH_WIN32
|
||||
#include <wchar.h> // off_t
|
||||
#endif // _WIN32
|
||||
|
||||
#include <sys/types.h> // off_t
|
||||
#include STDINT_H
|
||||
|
||||
typedef unsigned char byte;
|
||||
typedef int sound_t;
|
||||
typedef float vec_t;
|
||||
typedef vec_t vec2_t[2];
|
||||
typedef vec_t vec3_t[3];
|
||||
typedef vec_t vec4_t[4];
|
||||
typedef vec_t quat_t[4];
|
||||
typedef byte rgba_t[4]; // unsigned byte colorpack
|
||||
typedef byte rgb_t[3]; // unsigned byte colorpack
|
||||
typedef vec_t matrix3x4[3][4];
|
||||
typedef vec_t matrix4x4[4][4];
|
||||
typedef uint32_t poolhandle_t;
|
||||
|
||||
#undef true
|
||||
#undef false
|
||||
|
||||
#ifndef __cplusplus
|
||||
typedef enum { false, true } qboolean;
|
||||
#else
|
||||
typedef int qboolean;
|
||||
#endif
|
||||
|
||||
typedef uint64_t longtime_t;
|
||||
|
||||
#define MAX_STRING 256 // generic string
|
||||
#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_LOCALINFO_STRING 32768 // localinfo used on server and not sended to the clients
|
||||
#define MAX_SYSPATH 1024 // system filepath
|
||||
#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_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 BIT( n ) ( 1U << ( n ))
|
||||
#define GAMMA ( 2.2f ) // Valve Software gamma
|
||||
#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 ClearBits( iBitVector, bits ) ((iBitVector) = (iBitVector) & ~(bits))
|
||||
#define FBitSet( iBitVector, bit ) ((iBitVector) & (bit))
|
||||
|
||||
#ifndef __cplusplus
|
||||
#ifdef NULL
|
||||
#undef NULL
|
||||
#endif
|
||||
|
||||
#define NULL ((void *)0)
|
||||
#endif
|
||||
|
||||
// color strings
|
||||
#define IsColorString( p ) ( p && *( p ) == '^' && *(( p ) + 1) && *(( p ) + 1) >= '0' && *(( p ) + 1 ) <= '9' )
|
||||
#define ColorIndex( c ) ((( c ) - '0' ) & 7 )
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#ifdef __i386__
|
||||
#define EXPORT __attribute__ ((visibility ("default"),force_align_arg_pointer))
|
||||
#define GAME_EXPORT __attribute((force_align_arg_pointer))
|
||||
#else
|
||||
#define EXPORT __attribute__ ((visibility ("default")))
|
||||
#define GAME_EXPORT
|
||||
#endif
|
||||
#define _format(x) __attribute__((format(printf, x, x+1)))
|
||||
#define NORETURN __attribute__((noreturn))
|
||||
#elif defined(_MSC_VER)
|
||||
#define EXPORT __declspec( dllexport )
|
||||
#define GAME_EXPORT
|
||||
#define _format(x)
|
||||
#define NORETURN
|
||||
#else
|
||||
#define EXPORT
|
||||
#define GAME_EXPORT
|
||||
#define _format(x)
|
||||
#define NORETURN
|
||||
#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
|
||||
|
||||
|
||||
#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 LittleLongSW(x) (x = LittleLong(x) )
|
||||
#define LittleShort(x) ((short)( (((short)(x) >> 8) & 255) + (((short)(x) & 255) << 8)))
|
||||
#define LittleShortSW(x) (x = LittleShort(x) )
|
||||
_inline float LittleFloat( float f )
|
||||
{
|
||||
union
|
||||
{
|
||||
float f;
|
||||
unsigned char b[4];
|
||||
} dat1, dat2;
|
||||
|
||||
dat1.f = f;
|
||||
dat2.b[0] = dat1.b[3];
|
||||
dat2.b[1] = dat1.b[2];
|
||||
dat2.b[2] = dat1.b[1];
|
||||
dat2.b[3] = dat1.b[0];
|
||||
|
||||
return dat2.f;
|
||||
}
|
||||
#else
|
||||
#define LittleLong(x) (x)
|
||||
#define LittleLongSW(x)
|
||||
#define LittleShort(x) (x)
|
||||
#define LittleShortSW(x)
|
||||
#define LittleFloat(x) (x)
|
||||
#endif
|
||||
|
||||
|
||||
typedef unsigned int dword;
|
||||
typedef unsigned int uint;
|
||||
typedef char string[MAX_STRING];
|
||||
typedef struct file_s file_t; // normal file
|
||||
typedef struct stream_s stream_t; // sound stream for background music playing
|
||||
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
|
||||
{
|
||||
const char *name;
|
||||
void **func;
|
||||
} dllfunc_t;
|
||||
|
||||
typedef struct dll_info_s
|
||||
{
|
||||
const char *name; // name of library
|
||||
const dllfunc_t *fcts; // list of dll exports
|
||||
qboolean crash; // crash if dll not found
|
||||
void *link; // hinstance of loading library
|
||||
} dll_info_t;
|
||||
|
||||
typedef void (*setpair_t)( const char *key, const void *value, const void *buffer, void *numpairs );
|
||||
|
||||
// config strings are a general means of communication from
|
||||
// the server to all connected clients.
|
||||
// each config string can be at most CS_SIZE characters.
|
||||
#if XASH_LOW_MEMORY == 0
|
||||
#define MAX_QPATH 64 // max length of a game pathname
|
||||
#elif XASH_LOW_MEMORY == 2
|
||||
#define MAX_QPATH 32 // should be enough for singleplayer
|
||||
#elif XASH_LOW_MEMORY == 1
|
||||
#define MAX_QPATH 48
|
||||
#endif
|
||||
#define MAX_OSPATH 260 // max length of a filesystem pathname
|
||||
#define CS_SIZE 64 // size of one config string
|
||||
#define CS_TIME 16 // size of time string
|
||||
|
||||
#endif // XASH_TYPES_H
|
||||
206
contrib/mittorn/Makefile.linux
Normal file
206
contrib/mittorn/Makefile.linux
Normal file
@@ -0,0 +1,206 @@
|
||||
#############################################
|
||||
# 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
|
||||
269
contrib/mittorn/README.md
Normal file
269
contrib/mittorn/README.md
Normal file
@@ -0,0 +1,269 @@
|
||||
**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
|
||||
```
|
||||
7
contrib/mittorn/setup.sh
Executable file
7
contrib/mittorn/setup.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/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/
|
||||
73
contrib/mittorn/wscript
Normal file
73
contrib/mittorn/wscript
Normal file
@@ -0,0 +1,73 @@
|
||||
#! /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.
|
||||
*
|
||||
* This product contains software technology licensed from Id
|
||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||
*
|
||||
* 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
|
||||
@@ -135,4 +135,4 @@ typedef struct
|
||||
aliasskintype_t type;
|
||||
} daliasskintype_t;
|
||||
|
||||
#endif//ALIAS_H
|
||||
#endif//ALIAS_H
|
||||
|
||||
330
engine/anorms.h
330
engine/anorms.h
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -13,165 +13,165 @@
|
||||
*
|
||||
****/
|
||||
|
||||
{-0.525731, 0.000000, 0.850651},
|
||||
{-0.442863, 0.238856, 0.864188},
|
||||
{-0.295242, 0.000000, 0.955423},
|
||||
{-0.309017, 0.500000, 0.809017},
|
||||
{-0.162460, 0.262866, 0.951056},
|
||||
{0.000000, 0.000000, 1.000000},
|
||||
{0.000000, 0.850651, 0.525731},
|
||||
{-0.147621, 0.716567, 0.681718},
|
||||
{0.147621, 0.716567, 0.681718},
|
||||
{0.000000, 0.525731, 0.850651},
|
||||
{0.309017, 0.500000, 0.809017},
|
||||
{0.525731, 0.000000, 0.850651},
|
||||
{0.295242, 0.000000, 0.955423},
|
||||
{0.442863, 0.238856, 0.864188},
|
||||
{0.162460, 0.262866, 0.951056},
|
||||
{-0.681718, 0.147621, 0.716567},
|
||||
{-0.809017, 0.309017, 0.500000},
|
||||
{-0.587785, 0.425325, 0.688191},
|
||||
{-0.850651, 0.525731, 0.000000},
|
||||
{-0.864188, 0.442863, 0.238856},
|
||||
{-0.716567, 0.681718, 0.147621},
|
||||
{-0.688191, 0.587785, 0.425325},
|
||||
{-0.500000, 0.809017, 0.309017},
|
||||
{-0.238856, 0.864188, 0.442863},
|
||||
{-0.425325, 0.688191, 0.587785},
|
||||
{-0.716567, 0.681718, -0.147621},
|
||||
{-0.500000, 0.809017, -0.309017},
|
||||
{-0.525731, 0.850651, 0.000000},
|
||||
{0.000000, 0.850651, -0.525731},
|
||||
{-0.238856, 0.864188, -0.442863},
|
||||
{0.000000, 0.955423, -0.295242},
|
||||
{-0.262866, 0.951056, -0.162460},
|
||||
{0.000000, 1.000000, 0.000000},
|
||||
{0.000000, 0.955423, 0.295242},
|
||||
{-0.262866, 0.951056, 0.162460},
|
||||
{0.238856, 0.864188, 0.442863},
|
||||
{0.262866, 0.951056, 0.162460},
|
||||
{0.500000, 0.809017, 0.309017},
|
||||
{0.238856, 0.864188, -0.442863},
|
||||
{0.262866, 0.951056, -0.162460},
|
||||
{0.500000, 0.809017, -0.309017},
|
||||
{0.850651, 0.525731, 0.000000},
|
||||
{0.716567, 0.681718, 0.147621},
|
||||
{0.716567, 0.681718, -0.147621},
|
||||
{0.525731, 0.850651, 0.000000},
|
||||
{0.425325, 0.688191, 0.587785},
|
||||
{0.864188, 0.442863, 0.238856},
|
||||
{0.688191, 0.587785, 0.425325},
|
||||
{0.809017, 0.309017, 0.500000},
|
||||
{0.681718, 0.147621, 0.716567},
|
||||
{0.587785, 0.425325, 0.688191},
|
||||
{0.955423, 0.295242, 0.000000},
|
||||
{1.000000, 0.000000, 0.000000},
|
||||
{0.951056, 0.162460, 0.262866},
|
||||
{0.850651, -0.525731, 0.000000},
|
||||
{0.955423, -0.295242, 0.000000},
|
||||
{0.864188, -0.442863, 0.238856},
|
||||
{0.951056, -0.162460, 0.262866},
|
||||
{0.809017, -0.309017, 0.500000},
|
||||
{0.681718, -0.147621, 0.716567},
|
||||
{0.850651, 0.000000, 0.525731},
|
||||
{0.864188, 0.442863, -0.238856},
|
||||
{0.809017, 0.309017, -0.500000},
|
||||
{0.951056, 0.162460, -0.262866},
|
||||
{0.525731, 0.000000, -0.850651},
|
||||
{0.681718, 0.147621, -0.716567},
|
||||
{0.681718, -0.147621, -0.716567},
|
||||
{0.850651, 0.000000, -0.525731},
|
||||
{0.809017, -0.309017, -0.500000},
|
||||
{0.864188, -0.442863, -0.238856},
|
||||
{0.951056, -0.162460, -0.262866},
|
||||
{0.147621, 0.716567, -0.681718},
|
||||
{0.309017, 0.500000, -0.809017},
|
||||
{0.425325, 0.688191, -0.587785},
|
||||
{0.442863, 0.238856, -0.864188},
|
||||
{0.587785, 0.425325, -0.688191},
|
||||
{0.688191, 0.587785, -0.425325},
|
||||
{-0.147621, 0.716567, -0.681718},
|
||||
{-0.309017, 0.500000, -0.809017},
|
||||
{0.000000, 0.525731, -0.850651},
|
||||
{-0.525731, 0.000000, -0.850651},
|
||||
{-0.442863, 0.238856, -0.864188},
|
||||
{-0.295242, 0.000000, -0.955423},
|
||||
{-0.162460, 0.262866, -0.951056},
|
||||
{0.000000, 0.000000, -1.000000},
|
||||
{0.295242, 0.000000, -0.955423},
|
||||
{0.162460, 0.262866, -0.951056},
|
||||
{-0.442863, -0.238856, -0.864188},
|
||||
{-0.309017, -0.500000, -0.809017},
|
||||
{-0.162460, -0.262866, -0.951056},
|
||||
{0.000000, -0.850651, -0.525731},
|
||||
{-0.147621, -0.716567, -0.681718},
|
||||
{0.147621, -0.716567, -0.681718},
|
||||
{0.000000, -0.525731, -0.850651},
|
||||
{0.309017, -0.500000, -0.809017},
|
||||
{0.442863, -0.238856, -0.864188},
|
||||
{0.162460, -0.262866, -0.951056},
|
||||
{0.238856, -0.864188, -0.442863},
|
||||
{0.500000, -0.809017, -0.309017},
|
||||
{0.425325, -0.688191, -0.587785},
|
||||
{0.716567, -0.681718, -0.147621},
|
||||
{0.688191, -0.587785, -0.425325},
|
||||
{0.587785, -0.425325, -0.688191},
|
||||
{0.000000, -0.955423, -0.295242},
|
||||
{0.000000, -1.000000, 0.000000},
|
||||
{0.262866, -0.951056, -0.162460},
|
||||
{0.000000, -0.850651, 0.525731},
|
||||
{0.000000, -0.955423, 0.295242},
|
||||
{0.238856, -0.864188, 0.442863},
|
||||
{0.262866, -0.951056, 0.162460},
|
||||
{0.500000, -0.809017, 0.309017},
|
||||
{0.716567, -0.681718, 0.147621},
|
||||
{0.525731, -0.850651, 0.000000},
|
||||
{-0.238856, -0.864188, -0.442863},
|
||||
{-0.500000, -0.809017, -0.309017},
|
||||
{-0.262866, -0.951056, -0.162460},
|
||||
{-0.850651, -0.525731, 0.000000},
|
||||
{-0.716567, -0.681718, -0.147621},
|
||||
{-0.716567, -0.681718, 0.147621},
|
||||
{-0.525731, -0.850651, 0.000000},
|
||||
{-0.500000, -0.809017, 0.309017},
|
||||
{-0.238856, -0.864188, 0.442863},
|
||||
{-0.262866, -0.951056, 0.162460},
|
||||
{-0.864188, -0.442863, 0.238856},
|
||||
{-0.809017, -0.309017, 0.500000},
|
||||
{-0.688191, -0.587785, 0.425325},
|
||||
{-0.681718, -0.147621, 0.716567},
|
||||
{-0.442863, -0.238856, 0.864188},
|
||||
{-0.587785, -0.425325, 0.688191},
|
||||
{-0.309017, -0.500000, 0.809017},
|
||||
{-0.147621, -0.716567, 0.681718},
|
||||
{-0.425325, -0.688191, 0.587785},
|
||||
{-0.162460, -0.262866, 0.951056},
|
||||
{0.442863, -0.238856, 0.864188},
|
||||
{0.162460, -0.262866, 0.951056},
|
||||
{0.309017, -0.500000, 0.809017},
|
||||
{0.147621, -0.716567, 0.681718},
|
||||
{0.000000, -0.525731, 0.850651},
|
||||
{0.425325, -0.688191, 0.587785},
|
||||
{0.587785, -0.425325, 0.688191},
|
||||
{0.688191, -0.587785, 0.425325},
|
||||
{-0.955423, 0.295242, 0.000000},
|
||||
{-0.951056, 0.162460, 0.262866},
|
||||
{-1.000000, 0.000000, 0.000000},
|
||||
{-0.850651, 0.000000, 0.525731},
|
||||
{-0.955423, -0.295242, 0.000000},
|
||||
{-0.951056, -0.162460, 0.262866},
|
||||
{-0.864188, 0.442863, -0.238856},
|
||||
{-0.951056, 0.162460, -0.262866},
|
||||
{-0.809017, 0.309017, -0.500000},
|
||||
{-0.864188, -0.442863, -0.238856},
|
||||
{-0.951056, -0.162460, -0.262866},
|
||||
{-0.809017, -0.309017, -0.500000},
|
||||
{-0.681718, 0.147621, -0.716567},
|
||||
{-0.681718, -0.147621, -0.716567},
|
||||
{-0.850651, 0.000000, -0.525731},
|
||||
{-0.688191, 0.587785, -0.425325},
|
||||
{-0.587785, 0.425325, -0.688191},
|
||||
{-0.425325, 0.688191, -0.587785},
|
||||
{-0.425325, -0.688191, -0.587785},
|
||||
{-0.587785, -0.425325, -0.688191},
|
||||
{-0.688191, -0.587785, -0.425325},
|
||||
{-0.525731, 0.000000, 0.850651},
|
||||
{-0.442863, 0.238856, 0.864188},
|
||||
{-0.295242, 0.000000, 0.955423},
|
||||
{-0.309017, 0.500000, 0.809017},
|
||||
{-0.162460, 0.262866, 0.951056},
|
||||
{0.000000, 0.000000, 1.000000},
|
||||
{0.000000, 0.850651, 0.525731},
|
||||
{-0.147621, 0.716567, 0.681718},
|
||||
{0.147621, 0.716567, 0.681718},
|
||||
{0.000000, 0.525731, 0.850651},
|
||||
{0.309017, 0.500000, 0.809017},
|
||||
{0.525731, 0.000000, 0.850651},
|
||||
{0.295242, 0.000000, 0.955423},
|
||||
{0.442863, 0.238856, 0.864188},
|
||||
{0.162460, 0.262866, 0.951056},
|
||||
{-0.681718, 0.147621, 0.716567},
|
||||
{-0.809017, 0.309017, 0.500000},
|
||||
{-0.587785, 0.425325, 0.688191},
|
||||
{-0.850651, 0.525731, 0.000000},
|
||||
{-0.864188, 0.442863, 0.238856},
|
||||
{-0.716567, 0.681718, 0.147621},
|
||||
{-0.688191, 0.587785, 0.425325},
|
||||
{-0.500000, 0.809017, 0.309017},
|
||||
{-0.238856, 0.864188, 0.442863},
|
||||
{-0.425325, 0.688191, 0.587785},
|
||||
{-0.716567, 0.681718, -0.147621},
|
||||
{-0.500000, 0.809017, -0.309017},
|
||||
{-0.525731, 0.850651, 0.000000},
|
||||
{0.000000, 0.850651, -0.525731},
|
||||
{-0.238856, 0.864188, -0.442863},
|
||||
{0.000000, 0.955423, -0.295242},
|
||||
{-0.262866, 0.951056, -0.162460},
|
||||
{0.000000, 1.000000, 0.000000},
|
||||
{0.000000, 0.955423, 0.295242},
|
||||
{-0.262866, 0.951056, 0.162460},
|
||||
{0.238856, 0.864188, 0.442863},
|
||||
{0.262866, 0.951056, 0.162460},
|
||||
{0.500000, 0.809017, 0.309017},
|
||||
{0.238856, 0.864188, -0.442863},
|
||||
{0.262866, 0.951056, -0.162460},
|
||||
{0.500000, 0.809017, -0.309017},
|
||||
{0.850651, 0.525731, 0.000000},
|
||||
{0.716567, 0.681718, 0.147621},
|
||||
{0.716567, 0.681718, -0.147621},
|
||||
{0.525731, 0.850651, 0.000000},
|
||||
{0.425325, 0.688191, 0.587785},
|
||||
{0.864188, 0.442863, 0.238856},
|
||||
{0.688191, 0.587785, 0.425325},
|
||||
{0.809017, 0.309017, 0.500000},
|
||||
{0.681718, 0.147621, 0.716567},
|
||||
{0.587785, 0.425325, 0.688191},
|
||||
{0.955423, 0.295242, 0.000000},
|
||||
{1.000000, 0.000000, 0.000000},
|
||||
{0.951056, 0.162460, 0.262866},
|
||||
{0.850651, -0.525731, 0.000000},
|
||||
{0.955423, -0.295242, 0.000000},
|
||||
{0.864188, -0.442863, 0.238856},
|
||||
{0.951056, -0.162460, 0.262866},
|
||||
{0.809017, -0.309017, 0.500000},
|
||||
{0.681718, -0.147621, 0.716567},
|
||||
{0.850651, 0.000000, 0.525731},
|
||||
{0.864188, 0.442863, -0.238856},
|
||||
{0.809017, 0.309017, -0.500000},
|
||||
{0.951056, 0.162460, -0.262866},
|
||||
{0.525731, 0.000000, -0.850651},
|
||||
{0.681718, 0.147621, -0.716567},
|
||||
{0.681718, -0.147621, -0.716567},
|
||||
{0.850651, 0.000000, -0.525731},
|
||||
{0.809017, -0.309017, -0.500000},
|
||||
{0.864188, -0.442863, -0.238856},
|
||||
{0.951056, -0.162460, -0.262866},
|
||||
{0.147621, 0.716567, -0.681718},
|
||||
{0.309017, 0.500000, -0.809017},
|
||||
{0.425325, 0.688191, -0.587785},
|
||||
{0.442863, 0.238856, -0.864188},
|
||||
{0.587785, 0.425325, -0.688191},
|
||||
{0.688191, 0.587785, -0.425325},
|
||||
{-0.147621, 0.716567, -0.681718},
|
||||
{-0.309017, 0.500000, -0.809017},
|
||||
{0.000000, 0.525731, -0.850651},
|
||||
{-0.525731, 0.000000, -0.850651},
|
||||
{-0.442863, 0.238856, -0.864188},
|
||||
{-0.295242, 0.000000, -0.955423},
|
||||
{-0.162460, 0.262866, -0.951056},
|
||||
{0.000000, 0.000000, -1.000000},
|
||||
{0.295242, 0.000000, -0.955423},
|
||||
{0.162460, 0.262866, -0.951056},
|
||||
{-0.442863, -0.238856, -0.864188},
|
||||
{-0.309017, -0.500000, -0.809017},
|
||||
{-0.162460, -0.262866, -0.951056},
|
||||
{0.000000, -0.850651, -0.525731},
|
||||
{-0.147621, -0.716567, -0.681718},
|
||||
{0.147621, -0.716567, -0.681718},
|
||||
{0.000000, -0.525731, -0.850651},
|
||||
{0.309017, -0.500000, -0.809017},
|
||||
{0.442863, -0.238856, -0.864188},
|
||||
{0.162460, -0.262866, -0.951056},
|
||||
{0.238856, -0.864188, -0.442863},
|
||||
{0.500000, -0.809017, -0.309017},
|
||||
{0.425325, -0.688191, -0.587785},
|
||||
{0.716567, -0.681718, -0.147621},
|
||||
{0.688191, -0.587785, -0.425325},
|
||||
{0.587785, -0.425325, -0.688191},
|
||||
{0.000000, -0.955423, -0.295242},
|
||||
{0.000000, -1.000000, 0.000000},
|
||||
{0.262866, -0.951056, -0.162460},
|
||||
{0.000000, -0.850651, 0.525731},
|
||||
{0.000000, -0.955423, 0.295242},
|
||||
{0.238856, -0.864188, 0.442863},
|
||||
{0.262866, -0.951056, 0.162460},
|
||||
{0.500000, -0.809017, 0.309017},
|
||||
{0.716567, -0.681718, 0.147621},
|
||||
{0.525731, -0.850651, 0.000000},
|
||||
{-0.238856, -0.864188, -0.442863},
|
||||
{-0.500000, -0.809017, -0.309017},
|
||||
{-0.262866, -0.951056, -0.162460},
|
||||
{-0.850651, -0.525731, 0.000000},
|
||||
{-0.716567, -0.681718, -0.147621},
|
||||
{-0.716567, -0.681718, 0.147621},
|
||||
{-0.525731, -0.850651, 0.000000},
|
||||
{-0.500000, -0.809017, 0.309017},
|
||||
{-0.238856, -0.864188, 0.442863},
|
||||
{-0.262866, -0.951056, 0.162460},
|
||||
{-0.864188, -0.442863, 0.238856},
|
||||
{-0.809017, -0.309017, 0.500000},
|
||||
{-0.688191, -0.587785, 0.425325},
|
||||
{-0.681718, -0.147621, 0.716567},
|
||||
{-0.442863, -0.238856, 0.864188},
|
||||
{-0.587785, -0.425325, 0.688191},
|
||||
{-0.309017, -0.500000, 0.809017},
|
||||
{-0.147621, -0.716567, 0.681718},
|
||||
{-0.425325, -0.688191, 0.587785},
|
||||
{-0.162460, -0.262866, 0.951056},
|
||||
{0.442863, -0.238856, 0.864188},
|
||||
{0.162460, -0.262866, 0.951056},
|
||||
{0.309017, -0.500000, 0.809017},
|
||||
{0.147621, -0.716567, 0.681718},
|
||||
{0.000000, -0.525731, 0.850651},
|
||||
{0.425325, -0.688191, 0.587785},
|
||||
{0.587785, -0.425325, 0.688191},
|
||||
{0.688191, -0.587785, 0.425325},
|
||||
{-0.955423, 0.295242, 0.000000},
|
||||
{-0.951056, 0.162460, 0.262866},
|
||||
{-1.000000, 0.000000, 0.000000},
|
||||
{-0.850651, 0.000000, 0.525731},
|
||||
{-0.955423, -0.295242, 0.000000},
|
||||
{-0.951056, -0.162460, 0.262866},
|
||||
{-0.864188, 0.442863, -0.238856},
|
||||
{-0.951056, 0.162460, -0.262866},
|
||||
{-0.809017, 0.309017, -0.500000},
|
||||
{-0.864188, -0.442863, -0.238856},
|
||||
{-0.951056, -0.162460, -0.262866},
|
||||
{-0.809017, -0.309017, -0.500000},
|
||||
{-0.681718, 0.147621, -0.716567},
|
||||
{-0.681718, -0.147621, -0.716567},
|
||||
{-0.850651, 0.000000, -0.525731},
|
||||
{-0.688191, 0.587785, -0.425325},
|
||||
{-0.587785, 0.425325, -0.688191},
|
||||
{-0.425325, 0.688191, -0.587785},
|
||||
{-0.425325, -0.688191, -0.587785},
|
||||
{-0.587785, -0.425325, -0.688191},
|
||||
{-0.688191, -0.587785, -0.425325},
|
||||
|
||||
@@ -15,6 +15,14 @@ GNU General Public License for more details.
|
||||
#ifndef CDLL_EXP_H
|
||||
#define CDLL_EXP_H
|
||||
|
||||
struct tempent_s;
|
||||
struct usercmd_s;
|
||||
struct physent_s;
|
||||
struct playermove_s;
|
||||
struct mstudioevent_s;
|
||||
struct engine_studio_api_s;
|
||||
struct r_studio_interface_s;
|
||||
|
||||
// NOTE: ordering is important!
|
||||
typedef struct cldll_func_s
|
||||
{
|
||||
@@ -62,6 +70,10 @@ typedef struct cldll_func_s
|
||||
// Xash3D extension
|
||||
int (*pfnGetRenderInterface)( int version, render_api_t *renderfuncs, render_interface_t *callback );
|
||||
void (*pfnClipMoveToEntity)( struct physent_s *pe, const vec3_t start, vec3_t mins, vec3_t maxs, const vec3_t end, struct pmtrace_s *tr );
|
||||
// Xash3D FWGS extension
|
||||
int (*pfnTouchEvent)( int type, int fingerID, float x, float y, float dx, float dy );
|
||||
void (*pfnMoveEvent)( float forwardmove, float sidemove );
|
||||
void (*pfnLookEvent)( float relyaw, float relpitch );
|
||||
} cldll_func_t;
|
||||
|
||||
#endif//CDLL_EXP_H
|
||||
#endif//CDLL_EXP_H
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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
|
||||
@@ -15,7 +15,7 @@
|
||||
//
|
||||
// cdll_int.h
|
||||
//
|
||||
// 4-23-98
|
||||
// 4-23-98
|
||||
// JOHN: client dll interface declarations
|
||||
//
|
||||
|
||||
@@ -27,6 +27,16 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "const.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAX_ALIAS_NAME 32
|
||||
|
||||
typedef struct cmdalias_s
|
||||
{
|
||||
struct cmdalias_s *next;
|
||||
char name[MAX_ALIAS_NAME];
|
||||
char *value;
|
||||
} cmdalias_t;
|
||||
|
||||
// this file is included by both the engine and the client-dll,
|
||||
// so make sure engine declarations aren't done twice
|
||||
@@ -96,8 +106,14 @@ typedef struct hud_player_info_s
|
||||
char *model;
|
||||
short topcolor;
|
||||
short bottomcolor;
|
||||
|
||||
uint64_t m_nSteamID;
|
||||
} hud_player_info_t;
|
||||
|
||||
struct screenfade_s;
|
||||
struct tagPOINT;
|
||||
struct event_args_s;
|
||||
|
||||
typedef struct cl_enginefuncs_s
|
||||
{
|
||||
// sprite handlers
|
||||
@@ -119,20 +135,20 @@ typedef struct cl_enginefuncs_s
|
||||
void (*pfnSetCrosshair)( HSPRITE hspr, wrect_t rc, int r, int g, int b );
|
||||
|
||||
// cvar handlers
|
||||
struct cvar_s *(*pfnRegisterVariable)( char *szName, char *szValue, int flags );
|
||||
float (*pfnGetCvarFloat)( char *szName );
|
||||
char* (*pfnGetCvarString)( char *szName );
|
||||
struct cvar_s *(*pfnRegisterVariable)( const char *szName, const char *szValue, int flags );
|
||||
float (*pfnGetCvarFloat)( const char *szName );
|
||||
const char* (*pfnGetCvarString)( const char *szName );
|
||||
|
||||
// command handlers
|
||||
int (*pfnAddCommand)( char *cmd_name, void (*function)(void) );
|
||||
int (*pfnHookUserMsg)( char *szMsgName, pfnUserMsgHook pfn );
|
||||
int (*pfnServerCmd)( char *szCmdString );
|
||||
int (*pfnClientCmd)( char *szCmdString );
|
||||
int (*pfnAddCommand)( const char *cmd_name, void (*function)(void) );
|
||||
int (*pfnHookUserMsg)( const char *szMsgName, pfnUserMsgHook pfn );
|
||||
int (*pfnServerCmd)( const char *szCmdString );
|
||||
int (*pfnClientCmd)( const char *szCmdString );
|
||||
|
||||
void (*pfnGetPlayerInfo)( int ent_num, hud_player_info_t *pinfo );
|
||||
|
||||
// sound handlers
|
||||
void (*pfnPlaySoundByName)( char *szSound, float volume );
|
||||
void (*pfnPlaySoundByName)( const char *szSound, float volume );
|
||||
void (*pfnPlaySoundByIndex)( int iSound, float volume );
|
||||
|
||||
// vector helpers
|
||||
@@ -154,14 +170,14 @@ typedef struct cl_enginefuncs_s
|
||||
void (*GetViewAngles)( float * );
|
||||
void (*SetViewAngles)( float * );
|
||||
int (*GetMaxClients)( void );
|
||||
void (*Cvar_SetValue)( char *cvar, float value );
|
||||
void (*Cvar_SetValue)( const char *cvar, float value );
|
||||
|
||||
int (*Cmd_Argc)( void );
|
||||
char *(*Cmd_Argv)( int arg );
|
||||
void (*Con_Printf)( char *fmt, ... );
|
||||
void (*Con_DPrintf)( char *fmt, ... );
|
||||
void (*Con_NPrintf)( int pos, char *fmt, ... );
|
||||
void (*Con_NXPrintf)( struct con_nprint_s *info, char *fmt, ... );
|
||||
int (*Cmd_Argc)( void );
|
||||
const char *(*Cmd_Argv)( int arg );
|
||||
void (*Con_Printf)( const char *fmt, ... );
|
||||
void (*Con_DPrintf)( const char *fmt, ... );
|
||||
void (*Con_NPrintf)( int pos, const char *fmt, ... );
|
||||
void (*Con_NXPrintf)( struct con_nprint_s *info, const char *fmt, ... );
|
||||
|
||||
const char* (*PhysInfo_ValueForKey)( const char *key );
|
||||
const char* (*ServerInfo_ValueForKey)( const char *key );
|
||||
@@ -180,8 +196,8 @@ typedef struct cl_enginefuncs_s
|
||||
void (*V_CalcShake)( void );
|
||||
void (*V_ApplyShake)( float *origin, float *angles, float factor );
|
||||
|
||||
int (*PM_PointContents)( float *point, int *truecontents );
|
||||
int (*PM_WaterEntity)( float *p );
|
||||
int (*PM_PointContents)( const float *point, int *truecontents );
|
||||
int (*PM_WaterEntity)( const float *p );
|
||||
struct pmtrace_s *(*PM_TraceLine)( float *start, float *end, int flags, int usehull, int ignore_pe );
|
||||
|
||||
struct model_s *(*CL_LoadModel)( const char *modelname, int *index );
|
||||
@@ -189,35 +205,36 @@ typedef struct cl_enginefuncs_s
|
||||
|
||||
const struct model_s* (*GetSpritePointer)( HSPRITE hSprite );
|
||||
void (*pfnPlaySoundByNameAtLocation)( char *szSound, float volume, float *origin );
|
||||
|
||||
|
||||
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 (*pfnWeaponAnim)( int iAnim, int body );
|
||||
float (*pfnRandomFloat)( float flLow, float flHigh );
|
||||
long (*pfnRandomLong)( long lLow, long lHigh );
|
||||
void (*pfnHookEvent)( char *name, void ( *pfnEvent )( struct event_args_s *args ));
|
||||
int (*Con_IsVisible) ();
|
||||
float (*pfnRandomFloat)( float flLow, float flHigh );
|
||||
int (*pfnRandomLong)( int lLow, int lHigh );
|
||||
void (*pfnHookEvent)( const char *name, void ( *pfnEvent )( struct event_args_s *args ));
|
||||
|
||||
int (*Con_IsVisible) ( void );
|
||||
const char *(*pfnGetGameDirectory)( void );
|
||||
struct cvar_s *(*pfnGetCvarPointer)( const char *szName );
|
||||
const char *(*Key_LookupBinding)( const char *pBinding );
|
||||
const char *(*pfnGetLevelName)( void );
|
||||
void (*pfnGetScreenFade)( struct screenfade_s *fade );
|
||||
void (*pfnSetScreenFade)( struct screenfade_s *fade );
|
||||
void* (*VGui_GetPanel)( );
|
||||
void* (*VGui_GetPanel)( void );
|
||||
void (*VGui_ViewportPaintBackground)( int extents[4] );
|
||||
|
||||
byte* (*COM_LoadFile)( char *path, int usehunk, int *pLength );
|
||||
byte* (*COM_LoadFile)( const char *path, int usehunk, int *pLength );
|
||||
char* (*COM_ParseFile)( char *data, char *token );
|
||||
void (*COM_FreeFile)( void *buffer );
|
||||
|
||||
struct triangleapi_s *pTriAPI;
|
||||
struct efx_api_s *pEfxAPI;
|
||||
struct event_api_s *pEventAPI;
|
||||
struct event_api_s *pEventAPI;
|
||||
struct demo_api_s *pDemoAPI;
|
||||
struct net_api_s *pNetAPI;
|
||||
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 );
|
||||
struct model_s *(*LoadMapSprite)( const char *filename );
|
||||
|
||||
@@ -248,39 +265,47 @@ typedef struct cl_enginefuncs_s
|
||||
void (*pfnGetMousePos)( struct tagPOINT *ppt );
|
||||
void (*pfnSetMousePos)( int x, int y );
|
||||
void (*pfnSetMouseEnable)( qboolean fEnable );
|
||||
void (*pfnUnused1)( void );
|
||||
void (*pfnUnused2)( void );
|
||||
void (*pfnUnused3)( void );
|
||||
void (*pfnUnused4)( void );
|
||||
float (*pfnGetClientOldTime)( void );
|
||||
float (*pfnGetGravity)( void );
|
||||
struct model_s*(*pfnGetModelByIndex)( int index );
|
||||
void (*pfnUnused5)( void );
|
||||
void (*pfnUnused6)( void );
|
||||
void (*pfnUnused7)( void );
|
||||
void (*pfnUnused8)( void );
|
||||
void (*pfnUnused9)( void );
|
||||
void (*pfnUnused10)( void );
|
||||
void (*pfnUnused11)( void );
|
||||
void (*pfnUnused12)( void );
|
||||
const char*(*LocalPlayerInfo_ValueForKey)( const char* key );
|
||||
void (*pfnUnused13)( void );
|
||||
void (*pfnUnused14)( void );
|
||||
void (*pfnUnused15)( void );
|
||||
void (*pfnUnused16)( void );
|
||||
void (*Cvar_Set)( char *name, char *value );
|
||||
void (*pfnUnused17)( void );
|
||||
void (*pfnUnused18)( void );
|
||||
void (*pfnUnused19)( void );
|
||||
double (*pfnSys_FloatTime)( void );
|
||||
void (*pfnUnused20)( void );
|
||||
void (*pfnUnused21)( void );
|
||||
void (*pfnUnused22)( void );
|
||||
void (*pfnUnused23)( void );
|
||||
void (*pfnFillRGBABlend)( int x, int y, int width, int height, int r, int g, int b, int a );
|
||||
int (*pfnGetAppID)( void );
|
||||
void (*pfnUnused24)( void );
|
||||
void (*pfnUnused25)( void );
|
||||
|
||||
// undocumented interface starts here
|
||||
struct cvar_s* (*pfnGetFirstCvarPtr)( void );
|
||||
void* (*pfnGetFirstCmdFunctionHandle)( void );
|
||||
void* (*pfnGetNextCmdFunctionHandle)( void *cmdhandle );
|
||||
const char* (*pfnGetCmdFunctionName)( void *cmdhandle );
|
||||
float (*pfnGetClientOldTime)( void );
|
||||
float (*pfnGetGravity)( void );
|
||||
struct model_s* (*pfnGetModelByIndex)( int index );
|
||||
void (*pfnSetFilterMode)( int mode ); // same as gl_texsort in original Quake
|
||||
void (*pfnSetFilterColor)( float red, float green, float blue );
|
||||
void (*pfnSetFilterBrightness)( float brightness );
|
||||
void *(*pfnSequenceGet)( const char *fileName, const char *entryName );
|
||||
void (*pfnSPR_DrawGeneric)( int frame, int x, int y, const wrect_t *prc, int blendsrc, int blenddst, int width, int height );
|
||||
void *(*pfnSequencePickSentence)( const char *groupName, int pickMethod, int *entryPicked );
|
||||
int (*pfnDrawString)( int x, int y, const char *str, int r, int g, int b );
|
||||
int (*pfnDrawStringReverse)( int x, int y, const char *str, int r, int g, int b );
|
||||
const char *(*LocalPlayerInfo_ValueForKey)( const char* key );
|
||||
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 );
|
||||
unsigned int (*pfnGetApproxWavePlayLen)( const char *filename );
|
||||
void* (*GetCareerGameUI)( void ); // g-cont. !!!! potential crash-point!
|
||||
void (*Cvar_Set)( const char *name, const char *value );
|
||||
int (*pfnIsPlayingCareerMatch)( void );
|
||||
void (*pfnPlaySoundVoiceByName)( char *szSound, float volume, int pitch );
|
||||
void (*pfnPrimeMusicStream)( char *filename, int looping );
|
||||
double (*pfnSys_FloatTime)( void );
|
||||
|
||||
// decay funcs
|
||||
void (*pfnProcessTutorMessageDecayBuffer)( int *buffer, int buflen );
|
||||
void (*pfnConstructTutorMessageDecayBuffer)( int *buffer, int buflen );
|
||||
void (*pfnResetTutorMessageDecayData)( void );
|
||||
|
||||
void (*pfnPlaySoundByNameAtPitch)( char *szSound, float volume, int pitch );
|
||||
void (*pfnFillRGBABlend)( int x, int y, int width, int height, int r, int g, int b, int a );
|
||||
int (*pfnGetAppID)( void );
|
||||
cmdalias_t *(*pfnGetAliases)( void );
|
||||
void (*pfnVguiWrap2_GetMouseDelta)( int *x, int *y );
|
||||
|
||||
// added in 2019 update, not documented yet
|
||||
int (*pfnFilteredClientCmd)( const char *cmd );
|
||||
} cl_enginefunc_t;
|
||||
|
||||
#define CLDLL_INTERFACE_VERSION 7
|
||||
@@ -289,4 +314,4 @@ typedef struct cl_enginefuncs_s
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif//CDLL_INT_H
|
||||
#endif//CDLL_INT_H
|
||||
|
||||
38
engine/client/avi/avi.h
Normal file
38
engine/client/avi/avi.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
avi.h -- common avi support header
|
||||
Copyright (C) 2018 a1batross, Uncle Mike
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
#ifndef AVI_H
|
||||
#define AVI_H
|
||||
|
||||
//
|
||||
// avikit.c
|
||||
//
|
||||
typedef struct movie_state_s movie_state_t;
|
||||
int AVI_GetVideoFrameNumber( movie_state_t *Avi, float time );
|
||||
byte *AVI_GetVideoFrame( movie_state_t *Avi, int frame );
|
||||
qboolean AVI_GetVideoInfo( movie_state_t *Avi, int *xres, int *yres, float *duration );
|
||||
qboolean AVI_GetAudioInfo( movie_state_t *Avi, wavdata_t *snd_info );
|
||||
int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int length );
|
||||
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 );
|
||||
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time );
|
||||
int AVI_GetVideoFrameCount( movie_state_t *Avi );
|
||||
void AVI_CloseVideo( movie_state_t *Avi );
|
||||
qboolean AVI_IsActive( movie_state_t *Avi );
|
||||
void AVI_FreeVideo( movie_state_t *Avi );
|
||||
movie_state_t *AVI_GetState( int num );
|
||||
qboolean AVI_Initailize( void );
|
||||
void AVI_Shutdown( void );
|
||||
|
||||
#endif // AVI_H
|
||||
95
engine/client/avi/avi_stub.c
Normal file
95
engine/client/avi/avi_stub.c
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
avi_stub.c - playing AVI files (stub)
|
||||
Copyright (C) 2018 a1batross
|
||||
|
||||
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 "build.h"
|
||||
#if !XASH_WIN32
|
||||
#include "common.h"
|
||||
|
||||
int AVI_GetVideoFrameNumber( movie_state_t *Avi, float time )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
byte *AVI_GetVideoFrame( movie_state_t *Avi, int frame )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
qboolean AVI_GetVideoInfo( movie_state_t *Avi, int *xres, int *yres, float *duration )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean AVI_GetAudioInfo( movie_state_t *Avi, wavdata_t *snd_info )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int length )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int AVI_GetVideoFrameCount( movie_state_t *Avi )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AVI_CloseVideo( movie_state_t *Avi )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
qboolean AVI_IsActive( movie_state_t *Avi )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void AVI_FreeVideo( movie_state_t *Avi )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
movie_state_t *AVI_GetState( int num )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
qboolean AVI_Initailize( void )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void AVI_Shutdown( void )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
#endif // WIN32
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
avikit.c - playing AVI files (based on original AVIKit code)
|
||||
avi_win.c - playing AVI files (based on original AVIKit code, Win32 version)
|
||||
Copyright (C) 2010 Uncle Mike
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@@ -13,9 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "build.h"
|
||||
#if XASH_WIN32
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
#include <vfw.h> // video for windows
|
||||
|
||||
// msvfw32.dll exports
|
||||
@@ -58,14 +59,14 @@ dll_info_t msacm_dll = { "msacm32.dll", msacm_funcs, false };
|
||||
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 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 int (_stdcall *pAVIStreamGetFrameClose)( PGETFRAME pg );
|
||||
static dword (_stdcall *pAVIStreamRelease)( PAVISTREAM pavi );
|
||||
static int (_stdcall *pAVIFileOpen)( PAVIFILE *ppfile, LPCSTR szFile, UINT uMode, LPCLSID lpHandler );
|
||||
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 long (_stdcall *pAVIStreamStart)( PAVISTREAM pavi );
|
||||
static int (_stdcall *pAVIStreamStart)( PAVISTREAM pavi );
|
||||
static dword (_stdcall *pAVIFileRelease)( PAVIFILE pfile );
|
||||
static void (_stdcall *pAVIFileInit)( void );
|
||||
static void (_stdcall *pAVIFileExit)( void );
|
||||
@@ -90,7 +91,7 @@ static dllfunc_t avifile_funcs[] =
|
||||
};
|
||||
|
||||
dll_info_t avifile_dll = { "avifil32.dll", avifile_funcs, false };
|
||||
|
||||
|
||||
typedef struct movie_state_s
|
||||
{
|
||||
qboolean active;
|
||||
@@ -99,17 +100,17 @@ typedef struct movie_state_s
|
||||
PAVIFILE pfile; // avi file pointer
|
||||
PAVISTREAM video_stream; // video stream pointer
|
||||
PGETFRAME video_getframe; // pointer to getframe object for video stream
|
||||
long video_frames; // total frames
|
||||
long video_xres; // video stream resolution
|
||||
long video_yres;
|
||||
int video_frames; // total frames
|
||||
int video_xres; // video stream resolution
|
||||
int video_yres;
|
||||
float video_fps; // video stream fps
|
||||
|
||||
PAVISTREAM audio_stream; // audio stream pointer
|
||||
WAVEFORMAT *audio_header; // audio stream header
|
||||
long audio_header_size; // WAVEFORMAT is returned for PCM data; WAVEFORMATEX for others
|
||||
long audio_codec; // WAVE_FORMAT_PCM is oldstyle: anything else needs conversion
|
||||
long audio_length; // in converted samples
|
||||
long audio_bytes_per_sample; // guess.
|
||||
int audio_header_size; // WAVEFORMAT is returned for PCM data; WAVEFORMATEX for others
|
||||
int audio_codec; // WAVE_FORMAT_PCM is oldstyle: anything else needs conversion
|
||||
int audio_length; // in converted samples
|
||||
int audio_bytes_per_sample; // guess.
|
||||
|
||||
// compressed audio specific data
|
||||
dword cpa_blockalign; // block size to read
|
||||
@@ -251,7 +252,7 @@ qboolean AVI_ACMConvertAudio( movie_state_t *Avi )
|
||||
return true;
|
||||
}
|
||||
|
||||
qboolean AVI_GetVideoInfo( movie_state_t *Avi, long *xres, long *yres, float *duration )
|
||||
qboolean AVI_GetVideoInfo( movie_state_t *Avi, int *xres, int *yres, float *duration )
|
||||
{
|
||||
if( !Avi->active )
|
||||
return false;
|
||||
@@ -269,7 +270,7 @@ qboolean AVI_GetVideoInfo( movie_state_t *Avi, long *xres, long *yres, float *du
|
||||
}
|
||||
|
||||
// returns a unique frame identifier
|
||||
long AVI_GetVideoFrameNumber( movie_state_t *Avi, float time )
|
||||
int AVI_GetVideoFrameNumber( movie_state_t *Avi, float time )
|
||||
{
|
||||
if( !Avi->active )
|
||||
return 0;
|
||||
@@ -277,7 +278,7 @@ long AVI_GetVideoFrameNumber( movie_state_t *Avi, float time )
|
||||
return (time * Avi->video_fps);
|
||||
}
|
||||
|
||||
long AVI_GetVideoFrameCount( movie_state_t *Avi )
|
||||
int AVI_GetVideoFrameCount( movie_state_t *Avi )
|
||||
{
|
||||
if( !Avi->active )
|
||||
return 0;
|
||||
@@ -285,7 +286,7 @@ long AVI_GetVideoFrameCount( movie_state_t *Avi )
|
||||
return Avi->video_frames;
|
||||
}
|
||||
|
||||
long AVI_TimeToSoundPosition( movie_state_t *Avi, long time )
|
||||
int AVI_TimeToSoundPosition( movie_state_t *Avi, int time )
|
||||
{
|
||||
if( !Avi->active || !Avi->audio_stream )
|
||||
return 0;
|
||||
@@ -295,7 +296,7 @@ long AVI_TimeToSoundPosition( movie_state_t *Avi, long time )
|
||||
}
|
||||
|
||||
// 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;
|
||||
byte *frame_raw;
|
||||
@@ -382,9 +383,9 @@ qboolean AVI_SeekPosition( movie_state_t *Avi, dword offset )
|
||||
}
|
||||
|
||||
// get a chunk of audio from the stream (in bytes)
|
||||
long AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, long offset, long length )
|
||||
int AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, int offset, int length )
|
||||
{
|
||||
long result = 0;
|
||||
int result = 0;
|
||||
int i;
|
||||
|
||||
// zero data past the end of the file
|
||||
@@ -392,7 +393,7 @@ long AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, long offset, long l
|
||||
{
|
||||
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 );
|
||||
|
||||
@@ -422,12 +423,12 @@ long AVI_GetAudioChunk( movie_state_t *Avi, char *audiodata, long offset, long l
|
||||
result = 0;
|
||||
|
||||
// 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
|
||||
|
||||
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
|
||||
{
|
||||
@@ -490,7 +491,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
||||
{
|
||||
BITMAPINFOHEADER bmih;
|
||||
AVISTREAMINFO stream_info;
|
||||
long opened_streams = 0;
|
||||
int opened_streams = 0;
|
||||
LONG hr;
|
||||
|
||||
// default state: non-working.
|
||||
@@ -534,7 +535,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
||||
|
||||
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 )
|
||||
{
|
||||
PAVISTREAM stream = NULL;
|
||||
@@ -557,7 +558,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 )
|
||||
{
|
||||
long size;
|
||||
int size;
|
||||
|
||||
Avi->audio_stream = stream;
|
||||
|
||||
@@ -570,7 +571,7 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
||||
Avi->audio_codec = Avi->audio_header->wFormatTag;
|
||||
|
||||
// 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;
|
||||
|
||||
if( Avi->audio_codec != WAVE_FORMAT_PCM )
|
||||
@@ -584,17 +585,17 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
||||
}
|
||||
else Avi->audio_bytes_per_sample = Avi->audio_header->nBlockAlign;
|
||||
Avi->audio_length *= Avi->audio_bytes_per_sample;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pAVIStreamRelease( stream );
|
||||
}
|
||||
}
|
||||
|
||||
// display error message-stream not found.
|
||||
// display error message-stream not found.
|
||||
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 );
|
||||
if( !Avi->quiet )
|
||||
Con_DPrintf( S_ERROR "couldn't find a valid video stream.\n" );
|
||||
@@ -612,9 +613,9 @@ void AVI_OpenVideo( movie_state_t *Avi, const char *filename, qboolean load_audi
|
||||
}
|
||||
|
||||
bmih.biSize = sizeof( BITMAPINFOHEADER );
|
||||
bmih.biPlanes = 1;
|
||||
bmih.biPlanes = 1;
|
||||
bmih.biBitCount = 32;
|
||||
bmih.biCompression = BI_RGB;
|
||||
bmih.biCompression = BI_RGB;
|
||||
bmih.biWidth = Avi->video_xres;
|
||||
bmih.biHeight = -Avi->video_yres; // invert height to flip image upside down
|
||||
|
||||
@@ -729,4 +730,5 @@ void AVI_Shutdown( void )
|
||||
Sys_FreeLibrary( &msvfw_dll );
|
||||
Sys_FreeLibrary( &msacm_dll );
|
||||
avi_initialized = false;
|
||||
}
|
||||
}
|
||||
#endif // _WIN32
|
||||
@@ -15,7 +15,6 @@ GNU General Public License for more details.
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
|
||||
/*
|
||||
====================
|
||||
@@ -127,8 +126,8 @@ void CL_PlayCDTrack_f( void )
|
||||
int i, maxTrack;
|
||||
|
||||
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 );
|
||||
if( track )
|
||||
{
|
||||
@@ -141,43 +140,31 @@ void CL_PlayCDTrack_f( void )
|
||||
else Con_Printf( "%s: unknown command %s\n", Cmd_Argv( 0 ), command );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_ScreenshotGetName
|
||||
==================
|
||||
*/
|
||||
==================
|
||||
*/
|
||||
qboolean CL_ScreenshotGetName( int lastnum, char *filename )
|
||||
{
|
||||
int a, b, c, d;
|
||||
|
||||
if( lastnum < 0 || lastnum > 9999 )
|
||||
{
|
||||
Con_Printf( S_ERROR "unable to write screenshot\n" );
|
||||
return false;
|
||||
}
|
||||
|
||||
a = lastnum / 1000;
|
||||
lastnum -= a * 1000;
|
||||
b = lastnum / 100;
|
||||
lastnum -= b * 100;
|
||||
c = lastnum / 10;
|
||||
lastnum -= c * 10;
|
||||
d = lastnum;
|
||||
|
||||
Q_sprintf( filename, "scrshots/%s_shot%i%i%i%i.bmp", clgame.mapname, a, b, c, d );
|
||||
Q_sprintf( filename, "scrshots/%s_shot%04d.png", clgame.mapname, lastnum );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_SnapshotGetName
|
||||
==================
|
||||
*/
|
||||
==================
|
||||
*/
|
||||
qboolean CL_SnapshotGetName( int lastnum, char *filename )
|
||||
{
|
||||
int a, b, c, d;
|
||||
|
||||
if( lastnum < 0 || lastnum > 9999 )
|
||||
{
|
||||
Con_Printf( S_ERROR "unable to write snapshot\n" );
|
||||
@@ -185,34 +172,26 @@ qboolean CL_SnapshotGetName( int lastnum, char *filename )
|
||||
return false;
|
||||
}
|
||||
|
||||
a = lastnum / 1000;
|
||||
lastnum -= a * 1000;
|
||||
b = lastnum / 100;
|
||||
lastnum -= b * 100;
|
||||
c = lastnum / 10;
|
||||
lastnum -= c * 10;
|
||||
d = lastnum;
|
||||
|
||||
Q_sprintf( filename, "../%s_%i%i%i%i.bmp", clgame.mapname, a, b, c, d );
|
||||
Q_sprintf( filename, "../%s_%04d.png", clgame.mapname, lastnum );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
SCREEN SHOTS
|
||||
|
||||
==============================================================================
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
SCREEN SHOTS
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_ScreenShot_f
|
||||
|
||||
normal screenshot
|
||||
==================
|
||||
==================
|
||||
*/
|
||||
void CL_ScreenShot_f( void )
|
||||
void CL_ScreenShot_f( void )
|
||||
{
|
||||
int i;
|
||||
string checkname;
|
||||
@@ -243,14 +222,14 @@ void CL_ScreenShot_f( void )
|
||||
cls.envshot_viewsize = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_SnapShot_f
|
||||
|
||||
save screenshots into root dir
|
||||
==================
|
||||
==================
|
||||
*/
|
||||
void CL_SnapShot_f( void )
|
||||
void CL_SnapShot_f( void )
|
||||
{
|
||||
int i;
|
||||
string checkname;
|
||||
@@ -284,12 +263,12 @@ void CL_SnapShot_f( void )
|
||||
cls.envshot_viewsize = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_EnvShot_f
|
||||
|
||||
cubemap view
|
||||
==================
|
||||
==================
|
||||
*/
|
||||
void CL_EnvShot_f( void )
|
||||
{
|
||||
@@ -305,12 +284,12 @@ void CL_EnvShot_f( void )
|
||||
cls.envshot_viewsize = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_SkyShot_f
|
||||
|
||||
skybox view
|
||||
==================
|
||||
==================
|
||||
*/
|
||||
void CL_SkyShot_f( void )
|
||||
{
|
||||
@@ -326,13 +305,13 @@ void CL_SkyShot_f( void )
|
||||
cls.envshot_viewsize = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_LevelShot_f
|
||||
|
||||
splash logo while map is loading
|
||||
==================
|
||||
*/
|
||||
==================
|
||||
*/
|
||||
void CL_LevelShot_f( void )
|
||||
{
|
||||
size_t ft1, ft2;
|
||||
@@ -344,7 +323,7 @@ void CL_LevelShot_f( void )
|
||||
// check for exist
|
||||
if( cls.demoplayback && ( cls.demonum != -1 ))
|
||||
{
|
||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", cls.demoname, glState.wideScreen ? "16x9" : "4x3" );
|
||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", cls.demoname, refState.wideScreen ? "16x9" : "4x3" );
|
||||
Q_snprintf( filename, sizeof( filename ), "%s.dem", cls.demoname );
|
||||
|
||||
// make sure what levelshot is newer than demo
|
||||
@@ -353,7 +332,7 @@ void CL_LevelShot_f( void )
|
||||
}
|
||||
else
|
||||
{
|
||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", clgame.mapname, glState.wideScreen ? "16x9" : "4x3" );
|
||||
Q_sprintf( cls.shotname, "levelshots/%s_%s.bmp", clgame.mapname, refState.wideScreen ? "16x9" : "4x3" );
|
||||
|
||||
// make sure what levelshot is newer than bsp
|
||||
ft1 = FS_FileTime( cl.worldmodel->name, false );
|
||||
@@ -366,13 +345,13 @@ void CL_LevelShot_f( void )
|
||||
else cls.scrshot_action = scrshot_inactive; // disable - not needs
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_SaveShot_f
|
||||
|
||||
mini-pic in loadgame menu
|
||||
==================
|
||||
*/
|
||||
==================
|
||||
*/
|
||||
void CL_SaveShot_f( void )
|
||||
{
|
||||
if( Cmd_Argc() < 2 )
|
||||
@@ -381,7 +360,7 @@ void CL_SaveShot_f( void )
|
||||
return;
|
||||
}
|
||||
|
||||
Q_sprintf( cls.shotname, "%s%s.bmp", DEFAULT_SAVE_DIRECTORY, Cmd_Argv( 1 ));
|
||||
Q_sprintf( cls.shotname, DEFAULT_SAVE_DIRECTORY "%s.bmp", Cmd_Argv( 1 ));
|
||||
cls.scrshot_action = scrshot_savegame; // build new frame for saveshot
|
||||
}
|
||||
|
||||
@@ -424,53 +403,7 @@ void CL_SetSky_f( void )
|
||||
return;
|
||||
}
|
||||
|
||||
R_SetupSky( Cmd_Argv( 1 ));
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
SCR_TimeRefresh_f
|
||||
|
||||
timerefresh [noflip]
|
||||
================
|
||||
*/
|
||||
void SCR_TimeRefresh_f( void )
|
||||
{
|
||||
int i;
|
||||
double start, stop;
|
||||
double time;
|
||||
|
||||
if( cls.state != ca_active )
|
||||
return;
|
||||
|
||||
start = Sys_DoubleTime();
|
||||
|
||||
// run without page flipping like GoldSrc
|
||||
if( Cmd_Argc() == 1 )
|
||||
{
|
||||
pglDrawBuffer( GL_FRONT );
|
||||
for( i = 0; i < 128; i++ )
|
||||
{
|
||||
RI.viewangles[1] = i / 128.0 * 360.0f;
|
||||
R_RenderScene();
|
||||
}
|
||||
pglFinish();
|
||||
R_EndFrame();
|
||||
}
|
||||
else
|
||||
{
|
||||
for( i = 0; i < 128; i++ )
|
||||
{
|
||||
R_BeginFrame( true );
|
||||
RI.viewangles[1] = i / 128.0 * 360.0f;
|
||||
R_RenderScene();
|
||||
R_EndFrame();
|
||||
}
|
||||
}
|
||||
|
||||
stop = Sys_DoubleTime ();
|
||||
time = (stop - start);
|
||||
Con_Printf( "%f seconds (%f fps)\n", time, 128 / time );
|
||||
ref.dllFuncs.R_SetupSky( Cmd_Argv( 1 ));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -482,6 +415,35 @@ viewpos (level-designer helper)
|
||||
*/
|
||||
void SCR_Viewpos_f( void )
|
||||
{
|
||||
Con_Printf( "org ( %g %g %g )\n", RI.vieworg[0], RI.vieworg[1], RI.vieworg[2] );
|
||||
Con_Printf( "ang ( %g %g %g )\n", RI.viewangles[0], RI.viewangles[1], RI.viewangles[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] );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
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 )
|
||||
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 ));
|
||||
|
||||
|
||||
if( !COM_IsSafeFileToDownload( filepath ))
|
||||
{
|
||||
Con_Reportf( "refusing to download %s\n", filepath );
|
||||
@@ -70,6 +70,13 @@ qboolean CL_CheckFile( sizebuf_t *msg, resource_t *pResource )
|
||||
return true;
|
||||
}
|
||||
|
||||
if( cl.downloadUrl[0] )
|
||||
{
|
||||
HTTP_AddDownload( filepath, pResource->nDownloadSize, true );
|
||||
host.downloadcount++;
|
||||
return false;
|
||||
}
|
||||
|
||||
MSG_BeginClientCmd( msg, clc_stringcmd );
|
||||
MSG_WriteString( msg, va( "dlfile %s", filepath ));
|
||||
host.downloadcount++;
|
||||
@@ -99,7 +106,7 @@ void CL_RemoveFromResourceList( resource_t *pResource )
|
||||
if( pResource->pPrev == NULL || pResource->pNext == NULL )
|
||||
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" );
|
||||
|
||||
pResource->pPrev->pNext = pResource->pNext;
|
||||
@@ -140,4 +147,4 @@ void CL_ClearResourceLists( void )
|
||||
{
|
||||
CL_ClearResourceList( &cl.resourcesneeded );
|
||||
CL_ClearResourceList( &cl.resourcesonhand );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ GNU General Public License for more details.
|
||||
#include "client.h"
|
||||
#include "net_encode.h"
|
||||
#include "particledef.h"
|
||||
#include "gl_local.h"
|
||||
#include "cl_tent.h"
|
||||
#include "shake.h"
|
||||
#include "hltv.h"
|
||||
@@ -87,6 +86,7 @@ const char *svc_strings[svc_lastmsg+1] =
|
||||
"svc_resourcelocation",
|
||||
"svc_querycvarvalue",
|
||||
"svc_querycvarvalue2",
|
||||
"svc_exec",
|
||||
};
|
||||
|
||||
typedef struct
|
||||
@@ -98,7 +98,7 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
oldcmd_t oldcmd[MSG_COUNT];
|
||||
oldcmd_t oldcmd[MSG_COUNT];
|
||||
int currentcmd;
|
||||
qboolean parsing;
|
||||
} msg_debug_t;
|
||||
@@ -156,7 +156,7 @@ void CL_Parse_RecordCommand( int cmd, int startoffset )
|
||||
int slot;
|
||||
|
||||
if( cmd == svc_nop ) return;
|
||||
|
||||
|
||||
slot = ( cls_message_debug.currentcmd++ & MSG_MASK );
|
||||
cls_message_debug.oldcmd[slot].command = cmd;
|
||||
cls_message_debug.oldcmd[slot].starting_offset = startoffset;
|
||||
@@ -188,7 +188,7 @@ write net_message into buffer.dat for debugging
|
||||
static void CL_WriteErrorMessage( int current_count, sizebuf_t *msg )
|
||||
{
|
||||
const char *buffer_file = "buffer.dat";
|
||||
file_t *fp;
|
||||
file_t *fp;
|
||||
|
||||
fp = FS_Open( buffer_file, "wb", false );
|
||||
if( !fp ) return;
|
||||
@@ -239,4 +239,4 @@ void CL_WriteMessageHistory( void )
|
||||
if( host_developer.value >= DEV_EXTENDED )
|
||||
CL_WriteErrorMessage( MSG_GetNumBytesRead( msg ) - 1, msg );
|
||||
cls_message_debug.parsing = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ GNU General Public License for more details.
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
#include "net_encode.h"
|
||||
|
||||
#define dem_unknown 0 // unknown command
|
||||
@@ -52,6 +51,7 @@ const char *demo_cmd[dem_lastcmd+1] =
|
||||
"dem_stop",
|
||||
};
|
||||
|
||||
#pragma pack( push, 1 )
|
||||
typedef struct
|
||||
{
|
||||
int id; // should be IDEM
|
||||
@@ -63,6 +63,7 @@ typedef struct
|
||||
char gamedir[64]; // name of game directory (FS_Gamedir())
|
||||
int directory_offset; // offset of Entry Directory.
|
||||
} demoheader_t;
|
||||
#pragma pack( pop )
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -155,7 +156,7 @@ CL_GetDemoRecordClock
|
||||
write time while demo is recording
|
||||
====================
|
||||
*/
|
||||
float CL_GetDemoRecordClock( void )
|
||||
float CL_GetDemoRecordClock( void )
|
||||
{
|
||||
return cl.mtime[0];
|
||||
}
|
||||
@@ -167,7 +168,7 @@ CL_GetDemoPlaybackClock
|
||||
overwrite host.realtime
|
||||
====================
|
||||
*/
|
||||
float CL_GetDemoPlaybackClock( void )
|
||||
float CL_GetDemoPlaybackClock( void )
|
||||
{
|
||||
return host.realtime + host.frametime;
|
||||
}
|
||||
@@ -349,10 +350,10 @@ Write demo header
|
||||
*/
|
||||
void CL_WriteDemoHeader( const char *name )
|
||||
{
|
||||
long copysize;
|
||||
long savepos;
|
||||
long curpos;
|
||||
|
||||
int copysize;
|
||||
int savepos;
|
||||
int curpos;
|
||||
|
||||
Con_Printf( "recording to %s.\n", name );
|
||||
cls.demofile = FS_Open( name, "wb", false );
|
||||
cls.demotime = 0.0;
|
||||
@@ -370,7 +371,7 @@ void CL_WriteDemoHeader( const char *name )
|
||||
|
||||
demo.header.id = IDEMOHEADER;
|
||||
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 );
|
||||
Q_strncpy( demo.header.mapname, clgame.mapname, sizeof( demo.header.mapname ));
|
||||
Q_strncpy( demo.header.comment, clgame.maptitle, sizeof( demo.header.comment ));
|
||||
@@ -466,7 +467,7 @@ void CL_StopRecord( void )
|
||||
demo.header.directory_offset = curpos;
|
||||
FS_Seek( cls.demofile, 0, SEEK_SET );
|
||||
FS_Write( cls.demofile, &demo.header, sizeof( demo.header ));
|
||||
|
||||
|
||||
FS_Close( cls.demofile );
|
||||
cls.demofile = NULL;
|
||||
cls.demorecording = false;
|
||||
@@ -489,7 +490,7 @@ void CL_DrawDemoRecording( void )
|
||||
{
|
||||
char string[64];
|
||||
rgba_t color = { 255, 255, 255, 255 };
|
||||
long pos;
|
||||
int pos;
|
||||
int len;
|
||||
|
||||
if(!( host_developer.value && cls.demorecording ))
|
||||
@@ -497,10 +498,10 @@ void CL_DrawDemoRecording( void )
|
||||
|
||||
pos = FS_Tell( cls.demofile );
|
||||
Q_snprintf( string, sizeof( string ), "^1RECORDING:^7 %s: %s time: %02d:%02d", cls.demoname,
|
||||
Q_memprint( pos ), (int)(cls.demotime / 60.0f ), (int)fmod( cls.demotime, 60.0f ));
|
||||
Q_memprint( pos ), (int)(cls.demotime / 60.0f ), (int)fmod( cls.demotime, 60.0f ));
|
||||
|
||||
Con_DrawStringLen( string, &len, NULL );
|
||||
Con_DrawString(( glState.width - len ) >> 1, glState.height >> 2, string, color );
|
||||
Con_DrawString(( refState.width - len ) >> 1, refState.height >> 4, string, color );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -725,9 +726,9 @@ qboolean CL_DemoMoveToNextSection( void )
|
||||
|
||||
// switch to next section, we got a dem_stop
|
||||
demo.entry = &demo.directory.entries[demo.entryIndex];
|
||||
|
||||
|
||||
// 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.
|
||||
demo.starttime = CL_GetDemoPlaybackClock();
|
||||
@@ -738,7 +739,7 @@ qboolean CL_DemoMoveToNextSection( void )
|
||||
|
||||
qboolean CL_ReadRawNetworkData( byte *buffer, size_t *length )
|
||||
{
|
||||
int msglen = 0;
|
||||
int msglen = 0;
|
||||
|
||||
Assert( buffer != NULL );
|
||||
Assert( length != NULL );
|
||||
@@ -794,8 +795,8 @@ qboolean CL_DemoReadMessageQuake( byte *buffer, size_t *length )
|
||||
demoangle_t *a;
|
||||
|
||||
*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.timedemo )
|
||||
@@ -887,7 +888,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
||||
qboolean swallowmessages = true;
|
||||
static int tdlastdemoframe = 0;
|
||||
byte *userbuf = NULL;
|
||||
size_t size;
|
||||
size_t size = 0;
|
||||
byte cmd;
|
||||
|
||||
if( !cls.demofile )
|
||||
@@ -970,7 +971,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
||||
}
|
||||
} 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.
|
||||
if( cls.timedemo && ( tdlastdemoframe == host.framecount ))
|
||||
{
|
||||
@@ -992,7 +993,7 @@ qboolean CL_DemoReadMessage( byte *buffer, size_t *length )
|
||||
{
|
||||
// cheat by moving the relative start time forward.
|
||||
demo.starttime = CL_GetDemoPlaybackClock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
demo.framecount++;
|
||||
@@ -1100,9 +1101,9 @@ void CL_FinishTimeDemo( void )
|
||||
{
|
||||
int frames;
|
||||
double time;
|
||||
|
||||
|
||||
cls.timedemo = false;
|
||||
|
||||
|
||||
// the first frame didn't count
|
||||
frames = (host.framecount - cls.td_startframe) - 1;
|
||||
time = host.realtime - cls.td_starttime;
|
||||
@@ -1150,9 +1151,10 @@ void CL_StopPlayback( void )
|
||||
}
|
||||
else
|
||||
{
|
||||
// let game known about demo state
|
||||
// let game known about demo state
|
||||
Cvar_FullSet( "cl_background", "0", FCVAR_READ_ONLY );
|
||||
cls.state = ca_disconnected;
|
||||
memset( &cls.serveradr, 0, sizeof( cls.serveradr ) );
|
||||
cls.set_lastdemo = false;
|
||||
S_StopBackgroundTrack();
|
||||
cls.connect_time = 0;
|
||||
@@ -1164,12 +1166,12 @@ void CL_StopPlayback( void )
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_GetDemoComment
|
||||
==================
|
||||
*/
|
||||
qboolean CL_GetDemoComment( const char *demoname, char *comment )
|
||||
==================
|
||||
*/
|
||||
int GAME_EXPORT CL_GetDemoComment( const char *demoname, char *comment )
|
||||
{
|
||||
file_t *demfile;
|
||||
demoheader_t demohdr;
|
||||
@@ -1177,15 +1179,15 @@ qboolean CL_GetDemoComment( const char *demoname, char *comment )
|
||||
demoentry_t entry;
|
||||
float playtime = 0.0f;
|
||||
int i;
|
||||
|
||||
|
||||
if( !comment ) return false;
|
||||
|
||||
demfile = FS_Open( demoname, "rb", false );
|
||||
if( !demfile )
|
||||
{
|
||||
Q_strncpy( comment, "", MAX_STRING );
|
||||
comment[0] = '\0';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// read in the m_DemoHeader
|
||||
FS_Read( demfile, &demohdr, sizeof( demoheader_t ));
|
||||
@@ -1197,7 +1199,9 @@ qboolean CL_GetDemoComment( const char *demoname, char *comment )
|
||||
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 );
|
||||
Q_strncpy( comment, "<invalid protocol>", MAX_STRING );
|
||||
@@ -1224,11 +1228,11 @@ qboolean CL_GetDemoComment( const char *demoname, char *comment )
|
||||
// split comment to sections
|
||||
Q_strncpy( comment, demohdr.mapname, 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
|
||||
FS_Close( demfile );
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1265,12 +1269,12 @@ qboolean CL_NextDemo( void )
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_CheckStartupDemos
|
||||
|
||||
queue demos loop after movie playing
|
||||
==================
|
||||
==================
|
||||
*/
|
||||
void CL_CheckStartupDemos( void )
|
||||
{
|
||||
@@ -1295,15 +1299,13 @@ void CL_CheckStartupDemos( void )
|
||||
CL_NextDemo ();
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
/*
|
||||
==================
|
||||
CL_DemoGetName
|
||||
==================
|
||||
*/
|
||||
==================
|
||||
*/
|
||||
static void CL_DemoGetName( int lastnum, char *filename )
|
||||
{
|
||||
int a, b, c, d;
|
||||
|
||||
if( lastnum < 0 || lastnum > 9999 )
|
||||
{
|
||||
// bound
|
||||
@@ -1311,15 +1313,7 @@ static void CL_DemoGetName( int lastnum, char *filename )
|
||||
return;
|
||||
}
|
||||
|
||||
a = lastnum / 1000;
|
||||
lastnum -= a * 1000;
|
||||
b = lastnum / 100;
|
||||
lastnum -= b * 100;
|
||||
c = lastnum / 10;
|
||||
lastnum -= c * 10;
|
||||
d = lastnum;
|
||||
|
||||
Q_sprintf( filename, "demo%i%i%i%i", a, b, c, d );
|
||||
Q_sprintf( filename, "demo%04d", lastnum );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1389,13 +1383,13 @@ void CL_Record_f( void )
|
||||
// open the demo file
|
||||
Q_sprintf( demopath, "%s.dem", demoname );
|
||||
|
||||
// make sure what old demo is removed
|
||||
// make sure that old demo is removed
|
||||
if( FS_FileExists( demopath, false ))
|
||||
FS_Delete( demopath );
|
||||
|
||||
Q_strncpy( cls.demoname, demoname, sizeof( cls.demoname ));
|
||||
Q_strncpy( gameui.globals->demoname, demoname, sizeof( gameui.globals->demoname ));
|
||||
|
||||
|
||||
CL_WriteDemoHeader( demopath );
|
||||
}
|
||||
|
||||
@@ -1484,13 +1478,17 @@ void CL_PlayDemo_f( void )
|
||||
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 )
|
||||
Con_Printf( S_ERROR "playdemo: net protocol outdated (%i should be %i)\n", demo.header.net_protocol, PROTOCOL_VERSION );
|
||||
if( demo.header.net_protocol != PROTOCOL_VERSION &&
|
||||
demo.header.net_protocol != PROTOCOL_LEGACY_VERSION )
|
||||
{
|
||||
Con_Printf( S_ERROR "playdemo: net protocol outdated (%i should be %i)\n", demo.header.net_protocol, PROTOCOL_VERSION );
|
||||
CL_DemoAborted();
|
||||
return;
|
||||
}
|
||||
@@ -1523,6 +1521,7 @@ void CL_PlayDemo_f( void )
|
||||
|
||||
// g-cont. is this need?
|
||||
Q_strncpy( cls.servername, demoname, sizeof( cls.servername ));
|
||||
cls.legacymode = demo.header.net_protocol == PROTOCOL_LEGACY_VERSION;
|
||||
|
||||
// begin a playback demo
|
||||
}
|
||||
@@ -1627,4 +1626,4 @@ void CL_Stop_f( void )
|
||||
{
|
||||
S_StopBackgroundTrack();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,11 @@ GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
#include "mod_local.h"
|
||||
#include "entity_types.h"
|
||||
#include "studio.h"
|
||||
#include "world.h" // BOX_ON_PLANE_SIDE
|
||||
#include "client.h"
|
||||
#include "xash3d_mathlib.h"
|
||||
|
||||
/*
|
||||
===============================================================================
|
||||
@@ -43,9 +43,9 @@ 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;
|
||||
@@ -55,22 +55,22 @@ void R_RemoveEfrags( cl_entity_t *ent )
|
||||
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;
|
||||
ent->efrag = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -83,10 +83,10 @@ static void R_SplitEntityOnNode( mnode_t *node )
|
||||
efrag_t *ef;
|
||||
mleaf_t *leaf;
|
||||
int sides;
|
||||
|
||||
|
||||
if( node->contents == CONTENTS_SOLID )
|
||||
return;
|
||||
|
||||
|
||||
// add an efrag if the node is a leaf
|
||||
if( node->contents < 0 )
|
||||
{
|
||||
@@ -103,31 +103,31 @@ static void R_SplitEntityOnNode( mnode_t *node )
|
||||
return; // no free fragments...
|
||||
}
|
||||
|
||||
clgame.free_efrags = clgame.free_efrags->entnext;
|
||||
clgame.free_efrags = ef->entnext;
|
||||
ef->entity = r_addent;
|
||||
|
||||
// add the entity link
|
||||
|
||||
// add the entity link
|
||||
*lastlink = ef;
|
||||
lastlink = &ef->entnext;
|
||||
ef->entnext = NULL;
|
||||
|
||||
|
||||
// set the leaf links
|
||||
ef->leaf = leaf;
|
||||
ef->leafnext = leaf->efrags;
|
||||
leaf->efrags = ef;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// NODE_MIXED
|
||||
sides = BOX_ON_PLANE_SIDE( r_emins, r_emaxs, node->plane );
|
||||
|
||||
|
||||
if( sides == 3 )
|
||||
{
|
||||
// split on this plane
|
||||
// if this is the first splitter of this bmodel, remember it
|
||||
if( !r_pefragtopnode ) r_pefragtopnode = node;
|
||||
}
|
||||
|
||||
|
||||
// recurse down the contacted sides
|
||||
if( sides & 1 ) R_SplitEntityOnNode( node->children[0] );
|
||||
if( sides & 2 ) R_SplitEntityOnNode( node->children[1] );
|
||||
@@ -143,7 +143,7 @@ void R_AddEfrags( cl_entity_t *ent )
|
||||
matrix3x4 transform;
|
||||
vec3_t outmins, outmaxs;
|
||||
int i;
|
||||
|
||||
|
||||
if( !ent->model )
|
||||
return;
|
||||
|
||||
@@ -188,8 +188,6 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
||||
case mod_brush:
|
||||
case mod_studio:
|
||||
case mod_sprite:
|
||||
pent = pefrag->entity;
|
||||
|
||||
if( pent->visframe != framecount )
|
||||
{
|
||||
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
||||
@@ -202,8 +200,8 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
||||
|
||||
ppefrag = &pefrag->leafnext;
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2188
engine/client/cl_efx.c
Normal file
2188
engine/client/cl_efx.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -63,7 +63,7 @@ void CL_CalcPlayerVelocity( int idx, vec3_t velocity )
|
||||
if( dt != 0.0 )
|
||||
{
|
||||
VectorSubtract( clgame.entities[idx].curstate.velocity, clgame.entities[idx].prevstate.velocity, delta );
|
||||
VectorScale( delta, 1.0 / dt, velocity );
|
||||
VectorScale( delta, 1.0f / dt, velocity );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -78,23 +78,48 @@ CL_DescribeEvent
|
||||
|
||||
=============
|
||||
*/
|
||||
void CL_DescribeEvent( int slot, int flags, const char *eventname )
|
||||
void CL_DescribeEvent( event_info_t *ei, int slot )
|
||||
{
|
||||
int idx = (slot & 31);
|
||||
int idx = (slot & 63) * 2;
|
||||
con_nprint_t info;
|
||||
string origin_str = { 0 }; //, angles_str = { 0 };
|
||||
|
||||
if( !eventname || !cl_showevents->value )
|
||||
if( !cl_showevents->value )
|
||||
return;
|
||||
|
||||
// mark reliable as green and unreliable as red
|
||||
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.time_to_live = 1.0f;
|
||||
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 )
|
||||
{
|
||||
int i;
|
||||
|
||||
word i;
|
||||
|
||||
if( !COM_CheckString( name ))
|
||||
return 0;
|
||||
|
||||
@@ -189,7 +214,7 @@ qboolean CL_FireEvent( event_info_t *ei, int slot )
|
||||
// get the func pointer
|
||||
for( i = 0; i < MAX_EVENTS; i++ )
|
||||
{
|
||||
ev = clgame.events[i];
|
||||
ev = clgame.events[i];
|
||||
|
||||
if( !ev )
|
||||
{
|
||||
@@ -202,14 +227,14 @@ qboolean CL_FireEvent( event_info_t *ei, int slot )
|
||||
{
|
||||
if( ev->func )
|
||||
{
|
||||
CL_DescribeEvent( slot, ei->flags, cl.event_precache[ei->index] );
|
||||
CL_DescribeEvent( ei, slot );
|
||||
ev->func( &ei->args );
|
||||
return true;
|
||||
}
|
||||
|
||||
name = cl.event_precache[ei->index];
|
||||
Con_Reportf( S_ERROR "CL_FireEvent: %s not hooked\n", name );
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -393,7 +418,7 @@ void CL_ParseEvent( sizebuf_t *msg )
|
||||
event_index = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
|
||||
|
||||
if( MSG_ReadOneBit( msg ))
|
||||
packet_index = MSG_ReadUBitLong( msg, MAX_ENTITY_BITS );
|
||||
packet_index = MSG_ReadUBitLong( msg, cls.legacymode ? MAX_LEGACY_ENTITY_BITS : MAX_ENTITY_BITS );
|
||||
else packet_index = -1;
|
||||
|
||||
if( MSG_ReadOneBit( msg ))
|
||||
@@ -437,7 +462,7 @@ void CL_ParseEvent( sizebuf_t *msg )
|
||||
args.angles[PITCH] /= -3.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Place event on queue
|
||||
CL_QueueEvent( FEV_SERVER, event_index, delay, &args );
|
||||
}
|
||||
@@ -450,7 +475,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 )
|
||||
{
|
||||
event_args_t args;
|
||||
@@ -459,7 +484,7 @@ void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, floa
|
||||
return;
|
||||
|
||||
// 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 );
|
||||
return;
|
||||
@@ -469,7 +494,7 @@ void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, floa
|
||||
if( !CL_EventIndex( cl.event_precache[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
|
||||
@@ -492,4 +517,4 @@ void CL_PlaybackEvent( int flags, const edict_t *pInvoker, word eventindex, floa
|
||||
args.bparam2 = bparam2;
|
||||
|
||||
CL_QueueEvent( flags, eventindex, delay, &args );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ GNU General Public License for more details.
|
||||
#include "client.h"
|
||||
#include "net_encode.h"
|
||||
#include "entity_types.h"
|
||||
#include "gl_local.h"
|
||||
#include "pm_local.h"
|
||||
#include "cl_tent.h"
|
||||
#include "studio.h"
|
||||
@@ -59,10 +58,13 @@ void CL_UpdatePositions( cl_entity_t *ent )
|
||||
|
||||
ent->current_position = (ent->current_position + 1) & HISTORY_MASK;
|
||||
ph = &ent->ph[ent->current_position];
|
||||
|
||||
VectorCopy( ent->curstate.origin, ph->origin );
|
||||
VectorCopy( ent->curstate.angles, ph->angles );
|
||||
ph->animtime = ent->curstate.animtime; // !!!
|
||||
|
||||
if( ent->model && ent->model->type == mod_brush )
|
||||
ph->animtime = ent->curstate.animtime;
|
||||
else
|
||||
ph->animtime = cl.time;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -102,7 +104,7 @@ qboolean CL_EntityTeleported( cl_entity_t *ent )
|
||||
VectorSubtract( ent->curstate.origin, ent->prevstate.origin, delta );
|
||||
|
||||
// compute potential max movement in units per frame and compare with entity movement
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0 / GAME_FPS ));
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0f / GAME_FPS ));
|
||||
len = VectorLength( delta );
|
||||
|
||||
return (len > maxlen);
|
||||
@@ -132,6 +134,9 @@ some ents will be ignore lerping
|
||||
*/
|
||||
qboolean CL_EntityIgnoreLerp( cl_entity_t *e )
|
||||
{
|
||||
if( cl_nointerp->value > 0.f )
|
||||
return true;
|
||||
|
||||
if( e->model && e->model->type == mod_alias )
|
||||
return false;
|
||||
|
||||
@@ -217,7 +222,7 @@ void CL_UpdateLatchedVars( cl_entity_t *ent )
|
||||
|
||||
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.sequencetime = ent->curstate.animtime;
|
||||
}
|
||||
@@ -230,6 +235,33 @@ void CL_UpdateLatchedVars( cl_entity_t *ent )
|
||||
clgame.drawFuncs.CL_UpdateLatchedVars( ent, false );
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_GetStudioEstimatedFrame
|
||||
|
||||
====================
|
||||
*/
|
||||
float CL_GetStudioEstimatedFrame( cl_entity_t *ent )
|
||||
{
|
||||
studiohdr_t *pstudiohdr;
|
||||
mstudioseqdesc_t *pseqdesc;
|
||||
int sequence;
|
||||
|
||||
if( ent->model != NULL && ent->model->type == mod_studio )
|
||||
{
|
||||
pstudiohdr = (studiohdr_t *)Mod_StudioExtradata( ent->model );
|
||||
|
||||
if( pstudiohdr )
|
||||
{
|
||||
sequence = bound( 0, ent->curstate.sequence, pstudiohdr->numseq - 1 );
|
||||
pseqdesc = (mstudioseqdesc_t *)((byte *)pstudiohdr + pstudiohdr->seqindex) + sequence;
|
||||
return ref.dllFuncs.R_StudioEstimateFrame( ent, pseqdesc );
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
CL_ResetLatchedVars
|
||||
@@ -281,7 +313,7 @@ void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
||||
if( FBitSet( ent->curstate.entityType, ENTITY_NORMAL ))
|
||||
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
|
||||
if( ent->model && ent->model->type == mod_brush )
|
||||
@@ -297,7 +329,7 @@ void CL_ProcessEntityUpdate( cl_entity_t *ent )
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
VectorCopy( ent->curstate.origin, ent->origin );
|
||||
@@ -320,7 +352,7 @@ find two timestamps
|
||||
qboolean CL_FindInterpolationUpdates( cl_entity_t *ent, float targettime, position_history_t **ph0, position_history_t **ph1 )
|
||||
{
|
||||
qboolean extrapolate = true;
|
||||
int i, i0, i1, imod;
|
||||
uint i, i0, i1, imod;
|
||||
float at;
|
||||
|
||||
imod = ent->current_position;
|
||||
@@ -330,7 +362,7 @@ qboolean CL_FindInterpolationUpdates( cl_entity_t *ent, float targettime, positi
|
||||
for( i = 1; i < HISTORY_MAX - 1; i++ )
|
||||
{
|
||||
at = ent->ph[( imod - i ) & HISTORY_MASK].animtime;
|
||||
if( at == 0.0 ) break;
|
||||
if( at == 0.0f ) break;
|
||||
|
||||
if( targettime > at )
|
||||
{
|
||||
@@ -377,7 +409,7 @@ void CL_PureOrigin( cl_entity_t *ent, float t, vec3_t outorigin, vec3_t outangle
|
||||
|
||||
VectorSubtract( ph0->origin, ph1->origin, delta );
|
||||
|
||||
if( t0 != t1 )
|
||||
if( !Q_equal( t0, t1 ))
|
||||
frac = ( t - t1 ) / ( t0 - t1 );
|
||||
else frac = 1.0f;
|
||||
|
||||
@@ -457,7 +489,9 @@ int CL_InterpolateModel( cl_entity_t *e )
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( t2 == t1 )
|
||||
// HACKHACK: workaround buggy position history animtime
|
||||
// going backward sometimes
|
||||
if( Q_equal( t2, t1 ) || t2 < t1 )
|
||||
{
|
||||
VectorCopy( ph0->origin, e->origin );
|
||||
VectorCopy( ph0->angles, e->angles );
|
||||
@@ -500,9 +534,16 @@ void CL_ComputePlayerOrigin( cl_entity_t *ent )
|
||||
vec3_t origin;
|
||||
vec3_t angles;
|
||||
|
||||
if( !ent->player || ent->index == ( cl.playernum + 1 ))
|
||||
if( !ent->player )
|
||||
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 )
|
||||
{
|
||||
// quake lerping is easy
|
||||
@@ -729,7 +770,10 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
CL_WriteDemoJumpTime();
|
||||
|
||||
// sentinel count. save it for debug checking
|
||||
count = ( MSG_ReadUBitLong( msg, MAX_VISIBLE_PACKET_BITS ) + 1 );
|
||||
if( cls.legacymode )
|
||||
count = MSG_ReadWord( msg );
|
||||
else count = MSG_ReadUBitLong( msg, MAX_VISIBLE_PACKET_BITS ) + 1;
|
||||
|
||||
newframe = &cl.frames[cl.parsecountmod];
|
||||
|
||||
// allocate parse entities
|
||||
@@ -753,7 +797,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
}
|
||||
|
||||
if( subtracted >= CL_UPDATE_MASK )
|
||||
{
|
||||
{
|
||||
// we can't use this, it is too old
|
||||
Con_NPrintf( 2, "^3Warning:^1 delta frame is too old^7\n" );
|
||||
CL_FlushEntityPacket( msg );
|
||||
@@ -803,15 +847,25 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
newnum = MSG_ReadUBitLong( msg, MAX_ENTITY_BITS );
|
||||
if( newnum == LAST_EDICT ) break; // end of packet entities
|
||||
int lastedict;
|
||||
if( cls.legacymode )
|
||||
{
|
||||
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 ))
|
||||
Host_Error( "CL_ParsePacketEntities: overflow\n" );
|
||||
player = CL_IsPlayerIndex( newnum );
|
||||
|
||||
while( oldnum < newnum )
|
||||
{
|
||||
{
|
||||
// one or more entities from the old packet are unchanged
|
||||
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
||||
oldindex++;
|
||||
@@ -828,7 +882,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
}
|
||||
|
||||
if( oldnum == newnum )
|
||||
{
|
||||
{
|
||||
// delta from previous state
|
||||
bufStart = MSG_GetNumBytesRead( msg );
|
||||
CL_DeltaEntity( msg, newframe, newnum, oldent, true );
|
||||
@@ -848,7 +902,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
}
|
||||
|
||||
if( oldnum > newnum )
|
||||
{
|
||||
{
|
||||
// delta from baseline ?
|
||||
bufStart = MSG_GetNumBytesRead( msg );
|
||||
CL_DeltaEntity( msg, newframe, newnum, NULL, true );
|
||||
@@ -859,7 +913,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
|
||||
|
||||
// any remaining entities in the old frame are copied over
|
||||
while( oldnum != MAX_ENTNUMBER )
|
||||
{
|
||||
{
|
||||
// one or more entities from the old packet are unchanged
|
||||
CL_DeltaEntity( msg, newframe, oldnum, oldent, false );
|
||||
oldindex++;
|
||||
@@ -889,10 +943,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)
|
||||
if( cls.signon == ( SIGNONS - 1 ))
|
||||
{
|
||||
{
|
||||
// we are done with signon sequence.
|
||||
cls.signon = SIGNONS;
|
||||
|
||||
|
||||
// Clear loading plaque.
|
||||
CL_SignonReply ();
|
||||
}
|
||||
@@ -929,27 +983,28 @@ qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
|
||||
}
|
||||
|
||||
// don't add the player in firstperson mode
|
||||
if( RP_LOCALCLIENT( ent ) && !CL_IsThirdPerson( ) && ( ent->index == cl.viewentity ))
|
||||
return false;
|
||||
if( RP_LOCALCLIENT( ent ))
|
||||
{
|
||||
cl.local.apply_effects = true;
|
||||
|
||||
if( !CL_IsThirdPerson( ) && ( ent->index == cl.viewentity ))
|
||||
return false;
|
||||
}
|
||||
|
||||
if( entityType == ET_BEAM )
|
||||
{
|
||||
CL_AddCustomBeam( ent );
|
||||
ref.dllFuncs.CL_AddCustomBeam( ent );
|
||||
return true;
|
||||
}
|
||||
else if( !R_AddEntity( ent, entityType ))
|
||||
else if( !ref.dllFuncs.R_AddEntity( ent, entityType ))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// because pTemp->entity.curstate.effects
|
||||
// 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
|
||||
CL_AddEntityEffects( ent );
|
||||
|
||||
@@ -1001,7 +1056,6 @@ void CL_LinkPlayers( frame_t *frame )
|
||||
// apply muzzleflash to weaponmodel
|
||||
if( ent && FBitSet( ent->curstate.effects, EF_MUZZLEFLASH ))
|
||||
SetBits( clgame.viewent.curstate.effects, EF_MUZZLEFLASH );
|
||||
cl.local.apply_effects = true;
|
||||
|
||||
// check all the clients but add only visible
|
||||
for( i = 0, state = frame->playerstate; i < MAX_CLIENTS; i++, state++ )
|
||||
@@ -1040,6 +1094,9 @@ void CL_LinkPlayers( frame_t *frame )
|
||||
|
||||
if ( i == cl.playernum )
|
||||
{
|
||||
// using interpolation only for local player angles
|
||||
CL_ComputePlayerOrigin( ent );
|
||||
|
||||
if( cls.demoplayback == DEMO_QUAKE1 )
|
||||
VectorLerp( ent->prevstate.origin, cl.lerpFrac, ent->curstate.origin, cl.simorg );
|
||||
VectorCopy( cl.simorg, ent->origin );
|
||||
@@ -1109,7 +1166,7 @@ void CL_LinkPacketEntities( frame_t *frame )
|
||||
if( ent->curstate.rendermode == kRenderNormal )
|
||||
{
|
||||
// auto 'solid' faces
|
||||
if( FBitSet( ent->model->flags, MODEL_TRANSPARENT ) && CL_IsQuakeCompatible( ))
|
||||
if( FBitSet( ent->model->flags, MODEL_TRANSPARENT ) && Host_IsQuakeCompatible( ))
|
||||
{
|
||||
ent->curstate.rendermode = kRenderTransAlpha;
|
||||
ent->curstate.renderamt = 255;
|
||||
@@ -1185,8 +1242,8 @@ void CL_LinkPacketEntities( frame_t *frame )
|
||||
|
||||
if( ent->model->type == mod_studio )
|
||||
{
|
||||
if( interpolate && FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||
R_StudioLerpMovement( ent, cl.time, ent->origin, ent->angles );
|
||||
if( interpolate && FBitSet( host.features, ENGINE_COMPUTE_STUDIO_LERP ))
|
||||
ref.dllFuncs.R_StudioLerpMovement( ent, cl.time, ent->origin, ent->angles );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1257,8 +1314,6 @@ void CL_EmitEntities( void )
|
||||
{
|
||||
if( cl.paused ) return; // don't waste time
|
||||
|
||||
R_ClearScene ();
|
||||
|
||||
// not in server yet, no entities to redraw
|
||||
if( cls.state != ca_active || !cl.validsequence )
|
||||
return;
|
||||
@@ -1268,7 +1323,7 @@ void CL_EmitEntities( void )
|
||||
return;
|
||||
|
||||
// animate lightestyles
|
||||
CL_RunLightStyles ();
|
||||
ref.dllFuncs.CL_RunLightStyles ();
|
||||
|
||||
// decay dynamic lights
|
||||
CL_DecayLights ();
|
||||
@@ -1279,9 +1334,7 @@ void CL_EmitEntities( void )
|
||||
// set client ideal pitch when mlook is disabled
|
||||
CL_SetIdealPitch ();
|
||||
|
||||
// clear the scene befor start new frame
|
||||
if( clgame.drawFuncs.R_ClearScene != NULL )
|
||||
clgame.drawFuncs.R_ClearScene();
|
||||
ref.dllFuncs.R_ClearScene ();
|
||||
|
||||
// link all the visible clients first
|
||||
CL_LinkPlayers ( &cl.frames[cl.parsecountmod] );
|
||||
@@ -1325,35 +1378,27 @@ qboolean CL_GetEntitySpatialization( channel_t *ch )
|
||||
|
||||
if(( ch->entnum - 1 ) == cl.playernum )
|
||||
{
|
||||
VectorCopy( RI.vieworg, ch->origin );
|
||||
VectorCopy( refState.vieworg, ch->origin );
|
||||
return true;
|
||||
}
|
||||
|
||||
valid_origin = VectorIsNull( ch->origin ) ? false : true;
|
||||
valid_origin = VectorIsNull( ch->origin ) ? false : true;
|
||||
ent = CL_GetEntityByIndex( ch->entnum );
|
||||
|
||||
// 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;
|
||||
|
||||
#if 0
|
||||
// uncomment this if you want enable additional check by PVS
|
||||
if( ent->curstate.messagenum != cl.parsecount )
|
||||
return valid_origin;
|
||||
#endif
|
||||
ch->movetype = ent->curstate.movetype;
|
||||
|
||||
// setup origin
|
||||
VectorAverage( ent->curstate.mins, ent->curstate.maxs, ch->origin );
|
||||
VectorAdd( ch->origin, ent->curstate.origin, ch->origin );
|
||||
|
||||
// setup mins\maxs
|
||||
VectorAdd( ent->curstate.mins, ent->curstate.origin, ch->absmin );
|
||||
VectorAdd( ent->curstate.maxs, ent->curstate.origin, ch->absmax );
|
||||
|
||||
// setup radius
|
||||
if( ent->model != NULL && ent->model->radius ) ch->radius = ent->model->radius;
|
||||
else ch->radius = RadiusFromBounds( ent->curstate.mins, ent->curstate.maxs );
|
||||
if( ent->model->type == mod_brush )
|
||||
{
|
||||
VectorAverage( ent->model->mins, ent->model->maxs, ch->origin );
|
||||
VectorAdd( ent->origin, ch->origin, ch->origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
VectorCopy( ent->origin, ch->origin );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1363,7 +1408,7 @@ qboolean CL_GetMovieSpatialization( rawchan_t *ch )
|
||||
cl_entity_t *ent;
|
||||
qboolean valid_origin;
|
||||
|
||||
valid_origin = VectorIsNull( ch->origin ) ? false : true;
|
||||
valid_origin = VectorIsNull( ch->origin ) ? false : true;
|
||||
ent = CL_GetEntityByIndex( ch->entnum );
|
||||
|
||||
// entity is not present on the client but has valid origin
|
||||
@@ -1371,12 +1416,15 @@ qboolean CL_GetMovieSpatialization( rawchan_t *ch )
|
||||
return valid_origin;
|
||||
|
||||
// setup origin
|
||||
VectorAverage( ent->curstate.mins, ent->curstate.maxs, ch->origin );
|
||||
VectorAdd( ch->origin, ent->curstate.origin, ch->origin );
|
||||
|
||||
// setup radius
|
||||
if( ent->model != NULL && ent->model->radius ) ch->radius = ent->model->radius;
|
||||
else ch->radius = RadiusFromBounds( ent->curstate.mins, ent->curstate.maxs );
|
||||
if( ent->model->type == mod_brush )
|
||||
{
|
||||
VectorAverage( ent->model->mins, ent->model->maxs, ch->origin );
|
||||
VectorAdd( ent->origin, ch->origin, ch->origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
VectorCopy( ent->origin, ch->origin );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1385,4 +1433,4 @@ void CL_ExtraUpdate( void )
|
||||
{
|
||||
clgame.dllFuncs.IN_Accumulate();
|
||||
S_ExtraUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,11 +16,11 @@ GNU General Public License for more details.
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "const.h"
|
||||
#include "gl_local.h"
|
||||
#include "library.h"
|
||||
#include "input.h"
|
||||
#include "server.h" // !!svgame.hInstance
|
||||
#include "vid_common.h"
|
||||
|
||||
static MENUAPI GetMenuAPI;
|
||||
static void UI_UpdateUserinfo( void );
|
||||
|
||||
gameui_static_t gameui;
|
||||
@@ -47,7 +47,7 @@ void UI_UpdateMenu( float realtime )
|
||||
gameui.globals->frametime = host.realframetime;
|
||||
gameui.globals->demoplayback = cls.demoplayback;
|
||||
gameui.globals->demorecording = cls.demorecording;
|
||||
gameui.globals->allow_console = host.allow_console;
|
||||
gameui.globals->developer = host.allow_console;
|
||||
|
||||
gameui.dllFuncs.pfnRedraw( realtime );
|
||||
UI_UpdateUserinfo();
|
||||
@@ -135,7 +135,162 @@ qboolean UI_IsVisible( void )
|
||||
return gameui.dllFuncs.pfnIsVisible();
|
||||
}
|
||||
|
||||
static void UI_DrawLogo( const char *filename, float x, float y, float width, float height )
|
||||
/*
|
||||
=======================
|
||||
UI_AddTouchButtonToList
|
||||
|
||||
send button parameters to menu
|
||||
=======================
|
||||
*/
|
||||
void UI_AddTouchButtonToList( const char *name, const char *texture, const char *command, unsigned char *color, int flags )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnAddTouchButtonToList )
|
||||
{
|
||||
gameui.dllFuncs2.pfnAddTouchButtonToList( name, texture, command, color, flags );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
UI_ResetPing
|
||||
|
||||
notify gameui dll about latency reset
|
||||
=================
|
||||
*/
|
||||
void UI_ResetPing( void )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnResetPing )
|
||||
{
|
||||
gameui.dllFuncs2.pfnResetPing( );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
UI_ShowConnectionWarning
|
||||
|
||||
show connection warning dialog implemented by gameui dll
|
||||
=================
|
||||
*/
|
||||
void UI_ShowConnectionWarning( void )
|
||||
{
|
||||
if( cls.state != ca_connected )
|
||||
return;
|
||||
|
||||
if( Host_IsLocalClient() )
|
||||
return;
|
||||
|
||||
if( ++cl.lostpackets == 8 )
|
||||
{
|
||||
CL_Disconnect();
|
||||
if( gameui.dllFuncs2.pfnShowConnectionWarning )
|
||||
{
|
||||
gameui.dllFuncs2.pfnShowConnectionWarning();
|
||||
}
|
||||
Con_DPrintf( S_WARN "Too many lost packets! Showing Network options menu\n" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
UI_ShowConnectionWarning
|
||||
|
||||
show update dialog
|
||||
=================
|
||||
*/
|
||||
void UI_ShowUpdateDialog( qboolean preferStore )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnShowUpdateDialog )
|
||||
{
|
||||
gameui.dllFuncs2.pfnShowUpdateDialog( preferStore );
|
||||
}
|
||||
|
||||
Con_Printf( S_WARN "This version is not supported anymore. To continue, install latest engine version\n" );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
UI_ShowConnectionWarning
|
||||
|
||||
show message box
|
||||
=================
|
||||
*/
|
||||
void UI_ShowMessageBox( const char *text )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnShowMessageBox )
|
||||
{
|
||||
gameui.dllFuncs2.pfnShowMessageBox( text );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_Disconnect( void )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_Disconnect )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_Disconnect( );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_Download( const char *pszFileName, const char *pszServerName, const char *pszServerPath, int iCurrent, int iTotal, const char *comment )
|
||||
{
|
||||
if( !gameui.dllFuncs2.pfnConnectionProgress_Download )
|
||||
return;
|
||||
|
||||
if( pszServerPath )
|
||||
{
|
||||
char serverpath[MAX_SYSPATH];
|
||||
|
||||
Q_snprintf( serverpath, sizeof( serverpath ), "%s%s", pszServerName, pszServerPath );
|
||||
gameui.dllFuncs2.pfnConnectionProgress_Download( pszFileName, serverpath, iCurrent, iTotal, comment );
|
||||
}
|
||||
else
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_Download( pszFileName, pszServerName, iCurrent, iTotal, comment );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_DownloadEnd( void )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_DownloadEnd )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_DownloadEnd( );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_Precache( void )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_Precache )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_Precache( );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_Connect( const char *server ) // NULL for local server
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_Connect )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_Connect( server );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_ChangeLevel( void )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_ChangeLevel )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_ChangeLevel( );
|
||||
}
|
||||
}
|
||||
|
||||
void UI_ConnectionProgress_ParseServerInfo( const char *server )
|
||||
{
|
||||
if( gameui.dllFuncs2.pfnConnectionProgress_ParseServerInfo )
|
||||
{
|
||||
gameui.dllFuncs2.pfnConnectionProgress_ParseServerInfo( server );
|
||||
}
|
||||
}
|
||||
|
||||
static void GAME_EXPORT UI_DrawLogo( const char *filename, float x, float y, float width, float height )
|
||||
{
|
||||
static float cin_time;
|
||||
static int last_frame = -1;
|
||||
@@ -151,7 +306,7 @@ static void UI_DrawLogo( const char *filename, float x, float y, float width, fl
|
||||
{
|
||||
string path;
|
||||
const char *fullpath;
|
||||
|
||||
|
||||
// run cinematic if not
|
||||
Q_snprintf( path, sizeof( path ), "media/%s", filename );
|
||||
COM_DefaultExtension( path, ".avi" );
|
||||
@@ -201,20 +356,20 @@ static void UI_DrawLogo( const char *filename, float x, float y, float width, fl
|
||||
redraw = true;
|
||||
}
|
||||
|
||||
R_DrawStretchRaw( x, y, width, height, gameui.logo_xres, gameui.logo_yres, cin_data, redraw );
|
||||
ref.dllFuncs.R_DrawStretchRaw( x, y, width, height, gameui.logo_xres, gameui.logo_yres, cin_data, redraw );
|
||||
}
|
||||
|
||||
static int UI_GetLogoWidth( void )
|
||||
static int GAME_EXPORT UI_GetLogoWidth( void )
|
||||
{
|
||||
return gameui.logo_xres;
|
||||
}
|
||||
|
||||
static int UI_GetLogoHeight( void )
|
||||
static int GAME_EXPORT UI_GetLogoHeight( void )
|
||||
{
|
||||
return gameui.logo_yres;
|
||||
}
|
||||
|
||||
static float UI_GetLogoLength( void )
|
||||
static float GAME_EXPORT UI_GetLogoLength( void )
|
||||
{
|
||||
return gameui.logo_length;
|
||||
}
|
||||
@@ -235,7 +390,7 @@ static void UI_UpdateUserinfo( void )
|
||||
player->bottomcolor = Q_atoi( Info_ValueForKey( player->userinfo, "bottomcolor" ));
|
||||
host.userinfo_changed = false; // we got it
|
||||
}
|
||||
|
||||
|
||||
void Host_Credits( void )
|
||||
{
|
||||
if( !gameui.hInstance ) return;
|
||||
@@ -248,7 +403,7 @@ static void UI_ConvertGameInfo( GAMEINFO *out, gameinfo_t *in )
|
||||
Q_strncpy( out->startmap, in->startmap, sizeof( out->startmap ));
|
||||
Q_strncpy( out->trainmap, in->trainmap, sizeof( out->trainmap ));
|
||||
Q_strncpy( out->title, in->title, sizeof( out->title ));
|
||||
Q_strncpy( out->version, va( "%g", in->version ), sizeof( out->version ));
|
||||
Q_snprintf( out->version, sizeof( out->version ), "%g", in->version );
|
||||
|
||||
Q_strncpy( out->game_url, in->game_url, sizeof( out->game_url ));
|
||||
Q_strncpy( out->update_url, in->update_url, sizeof( out->update_url ));
|
||||
@@ -262,6 +417,8 @@ static void UI_ConvertGameInfo( GAMEINFO *out, gameinfo_t *in )
|
||||
out->flags |= GFL_NOMODELS;
|
||||
if( in->noskills )
|
||||
out->flags |= GFL_NOSKILLS;
|
||||
if( in->render_picbutton_text )
|
||||
out->flags |= GFL_RENDER_PICBUTTON_TEXT;
|
||||
}
|
||||
|
||||
static qboolean PIC_Scissor( float *x, float *y, float *width, float *height, float *u0, float *v0, float *u1, float *v1 )
|
||||
@@ -358,8 +515,8 @@ static void PIC_DrawGeneric( float x, float y, float width, float height, const
|
||||
return;
|
||||
|
||||
PicAdjustSize( &x, &y, &width, &height );
|
||||
R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, gameui.ds.gl_texturenum );
|
||||
pglColor4ub( 255, 255, 255, 255 );
|
||||
ref.dllFuncs.R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, gameui.ds.gl_texturenum );
|
||||
ref.dllFuncs.Color4ub( 255, 255, 255, 255 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -374,13 +531,13 @@ pfnPIC_Load
|
||||
|
||||
=========
|
||||
*/
|
||||
static HIMAGE pfnPIC_Load( const char *szPicName, const byte *image_buf, long image_size, long flags )
|
||||
static HIMAGE GAME_EXPORT pfnPIC_Load( const char *szPicName, const byte *image_buf, int image_size, int flags )
|
||||
{
|
||||
HIMAGE tx;
|
||||
|
||||
if( !COM_CheckString( szPicName ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "CL_LoadImage: bad name!\n" );
|
||||
Con_Reportf( S_ERROR "CL_LoadImage: refusing to load image with empty name\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -388,7 +545,7 @@ static HIMAGE pfnPIC_Load( const char *szPicName, const byte *image_buf, long im
|
||||
SetBits( flags, TF_IMAGE );
|
||||
|
||||
Image_SetForceFlags( IL_LOAD_DECAL ); // allow decal images for menu
|
||||
tx = GL_LoadTexture( szPicName, image_buf, image_size, flags );
|
||||
tx = ref.dllFuncs.GL_LoadTexture( szPicName, image_buf, image_size, flags );
|
||||
Image_ClearForceFlags();
|
||||
|
||||
return tx;
|
||||
@@ -400,7 +557,7 @@ pfnPIC_Width
|
||||
|
||||
=========
|
||||
*/
|
||||
static int pfnPIC_Width( HIMAGE hPic )
|
||||
static int GAME_EXPORT pfnPIC_Width( HIMAGE hPic )
|
||||
{
|
||||
int picWidth;
|
||||
|
||||
@@ -415,7 +572,7 @@ pfnPIC_Height
|
||||
|
||||
=========
|
||||
*/
|
||||
static int pfnPIC_Height( HIMAGE hPic )
|
||||
static int GAME_EXPORT pfnPIC_Height( HIMAGE hPic )
|
||||
{
|
||||
int picHeight;
|
||||
|
||||
@@ -430,14 +587,14 @@ pfnPIC_Set
|
||||
|
||||
=========
|
||||
*/
|
||||
void pfnPIC_Set( HIMAGE hPic, int r, int g, int b, int a )
|
||||
void GAME_EXPORT pfnPIC_Set( HIMAGE hPic, int r, int g, int b, int a )
|
||||
{
|
||||
gameui.ds.gl_texturenum = hPic;
|
||||
r = bound( 0, r, 255 );
|
||||
g = bound( 0, g, 255 );
|
||||
b = bound( 0, b, 255 );
|
||||
a = bound( 0, a, 255 );
|
||||
pglColor4ub( r, g, b, a );
|
||||
ref.dllFuncs.Color4ub( r, g, b, a );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -446,9 +603,9 @@ pfnPIC_Draw
|
||||
|
||||
=========
|
||||
*/
|
||||
void pfnPIC_Draw( int x, int y, int width, int height, const wrect_t *prc )
|
||||
void GAME_EXPORT pfnPIC_Draw( int x, int y, int width, int height, const wrect_t *prc )
|
||||
{
|
||||
GL_SetRenderMode( kRenderNormal );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderNormal );
|
||||
PIC_DrawGeneric( x, y, width, height, prc );
|
||||
}
|
||||
|
||||
@@ -458,9 +615,9 @@ pfnPIC_DrawTrans
|
||||
|
||||
=========
|
||||
*/
|
||||
void pfnPIC_DrawTrans( int x, int y, int width, int height, const wrect_t *prc )
|
||||
void GAME_EXPORT pfnPIC_DrawTrans( int x, int y, int width, int height, const wrect_t *prc )
|
||||
{
|
||||
GL_SetRenderMode( kRenderTransTexture );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
||||
PIC_DrawGeneric( x, y, width, height, prc );
|
||||
}
|
||||
|
||||
@@ -470,9 +627,9 @@ pfnPIC_DrawHoles
|
||||
|
||||
=========
|
||||
*/
|
||||
void pfnPIC_DrawHoles( int x, int y, int width, int height, const wrect_t *prc )
|
||||
void GAME_EXPORT pfnPIC_DrawHoles( int x, int y, int width, int height, const wrect_t *prc )
|
||||
{
|
||||
GL_SetRenderMode( kRenderTransAlpha );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransAlpha );
|
||||
PIC_DrawGeneric( x, y, width, height, prc );
|
||||
}
|
||||
|
||||
@@ -482,9 +639,9 @@ pfnPIC_DrawAdditive
|
||||
|
||||
=========
|
||||
*/
|
||||
void pfnPIC_DrawAdditive( int x, int y, int width, int height, const wrect_t *prc )
|
||||
void GAME_EXPORT pfnPIC_DrawAdditive( int x, int y, int width, int height, const wrect_t *prc )
|
||||
{
|
||||
GL_SetRenderMode( kRenderTransAdd );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransAdd );
|
||||
PIC_DrawGeneric( x, y, width, height, prc );
|
||||
}
|
||||
|
||||
@@ -494,7 +651,7 @@ pfnPIC_EnableScissor
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnPIC_EnableScissor( int x, int y, int width, int height )
|
||||
static void GAME_EXPORT pfnPIC_EnableScissor( int x, int y, int width, int height )
|
||||
{
|
||||
// check bounds
|
||||
x = bound( 0, x, gameui.globals->scrWidth );
|
||||
@@ -515,7 +672,7 @@ pfnPIC_DisableScissor
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnPIC_DisableScissor( void )
|
||||
static void GAME_EXPORT pfnPIC_DisableScissor( void )
|
||||
{
|
||||
gameui.ds.scissor_x = 0;
|
||||
gameui.ds.scissor_width = 0;
|
||||
@@ -530,16 +687,16 @@ pfnFillRGBA
|
||||
|
||||
=============
|
||||
*/
|
||||
static void pfnFillRGBA( int x, int y, int width, int height, int r, int g, int b, int a )
|
||||
static void GAME_EXPORT pfnFillRGBA( int x, int y, int width, int height, int r, int g, int b, int a )
|
||||
{
|
||||
r = bound( 0, r, 255 );
|
||||
g = bound( 0, g, 255 );
|
||||
b = bound( 0, b, 255 );
|
||||
a = bound( 0, a, 255 );
|
||||
pglColor4ub( r, g, b, a );
|
||||
GL_SetRenderMode( kRenderTransTexture );
|
||||
R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, tr.whiteTexture );
|
||||
pglColor4ub( 255, 255, 255, 255 );
|
||||
ref.dllFuncs.Color4ub( r, g, b, a );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
||||
ref.dllFuncs.R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, R_GetBuiltinTexture( REF_WHITE_TEXTURE ) );
|
||||
ref.dllFuncs.Color4ub( 255, 255, 255, 255 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -548,7 +705,7 @@ pfnClientCmd
|
||||
|
||||
=============
|
||||
*/
|
||||
static void pfnClientCmd( int exec_now, const char *szCmdString )
|
||||
static void GAME_EXPORT pfnClientCmd( int exec_now, const char *szCmdString )
|
||||
{
|
||||
if( !szCmdString || !szCmdString[0] )
|
||||
return;
|
||||
@@ -566,7 +723,7 @@ pfnPlaySound
|
||||
|
||||
=============
|
||||
*/
|
||||
static void pfnPlaySound( const char *szSound )
|
||||
static void GAME_EXPORT pfnPlaySound( const char *szSound )
|
||||
{
|
||||
if( !COM_CheckString( szSound )) return;
|
||||
S_StartLocalSound( szSound, VOL_NORM, false );
|
||||
@@ -579,7 +736,7 @@ pfnDrawCharacter
|
||||
quakefont draw character
|
||||
=============
|
||||
*/
|
||||
static void pfnDrawCharacter( int ix, int iy, int iwidth, int iheight, int ch, int ulRGBA, HIMAGE hFont )
|
||||
static void GAME_EXPORT pfnDrawCharacter( int ix, int iy, int iwidth, int iheight, int ch, int ulRGBA, HIMAGE hFont )
|
||||
{
|
||||
rgba_t color;
|
||||
float row, col, size;
|
||||
@@ -597,7 +754,7 @@ static void pfnDrawCharacter( int ix, int iy, int iwidth, int iheight, int ch, i
|
||||
color[0] = (ulRGBA & 0xFF0000) >> 16;
|
||||
color[1] = (ulRGBA & 0xFF00) >> 8;
|
||||
color[2] = (ulRGBA & 0xFF) >> 0;
|
||||
pglColor4ubv( color );
|
||||
ref.dllFuncs.Color4ub( color[0], color[1], color[2], color[3] );
|
||||
|
||||
col = (ch & 15) * 0.0625f + (0.5f / 256.0f);
|
||||
row = (ch >> 4) * 0.0625f + (0.5f / 256.0f);
|
||||
@@ -612,19 +769,19 @@ static void pfnDrawCharacter( int ix, int iy, int iwidth, int iheight, int ch, i
|
||||
if( gameui.ds.scissor_test && !PIC_Scissor( &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
||||
return;
|
||||
|
||||
GL_SetRenderMode( kRenderTransTexture );
|
||||
R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, hFont );
|
||||
pglColor4ub( 255, 255, 255, 255 );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
||||
ref.dllFuncs.R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, hFont );
|
||||
ref.dllFuncs.Color4ub( 255, 255, 255, 255 );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
UI_DrawConsoleString
|
||||
|
||||
drawing string like a console string
|
||||
drawing string like a console string
|
||||
=============
|
||||
*/
|
||||
static int UI_DrawConsoleString( int x, int y, const char *string )
|
||||
static int GAME_EXPORT UI_DrawConsoleString( int x, int y, const char *string )
|
||||
{
|
||||
int drawLen;
|
||||
|
||||
@@ -642,7 +799,7 @@ pfnDrawSetTextColor
|
||||
set color for anything
|
||||
=============
|
||||
*/
|
||||
static void UI_DrawSetTextColor( int r, int g, int b, int alpha )
|
||||
static void GAME_EXPORT UI_DrawSetTextColor( int r, int g, int b, int alpha )
|
||||
{
|
||||
// bound color and convert to byte
|
||||
gameui.ds.textColor[0] = r;
|
||||
@@ -658,7 +815,7 @@ pfnGetPlayerModel
|
||||
for drawing playermodel previews
|
||||
====================
|
||||
*/
|
||||
static cl_entity_t* pfnGetPlayerModel( void )
|
||||
static cl_entity_t* GAME_EXPORT pfnGetPlayerModel( void )
|
||||
{
|
||||
return &gameui.playermodel;
|
||||
}
|
||||
@@ -670,7 +827,7 @@ pfnSetPlayerModel
|
||||
for drawing playermodel previews
|
||||
====================
|
||||
*/
|
||||
static void pfnSetPlayerModel( cl_entity_t *ent, const char *path )
|
||||
static void GAME_EXPORT pfnSetPlayerModel( cl_entity_t *ent, const char *path )
|
||||
{
|
||||
ent->model = Mod_ForName( path, false, false );
|
||||
ent->curstate.modelindex = MAX_MODELS; // unreachable index
|
||||
@@ -683,10 +840,10 @@ pfnClearScene
|
||||
for drawing playermodel previews
|
||||
====================
|
||||
*/
|
||||
static void pfnClearScene( void )
|
||||
static void GAME_EXPORT pfnClearScene( void )
|
||||
{
|
||||
R_PushScene();
|
||||
R_ClearScene();
|
||||
ref.dllFuncs.R_PushScene();
|
||||
ref.dllFuncs.R_ClearScene();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -696,19 +853,23 @@ pfnRenderScene
|
||||
for drawing playermodel previews
|
||||
====================
|
||||
*/
|
||||
static void pfnRenderScene( const ref_viewpass_t *rvp )
|
||||
static void GAME_EXPORT pfnRenderScene( const ref_viewpass_t *rvp )
|
||||
{
|
||||
ref_viewpass_t copy;
|
||||
|
||||
// to avoid division by zero
|
||||
if( !rvp || rvp->fov_x <= 0.0f || rvp->fov_y <= 0.0f )
|
||||
return;
|
||||
|
||||
// don't allow special modes from menu
|
||||
((ref_viewpass_t *)&rvp)->flags = 0;
|
||||
copy = *rvp;
|
||||
|
||||
R_Set2DMode( false );
|
||||
R_RenderFrame( rvp );
|
||||
R_Set2DMode( true );
|
||||
R_PopScene();
|
||||
// don't allow special modes from menu
|
||||
copy.flags = 0;
|
||||
|
||||
ref.dllFuncs.R_Set2DMode( false );
|
||||
GL_RenderFrame( © );
|
||||
ref.dllFuncs.R_Set2DMode( true );
|
||||
ref.dllFuncs.R_PopScene();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -718,9 +879,9 @@ pfnAddEntity
|
||||
adding player model into visible list
|
||||
====================
|
||||
*/
|
||||
static int pfnAddEntity( int entityType, cl_entity_t *ent )
|
||||
static int GAME_EXPORT pfnAddEntity( int entityType, cl_entity_t *ent )
|
||||
{
|
||||
if( !R_AddEntity( ent, entityType ))
|
||||
if( !ref.dllFuncs.R_AddEntity( ent, entityType ))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@@ -732,7 +893,7 @@ pfnClientJoin
|
||||
send client connect
|
||||
====================
|
||||
*/
|
||||
static void pfnClientJoin( const netadr_t adr )
|
||||
static void GAME_EXPORT pfnClientJoin( const netadr_t adr )
|
||||
{
|
||||
Cbuf_AddText( va( "connect %s\n", NET_AdrToString( adr )));
|
||||
}
|
||||
@@ -744,7 +905,7 @@ pfnKeyGetOverstrikeMode
|
||||
get global key overstrike state
|
||||
====================
|
||||
*/
|
||||
static int pfnKeyGetOverstrikeMode( void )
|
||||
static int GAME_EXPORT pfnKeyGetOverstrikeMode( void )
|
||||
{
|
||||
return host.key_overstrike;
|
||||
}
|
||||
@@ -756,7 +917,7 @@ pfnKeySetOverstrikeMode
|
||||
set global key overstrike mode
|
||||
====================
|
||||
*/
|
||||
static void pfnKeySetOverstrikeMode( int fActive )
|
||||
static void GAME_EXPORT pfnKeySetOverstrikeMode( int fActive )
|
||||
{
|
||||
host.key_overstrike = fActive;
|
||||
}
|
||||
@@ -792,7 +953,7 @@ pfnMemFree
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnMemFree( void *mem, const char *filename, const int fileline )
|
||||
static void GAME_EXPORT pfnMemFree( void *mem, const char *filename, const int fileline )
|
||||
{
|
||||
_Mem_Free( mem, filename, fileline );
|
||||
}
|
||||
@@ -803,7 +964,7 @@ pfnGetGameInfo
|
||||
|
||||
=========
|
||||
*/
|
||||
static int pfnGetGameInfo( GAMEINFO *pgameinfo )
|
||||
static int GAME_EXPORT pfnGetGameInfo( GAMEINFO *pgameinfo )
|
||||
{
|
||||
if( !pgameinfo ) return 0;
|
||||
|
||||
@@ -817,9 +978,9 @@ pfnGetGamesList
|
||||
|
||||
=========
|
||||
*/
|
||||
static GAMEINFO **pfnGetGamesList( int *numGames )
|
||||
static GAMEINFO ** GAME_EXPORT pfnGetGamesList( int *numGames )
|
||||
{
|
||||
if( numGames ) *numGames = SI.numgames;
|
||||
if( numGames ) *numGames = FI->numgames;
|
||||
return gameui.modsInfo;
|
||||
}
|
||||
|
||||
@@ -830,7 +991,7 @@ pfnGetFilesList
|
||||
release prev search on a next call
|
||||
=========
|
||||
*/
|
||||
static char **pfnGetFilesList( const char *pattern, int *numFiles, int gamedironly )
|
||||
static char ** GAME_EXPORT pfnGetFilesList( const char *pattern, int *numFiles, int gamedironly )
|
||||
{
|
||||
static search_t *t = NULL;
|
||||
|
||||
@@ -865,17 +1026,29 @@ pfnCheckGameDll
|
||||
|
||||
=========
|
||||
*/
|
||||
int pfnCheckGameDll( void )
|
||||
int GAME_EXPORT pfnCheckGameDll( void )
|
||||
{
|
||||
string dllpath;
|
||||
void *hInst;
|
||||
|
||||
if( SV_Initialized( )) return true;
|
||||
#if TARGET_OS_IPHONE
|
||||
// loading server library drains too many ram
|
||||
// so 512MB iPod Touch cannot even connect to
|
||||
// to servers in cstrike
|
||||
return true;
|
||||
#endif
|
||||
|
||||
if(( hInst = COM_LoadLibrary( GI->game_dll, true, false )) != NULL )
|
||||
if( svgame.hInstance )
|
||||
return true;
|
||||
|
||||
COM_GetCommonLibraryPath( LIBRARY_SERVER, dllpath, sizeof( dllpath ));
|
||||
|
||||
if(( hInst = COM_LoadLibrary( dllpath, true, false )) != NULL )
|
||||
{
|
||||
COM_FreeLibrary( hInst );
|
||||
COM_FreeLibrary( hInst ); // don't increase linker's reference counter
|
||||
return true;
|
||||
}
|
||||
Con_Reportf( S_WARN "Could not load server library: %s\n", COM_GetLibraryError() );
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -885,12 +1058,9 @@ pfnChangeInstance
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnChangeInstance( const char *newInstance, const char *szFinalMessage )
|
||||
static void GAME_EXPORT pfnChangeInstance( const char *newInstance, const char *szFinalMessage )
|
||||
{
|
||||
if( !szFinalMessage ) szFinalMessage = "";
|
||||
if( !newInstance || !*newInstance ) return;
|
||||
|
||||
Host_NewInstance( newInstance, szFinalMessage );
|
||||
Con_Reportf( S_ERROR "ChangeInstance menu call is deprecated!\n" );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -899,10 +1069,10 @@ pfnHostEndGame
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnHostEndGame( const char *szFinalMessage )
|
||||
static void GAME_EXPORT pfnHostEndGame( const char *szFinalMessage )
|
||||
{
|
||||
if( !szFinalMessage ) szFinalMessage = "";
|
||||
Host_EndGame( false, szFinalMessage );
|
||||
Host_EndGame( false, "%s", szFinalMessage );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -911,13 +1081,68 @@ pfnStartBackgroundTrack
|
||||
|
||||
=========
|
||||
*/
|
||||
static void pfnStartBackgroundTrack( const char *introTrack, const char *mainTrack )
|
||||
static void GAME_EXPORT pfnStartBackgroundTrack( const char *introTrack, const char *mainTrack )
|
||||
{
|
||||
S_StartBackgroundTrack( introTrack, mainTrack, 0, false );
|
||||
}
|
||||
|
||||
static void GAME_EXPORT GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor )
|
||||
{
|
||||
ref.dllFuncs.GL_ProcessTexture( texnum, gamma, topColor, bottomColor );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
UI_ShellExecute
|
||||
=================
|
||||
*/
|
||||
static void GAME_EXPORT UI_ShellExecute( const char *path, const char *parms, int shouldExit )
|
||||
{
|
||||
Platform_ShellExecute( path, parms );
|
||||
|
||||
if( shouldExit )
|
||||
Sys_Quit();
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
pfnParseFile
|
||||
|
||||
legacy wrapper
|
||||
==============
|
||||
*/
|
||||
static char *pfnParseFile( char *buf, char *token )
|
||||
{
|
||||
return COM_ParseFile( buf, token, INT_MAX );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
pfnFileExists
|
||||
|
||||
legacy wrapper
|
||||
=============
|
||||
*/
|
||||
static int pfnFileExists( const char *path, int gamedironly )
|
||||
{
|
||||
return FS_FileExists( path, gamedironly );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
pfnDelete
|
||||
|
||||
legacy wrapper
|
||||
=============
|
||||
*/
|
||||
static int pfnDelete( const char *path )
|
||||
{
|
||||
return FS_Delete( path );
|
||||
}
|
||||
|
||||
// engine callbacks
|
||||
static ui_enginefuncs_t gEngfuncs =
|
||||
static ui_enginefuncs_t gEngfuncs =
|
||||
{
|
||||
pfnPIC_Load,
|
||||
GL_FreeImage,
|
||||
@@ -958,17 +1183,17 @@ static ui_enginefuncs_t gEngfuncs =
|
||||
Con_DefaultColor,
|
||||
pfnGetPlayerModel,
|
||||
pfnSetPlayerModel,
|
||||
pfnClearScene,
|
||||
pfnClearScene,
|
||||
pfnRenderScene,
|
||||
pfnAddEntity,
|
||||
Host_Error,
|
||||
FS_FileExists,
|
||||
pfnFileExists,
|
||||
pfnGetGameDir,
|
||||
Cmd_CheckMapsList,
|
||||
CL_Active,
|
||||
pfnClientJoin,
|
||||
COM_LoadFileForMe,
|
||||
COM_ParseFile,
|
||||
pfnParseFile,
|
||||
COM_FreeFile,
|
||||
Key_ClearStates,
|
||||
Key_SetKeyDest,
|
||||
@@ -988,7 +1213,7 @@ static ui_enginefuncs_t gEngfuncs =
|
||||
CL_GetDemoComment,
|
||||
pfnCheckGameDll,
|
||||
pfnGetClipboardData,
|
||||
Sys_ShellExecute,
|
||||
UI_ShellExecute,
|
||||
Host_WriteServerConfig,
|
||||
pfnChangeInstance,
|
||||
pfnStartBackgroundTrack,
|
||||
@@ -1000,8 +1225,44 @@ static ui_enginefuncs_t gEngfuncs =
|
||||
GL_ProcessTexture,
|
||||
COM_CompareFileTime,
|
||||
VID_GetModeString,
|
||||
COM_SaveFile,
|
||||
FS_Delete,
|
||||
(void*)COM_SaveFile,
|
||||
pfnDelete
|
||||
};
|
||||
|
||||
static void pfnEnableTextInput( int enable )
|
||||
{
|
||||
Key_EnableTextInput( enable, false );
|
||||
}
|
||||
|
||||
static int pfnGetRenderers( unsigned int num, char *shortName, size_t size1, char *readableName, size_t size2 )
|
||||
{
|
||||
if( num >= ref.numRenderers )
|
||||
return 0;
|
||||
|
||||
if( shortName && size1 )
|
||||
Q_strncpy( shortName, ref.shortNames[num], size1 );
|
||||
|
||||
if( readableName && size2 )
|
||||
Q_strncpy( readableName, ref.readableNames[num], size2 );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static char *pfnParseFileSafe( char *data, char *buf, const int size, unsigned int flags, int *len )
|
||||
{
|
||||
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
||||
}
|
||||
|
||||
static ui_extendedfuncs_t gExtendedfuncs =
|
||||
{
|
||||
pfnEnableTextInput,
|
||||
Con_UtfProcessChar,
|
||||
Con_UtfMoveLeft,
|
||||
Con_UtfMoveRight,
|
||||
pfnGetRenderers,
|
||||
Sys_DoubleTime,
|
||||
pfnParseFileSafe,
|
||||
NET_AdrToString
|
||||
};
|
||||
|
||||
void UI_UnloadProgs( void )
|
||||
@@ -1024,7 +1285,12 @@ void UI_UnloadProgs( void )
|
||||
qboolean UI_LoadProgs( void )
|
||||
{
|
||||
static ui_enginefuncs_t gpEngfuncs;
|
||||
static ui_extendedfuncs_t gpExtendedfuncs;
|
||||
static ui_globalvars_t gpGlobals;
|
||||
UIEXTENEDEDAPI GetExtAPI;
|
||||
UITEXTAPI GiveTextApi;
|
||||
MENUAPI GetMenuAPI;
|
||||
string dllpath;
|
||||
int i;
|
||||
|
||||
if( gameui.hInstance ) UI_UnloadProgs();
|
||||
@@ -1032,12 +1298,27 @@ qboolean UI_LoadProgs( void )
|
||||
// setup globals
|
||||
gameui.globals = &gpGlobals;
|
||||
|
||||
if(( gameui.hInstance = COM_LoadLibrary( va( "%s/menu.dll", GI->dll_path ), false, false )) == NULL )
|
||||
COM_GetCommonLibraryPath( LIBRARY_GAMEUI, dllpath, sizeof( dllpath ));
|
||||
|
||||
if(!( gameui.hInstance = COM_LoadLibrary( dllpath, false, false )))
|
||||
{
|
||||
if(( gameui.hInstance = COM_LoadLibrary( "menu.dll", false, true )) == NULL )
|
||||
string path = OS_LIB_PREFIX "menu." OS_LIB_EXT;
|
||||
|
||||
FS_AllowDirectPaths( true );
|
||||
|
||||
// no use to load it from engine directory, as library loader
|
||||
// that implements internal gamelibs already knows how to load it
|
||||
#ifndef XASH_INTERNAL_GAMELIBS
|
||||
if(!( gameui.hInstance = COM_LoadLibrary( path, false, true )))
|
||||
#endif
|
||||
{
|
||||
FS_AllowDirectPaths( false );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
FS_AllowDirectPaths( false );
|
||||
|
||||
if(( GetMenuAPI = (MENUAPI)COM_GetProcAddress( gameui.hInstance, "GetMenuAPI" )) == NULL )
|
||||
{
|
||||
COM_FreeLibrary( gameui.hInstance );
|
||||
@@ -1046,6 +1327,9 @@ qboolean UI_LoadProgs( void )
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
gameui.use_text_api = false;
|
||||
|
||||
// make local copy of engfuncs to prevent overwrite it with user dll
|
||||
memcpy( &gpEngfuncs, &gEngfuncs, sizeof( gpEngfuncs ));
|
||||
|
||||
@@ -1060,22 +1344,57 @@ qboolean UI_LoadProgs( void )
|
||||
return false;
|
||||
}
|
||||
|
||||
// make local copy of engfuncs to prevent overwrite it with user dll
|
||||
memcpy( &gpExtendedfuncs, &gExtendedfuncs, sizeof( gExtendedfuncs ));
|
||||
memset( &gameui.dllFuncs2, 0, sizeof( gameui.dllFuncs2 ));
|
||||
|
||||
// try to initialize new extended API
|
||||
if( ( GetExtAPI = (UIEXTENEDEDAPI)COM_GetProcAddress( gameui.hInstance, "GetExtAPI" ) ) )
|
||||
{
|
||||
Con_Reportf( "UI_LoadProgs: extended Menu API found\n" );
|
||||
if( GetExtAPI( MENU_EXTENDED_API_VERSION, &gameui.dllFuncs2, &gpExtendedfuncs ) )
|
||||
{
|
||||
Con_Reportf( "UI_LoadProgs: extended Menu API initialized\n" );
|
||||
gameui.use_text_api = true;
|
||||
}
|
||||
}
|
||||
else // otherwise, fallback to old and deprecated extensions
|
||||
{
|
||||
if( ( GiveTextApi = (UITEXTAPI)COM_GetProcAddress( gameui.hInstance, "GiveTextAPI" ) ) )
|
||||
{
|
||||
Con_Reportf( "UI_LoadProgs: extended text API found\n" );
|
||||
Con_Reportf( S_WARN "Text API is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
||||
if( GiveTextApi( &gpExtendedfuncs ) ) // they are binary compatible, so we can just pass extended funcs API to menu
|
||||
{
|
||||
Con_Reportf( "UI_LoadProgs: extended text API initialized\n" );
|
||||
gameui.use_text_api = true;
|
||||
}
|
||||
}
|
||||
|
||||
gameui.dllFuncs2.pfnAddTouchButtonToList = (ADDTOUCHBUTTONTOLIST)COM_GetProcAddress( gameui.hInstance, "AddTouchButtonToList" );
|
||||
if( gameui.dllFuncs2.pfnAddTouchButtonToList )
|
||||
{
|
||||
Con_Reportf( "UI_LoadProgs: AddTouchButtonToList call found\n" );
|
||||
Con_Reportf( S_WARN "AddTouchButtonToList is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
|
||||
}
|
||||
}
|
||||
|
||||
Cvar_FullSet( "host_gameuiloaded", "1", FCVAR_READ_ONLY );
|
||||
|
||||
// setup gameinfo
|
||||
for( i = 0; i < SI.numgames; i++ )
|
||||
for( i = 0; i < FI->numgames; i++ )
|
||||
{
|
||||
gameui.modsInfo[i] = Mem_Calloc( gameui.mempool, sizeof( GAMEINFO ));
|
||||
UI_ConvertGameInfo( gameui.modsInfo[i], SI.games[i] );
|
||||
UI_ConvertGameInfo( gameui.modsInfo[i], FI->games[i] );
|
||||
}
|
||||
|
||||
UI_ConvertGameInfo( &gameui.gameInfo, SI.GameInfo ); // current gameinfo
|
||||
UI_ConvertGameInfo( &gameui.gameInfo, FI->GameInfo ); // current gameinfo
|
||||
|
||||
// setup globals
|
||||
gameui.globals->allow_console = host.allow_console;
|
||||
gameui.globals->developer = host.allow_console;
|
||||
|
||||
// initialize game
|
||||
gameui.dllFuncs.pfnInit();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
151
engine/client/cl_mobile.c
Normal file
151
engine/client/cl_mobile.c
Normal file
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
cl_mobile.c - common mobile interface
|
||||
Copyright (C) 2015 a1batross
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "mobility_int.h"
|
||||
#include "library.h"
|
||||
#include "input.h"
|
||||
#include "platform/platform.h"
|
||||
|
||||
mobile_engfuncs_t *gMobileEngfuncs;
|
||||
|
||||
convar_t *vibration_length;
|
||||
convar_t *vibration_enable;
|
||||
|
||||
static void pfnVibrate( float life, char flags )
|
||||
{
|
||||
if( !vibration_enable->value )
|
||||
return;
|
||||
|
||||
if( life < 0.0f )
|
||||
{
|
||||
Con_Reportf( S_WARN "Negative vibrate time: %f\n", life );
|
||||
return;
|
||||
}
|
||||
|
||||
//Con_Reportf( "Vibrate: %f %d\n", life, flags );
|
||||
|
||||
// here goes platform-specific backends
|
||||
Platform_Vibrate( life * vibration_length->value, flags );
|
||||
}
|
||||
|
||||
static void Vibrate_f( void )
|
||||
{
|
||||
if( Cmd_Argc() != 2 )
|
||||
{
|
||||
Msg( S_USAGE "vibrate <time>\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
pfnVibrate( Q_atof( Cmd_Argv(1) ), VIBRATE_NORMAL );
|
||||
}
|
||||
|
||||
static void pfnEnableTextInput( int enable )
|
||||
{
|
||||
Key_EnableTextInput( enable, false );
|
||||
}
|
||||
|
||||
static int pfnDrawScaledCharacter( int x, int y, int number, int r, int g, int b, float scale )
|
||||
{
|
||||
int width = clgame.scrInfo.charWidths[number] * scale * hud_scale->value;
|
||||
int height = clgame.scrInfo.iCharHeight * scale * hud_scale->value;
|
||||
|
||||
if( !cls.creditsFont.valid )
|
||||
return 0;
|
||||
|
||||
x *= hud_scale->value;
|
||||
y *= hud_scale->value;
|
||||
|
||||
number &= 255;
|
||||
number = Con_UtfProcessChar( number );
|
||||
|
||||
if( number < 32 )
|
||||
return 0;
|
||||
|
||||
if( y < -height )
|
||||
return 0;
|
||||
|
||||
pfnPIC_Set( cls.creditsFont.hFontTexture, r, g, b, 255 );
|
||||
pfnPIC_DrawAdditive( x, y, width, height, &cls.creditsFont.fontRc[number] );
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
static void *pfnGetNativeObject( const char *obj )
|
||||
{
|
||||
if( !obj )
|
||||
return NULL;
|
||||
|
||||
// Backend should consider that obj is case-sensitive
|
||||
return Platform_GetNativeObject( obj );
|
||||
}
|
||||
|
||||
static void pfnTouch_HideButtons( const char *name, byte state )
|
||||
{
|
||||
Touch_HideButtons( name, state, true );
|
||||
}
|
||||
|
||||
static void pfnTouch_RemoveButton( const char *name )
|
||||
{
|
||||
Touch_RemoveButton( name, true );
|
||||
}
|
||||
|
||||
static char *pfnParseFileSafe( char *data, char *buf, const int size, unsigned int flags, int *len )
|
||||
{
|
||||
return COM_ParseFileSafe( data, buf, size, flags, len, NULL );
|
||||
}
|
||||
|
||||
static mobile_engfuncs_t gpMobileEngfuncs =
|
||||
{
|
||||
MOBILITY_API_VERSION,
|
||||
pfnVibrate,
|
||||
pfnEnableTextInput,
|
||||
Touch_AddClientButton,
|
||||
Touch_AddDefaultButton,
|
||||
pfnTouch_HideButtons,
|
||||
pfnTouch_RemoveButton,
|
||||
Touch_SetClientOnly,
|
||||
Touch_ResetDefaultButtons,
|
||||
pfnDrawScaledCharacter,
|
||||
Sys_Warn,
|
||||
pfnGetNativeObject,
|
||||
ID_SetCustomClientID,
|
||||
pfnParseFileSafe
|
||||
};
|
||||
|
||||
qboolean Mobile_Init( void )
|
||||
{
|
||||
qboolean success = false;
|
||||
pfnMobilityInterface ExportToClient;
|
||||
|
||||
// find a mobility interface
|
||||
ExportToClient = COM_GetProcAddress( clgame.hInstance, MOBILITY_CLIENT_EXPORT );
|
||||
gMobileEngfuncs = &gpMobileEngfuncs;
|
||||
|
||||
if( ExportToClient && !ExportToClient( gMobileEngfuncs ) )
|
||||
success = true;
|
||||
|
||||
Cmd_AddCommand( "vibrate", (xcommand_t)Vibrate_f, "Vibrate for specified time");
|
||||
vibration_length = Cvar_Get( "vibration_length", "1.0", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "Vibration length");
|
||||
vibration_enable = Cvar_Get( "vibration_enable", "1", FCVAR_ARCHIVE | FCVAR_PRIVILEGED, "Enable vibration");
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
void Mobile_Shutdown( void )
|
||||
{
|
||||
Cmd_RemoveCommand( "vibrate" );
|
||||
}
|
||||
@@ -15,24 +15,30 @@ GNU General Public License for more details.
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
#include "kbutton.h"
|
||||
|
||||
#if XASH_LOW_MEMORY == 0
|
||||
#define NET_TIMINGS 1024
|
||||
#elif XASH_LOW_MEMORY == 1
|
||||
#define NET_TIMINGS 256
|
||||
#elif XASH_LOW_MEMORY == 2
|
||||
#define NET_TIMINGS 64
|
||||
#endif
|
||||
#define NET_TIMINGS_MASK (NET_TIMINGS - 1)
|
||||
#define LATENCY_AVG_FRAC 0.5
|
||||
#define FRAMERATE_AVG_FRAC 0.5
|
||||
#define PACKETLOSS_AVG_FRAC 0.5
|
||||
#define PACKETCHOKE_AVG_FRAC 0.5
|
||||
#define LATENCY_AVG_FRAC 0.5f
|
||||
#define FRAMERATE_AVG_FRAC 0.5f
|
||||
#define PACKETLOSS_AVG_FRAC 0.5f
|
||||
#define PACKETCHOKE_AVG_FRAC 0.5f
|
||||
#define NETGRAPH_LERP_HEIGHT 24
|
||||
#define NETGRAPH_NET_COLORS 5
|
||||
#define NUM_LATENCY_SAMPLES 8
|
||||
|
||||
convar_t *net_graph;
|
||||
convar_t *net_graphpos;
|
||||
convar_t *net_graphwidth;
|
||||
convar_t *net_graphheight;
|
||||
convar_t *net_graphsolid;
|
||||
convar_t *net_scale;
|
||||
static convar_t *net_graphpos;
|
||||
static convar_t *net_graphwidth;
|
||||
static convar_t *net_graphheight;
|
||||
static convar_t *net_graphsolid;
|
||||
static convar_t *net_scale;
|
||||
|
||||
static struct packet_latency_t
|
||||
{
|
||||
@@ -75,12 +81,12 @@ NetGraph_FillRGBA shortcut
|
||||
*/
|
||||
static void NetGraph_DrawRect( wrect_t *rect, byte colors[4] )
|
||||
{
|
||||
pglColor4ubv( colors ); // color for this quad
|
||||
ref.dllFuncs.Color4ub( colors[0], colors[1], colors[2], colors[3] ); // color for this quad
|
||||
|
||||
pglVertex2f( rect->left, rect->top );
|
||||
pglVertex2f( rect->left + rect->right, rect->top );
|
||||
pglVertex2f( rect->left + rect->right, rect->top + rect->bottom );
|
||||
pglVertex2f( rect->left, rect->top + rect->bottom );
|
||||
ref.dllFuncs.Vertex3f( rect->left, rect->top, 0 );
|
||||
ref.dllFuncs.Vertex3f( rect->left + rect->right, rect->top, 0 );
|
||||
ref.dllFuncs.Vertex3f( rect->left + rect->right, rect->top + rect->bottom, 0 );
|
||||
ref.dllFuncs.Vertex3f( rect->left, rect->top + rect->bottom, 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -90,7 +96,7 @@ NetGraph_AtEdge
|
||||
edge detect
|
||||
==========
|
||||
*/
|
||||
qboolean NetGraph_AtEdge( int x, int width )
|
||||
static qboolean NetGraph_AtEdge( int x, int width )
|
||||
{
|
||||
if( x > 3 )
|
||||
{
|
||||
@@ -108,38 +114,38 @@ NetGraph_InitColors
|
||||
init netgraph colors
|
||||
==========
|
||||
*/
|
||||
void NetGraph_InitColors( void )
|
||||
static void NetGraph_InitColors( void )
|
||||
{
|
||||
byte mincolor[2][3];
|
||||
byte maxcolor[2][3];
|
||||
float dc[2][3];
|
||||
int i, hfrac;
|
||||
int i, hfrac;
|
||||
float f;
|
||||
|
||||
|
||||
mincolor[0][0] = 63;
|
||||
mincolor[0][1] = 0;
|
||||
mincolor[0][2] = 100;
|
||||
|
||||
|
||||
maxcolor[0][0] = 0;
|
||||
maxcolor[0][1] = 63;
|
||||
maxcolor[0][2] = 255;
|
||||
|
||||
|
||||
mincolor[1][0] = 255;
|
||||
mincolor[1][1] = 127;
|
||||
mincolor[1][2] = 0;
|
||||
|
||||
|
||||
maxcolor[1][0] = 250;
|
||||
maxcolor[1][1] = 0;
|
||||
maxcolor[1][2] = 0;
|
||||
|
||||
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
dc[0][i] = (float)(maxcolor[0][i] - mincolor[0][i]);
|
||||
dc[1][i] = (float)(maxcolor[1][i] - mincolor[1][i]);
|
||||
}
|
||||
|
||||
|
||||
hfrac = NETGRAPH_LERP_HEIGHT / 3;
|
||||
|
||||
|
||||
for( i = 0; i < NETGRAPH_LERP_HEIGHT; i++ )
|
||||
{
|
||||
if( i < hfrac )
|
||||
@@ -152,6 +158,7 @@ void NetGraph_InitColors( void )
|
||||
f = (float)(i - hfrac) / (float)(NETGRAPH_LERP_HEIGHT - hfrac );
|
||||
VectorMA( mincolor[1], f, dc[1], netcolors[NETGRAPH_NET_COLORS + i] );
|
||||
}
|
||||
netcolors[NETGRAPH_NET_COLORS + i][3] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +169,7 @@ NetGraph_GetFrameData
|
||||
get frame data info, like chokes, packet losses, also update graph, packet and cmdinfo
|
||||
==========
|
||||
*/
|
||||
void NetGraph_GetFrameData( float *latency, int *latency_count )
|
||||
static void NetGraph_GetFrameData( float *latency, int *latency_count )
|
||||
{
|
||||
int i, choke_count = 0, loss_count = 0;
|
||||
double newtime = Sys_DoubleTime();
|
||||
@@ -204,7 +211,7 @@ void NetGraph_GetFrameData( float *latency, int *latency_count )
|
||||
else
|
||||
{
|
||||
int frame_latency = Q_min( 1.0f, f->latency );
|
||||
p->latency = (( frame_latency + 0.1 ) / 1.1 ) * ( net_graphheight->value - NETGRAPH_LERP_HEIGHT - 2 );
|
||||
p->latency = (( frame_latency + 0.1f ) / 1.1f ) * ( net_graphheight->value - NETGRAPH_LERP_HEIGHT - 2 );
|
||||
|
||||
if( i > cls.netchan.incoming_sequence - NUM_LATENCY_SAMPLES )
|
||||
{
|
||||
@@ -230,12 +237,12 @@ void NetGraph_GetFrameData( float *latency, int *latency_count )
|
||||
}
|
||||
|
||||
// packet loss
|
||||
loss = 100.0 * (float)loss_count / CL_UPDATE_BACKUP;
|
||||
packet_loss = PACKETLOSS_AVG_FRAC * packet_loss + ( 1.0 - PACKETLOSS_AVG_FRAC ) * loss;
|
||||
loss = 100.0f * (float)loss_count / CL_UPDATE_BACKUP;
|
||||
packet_loss = PACKETLOSS_AVG_FRAC * packet_loss + ( 1.0f - PACKETLOSS_AVG_FRAC ) * loss;
|
||||
|
||||
// packet choke
|
||||
choke = 100.0 * (float)choke_count / CL_UPDATE_BACKUP;
|
||||
packet_choke = PACKETCHOKE_AVG_FRAC * packet_choke + ( 1.0 - PACKETCHOKE_AVG_FRAC ) * choke;
|
||||
choke = 100.0f * (float)choke_count / CL_UPDATE_BACKUP;
|
||||
packet_choke = PACKETCHOKE_AVG_FRAC * packet_choke + ( 1.0f - PACKETCHOKE_AVG_FRAC ) * choke;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -244,7 +251,7 @@ NetGraph_DrawTimes
|
||||
|
||||
===========
|
||||
*/
|
||||
void NetGraph_DrawTimes( wrect_t rect, int x, int w )
|
||||
static void NetGraph_DrawTimes( wrect_t rect, int x, int w )
|
||||
{
|
||||
int i, j, extrap_point = NETGRAPH_LERP_HEIGHT / 3, a, h;
|
||||
rgba_t colors = { 0.9 * 255, 0.9 * 255, 0.7 * 255, 255 };
|
||||
@@ -253,7 +260,7 @@ void NetGraph_DrawTimes( wrect_t rect, int x, int w )
|
||||
for( a = 0; a < w; a++ )
|
||||
{
|
||||
i = ( cls.netchan.outgoing_sequence - a ) & NET_TIMINGS_MASK;
|
||||
h = ( netstat_cmdinfo[i].cmd_lerp / 3.0f ) * NETGRAPH_LERP_HEIGHT;
|
||||
h = Q_min(( netstat_cmdinfo[i].cmd_lerp / 3.0f ) * NETGRAPH_LERP_HEIGHT, net_graphheight->value * 0.7f);
|
||||
|
||||
fill.left = x + w - a - 1;
|
||||
fill.right = fill.bottom = 1;
|
||||
@@ -319,7 +326,7 @@ NetGraph_DrawHatches
|
||||
|
||||
===========
|
||||
*/
|
||||
void NetGraph_DrawHatches( int x, int y )
|
||||
static void NetGraph_DrawHatches( int x, int y )
|
||||
{
|
||||
int ystep = (int)( 10.0f / net_scale->value );
|
||||
byte colorminor[4] = { 0, 63, 63, 200 };
|
||||
@@ -348,7 +355,7 @@ NetGraph_DrawTextFields
|
||||
|
||||
===========
|
||||
*/
|
||||
void NetGraph_DrawTextFields( int x, int y, int w, wrect_t rect, int count, float avg, int packet_loss, int packet_choke )
|
||||
static void NetGraph_DrawTextFields( int x, int y, int w, wrect_t rect, int count, float avg, int packet_loss, int packet_choke, int graphtype )
|
||||
{
|
||||
static int lastout;
|
||||
rgba_t colors = { 0.9 * 255, 0.9 * 255, 0.7 * 255, 255 };
|
||||
@@ -366,12 +373,12 @@ void NetGraph_DrawTextFields( int x, int y, int w, wrect_t rect, int count, floa
|
||||
avg -= 1000.0f / cl_updaterate->value;
|
||||
|
||||
// can't be below zero
|
||||
avg = Q_max( 0.0, avg );
|
||||
avg = Q_max( 0.0f, avg );
|
||||
}
|
||||
else avg = 0.0;
|
||||
|
||||
// move rolling average
|
||||
framerate = FRAMERATE_AVG_FRAC * host.frametime + ( 1.0 - FRAMERATE_AVG_FRAC ) * framerate;
|
||||
framerate = FRAMERATE_AVG_FRAC * host.frametime + ( 1.0f - FRAMERATE_AVG_FRAC ) * framerate;
|
||||
Con_SetFont( 0 );
|
||||
|
||||
if( framerate > 0.0f )
|
||||
@@ -389,22 +396,22 @@ void NetGraph_DrawTextFields( int x, int y, int w, wrect_t rect, int count, floa
|
||||
if( !out ) out = lastout;
|
||||
else lastout = out;
|
||||
|
||||
Con_DrawString( x, y, va( "in : %i %.2f k/s", netstat_graph[j].msgbytes, cls.netchan.flow[FLOW_INCOMING].avgkbytespersec ), colors );
|
||||
Con_DrawString( x, y, va( "in : %i %.2f kb/s", netstat_graph[j].msgbytes, cls.netchan.flow[FLOW_INCOMING].avgkbytespersec ), colors );
|
||||
y += 15;
|
||||
|
||||
Con_DrawString( x, y, va( "out: %i %.2f k/s", out, cls.netchan.flow[FLOW_OUTGOING].avgkbytespersec ), colors );
|
||||
Con_DrawString( x, y, va( "out: %i %.2f kb/s", out, cls.netchan.flow[FLOW_OUTGOING].avgkbytespersec ), colors );
|
||||
y += 15;
|
||||
|
||||
if( net_graph->value > 2 )
|
||||
if( graphtype > 2 )
|
||||
{
|
||||
int loss = (int)(( packet_loss + PACKETLOSS_AVG_FRAC ) - 0.01 );
|
||||
int choke = (int)(( packet_choke + PACKETCHOKE_AVG_FRAC ) - 0.01 );
|
||||
int loss = (int)(( packet_loss + PACKETLOSS_AVG_FRAC ) - 0.01f );
|
||||
int choke = (int)(( packet_choke + PACKETCHOKE_AVG_FRAC ) - 0.01f );
|
||||
|
||||
Con_DrawString( x, y, va( "loss: %i choke: %i", loss, choke ), colors );
|
||||
}
|
||||
}
|
||||
|
||||
if( net_graph->value < 3 )
|
||||
if( graphtype < 3 )
|
||||
Con_DrawString( ptx, pty, va( "%i/s", (int)cl_cmdrate->value ), colors );
|
||||
|
||||
Con_DrawString( ptx, last_y, va( "%i/s" , (int)cl_updaterate->value ), colors );
|
||||
@@ -418,7 +425,7 @@ NetGraph_DrawDataSegment
|
||||
|
||||
===========
|
||||
*/
|
||||
int NetGraph_DrawDataSegment( wrect_t *fill, int bytes, byte r, byte g, byte b, byte a )
|
||||
static int NetGraph_DrawDataSegment( wrect_t *fill, int bytes, byte r, byte g, byte b, byte a )
|
||||
{
|
||||
float h = bytes / net_scale->value;
|
||||
byte colors[4] = { r, g, b, a };
|
||||
@@ -445,7 +452,7 @@ NetGraph_ColorForHeight
|
||||
color based on packet latency
|
||||
===========
|
||||
*/
|
||||
void NetGraph_ColorForHeight( struct packet_latency_t *packet, byte color[4], int *ping )
|
||||
static void NetGraph_ColorForHeight( struct packet_latency_t *packet, byte color[4], int *ping )
|
||||
{
|
||||
switch( packet->latency )
|
||||
{
|
||||
@@ -480,7 +487,7 @@ NetGraph_DrawDataUsage
|
||||
|
||||
===========
|
||||
*/
|
||||
void NetGraph_DrawDataUsage( int x, int y, int w )
|
||||
static void NetGraph_DrawDataUsage( int x, int y, int w, int graphtype )
|
||||
{
|
||||
int a, i, h, lastvalidh = 0, ping;
|
||||
int pingheight = net_graphheight->value - NETGRAPH_LERP_HEIGHT - 2;
|
||||
@@ -535,7 +542,7 @@ void NetGraph_DrawDataUsage( int x, int y, int w )
|
||||
if( NetGraph_AtEdge( a, w ))
|
||||
NetGraph_DrawRect( &fill, color );
|
||||
|
||||
if( net_graph->value < 2 )
|
||||
if( graphtype < 2 )
|
||||
continue;
|
||||
|
||||
color[0] = color[1] = color[2] = color[3] = 255;
|
||||
@@ -582,7 +589,7 @@ void NetGraph_DrawDataUsage( int x, int y, int w )
|
||||
continue;
|
||||
}
|
||||
|
||||
if( net_graph->value >= 2 )
|
||||
if( graphtype >= 2 )
|
||||
NetGraph_DrawHatches( x, y - net_graphheight->value - 1 );
|
||||
}
|
||||
|
||||
@@ -592,11 +599,11 @@ NetGraph_GetScreenPos
|
||||
|
||||
===========
|
||||
*/
|
||||
void NetGraph_GetScreenPos( wrect_t *rect, int *w, int *x, int *y )
|
||||
static void NetGraph_GetScreenPos( wrect_t *rect, int *w, int *x, int *y )
|
||||
{
|
||||
rect->left = rect->top = 0;
|
||||
rect->right = glState.width;
|
||||
rect->bottom = glState.height;
|
||||
rect->right = refState.width;
|
||||
rect->bottom = refState.height;
|
||||
|
||||
*w = Q_min( NET_TIMINGS, net_graphwidth->value );
|
||||
if( rect->right < *w + 10 )
|
||||
@@ -609,7 +616,7 @@ void NetGraph_GetScreenPos( wrect_t *rect, int *w, int *x, int *y )
|
||||
*x = rect->left + rect->right - 5 - *w;
|
||||
break;
|
||||
case 2: // center
|
||||
*x = rect->left + ( rect->right - 10 - *w ) / 2;
|
||||
*x = ( rect->left + ( rect->right - 10 - *w )) / 2;
|
||||
break;
|
||||
default: // left sided
|
||||
*x = rect->left + 5;
|
||||
@@ -631,6 +638,8 @@ void SCR_DrawNetGraph( void )
|
||||
float avg_ping;
|
||||
int ping_count;
|
||||
int w, x, y;
|
||||
kbutton_t *in_graph;
|
||||
int graphtype;
|
||||
|
||||
if( !host.allow_console )
|
||||
return;
|
||||
@@ -638,8 +647,20 @@ void SCR_DrawNetGraph( void )
|
||||
if( cls.state != ca_active )
|
||||
return;
|
||||
|
||||
if( !net_graph->value )
|
||||
in_graph = clgame.dllFuncs.KB_Find( "in_graph" );
|
||||
|
||||
if( in_graph->state & 1 )
|
||||
{
|
||||
graphtype = 2;
|
||||
}
|
||||
else if( net_graph->value != 0.0f )
|
||||
{
|
||||
graphtype = (int)net_graph->value;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( net_scale->value <= 0 )
|
||||
Cvar_SetValue( "net_scale", 0.1f );
|
||||
@@ -648,24 +669,21 @@ void SCR_DrawNetGraph( void )
|
||||
|
||||
NetGraph_GetFrameData( &avg_ping, &ping_count );
|
||||
|
||||
NetGraph_DrawTextFields( x, y, w, rect, ping_count, avg_ping, packet_loss, packet_choke );
|
||||
NetGraph_DrawTextFields( x, y, w, rect, ping_count, avg_ping, packet_loss, packet_choke, graphtype );
|
||||
|
||||
if( net_graph->value < 3 )
|
||||
if( graphtype < 3 )
|
||||
{
|
||||
pglEnable( GL_BLEND );
|
||||
pglDisable( GL_TEXTURE_2D );
|
||||
pglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
||||
pglBlendFunc( GL_SRC_ALPHA, GL_ONE );
|
||||
pglBegin( GL_QUADS ); // draw all the fills as a long solid sequence of quads for speedup reasons
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransColor );
|
||||
ref.dllFuncs.GL_Bind( XASH_TEXTURE0, R_GetBuiltinTexture( REF_WHITE_TEXTURE ) );
|
||||
ref.dllFuncs.Begin( TRI_QUADS ); // draw all the fills as a long solid sequence of quads for speedup reasons
|
||||
|
||||
// NOTE: fill colors without texture at this point
|
||||
NetGraph_DrawDataUsage( x, y, w );
|
||||
NetGraph_DrawDataUsage( x, y, w, graphtype );
|
||||
NetGraph_DrawTimes( rect, x, w );
|
||||
|
||||
pglEnd();
|
||||
pglColor4ub( 255, 255, 255, 255 );
|
||||
pglEnable( GL_TEXTURE_2D );
|
||||
pglDisable( GL_BLEND );
|
||||
ref.dllFuncs.End();
|
||||
ref.dllFuncs.Color4ub( 255, 255, 255, 255 );
|
||||
ref.dllFuncs.GL_SetRenderMode( kRenderNormal );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -680,4 +698,4 @@ void CL_InitNetgraph( void )
|
||||
packet_loss = packet_choke = 0.0;
|
||||
|
||||
NetGraph_InitColors();
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -46,7 +46,7 @@ CL_PushPMStates
|
||||
|
||||
=============
|
||||
*/
|
||||
void CL_PushPMStates( void )
|
||||
void GAME_EXPORT CL_PushPMStates( void )
|
||||
{
|
||||
if( clgame.pushed ) return;
|
||||
clgame.oldphyscount = clgame.pmove->numphysent;
|
||||
@@ -60,7 +60,7 @@ CL_PopPMStates
|
||||
|
||||
=============
|
||||
*/
|
||||
void CL_PopPMStates( void )
|
||||
void GAME_EXPORT CL_PopPMStates( void )
|
||||
{
|
||||
if( !clgame.pushed ) return;
|
||||
clgame.pmove->numphysent = clgame.oldphyscount;
|
||||
@@ -74,7 +74,7 @@ CL_PushTraceBounds
|
||||
|
||||
=============
|
||||
*/
|
||||
void CL_PushTraceBounds( int hullnum, const float *mins, const float *maxs )
|
||||
void GAME_EXPORT CL_PushTraceBounds( int hullnum, const float *mins, const float *maxs )
|
||||
{
|
||||
hullnum = bound( 0, hullnum, 3 );
|
||||
VectorCopy( mins, clgame.pmove->player_mins[hullnum] );
|
||||
@@ -87,7 +87,7 @@ CL_PopTraceBounds
|
||||
|
||||
=============
|
||||
*/
|
||||
void CL_PopTraceBounds( void )
|
||||
void GAME_EXPORT CL_PopTraceBounds( void )
|
||||
{
|
||||
memcpy( clgame.pmove->player_mins, host.player_mins, sizeof( host.player_mins ));
|
||||
memcpy( clgame.pmove->player_maxs, host.player_maxs, sizeof( host.player_maxs ));
|
||||
@@ -159,7 +159,7 @@ void CL_SetIdealPitch( void )
|
||||
top[0] = cl.simorg[0] + cosval * (i + 3.0f) * 12.0f;
|
||||
top[1] = cl.simorg[1] + sinval * (i + 3.0f) * 12.0f;
|
||||
top[2] = cl.simorg[2] + cl.viewheight[2];
|
||||
|
||||
|
||||
bottom[0] = top[0];
|
||||
bottom[1] = top[1];
|
||||
bottom[2] = top[2] - 160.0f;
|
||||
@@ -170,10 +170,10 @@ void CL_SetIdealPitch( void )
|
||||
|
||||
if( tr.fraction == 1.0f )
|
||||
return; // near a dropoff
|
||||
|
||||
|
||||
z[i] = top[2] + tr.fraction * (bottom[2] - top[2]);
|
||||
}
|
||||
|
||||
|
||||
dir = 0;
|
||||
steps = 0;
|
||||
|
||||
@@ -186,16 +186,16 @@ void CL_SetIdealPitch( void )
|
||||
if( dir && ( step-dir > ON_EPSILON || step-dir < -ON_EPSILON ))
|
||||
return; // mixed changes
|
||||
|
||||
steps++;
|
||||
steps++;
|
||||
dir = step;
|
||||
}
|
||||
|
||||
|
||||
if( !dir )
|
||||
{
|
||||
cl.local.idealpitch = 0.0f;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( steps < 2 ) return;
|
||||
cl.local.idealpitch = -dir * cl_idealpitchscale->value;
|
||||
}
|
||||
@@ -216,7 +216,7 @@ qboolean CL_PlayerTeleported( local_state_t *from, local_state_t *to )
|
||||
VectorSubtract( to->playerstate.origin, from->playerstate.origin, delta );
|
||||
|
||||
// compute potential max movement in units per frame and compare with entity movement
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0 / GAME_FPS ));
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0f / GAME_FPS ));
|
||||
len = VectorLength( delta );
|
||||
|
||||
return (len > maxlen);
|
||||
@@ -264,7 +264,9 @@ void CL_CheckPredictionError( void )
|
||||
// save for error interpolation
|
||||
VectorCopy( delta, cl.local.prediction_error );
|
||||
|
||||
if( dist > MIN_CORRECTION_DISTANCE )
|
||||
// GoldSrc checks for singleplayer
|
||||
// we would check for local server
|
||||
if( dist > MIN_CORRECTION_DISTANCE && !SV_Active() )
|
||||
cls.correction_time = cl_smoothtime->value;
|
||||
}
|
||||
}
|
||||
@@ -280,7 +282,7 @@ then with clipping against them.
|
||||
This sets up the first phase.
|
||||
=============
|
||||
*/
|
||||
void CL_SetUpPlayerPrediction( int dopred, int bIncludeLocalClient )
|
||||
void GAME_EXPORT CL_SetUpPlayerPrediction( int dopred, int bIncludeLocalClient )
|
||||
{
|
||||
entity_state_t *state;
|
||||
predicted_player_t *player;
|
||||
@@ -538,7 +540,7 @@ pmove must be setup with world and solid entity hulls before calling
|
||||
(via CL_PredictMove)
|
||||
===============
|
||||
*/
|
||||
void CL_SetSolidPlayers( int playernum )
|
||||
void GAME_EXPORT CL_SetSolidPlayers( int playernum )
|
||||
{
|
||||
entity_state_t *state;
|
||||
predicted_player_t *player;
|
||||
@@ -594,7 +596,7 @@ CL_WaterEntity
|
||||
|
||||
=============
|
||||
*/
|
||||
int CL_WaterEntity( const float *rgflPos )
|
||||
int GAME_EXPORT CL_WaterEntity( const float *rgflPos )
|
||||
{
|
||||
physent_t *pe;
|
||||
hull_t *hull;
|
||||
@@ -627,7 +629,7 @@ int CL_WaterEntity( const float *rgflPos )
|
||||
if( FBitSet( pe->model->flags, MODEL_HAS_ORIGIN ) && !VectorIsNull( pe->angles ))
|
||||
{
|
||||
matrix4x4 matrix;
|
||||
|
||||
|
||||
Matrix4x4_CreateFromEntity( matrix, pe->angles, offset, 1.0f );
|
||||
Matrix4x4_VectorITransform( matrix, rgflPos, test );
|
||||
}
|
||||
@@ -655,7 +657,7 @@ pmtrace_t CL_TraceLine( vec3_t start, vec3_t end, int flags )
|
||||
pmtrace_t tr;
|
||||
|
||||
old_usehull = clgame.pmove->usehull;
|
||||
clgame.pmove->usehull = 2;
|
||||
clgame.pmove->usehull = 2;
|
||||
tr = PM_PlayerTraceExt( clgame.pmove, start, end, flags, clgame.pmove->numphysent, clgame.pmove->physents, -1, NULL );
|
||||
clgame.pmove->usehull = old_usehull;
|
||||
|
||||
@@ -675,7 +677,7 @@ pmtrace_t *CL_VisTraceLine( vec3_t start, vec3_t end, int flags )
|
||||
static pmtrace_t tr;
|
||||
|
||||
old_usehull = clgame.pmove->usehull;
|
||||
clgame.pmove->usehull = 2;
|
||||
clgame.pmove->usehull = 2;
|
||||
tr = PM_PlayerTraceExt( clgame.pmove, start, end, flags, clgame.pmove->numvisent, clgame.pmove->visents, -1, NULL );
|
||||
clgame.pmove->usehull = old_usehull;
|
||||
|
||||
@@ -699,17 +701,17 @@ cl_entity_t *CL_GetWaterEntity( const float *rgflPos )
|
||||
return CL_GetEntityByIndex( entnum );
|
||||
}
|
||||
|
||||
int CL_TestLine( const vec3_t start, const vec3_t end, int flags )
|
||||
int GAME_EXPORT CL_TestLine( const vec3_t start, const vec3_t end, int flags )
|
||||
{
|
||||
return PM_TestLineExt( clgame.pmove, clgame.pmove->physents, clgame.pmove->numphysent, start, end, flags );
|
||||
}
|
||||
|
||||
static int pfnTestPlayerPosition( float *pos, pmtrace_t *ptrace )
|
||||
static int GAME_EXPORT pfnTestPlayerPosition( float *pos, pmtrace_t *ptrace )
|
||||
{
|
||||
return PM_TestPlayerPosition( clgame.pmove, pos, ptrace, NULL );
|
||||
}
|
||||
|
||||
static void pfnStuckTouch( int hitent, pmtrace_t *tr )
|
||||
static void GAME_EXPORT pfnStuckTouch( int hitent, pmtrace_t *tr )
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -728,7 +730,7 @@ static void pfnStuckTouch( int hitent, pmtrace_t *tr )
|
||||
clgame.pmove->touchindex[clgame.pmove->numtouch++] = *tr;
|
||||
}
|
||||
|
||||
static int pfnPointContents( float *p, int *truecontents )
|
||||
static int GAME_EXPORT pfnPointContents( float *p, int *truecontents )
|
||||
{
|
||||
int cont, truecont;
|
||||
|
||||
@@ -740,28 +742,28 @@ static int pfnPointContents( float *p, int *truecontents )
|
||||
return cont;
|
||||
}
|
||||
|
||||
static int pfnTruePointContents( float *p )
|
||||
static int GAME_EXPORT pfnTruePointContents( float *p )
|
||||
{
|
||||
return PM_TruePointContents( clgame.pmove, p );
|
||||
}
|
||||
|
||||
static int pfnHullPointContents( struct hull_s *hull, int num, float *p )
|
||||
static int GAME_EXPORT pfnHullPointContents( struct hull_s *hull, int num, float *p )
|
||||
{
|
||||
return PM_HullPointContents( hull, num, p );
|
||||
}
|
||||
|
||||
static pmtrace_t pfnPlayerTrace( float *start, float *end, int traceFlags, int ignore_pe )
|
||||
static pmtrace_t GAME_EXPORT pfnPlayerTrace( float *start, float *end, int traceFlags, int ignore_pe )
|
||||
{
|
||||
return PM_PlayerTraceExt( clgame.pmove, start, end, traceFlags, clgame.pmove->numphysent, clgame.pmove->physents, ignore_pe, NULL );
|
||||
}
|
||||
|
||||
static pmtrace_t *pfnTraceLine( float *start, float *end, int flags, int usehull, int ignore_pe )
|
||||
pmtrace_t *PM_TraceLine( float *start, float *end, int flags, int usehull, int ignore_pe )
|
||||
{
|
||||
static pmtrace_t tr;
|
||||
int old_usehull;
|
||||
|
||||
old_usehull = clgame.pmove->usehull;
|
||||
clgame.pmove->usehull = usehull;
|
||||
clgame.pmove->usehull = usehull;
|
||||
|
||||
switch( flags )
|
||||
{
|
||||
@@ -783,7 +785,7 @@ static hull_t *pfnHullForBsp( physent_t *pe, float *offset )
|
||||
return PM_HullForBsp( pe, clgame.pmove, offset );
|
||||
}
|
||||
|
||||
static float pfnTraceModel( physent_t *pe, float *start, float *end, trace_t *trace )
|
||||
static float GAME_EXPORT pfnTraceModel( physent_t *pe, float *start, float *end, trace_t *trace )
|
||||
{
|
||||
int old_usehull;
|
||||
vec3_t start_l, end_l;
|
||||
@@ -792,6 +794,8 @@ static float pfnTraceModel( physent_t *pe, float *start, float *end, trace_t *tr
|
||||
matrix4x4 matrix;
|
||||
hull_t *hull;
|
||||
|
||||
PM_InitTrace( trace, end );
|
||||
|
||||
old_usehull = clgame.pmove->usehull;
|
||||
clgame.pmove->usehull = 2;
|
||||
|
||||
@@ -838,9 +842,9 @@ static const char *pfnTraceTexture( int ground, float *vstart, float *vend )
|
||||
|
||||
pe = &clgame.pmove->physents[ground];
|
||||
return PM_TraceTexture( pe, vstart, vend );
|
||||
}
|
||||
}
|
||||
|
||||
static void pfnPlaySound( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch )
|
||||
static void GAME_EXPORT pfnPlaySound( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch )
|
||||
{
|
||||
if( !clgame.pmove->runfuncs )
|
||||
return;
|
||||
@@ -848,18 +852,18 @@ static void pfnPlaySound( int channel, const char *sample, float volume, float a
|
||||
S_StartSound( NULL, clgame.pmove->player_index + 1, channel, S_RegisterSound( sample ), volume, attenuation, pitch, fFlags );
|
||||
}
|
||||
|
||||
static void pfnPlaybackEventFull( int flags, int clientindex, word eventindex, float delay, float *origin,
|
||||
static void GAME_EXPORT pfnPlaybackEventFull( int flags, int clientindex, word eventindex, float delay, float *origin,
|
||||
float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 )
|
||||
{
|
||||
CL_PlaybackEvent( flags, NULL, eventindex, delay, origin, angles, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2 );
|
||||
}
|
||||
|
||||
static pmtrace_t pfnPlayerTraceEx( float *start, float *end, int traceFlags, pfnIgnore pmFilter )
|
||||
static pmtrace_t GAME_EXPORT pfnPlayerTraceEx( float *start, float *end, int traceFlags, pfnIgnore pmFilter )
|
||||
{
|
||||
return PM_PlayerTraceExt( clgame.pmove, start, end, traceFlags, clgame.pmove->numphysent, clgame.pmove->physents, -1, pmFilter );
|
||||
}
|
||||
|
||||
static int pfnTestPlayerPositionEx( float *pos, pmtrace_t *ptrace, pfnIgnore pmFilter )
|
||||
static int GAME_EXPORT pfnTestPlayerPositionEx( float *pos, pmtrace_t *ptrace, pfnIgnore pmFilter )
|
||||
{
|
||||
return PM_TestPlayerPosition( clgame.pmove, pos, ptrace, pmFilter );
|
||||
}
|
||||
@@ -870,7 +874,7 @@ static pmtrace_t *pfnTraceLineEx( float *start, float *end, int flags, int usehu
|
||||
int old_usehull;
|
||||
|
||||
old_usehull = clgame.pmove->usehull;
|
||||
clgame.pmove->usehull = usehull;
|
||||
clgame.pmove->usehull = usehull;
|
||||
|
||||
switch( flags )
|
||||
{
|
||||
@@ -887,17 +891,6 @@ static pmtrace_t *pfnTraceLineEx( float *start, float *end, int flags, int usehu
|
||||
return &tr;
|
||||
}
|
||||
|
||||
static struct msurface_s *pfnTraceSurface( int ground, float *vstart, float *vend )
|
||||
{
|
||||
physent_t *pe;
|
||||
|
||||
if( ground < 0 || ground >= clgame.pmove->numphysent )
|
||||
return NULL; // bad ground
|
||||
|
||||
pe = &clgame.pmove->physents[ground];
|
||||
return PM_TraceSurface( pe, vstart, vend );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_InitClientMove
|
||||
@@ -928,7 +921,7 @@ void CL_InitClientMove( void )
|
||||
|
||||
// common utilities
|
||||
clgame.pmove->PM_Info_ValueForKey = Info_ValueForKey;
|
||||
clgame.pmove->PM_Particle = CL_Particle;
|
||||
clgame.pmove->PM_Particle = CL_Particle; // ref should be initialized here already
|
||||
clgame.pmove->PM_TestPlayerPosition = pfnTestPlayerPosition;
|
||||
clgame.pmove->Con_NPrintf = Con_NPrintf;
|
||||
clgame.pmove->Con_DPrintf = Con_DPrintf;
|
||||
@@ -937,14 +930,14 @@ void CL_InitClientMove( void )
|
||||
clgame.pmove->PM_StuckTouch = pfnStuckTouch;
|
||||
clgame.pmove->PM_PointContents = pfnPointContents;
|
||||
clgame.pmove->PM_TruePointContents = pfnTruePointContents;
|
||||
clgame.pmove->PM_HullPointContents = pfnHullPointContents;
|
||||
clgame.pmove->PM_HullPointContents = pfnHullPointContents;
|
||||
clgame.pmove->PM_PlayerTrace = pfnPlayerTrace;
|
||||
clgame.pmove->PM_TraceLine = pfnTraceLine;
|
||||
clgame.pmove->PM_TraceLine = PM_TraceLine;
|
||||
clgame.pmove->RandomLong = COM_RandomLong;
|
||||
clgame.pmove->RandomFloat = COM_RandomFloat;
|
||||
clgame.pmove->PM_GetModelType = pfnGetModelType;
|
||||
clgame.pmove->PM_GetModelBounds = pfnGetModelBounds;
|
||||
clgame.pmove->PM_HullForBsp = pfnHullForBsp;
|
||||
clgame.pmove->PM_GetModelBounds = pfnGetModelBounds;
|
||||
clgame.pmove->PM_HullForBsp = (void*)pfnHullForBsp;
|
||||
clgame.pmove->PM_TraceModel = pfnTraceModel;
|
||||
clgame.pmove->COM_FileSize = COM_FileSize;
|
||||
clgame.pmove->COM_LoadFile = COM_LoadFile;
|
||||
@@ -1001,7 +994,6 @@ void CL_SetupPMove( playermove_t *pmove, local_state_t *from, usercmd_t *ucmd, q
|
||||
pmove->flFallVelocity = ps->flFallVelocity;
|
||||
pmove->flSwimTime = cd->flSwimTime;
|
||||
VectorCopy( cd->punchangle, pmove->punchangle );
|
||||
pmove->flSwimTime = cd->flSwimTime;
|
||||
pmove->flNextPrimaryAttack = 0.0f; // not used by PM_ code
|
||||
pmove->effects = ps->effects;
|
||||
pmove->flags = cd->flags;
|
||||
@@ -1030,7 +1022,7 @@ void CL_SetupPMove( playermove_t *pmove, local_state_t *from, usercmd_t *ucmd, q
|
||||
VectorCopy( cd->vuser2, pmove->vuser2 );
|
||||
VectorCopy( cd->vuser3, pmove->vuser3 );
|
||||
VectorCopy( cd->vuser4, pmove->vuser4 );
|
||||
pmove->cmd = *ucmd; // copy current cmds
|
||||
pmove->cmd = *ucmd; // copy current cmds
|
||||
|
||||
Q_strncpy( pmove->physinfo, cls.physinfo, MAX_INFO_STRING );
|
||||
}
|
||||
@@ -1059,7 +1051,7 @@ void CL_FinishPMove( playermove_t *pmove, local_state_t *to )
|
||||
VectorCopy( pmove->angles, ps->angles );
|
||||
VectorCopy( pmove->basevelocity, ps->basevelocity );
|
||||
VectorCopy( pmove->punchangle, cd->punchangle );
|
||||
ps->oldbuttons = pmove->oldbuttons;
|
||||
ps->oldbuttons = pmove->cmd.buttons;
|
||||
ps->friction = pmove->friction;
|
||||
ps->movetype = pmove->movetype;
|
||||
ps->onground = pmove->onground;
|
||||
@@ -1091,13 +1083,14 @@ Runs prediction code for user cmd
|
||||
void CL_RunUsercmd( local_state_t *from, local_state_t *to, usercmd_t *u, qboolean runfuncs, double *time, unsigned int random_seed )
|
||||
{
|
||||
usercmd_t cmd;
|
||||
local_state_t temp;
|
||||
usercmd_t split;
|
||||
|
||||
memset( &temp, 0, sizeof( temp ));
|
||||
|
||||
if( u->msec > 50 )
|
||||
{
|
||||
local_state_t temp;
|
||||
usercmd_t split;
|
||||
|
||||
memset( &temp, 0, sizeof( temp ));
|
||||
|
||||
split = *u;
|
||||
split.msec /= 2;
|
||||
CL_RunUsercmd( from, &temp, &split, runfuncs, time, random_seed );
|
||||
@@ -1164,12 +1157,12 @@ Sets cl.predicted.origin and cl.predicted.angles
|
||||
*/
|
||||
void CL_PredictMovement( qboolean repredicting )
|
||||
{
|
||||
runcmd_t *to_cmd, *from_cmd;
|
||||
runcmd_t *to_cmd = NULL, *from_cmd;
|
||||
local_state_t *from = NULL, *to = NULL;
|
||||
int current_command;
|
||||
int current_command_mod;
|
||||
uint current_command;
|
||||
uint current_command_mod;
|
||||
frame_t *frame = NULL;
|
||||
int i, stoppoint;
|
||||
uint i, stoppoint;
|
||||
qboolean runfuncs;
|
||||
double f = 1.0;
|
||||
cl_entity_t *ent;
|
||||
@@ -1238,10 +1231,6 @@ void CL_PredictMovement( qboolean repredicting )
|
||||
if( to_cmd->senttime >= host.realtime )
|
||||
break;
|
||||
|
||||
// now interpolate some fraction of the final frame
|
||||
if( to_cmd->senttime != from_cmd->senttime )
|
||||
f = (host.realtime - from_cmd->senttime) / (to_cmd->senttime - from_cmd->senttime) * 0.1;
|
||||
|
||||
from = to;
|
||||
from_cmd = to_cmd;
|
||||
}
|
||||
@@ -1274,8 +1263,10 @@ void CL_PredictMovement( qboolean repredicting )
|
||||
return;
|
||||
}
|
||||
|
||||
f = bound( 0.0f, f, 1.0f );
|
||||
f = 0.0; // FIXME: make work, do revision
|
||||
// now interpolate some fraction of the final frame
|
||||
if( to_cmd->senttime != from_cmd->senttime )
|
||||
f = bound( 0.0, (host.realtime - from_cmd->senttime) / (to_cmd->senttime - from_cmd->senttime) * 0.1, 1.0 );
|
||||
else f = 0.0;
|
||||
|
||||
if( CL_PlayerTeleported( from, to ))
|
||||
{
|
||||
@@ -1337,14 +1328,14 @@ void CL_PredictMovement( qboolean repredicting )
|
||||
cls.correction_time -= host.frametime;
|
||||
|
||||
// Make sure smoothtime is postive
|
||||
if( cl_smoothtime->value <= 0.0 )
|
||||
if( cl_smoothtime->value <= 0.0f )
|
||||
Cvar_DirectSet( cl_smoothtime, "0.1" );
|
||||
|
||||
// Clamp from 0 to cl_smoothtime.value
|
||||
cls.correction_time = bound( 0.0, cls.correction_time, cl_smoothtime->value );
|
||||
|
||||
// Compute backward interpolation fraction along full correction
|
||||
frac = 1.0 - cls.correction_time / cl_smoothtime->value;
|
||||
frac = 1.0f - cls.correction_time / cl_smoothtime->value;
|
||||
|
||||
// Determine how much error we still have to make up for
|
||||
VectorSubtract( cl.simorg, cl.local.lastorigin, delta );
|
||||
@@ -1359,4 +1350,4 @@ void CL_PredictMovement( qboolean repredicting )
|
||||
|
||||
VectorCopy( cl.simorg, cl.local.lastorigin );
|
||||
cl.local.repredicting = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ GNU General Public License for more details.
|
||||
#include "client.h"
|
||||
#include "net_encode.h"
|
||||
#include "particledef.h"
|
||||
#include "gl_local.h"
|
||||
#include "cl_tent.h"
|
||||
#include "shake.h"
|
||||
#include "hltv.h"
|
||||
@@ -86,7 +85,7 @@ static qboolean CL_QuakeEntityTeleported( cl_entity_t *ent, entity_state_t *news
|
||||
VectorSubtract( newstate->origin, ent->prevstate.origin, delta );
|
||||
|
||||
// compute potential max movement in units per frame and compare with entity movement
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0 / GAME_FPS ));
|
||||
maxlen = ( clgame.movevars.maxvelocity * ( 1.0f / GAME_FPS ));
|
||||
len = VectorLength( delta );
|
||||
|
||||
return (len > maxlen);
|
||||
@@ -225,7 +224,7 @@ static void CL_ParseQuakeServerInfo( sizebuf_t *msg )
|
||||
}
|
||||
|
||||
// multiplayer game?
|
||||
if( cl.maxclients > 1 )
|
||||
if( cl.maxclients > 1 )
|
||||
{
|
||||
// allow console in multiplayer games
|
||||
host.allow_console = true;
|
||||
@@ -303,13 +302,13 @@ static void CL_ParseQuakeServerInfo( sizebuf_t *msg )
|
||||
|
||||
// get splash name
|
||||
if( cls.demoplayback && ( cls.demonum != -1 ))
|
||||
Cvar_Set( "cl_levelshot_name", va( "levelshots/%s_%s", cls.demoname, glState.wideScreen ? "16x9" : "4x3" ));
|
||||
else Cvar_Set( "cl_levelshot_name", va( "levelshots/%s_%s", clgame.mapname, glState.wideScreen ? "16x9" : "4x3" ));
|
||||
Cvar_Set( "cl_levelshot_name", va( "levelshots/%s_%s", cls.demoname, refState.wideScreen ? "16x9" : "4x3" ));
|
||||
else Cvar_Set( "cl_levelshot_name", va( "levelshots/%s_%s", clgame.mapname, refState.wideScreen ? "16x9" : "4x3" ));
|
||||
Cvar_SetValue( "scr_loading", 0.0f ); // reset progress bar
|
||||
|
||||
if(( cl_allow_levelshots->value && !cls.changelevel ) || cl.background )
|
||||
{
|
||||
if( !FS_FileExists( va( "%s.bmp", cl_levelshot_name->string ), true ))
|
||||
if( !FS_FileExists( va( "%s.bmp", cl_levelshot_name->string ), true ))
|
||||
Cvar_Set( "cl_levelshot_name", "*black" ); // render a black screen
|
||||
cls.scrshot_request = scrshot_plaque; // request levelshot even if exist (check filetime)
|
||||
}
|
||||
@@ -350,11 +349,11 @@ static void CL_ParseQuakeClientData( sizebuf_t *msg )
|
||||
// this is the frame update that this message corresponds to
|
||||
i = cls.netchan.incoming_sequence;
|
||||
|
||||
cl.parsecount = i; // ack'd incoming messages.
|
||||
cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
|
||||
cl.parsecount = i; // ack'd incoming messages.
|
||||
cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
|
||||
frame = &cl.frames[cl.parsecountmod]; // frame at index.
|
||||
frame->time = cl.mtime[0]; // mark network received time
|
||||
frame->receivedtime = host.realtime; // time now that we are parsing.
|
||||
frame->receivedtime = host.realtime; // time now that we are parsing.
|
||||
memset( &frame->graphdata, 0, sizeof( netbandwidthgraph_t ));
|
||||
memset( frame->flags, 0, sizeof( frame->flags ));
|
||||
frame->first_entity = cls.next_client_entities;
|
||||
@@ -449,7 +448,7 @@ void CL_ParseQuakeEntityData( sizebuf_t *msg, int bits )
|
||||
SetBits( bits, i << 8 );
|
||||
}
|
||||
|
||||
if( FBitSet( bits, U_LONGENTITY ))
|
||||
if( FBitSet( bits, U_LONGENTITY ))
|
||||
newnum = MSG_ReadWord( msg );
|
||||
else newnum = MSG_ReadByte( msg );
|
||||
|
||||
@@ -466,7 +465,7 @@ void CL_ParseQuakeEntityData( sizebuf_t *msg, int bits )
|
||||
if( ent->curstate.msg_time != cl.mtime[1] )
|
||||
forcelink = true; // no previous frame to lerp from
|
||||
else forcelink = false;
|
||||
|
||||
|
||||
if( FBitSet( bits, U_MODEL ))
|
||||
state->modelindex = MSG_ReadByte( msg );
|
||||
else state->modelindex = ent->baseline.modelindex;
|
||||
@@ -574,8 +573,8 @@ void CL_ParseQuakeParticle( sizebuf_t *msg )
|
||||
{
|
||||
int count, color;
|
||||
vec3_t org, dir;
|
||||
|
||||
MSG_ReadVec3Coord( msg, org );
|
||||
|
||||
MSG_ReadVec3Coord( msg, org );
|
||||
dir[0] = MSG_ReadChar( msg ) * 0.0625f;
|
||||
dir[1] = MSG_ReadChar( msg ) * 0.0625f;
|
||||
dir[2] = MSG_ReadChar( msg ) * 0.0625f;
|
||||
@@ -598,12 +597,12 @@ void CL_ParseQuakeStaticSound( sizebuf_t *msg )
|
||||
float vol, attn;
|
||||
vec3_t org;
|
||||
|
||||
MSG_ReadVec3Coord( msg, org );
|
||||
MSG_ReadVec3Coord( msg, org );
|
||||
sound_num = MSG_ReadByte( msg );
|
||||
vol = (float)MSG_ReadByte( msg ) / 255.0f;
|
||||
attn = (float)MSG_ReadByte( msg ) / 64.0f;
|
||||
|
||||
S_StartSound( org, 0, CHAN_STATIC, cl.sound_index[sound_num], vol, attn, PITCH_NORM, 0 );
|
||||
S_StartSound( org, 0, CHAN_STATIC, cl.sound_index[sound_num], vol, attn, PITCH_NORM, 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -677,7 +676,7 @@ static void CL_ParseQuakeStaticEntity( sizebuf_t *msg )
|
||||
if( ent->model != NULL )
|
||||
{
|
||||
// auto 'solid' faces
|
||||
if( FBitSet( ent->model->flags, MODEL_TRANSPARENT ) && CL_IsQuakeCompatible( ))
|
||||
if( FBitSet( ent->model->flags, MODEL_TRANSPARENT ) && Host_IsQuakeCompatible())
|
||||
{
|
||||
ent->curstate.rendermode = kRenderTransAlpha;
|
||||
ent->curstate.renderamt = 255;
|
||||
@@ -826,6 +825,9 @@ CL_QuakeStuffText
|
||||
void CL_QuakeStuffText( const char *text )
|
||||
{
|
||||
Q_strncat( cmd_buf, text, sizeof( cmd_buf ));
|
||||
|
||||
// a1ba: didn't filtered, anyway quake protocol
|
||||
// only supported for demos, not network games
|
||||
Cbuf_AddText( text );
|
||||
}
|
||||
|
||||
@@ -862,9 +864,7 @@ void CL_QuakeExecStuff( void )
|
||||
|
||||
if( !*text ) break;
|
||||
|
||||
host.com_ignorebracket = true;
|
||||
text = COM_ParseFile( text, token );
|
||||
host.com_ignorebracket = false;
|
||||
text = COM_ParseFileSafe( text, token, sizeof( token ), PFILE_IGNOREBRACKET, NULL, NULL );
|
||||
|
||||
if( !text ) break;
|
||||
|
||||
@@ -909,7 +909,7 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
||||
// assume no entity/player update this packet
|
||||
if( cls.state == ca_active )
|
||||
{
|
||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
|
||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
|
||||
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
|
||||
}
|
||||
else
|
||||
@@ -932,7 +932,7 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
||||
|
||||
// end of message (align bits)
|
||||
if( MSG_GetNumBitsLeft( msg ) < 8 )
|
||||
break;
|
||||
break;
|
||||
|
||||
cmd = MSG_ReadServerCmd( msg );
|
||||
|
||||
@@ -1130,4 +1130,4 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
|
||||
|
||||
// check deferred cmds
|
||||
CL_QuakeExecStuff();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ GNU General Public License for more details.
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "gl_local.h"
|
||||
#include "studio.h"
|
||||
|
||||
/*
|
||||
@@ -55,7 +54,7 @@ qboolean CL_CmpStudioTextures( int numtexs, mstudiotexture_t *p1, mstudiotexture
|
||||
|
||||
if( p1->index != p2->index )
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -78,7 +77,9 @@ byte *CL_CreateRawTextureFromPixels( texture_t *tx, size_t *size, int topcolor,
|
||||
// fill header
|
||||
if( !pin.name[0] ) Q_strncpy( pin.name, "#raw_remap_image.mdl", sizeof( pin.name ));
|
||||
pin.flags = STUDIO_NF_COLORMAP; // just in case :-)
|
||||
pin.index = (int)(tx + 1); // pointer to pixels
|
||||
//pin.index = (int)(tx + 1); // pointer to pixels
|
||||
// no more pointer-to-int-to-pointer casts
|
||||
Image_SetMDLPointer( (byte*)((texture_t *)tx + 1) );
|
||||
pin.width = tx->width;
|
||||
pin.height = tx->height;
|
||||
|
||||
@@ -97,24 +98,25 @@ CL_DuplicateTexture
|
||||
Dupliacte texture with remap pixels
|
||||
====================
|
||||
*/
|
||||
void CL_DuplicateTexture( mstudiotexture_t *ptexture, int topcolor, int bottomcolor )
|
||||
void CL_DuplicateTexture( cl_entity_t *entity, model_t *model, mstudiotexture_t *ptexture, int topcolor, int bottomcolor )
|
||||
{
|
||||
gl_texture_t *glt;
|
||||
const char *name;
|
||||
texture_t *tx = NULL;
|
||||
char texname[128];
|
||||
int i, size, index;
|
||||
int i, index;
|
||||
size_t size;
|
||||
byte paletteBackup[768];
|
||||
byte *raw, *pal;
|
||||
|
||||
// save off the real texture index
|
||||
index = ptexture->index;
|
||||
glt = R_GetTexture( index );
|
||||
Q_snprintf( texname, sizeof( texname ), "#%i_%s", RI.currententity->curstate.number, glt->name + 1 );
|
||||
name = ref.dllFuncs.GL_TextureName( index );
|
||||
Q_snprintf( texname, sizeof( texname ), "#%i_%s", entity->curstate.number, name + 1 );
|
||||
|
||||
// search for pixels
|
||||
for( i = 0; i < RI.currentmodel->numtextures; i++ )
|
||||
for( i = 0; i < model->numtextures; i++ )
|
||||
{
|
||||
tx = RI.currentmodel->textures[i];
|
||||
tx = model->textures[i];
|
||||
if( tx->gl_texturenum == index )
|
||||
break; // found
|
||||
}
|
||||
@@ -126,7 +128,7 @@ void CL_DuplicateTexture( mstudiotexture_t *ptexture, int topcolor, int bottomco
|
||||
memcpy( paletteBackup, pal, 768 );
|
||||
|
||||
raw = CL_CreateRawTextureFromPixels( tx, &size, topcolor, bottomcolor );
|
||||
ptexture->index = GL_LoadTexture( texname, raw, size, TF_FORCE_COLOR ); // do copy
|
||||
ptexture->index = ref.dllFuncs.GL_LoadTexture( texname, raw, size, TF_FORCE_COLOR ); // do copy
|
||||
|
||||
// restore original palette
|
||||
memcpy( pal, paletteBackup, 768 );
|
||||
@@ -139,32 +141,33 @@ CL_UpdateStudioTexture
|
||||
Update texture top and bottom colors
|
||||
====================
|
||||
*/
|
||||
void CL_UpdateStudioTexture( mstudiotexture_t *ptexture, int topcolor, int bottomcolor )
|
||||
void CL_UpdateStudioTexture( cl_entity_t *entity, mstudiotexture_t *ptexture, int topcolor, int bottomcolor )
|
||||
{
|
||||
gl_texture_t *glt;
|
||||
rgbdata_t *pic;
|
||||
texture_t *tx = NULL;
|
||||
char texname[128], name[128], mdlname[128];
|
||||
int i, size, index;
|
||||
const char *origtexname;
|
||||
int i, index;
|
||||
size_t size;
|
||||
byte paletteBackup[768];
|
||||
byte *raw, *pal;
|
||||
|
||||
// save off the real texture index
|
||||
glt = R_GetTexture( ptexture->index );
|
||||
origtexname = ref.dllFuncs.GL_TextureName( ptexture->index );
|
||||
|
||||
// build name of original texture
|
||||
Q_strncpy( mdlname, RI.currentmodel->name, sizeof( mdlname ));
|
||||
Q_strncpy( mdlname, entity->model->name, sizeof( mdlname ));
|
||||
COM_FileBase( ptexture->name, name );
|
||||
COM_StripExtension( mdlname );
|
||||
|
||||
Q_snprintf( texname, sizeof( texname ), "#%s/%s.mdl", mdlname, name );
|
||||
index = GL_FindTexture( texname );
|
||||
index = ref.dllFuncs.GL_FindTexture( texname );
|
||||
if( !index ) return; // couldn't find texture
|
||||
|
||||
// search for pixels
|
||||
for( i = 0; i < RI.currentmodel->numtextures; i++ )
|
||||
for( i = 0; i < entity->model->numtextures; i++ )
|
||||
{
|
||||
tx = RI.currentmodel->textures[i];
|
||||
tx = entity->model->textures[i];
|
||||
if( tx->gl_texturenum == index )
|
||||
break; // found
|
||||
}
|
||||
@@ -176,14 +179,14 @@ void CL_UpdateStudioTexture( mstudiotexture_t *ptexture, int topcolor, int botto
|
||||
memcpy( paletteBackup, pal, 768 );
|
||||
|
||||
raw = CL_CreateRawTextureFromPixels( tx, &size, topcolor, bottomcolor );
|
||||
pic = FS_LoadImage( glt->name, raw, size );
|
||||
pic = FS_LoadImage( origtexname, raw, size );
|
||||
if( !pic )
|
||||
{
|
||||
Con_DPrintf( S_ERROR "Couldn't update texture %s\n", glt->name );
|
||||
Con_DPrintf( S_ERROR "Couldn't update texture %s\n", origtexname );
|
||||
return;
|
||||
}
|
||||
|
||||
index = GL_UpdateTextureInternal( glt->name, pic, 0 );
|
||||
index = GL_UpdateTextureInternal( origtexname, pic, 0 );
|
||||
FS_FreeImage( pic );
|
||||
|
||||
// restore original palette
|
||||
@@ -199,21 +202,21 @@ CL_UpdateAliasTexture
|
||||
Update texture top and bottom colors
|
||||
====================
|
||||
*/
|
||||
void CL_UpdateAliasTexture( unsigned short *texture, int skinnum, int topcolor, int bottomcolor )
|
||||
void CL_UpdateAliasTexture( cl_entity_t *entity, unsigned short *texture, int skinnum, int topcolor, int bottomcolor )
|
||||
{
|
||||
char texname[MAX_QPATH];
|
||||
rgbdata_t skin, *pic;
|
||||
texture_t *tx;
|
||||
|
||||
if( !texture || !RI.currentmodel->textures )
|
||||
if( !texture || !entity->model->textures )
|
||||
return; // no remapinfo in model
|
||||
|
||||
tx = RI.currentmodel->textures[skinnum];
|
||||
tx = entity->model->textures[skinnum];
|
||||
if( !tx ) return; // missing texture ?
|
||||
|
||||
if( *texture == 0 )
|
||||
{
|
||||
Q_snprintf( texname, sizeof( texname ), "%s:remap%i_%i", RI.currentmodel->name, skinnum, RI.currententity->index );
|
||||
Q_snprintf( texname, sizeof( texname ), "%s:remap%i_%i", entity->model->name, skinnum, entity->index );
|
||||
skin.width = tx->width;
|
||||
skin.height = tx->height;
|
||||
skin.depth = skin.numMips = 1;
|
||||
@@ -228,7 +231,7 @@ void CL_UpdateAliasTexture( unsigned short *texture, int skinnum, int topcolor,
|
||||
}
|
||||
|
||||
// and now we can remap with internal routines
|
||||
GL_ProcessTexture( *texture, -1.0f, topcolor, bottomcolor );
|
||||
ref.dllFuncs.GL_ProcessTexture( *texture, -1.0f, topcolor, bottomcolor );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -239,7 +242,7 @@ Allocate new remap info per entity
|
||||
and make copy of remap textures
|
||||
====================
|
||||
*/
|
||||
void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
void CL_AllocRemapInfo( cl_entity_t *entity, model_t *model, int topcolor, int bottomcolor )
|
||||
{
|
||||
remap_info_t *info;
|
||||
studiohdr_t *phdr;
|
||||
@@ -247,10 +250,10 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
mstudiotexture_t *src, *dst;
|
||||
int i, size;
|
||||
|
||||
if( !RI.currententity ) return;
|
||||
i = ( RI.currententity == &clgame.viewent ) ? clgame.maxEntities : RI.currententity->curstate.number;
|
||||
if( !entity ) return;
|
||||
i = ( entity == &clgame.viewent ) ? clgame.maxEntities : entity->curstate.number;
|
||||
|
||||
if( !RI.currentmodel || ( RI.currentmodel->type != mod_alias && RI.currentmodel->type != mod_studio ))
|
||||
if( !model || ( model->type != mod_alias && model->type != mod_studio ))
|
||||
{
|
||||
// entity has changed model by another type, release remap info
|
||||
if( clgame.remap_info[i] )
|
||||
@@ -262,7 +265,7 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
}
|
||||
|
||||
// model doesn't contains remap textures
|
||||
if( RI.currentmodel->numtextures <= 0 )
|
||||
if( model->numtextures <= 0 )
|
||||
{
|
||||
// entity has changed model with no remap textures
|
||||
if( clgame.remap_info[i] )
|
||||
@@ -273,22 +276,22 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
return;
|
||||
}
|
||||
|
||||
if( RI.currentmodel->type == mod_studio )
|
||||
if( model->type == mod_studio )
|
||||
{
|
||||
phdr = (studiohdr_t *)Mod_StudioExtradata( RI.currentmodel );
|
||||
phdr = (studiohdr_t *)Mod_StudioExtradata( model );
|
||||
if( !phdr ) return; // bad model?
|
||||
|
||||
src = (mstudiotexture_t *)(((byte *)phdr) + phdr->textureindex);
|
||||
dst = (clgame.remap_info[i] ? clgame.remap_info[i]->ptexture : NULL);
|
||||
dst = (clgame.remap_info[i] ? clgame.remap_info[i]->ptexture : NULL);
|
||||
|
||||
// NOTE: we must copy all the structures 'mstudiotexture_t' for easy access when model is rendering
|
||||
if( !CL_CmpStudioTextures( phdr->numtextures, src, dst ) || clgame.remap_info[i]->model != RI.currentmodel )
|
||||
if( !CL_CmpStudioTextures( phdr->numtextures, src, dst ) || clgame.remap_info[i]->model != model )
|
||||
{
|
||||
// this code catches studiomodel change with another studiomodel with remap textures
|
||||
// e.g. playermodel 'barney' with playermodel 'gordon'
|
||||
if( clgame.remap_info[i] ) CL_FreeRemapInfo( clgame.remap_info[i] ); // free old info
|
||||
size = sizeof( remap_info_t ) + ( sizeof( mstudiotexture_t ) * phdr->numtextures );
|
||||
info = clgame.remap_info[i] = Mem_Calloc( clgame.mempool, size );
|
||||
info = clgame.remap_info[i] = Mem_Calloc( clgame.mempool, size );
|
||||
info->ptexture = (mstudiotexture_t *)(info + 1); // textures are immediately comes after remap_info
|
||||
}
|
||||
else
|
||||
@@ -311,21 +314,21 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
for( i = 0; i < info->numtextures; i++ )
|
||||
{
|
||||
if( dst[i].flags & STUDIO_NF_COLORMAP )
|
||||
CL_DuplicateTexture( &dst[i], topcolor, bottomcolor );
|
||||
CL_DuplicateTexture( entity, model, &dst[i], topcolor, bottomcolor );
|
||||
}
|
||||
}
|
||||
else if( RI.currentmodel->type == mod_alias )
|
||||
else if( model->type == mod_alias )
|
||||
{
|
||||
ahdr = (aliashdr_t *)Mod_AliasExtradata( RI.currentmodel );
|
||||
ahdr = (aliashdr_t *)Mod_AliasExtradata( model );
|
||||
if( !ahdr ) return; // bad model?
|
||||
|
||||
// NOTE: we must copy all the structures 'mstudiotexture_t' for easy access when model is rendering
|
||||
if( !clgame.remap_info[i] || clgame.remap_info[i]->model != RI.currentmodel )
|
||||
if( !clgame.remap_info[i] || clgame.remap_info[i]->model != model )
|
||||
{
|
||||
// this code catches studiomodel change with another studiomodel with remap textures
|
||||
// e.g. playermodel 'barney' with playermodel 'gordon'
|
||||
if( clgame.remap_info[i] ) CL_FreeRemapInfo( clgame.remap_info[i] ); // free old info
|
||||
info = clgame.remap_info[i] = Mem_Calloc( clgame.mempool, sizeof( remap_info_t ));
|
||||
info = clgame.remap_info[i] = Mem_Calloc( clgame.mempool, sizeof( remap_info_t ));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -333,10 +336,10 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
return;
|
||||
}
|
||||
|
||||
info->numtextures = RI.currentmodel->numtextures;
|
||||
info->numtextures = model->numtextures;
|
||||
|
||||
// alias remapping is easy
|
||||
CL_UpdateRemapInfo( topcolor, bottomcolor );
|
||||
CL_UpdateRemapInfo( entity, topcolor, bottomcolor );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -344,7 +347,7 @@ void CL_AllocRemapInfo( int topcolor, int bottomcolor )
|
||||
return;
|
||||
}
|
||||
|
||||
info->model = RI.currentmodel;
|
||||
info->model = model;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -354,12 +357,12 @@ CL_UpdateRemapInfo
|
||||
Update all remaps per entity
|
||||
====================
|
||||
*/
|
||||
void CL_UpdateRemapInfo( int topcolor, int bottomcolor )
|
||||
void CL_UpdateRemapInfo( cl_entity_t *entity, int topcolor, int bottomcolor )
|
||||
{
|
||||
remap_info_t *info;
|
||||
int i;
|
||||
|
||||
i = ( RI.currententity == &clgame.viewent ) ? clgame.maxEntities : RI.currententity->curstate.number;
|
||||
i = ( entity == &clgame.viewent ) ? clgame.maxEntities : entity->curstate.number;
|
||||
info = clgame.remap_info[i];
|
||||
if( !info ) return; // no remap info
|
||||
|
||||
@@ -371,9 +374,9 @@ void CL_UpdateRemapInfo( int topcolor, int bottomcolor )
|
||||
if( info->ptexture != NULL )
|
||||
{
|
||||
if( FBitSet( info->ptexture[i].flags, STUDIO_NF_COLORMAP ))
|
||||
CL_UpdateStudioTexture( &info->ptexture[i], topcolor, bottomcolor );
|
||||
CL_UpdateStudioTexture( entity, &info->ptexture[i], topcolor, bottomcolor );
|
||||
}
|
||||
else CL_UpdateAliasTexture( &info->textures[i], i, topcolor, bottomcolor );
|
||||
else CL_UpdateAliasTexture( entity, &info->textures[i], i, topcolor, bottomcolor );
|
||||
}
|
||||
|
||||
info->topcolor = topcolor;
|
||||
@@ -399,14 +402,14 @@ void CL_FreeRemapInfo( remap_info_t *info )
|
||||
if( info->ptexture != NULL )
|
||||
{
|
||||
if( FBitSet( info->ptexture[i].flags, STUDIO_NF_COLORMAP ))
|
||||
GL_FreeTexture( info->ptexture[i].index );
|
||||
ref.dllFuncs.GL_FreeTexture( info->ptexture[i].index );
|
||||
}
|
||||
|
||||
if( info->textures[i] != 0 )
|
||||
GL_FreeTexture( info->textures[i] );
|
||||
ref.dllFuncs.GL_FreeTexture( info->textures[i] );
|
||||
}
|
||||
|
||||
Mem_Free( info ); // release struct
|
||||
Mem_Free( info ); // release struct
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -425,9 +428,9 @@ void CL_ClearAllRemaps( void )
|
||||
for( i = 0; i < clgame.maxRemapInfos; i++ )
|
||||
{
|
||||
if( clgame.remap_info[i] )
|
||||
CL_FreeRemapInfo( clgame.remap_info[i] );
|
||||
CL_FreeRemapInfo( clgame.remap_info[i] );
|
||||
}
|
||||
Mem_Free( clgame.remap_info );
|
||||
}
|
||||
clgame.remap_info = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
346
engine/client/cl_render.c
Normal file
346
engine/client/cl_render.c
Normal file
@@ -0,0 +1,346 @@
|
||||
/*
|
||||
cl_render.c - RenderAPI loader & implementation
|
||||
Copyright (C) 2019 a1batross
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "library.h"
|
||||
#include "platform/platform.h"
|
||||
|
||||
int R_FatPVS( const vec3_t org, float radius, byte *visbuffer, qboolean merge, qboolean fullvis )
|
||||
{
|
||||
return Mod_FatPVS( org, radius, visbuffer, world.visbytes, merge, fullvis );
|
||||
}
|
||||
|
||||
lightstyle_t *CL_GetLightStyle( int number )
|
||||
{
|
||||
Assert( number >= 0 && number < MAX_LIGHTSTYLES );
|
||||
return &cl.lightstyles[number];
|
||||
}
|
||||
|
||||
const ref_overview_t *GL_GetOverviewParms( void )
|
||||
{
|
||||
return &clgame.overView;
|
||||
}
|
||||
|
||||
static void *R_Mem_Alloc( size_t cb, const char *filename, const int fileline )
|
||||
{
|
||||
return _Mem_Alloc( cls.mempool, cb, true, filename, fileline );
|
||||
}
|
||||
|
||||
static void R_Mem_Free( void *mem, const char *filename, const int fileline )
|
||||
{
|
||||
if( !mem ) return;
|
||||
_Mem_Free( mem, filename, fileline );
|
||||
}
|
||||
|
||||
/*
|
||||
=========
|
||||
pfnGetFilesList
|
||||
|
||||
=========
|
||||
*/
|
||||
static char **pfnGetFilesList( const char *pattern, int *numFiles, int gamedironly )
|
||||
{
|
||||
static search_t *t = NULL;
|
||||
|
||||
if( t ) Mem_Free( t ); // release prev search
|
||||
|
||||
t = FS_Search( pattern, true, gamedironly );
|
||||
|
||||
if( !t )
|
||||
{
|
||||
if( numFiles ) *numFiles = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( numFiles ) *numFiles = t->numfilenames;
|
||||
return t->filenames;
|
||||
}
|
||||
|
||||
static uint pfnFileBufferCRC32( const void *buffer, const int length )
|
||||
{
|
||||
uint modelCRC = 0;
|
||||
|
||||
if( !buffer || length <= 0 )
|
||||
return modelCRC;
|
||||
|
||||
CRC32_Init( &modelCRC );
|
||||
CRC32_ProcessBuffer( &modelCRC, buffer, length );
|
||||
return CRC32_Final( modelCRC );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_EnvShot
|
||||
|
||||
=================
|
||||
*/
|
||||
static void R_EnvShot( const float *vieworg, const char *name, qboolean skyshot, int shotsize )
|
||||
{
|
||||
static vec3_t viewPoint;
|
||||
|
||||
if( !COM_CheckString( name ))
|
||||
return;
|
||||
|
||||
if( cls.scrshot_action != scrshot_inactive )
|
||||
{
|
||||
if( cls.scrshot_action != scrshot_skyshot && cls.scrshot_action != scrshot_envshot )
|
||||
Con_Printf( S_ERROR "R_%sShot: subsystem is busy, try for next frame.\n", skyshot ? "Sky" : "Env" );
|
||||
return;
|
||||
}
|
||||
|
||||
cls.envshot_vieworg = NULL; // use client view
|
||||
Q_strncpy( cls.shotname, name, sizeof( cls.shotname ));
|
||||
|
||||
if( vieworg )
|
||||
{
|
||||
// make sure what viewpoint don't temporare
|
||||
VectorCopy( vieworg, viewPoint );
|
||||
cls.envshot_vieworg = viewPoint;
|
||||
cls.envshot_disable_vis = true;
|
||||
}
|
||||
|
||||
// make request for envshot
|
||||
if( skyshot ) cls.scrshot_action = scrshot_skyshot;
|
||||
else cls.scrshot_action = scrshot_envshot;
|
||||
|
||||
// catch negative values
|
||||
cls.envshot_viewsize = Q_max( 0, shotsize );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
CL_GenericHandle
|
||||
|
||||
=============
|
||||
*/
|
||||
const char *CL_GenericHandle( int fileindex )
|
||||
{
|
||||
if( fileindex < 0 || fileindex >= MAX_CUSTOM )
|
||||
return 0;
|
||||
return cl.files_precache[fileindex];
|
||||
}
|
||||
|
||||
int CL_RenderGetParm( const int parm, const int arg, const qboolean checkRef )
|
||||
{
|
||||
switch( parm )
|
||||
{
|
||||
case PARM_BSP2_SUPPORTED:
|
||||
#ifdef SUPPORT_BSP2_FORMAT
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
case PARM_SKY_SPHERE:
|
||||
return FBitSet( world.flags, FWORLD_SKYSPHERE ) && !FBitSet( world.flags, FWORLD_CUSTOM_SKYBOX );
|
||||
case PARAM_GAMEPAUSED:
|
||||
return cl.paused;
|
||||
case PARM_CLIENT_INGAME:
|
||||
return CL_IsInGame();
|
||||
case PARM_MAX_ENTITIES:
|
||||
return clgame.maxEntities;
|
||||
case PARM_FEATURES:
|
||||
return host.features;
|
||||
case PARM_MAP_HAS_DELUXE:
|
||||
return FBitSet( world.flags, FWORLD_HAS_DELUXEMAP );
|
||||
case PARM_CLIENT_ACTIVE:
|
||||
return (cls.state == ca_active);
|
||||
case PARM_DEDICATED_SERVER:
|
||||
return (host.type == HOST_DEDICATED);
|
||||
case PARM_WATER_ALPHA:
|
||||
return FBitSet( world.flags, FWORLD_WATERALPHA );
|
||||
case PARM_DELUXEDATA:
|
||||
return *(int *)&world.deluxedata;
|
||||
case PARM_SHADOWDATA:
|
||||
return *(int *)&world.shadowdata;
|
||||
default:
|
||||
// indicates call from client.dll
|
||||
if( checkRef )
|
||||
{
|
||||
return ref.dllFuncs.RefGetParm( parm, arg );
|
||||
}
|
||||
// call issued from ref_dll, check extensions here
|
||||
else switch( parm )
|
||||
{
|
||||
case PARM_DEV_OVERVIEW:
|
||||
return CL_IsDevOverviewMode();
|
||||
case PARM_THIRDPERSON:
|
||||
return CL_IsThirdPerson();
|
||||
case PARM_QUAKE_COMPATIBLE:
|
||||
return Host_IsQuakeCompatible();
|
||||
case PARM_PLAYER_INDEX:
|
||||
return cl.playernum + 1;
|
||||
case PARM_VIEWENT_INDEX:
|
||||
return cl.viewentity;
|
||||
case PARM_CONNSTATE:
|
||||
return (int)cls.state;
|
||||
case PARM_PLAYING_DEMO:
|
||||
return cls.demoplayback;
|
||||
case PARM_WATER_LEVEL:
|
||||
return cl.local.waterlevel;
|
||||
case PARM_MAX_CLIENTS:
|
||||
return cl.maxclients;
|
||||
case PARM_LOCAL_HEALTH:
|
||||
return cl.local.health;
|
||||
case PARM_LOCAL_GAME:
|
||||
return Host_IsLocalGame();
|
||||
case PARM_NUMENTITIES:
|
||||
return pfnNumberOfEntities();
|
||||
case PARM_NUMMODELS:
|
||||
return cl.nummodels;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pfnRenderGetParm( int parm, int arg )
|
||||
{
|
||||
return CL_RenderGetParm( parm, arg, true );
|
||||
}
|
||||
|
||||
static render_api_t gRenderAPI =
|
||||
{
|
||||
pfnRenderGetParm, // GL_RenderGetParm,
|
||||
NULL, // R_GetDetailScaleForTexture,
|
||||
NULL, // R_GetExtraParmsForTexture,
|
||||
CL_GetLightStyle,
|
||||
CL_GetDynamicLight,
|
||||
CL_GetEntityLight,
|
||||
LightToTexGamma,
|
||||
NULL, // R_GetFrameTime,
|
||||
NULL, // R_SetCurrentEntity,
|
||||
NULL, // R_SetCurrentModel,
|
||||
R_FatPVS,
|
||||
R_StoreEfrags,
|
||||
NULL, // GL_FindTexture,
|
||||
NULL, // GL_TextureName,
|
||||
NULL, // GL_TextureData,
|
||||
NULL, // GL_LoadTexture,
|
||||
NULL, // GL_CreateTexture,
|
||||
NULL, // GL_LoadTextureArray,
|
||||
NULL, // GL_CreateTextureArray,
|
||||
NULL, // GL_FreeTexture,
|
||||
NULL, // DrawSingleDecal,
|
||||
NULL, // R_DecalSetupVerts,
|
||||
NULL, // R_EntityRemoveDecals,
|
||||
(void*)AVI_LoadVideo,
|
||||
(void*)AVI_GetVideoInfo,
|
||||
(void*)AVI_GetVideoFrameNumber,
|
||||
(void*)AVI_GetVideoFrame,
|
||||
NULL, // R_UploadStretchRaw,
|
||||
(void*)AVI_FreeVideo,
|
||||
(void*)AVI_IsActive,
|
||||
S_StreamAviSamples,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL, // GL_Bind,
|
||||
NULL, // GL_SelectTexture,
|
||||
NULL, // GL_LoadTexMatrixExt,
|
||||
NULL, // GL_LoadIdentityTexMatrix,
|
||||
NULL, // GL_CleanUpTextureUnits,
|
||||
NULL, // GL_TexGen,
|
||||
NULL, // GL_TextureTarget,
|
||||
NULL, // GL_SetTexCoordArrayMode,
|
||||
NULL, // GL_GetProcAddress,
|
||||
NULL, // GL_UpdateTexSize,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL, // CL_DrawParticlesExternal,
|
||||
R_EnvShot,
|
||||
pfnSPR_LoadExt,
|
||||
NULL, // R_LightVec,
|
||||
NULL, // R_StudioGetTexture,
|
||||
GL_GetOverviewParms,
|
||||
CL_GenericHandle,
|
||||
COM_SaveFile,
|
||||
NULL,
|
||||
R_Mem_Alloc,
|
||||
R_Mem_Free,
|
||||
pfnGetFilesList,
|
||||
pfnFileBufferCRC32,
|
||||
COM_CompareFileTime,
|
||||
Host_Error,
|
||||
(void*)CL_ModelHandle,
|
||||
pfnTime,
|
||||
Cvar_Set,
|
||||
S_FadeMusicVolume,
|
||||
COM_SetRandomSeed,
|
||||
};
|
||||
|
||||
static void R_FillRenderAPIFromRef( render_api_t *to, const ref_interface_t *from )
|
||||
{
|
||||
to->GetDetailScaleForTexture = from->GetDetailScaleForTexture;
|
||||
to->GetExtraParmsForTexture = from->GetExtraParmsForTexture;
|
||||
to->GetFrameTime = from->GetFrameTime;
|
||||
to->R_SetCurrentEntity = from->R_SetCurrentEntity;
|
||||
to->R_SetCurrentModel = from->R_SetCurrentModel;
|
||||
to->GL_FindTexture = from->GL_FindTexture;
|
||||
to->GL_TextureName = from->GL_TextureName;
|
||||
to->GL_TextureData = from->GL_TextureData;
|
||||
to->GL_LoadTexture = from->GL_LoadTexture;
|
||||
to->GL_CreateTexture = from->GL_CreateTexture;
|
||||
to->GL_LoadTextureArray = from->GL_LoadTextureArray;
|
||||
to->GL_CreateTextureArray = from->GL_CreateTextureArray;
|
||||
to->GL_FreeTexture = from->GL_FreeTexture;
|
||||
to->DrawSingleDecal = from->DrawSingleDecal;
|
||||
to->R_DecalSetupVerts = from->R_DecalSetupVerts;
|
||||
to->R_EntityRemoveDecals = from->R_EntityRemoveDecals;
|
||||
to->AVI_UploadRawFrame = from->AVI_UploadRawFrame;
|
||||
to->GL_Bind = from->GL_Bind;
|
||||
to->GL_SelectTexture = from->GL_SelectTexture;
|
||||
to->GL_LoadTextureMatrix = from->GL_LoadTextureMatrix;
|
||||
to->GL_TexMatrixIdentity = from->GL_TexMatrixIdentity;
|
||||
to->GL_CleanUpTextureUnits = from->GL_CleanUpTextureUnits;
|
||||
to->GL_TexGen = from->GL_TexGen;
|
||||
to->GL_TextureTarget = from->GL_TextureTarget;
|
||||
to->GL_TexCoordArrayMode = from->GL_TexCoordArrayMode;
|
||||
to->GL_UpdateTexSize = from->GL_UpdateTexSize;
|
||||
to->GL_DrawParticles = from->GL_DrawParticles;
|
||||
to->LightVec = from->LightVec;
|
||||
to->StudioGetTexture = from->StudioGetTexture;
|
||||
to->GL_GetProcAddress = from->R_GetProcAddress;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_InitRenderAPI
|
||||
|
||||
Initialize client external rendering
|
||||
===============
|
||||
*/
|
||||
qboolean R_InitRenderAPI( void )
|
||||
{
|
||||
// make sure what render functions is cleared
|
||||
memset( &clgame.drawFuncs, 0, sizeof( clgame.drawFuncs ));
|
||||
|
||||
// fill missing functions from renderer
|
||||
R_FillRenderAPIFromRef( &gRenderAPI, &ref.dllFuncs );
|
||||
|
||||
if( clgame.dllFuncs.pfnGetRenderInterface )
|
||||
{
|
||||
if( clgame.dllFuncs.pfnGetRenderInterface( CL_RENDER_INTERFACE_VERSION, &gRenderAPI, &clgame.drawFuncs ))
|
||||
{
|
||||
Con_Reportf( "CL_LoadProgs: ^2initailized extended RenderAPI ^7ver. %i\n", CL_RENDER_INTERFACE_VERSION );
|
||||
return true;
|
||||
}
|
||||
|
||||
// make sure what render functions is cleared
|
||||
memset( &clgame.drawFuncs, 0, sizeof( clgame.drawFuncs ));
|
||||
|
||||
return false; // just tell user about problems
|
||||
}
|
||||
|
||||
// render interface is missed
|
||||
return true;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user