Compare commits
601 Commits
ed-03-07-2
...
TheShuEd-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd3f222e7d | ||
|
|
1f587c10b8 | ||
|
|
22bb0ae283 | ||
|
|
c69cb0320e | ||
|
|
02c5e03ae7 | ||
|
|
cc5f27c057 | ||
|
|
fb40f8cd25 | ||
|
|
0d345c33b9 | ||
|
|
9011aab26b | ||
|
|
cf6b42d20c | ||
|
|
655b32b720 | ||
|
|
fce5269fc0 | ||
|
|
2951ea2bee | ||
|
|
79fa810b9c | ||
|
|
ab84eee083 | ||
|
|
1d55a439ff | ||
|
|
4a9bd17a86 | ||
|
|
d9286dd6d9 | ||
|
|
e1e2d26969 | ||
|
|
3a10ffa030 | ||
|
|
404743f073 | ||
|
|
925d1e3ac8 | ||
|
|
7f9e06501f | ||
|
|
255b7f3b7a | ||
|
|
093054f7e3 | ||
|
|
e3d7c1bd6e | ||
|
|
845fa31419 | ||
|
|
34a7aa70ce | ||
|
|
3283424ba8 | ||
|
|
54e42cc4e5 | ||
|
|
9bd623a927 | ||
|
|
d846a621e5 | ||
|
|
dc1be42b8f | ||
|
|
6a1efebb6a | ||
|
|
de7df2a760 | ||
|
|
f49fc5a89c | ||
|
|
f67f7034b9 | ||
|
|
b66c286ecb | ||
|
|
9f6e5e8d60 | ||
|
|
1146f2fefe | ||
|
|
b9090e84f7 | ||
|
|
45a481de47 | ||
|
|
5485ae25e0 | ||
|
|
1149290825 | ||
|
|
d5d8c14ced | ||
|
|
8f250581be | ||
|
|
e7aa7791b4 | ||
|
|
7c7f4a9f25 | ||
|
|
582e6d2010 | ||
|
|
b1d5436bcd | ||
|
|
18506e1f3b | ||
|
|
e72393df71 | ||
|
|
eab5030c39 | ||
|
|
811da0e3d6 | ||
|
|
a7fa66e956 | ||
|
|
f083d080f5 | ||
|
|
5905767ce7 | ||
|
|
a99ae6211d | ||
|
|
76096b21f1 | ||
|
|
333bb386d9 | ||
|
|
4e1fe975ec | ||
|
|
44199991bf | ||
|
|
af47cbd7b0 | ||
|
|
d5236d8236 | ||
|
|
ff581d4275 | ||
|
|
0a07203121 | ||
|
|
818f43b005 | ||
|
|
d1663cade4 | ||
|
|
769967ac36 | ||
|
|
6f7719011a | ||
|
|
e161a021c4 | ||
|
|
2a7883b92e | ||
|
|
7388b91ef5 | ||
|
|
6f2e1d6d9f | ||
|
|
e95aaef839 | ||
|
|
bcd7a7ad00 | ||
|
|
f56e4f6624 | ||
|
|
99854edc93 | ||
|
|
50ba20c766 | ||
|
|
8de6b74e08 | ||
|
|
2d124c5c29 | ||
|
|
61efd1201e | ||
|
|
b0cc97fb04 | ||
|
|
0d12ce54d4 | ||
|
|
8f6326c3e0 | ||
|
|
b6811d3570 | ||
|
|
06d136698c | ||
|
|
50e042011d | ||
|
|
54e760088a | ||
|
|
620aed5939 | ||
|
|
f210325460 | ||
|
|
9def96d762 | ||
|
|
687e2c5844 | ||
|
|
bd4020bdfc | ||
|
|
ee641c2dff | ||
|
|
4536a527df | ||
|
|
492fb529df | ||
|
|
aa886ca494 | ||
|
|
08f1aa9fa1 | ||
|
|
bb20f3a1bc | ||
|
|
c4dcc90972 | ||
|
|
688a46f903 | ||
|
|
9c84ce9be0 | ||
|
|
343496faf8 | ||
|
|
fc0954085f | ||
|
|
8b27ef8a78 | ||
|
|
bf93349b73 | ||
|
|
e1f3bdc748 | ||
|
|
4f8b634f38 | ||
|
|
a32f9ff711 | ||
|
|
c5a6f75def | ||
|
|
8c477a67c1 | ||
|
|
3b5e0003c3 | ||
|
|
ea753e5227 | ||
|
|
ec071ceca7 | ||
|
|
7381df4335 | ||
|
|
e7aa97645b | ||
|
|
3187006641 | ||
|
|
526238bac5 | ||
|
|
f348213750 | ||
|
|
ed3e896cb8 | ||
|
|
0190e366a3 | ||
|
|
9826b9ff38 | ||
|
|
86b746217d | ||
|
|
17d0e6326e | ||
|
|
ab8655040b | ||
|
|
f71dffb746 | ||
|
|
2367085160 | ||
|
|
918709cb47 | ||
|
|
e806655c9d | ||
|
|
4ff34458cf | ||
|
|
629cd432b9 | ||
|
|
1f29a5ad36 | ||
|
|
9f1b4fc51c | ||
|
|
046aa54d0d | ||
|
|
eb861d173f | ||
|
|
99c3341dc9 | ||
|
|
3ab6d5daff | ||
|
|
d65c78746e | ||
|
|
2d4aaa414f | ||
|
|
851a0e15a7 | ||
|
|
768aeb28ec | ||
|
|
8376881cdf | ||
|
|
064b52a5ed | ||
|
|
e039e92016 | ||
|
|
6bd1604194 | ||
|
|
88cc6753ea | ||
|
|
99492e3e3f | ||
|
|
65f9cc3155 | ||
|
|
bf1450fdc8 | ||
|
|
61fd8167e0 | ||
|
|
fee5cc25ce | ||
|
|
a81465f0d9 | ||
|
|
b6f3545c8c | ||
|
|
d8433a8f86 | ||
|
|
cac867fa6d | ||
|
|
159a7413a7 | ||
|
|
1c43f85ffe | ||
|
|
edd9bb6e74 | ||
|
|
183d26f001 | ||
|
|
9bc9b6b696 | ||
|
|
28c8eba330 | ||
|
|
cb3c6b555a | ||
|
|
1aa2410f4e | ||
|
|
f91a642428 | ||
|
|
4e34fb66ec | ||
|
|
395b296d68 | ||
|
|
1fa91e2785 | ||
|
|
4eed2fd973 | ||
|
|
290542534a | ||
|
|
a0aafdfedd | ||
|
|
4a6a76fc06 | ||
|
|
f8428d636d | ||
|
|
05e676fb98 | ||
|
|
5cef8ca104 | ||
|
|
faeb3f1b91 | ||
|
|
177112b216 | ||
|
|
73024fc69f | ||
|
|
1e89c07573 | ||
|
|
88b6b457df | ||
|
|
fda3af5030 | ||
|
|
b66afb572e | ||
|
|
d5bdada430 | ||
|
|
3e3cfdb948 | ||
|
|
d1ecd84972 | ||
|
|
1119bc01cf | ||
|
|
06654c3158 | ||
|
|
aded74a88a | ||
|
|
bd302a0ee9 | ||
|
|
c407f7c473 | ||
|
|
ddc3e3110e | ||
|
|
fcf8943c82 | ||
|
|
644736b382 | ||
|
|
c7ff647cb3 | ||
|
|
564199f0c7 | ||
|
|
ac53e1d0a0 | ||
|
|
56de41e8a7 | ||
|
|
0cb86d7aae | ||
|
|
17be5c9782 | ||
|
|
673cd8accd | ||
|
|
ee2e94a204 | ||
|
|
354228c4b9 | ||
|
|
40a73db91f | ||
|
|
e77ebaf325 | ||
|
|
170c070443 | ||
|
|
c8725825be | ||
|
|
c22906205e | ||
|
|
b41c6a28fe | ||
|
|
5cb0442b75 | ||
|
|
aca878c9f7 | ||
|
|
2c8dd58ad8 | ||
|
|
b4ec629b9f | ||
|
|
6bbbba5702 | ||
|
|
6c6ae35cf8 | ||
|
|
b0c4c45bc5 | ||
|
|
0b5fe2a9ac | ||
|
|
edb05e36bb | ||
|
|
87e52e50b4 | ||
|
|
6b57cf2020 | ||
|
|
cb0ba66be3 | ||
|
|
6d664c9157 | ||
|
|
c89186a26f | ||
|
|
297baaca23 | ||
|
|
1208928564 | ||
|
|
3a30eea640 | ||
|
|
53eb9421c2 | ||
|
|
8d5792efd7 | ||
|
|
0cbc2e8d43 | ||
|
|
4997f92e18 | ||
|
|
cbf329a82d | ||
|
|
4aba9ec131 | ||
|
|
1783e0e4c2 | ||
|
|
b04f98513c | ||
|
|
8be13bf495 | ||
|
|
6972bc26a7 | ||
|
|
78f3ffc2a4 | ||
|
|
a2b021dffb | ||
|
|
7683acab5e | ||
|
|
aedf52f8ec | ||
|
|
e6b171645c | ||
|
|
93eeab2d10 | ||
|
|
5dfca4c2dc | ||
|
|
3c7d14ad50 | ||
|
|
f2b9cd7a25 | ||
|
|
58e5a7a668 | ||
|
|
eaace152ae | ||
|
|
e7911c3720 | ||
|
|
93dc22b67d | ||
|
|
c4b6917cfc | ||
|
|
b8ee458188 | ||
|
|
a7f1dfaec4 | ||
|
|
ca843bd84a | ||
|
|
c8a90a74c0 | ||
|
|
d6e0114126 | ||
|
|
6005a9f4cb | ||
|
|
56ee4da535 | ||
|
|
6d18dff33d | ||
|
|
b57174007c | ||
|
|
84fe6bcde4 | ||
|
|
d30b45f23f | ||
|
|
3ef5f521e2 | ||
|
|
0c2b569622 | ||
|
|
2fb2cde125 | ||
|
|
2bf17fdc35 | ||
|
|
dec6a1c2ca | ||
|
|
437fc936a2 | ||
|
|
a94f1f0fe0 | ||
|
|
77b1113d5d | ||
|
|
73111b5170 | ||
|
|
58a2a4c932 | ||
|
|
961a553fa2 | ||
|
|
d7b2e72882 | ||
|
|
3f014e84eb | ||
|
|
95b56ad4ce | ||
|
|
c7ea0490a6 | ||
|
|
e1f429b6b3 | ||
|
|
2d5bb92f46 | ||
|
|
ef02f8c18c | ||
|
|
eba7d2de0d | ||
|
|
fb7ca28b9a | ||
|
|
02275a0237 | ||
|
|
6f5077803b | ||
|
|
be9acaea35 | ||
|
|
ba2c5fcded | ||
|
|
b20fd4fbd0 | ||
|
|
0e02c50548 | ||
|
|
6443c53a8c | ||
|
|
1ac7739564 | ||
|
|
1fd8369a9c | ||
|
|
d8ab4982ad | ||
|
|
11320f4d2c | ||
|
|
13bec7a0e9 | ||
|
|
8d99961a00 | ||
|
|
8db252e7dc | ||
|
|
21d48ca5c4 | ||
|
|
93e4bfcfb3 | ||
|
|
db3f304f4b | ||
|
|
2e3d2db97e | ||
|
|
927cf7799f | ||
|
|
911a94dba9 | ||
|
|
8cbd26ae2f | ||
|
|
2de26baebd | ||
|
|
c69fff0bb9 | ||
|
|
09a05955d7 | ||
|
|
33a303236c | ||
|
|
b35539db4a | ||
|
|
dbc8c1b4d7 | ||
|
|
c0593fb328 | ||
|
|
eb3b2ae01a | ||
|
|
028c1ee478 | ||
|
|
b7d3964c56 | ||
|
|
17c23f11c5 | ||
|
|
3b85b1e43e | ||
|
|
35cd013e88 | ||
|
|
f6d827f5d9 | ||
|
|
b6115b672a | ||
|
|
a0052c5b09 | ||
|
|
1c74ffb8e4 | ||
|
|
7d9653fff7 | ||
|
|
f90538cca7 | ||
|
|
07535e8ecf | ||
|
|
4f479b6c85 | ||
|
|
919b3ac9e6 | ||
|
|
011250f35e | ||
|
|
960cc806cc | ||
|
|
bdf7293cfb | ||
|
|
922be64290 | ||
|
|
5d1702d280 | ||
|
|
68982953f3 | ||
|
|
87467a358b | ||
|
|
a06309b964 | ||
|
|
85fba9809a | ||
|
|
f687124312 | ||
|
|
b7aa97e203 | ||
|
|
a03b88979e | ||
|
|
c1915c9d73 | ||
|
|
5e800e0ece | ||
|
|
bf4ef62ab3 | ||
|
|
dcb3443b35 | ||
|
|
22a9290c5b | ||
|
|
1b0c434a9f | ||
|
|
87c82ff114 | ||
|
|
6c1d1057d5 | ||
|
|
ac768fe9f1 | ||
|
|
87f7ea8aa9 | ||
|
|
044d84142c | ||
|
|
eb4ce85354 | ||
|
|
49096cf14f | ||
|
|
361ec59412 | ||
|
|
f969fd2bfb | ||
|
|
cb98b659ad | ||
|
|
7b590122b6 | ||
|
|
87fa6075b6 | ||
|
|
3388c0dcaa | ||
|
|
de2ab29f34 | ||
|
|
e11f1e6cf6 | ||
|
|
3acc100ae5 | ||
|
|
b94b52396e | ||
|
|
1b360ac914 | ||
|
|
55a50d0426 | ||
|
|
162348e02d | ||
|
|
8ed9ea1586 | ||
|
|
5fa0844f3c | ||
|
|
a1000587cf | ||
|
|
2e694f109d | ||
|
|
97aa8ff701 | ||
|
|
c94c72785d | ||
|
|
e3697c6fda | ||
|
|
a314a967c2 | ||
|
|
3ee7d7bc35 | ||
|
|
7ce3a1f27f | ||
|
|
caf8776d07 | ||
|
|
560df6ed97 | ||
|
|
4f24b30b22 | ||
|
|
2ef4402068 | ||
|
|
0931c9e7d1 | ||
|
|
b5e49c9c07 | ||
|
|
f53d0143ae | ||
|
|
a8cae6f3e6 | ||
|
|
160364e100 | ||
|
|
b6672f087f | ||
|
|
65ccd6e033 | ||
|
|
00ec83af0f | ||
|
|
f125dda677 | ||
|
|
3a9b1eaa16 | ||
|
|
cd90b414df | ||
|
|
00a2c6a234 | ||
|
|
e87994ae40 | ||
|
|
4945e6a61c | ||
|
|
e3bb2771d6 | ||
|
|
8fd35e8e44 | ||
|
|
bb67364900 | ||
|
|
9a17154d83 | ||
|
|
03f0257ae9 | ||
|
|
e6f55fafb4 | ||
|
|
02636386b5 | ||
|
|
e45f55e36d | ||
|
|
1a50760e67 | ||
|
|
1ea7e3e71f | ||
|
|
eae04129cf | ||
|
|
3ebfe468ca | ||
|
|
19a06b6cc0 | ||
|
|
6371a04621 | ||
|
|
e01af4d602 | ||
|
|
4d4f67132c | ||
|
|
24a2866747 | ||
|
|
8340686078 | ||
|
|
adcbe8d0be | ||
|
|
2df65f10f5 | ||
|
|
b014d4d0e0 | ||
|
|
939f0f4b27 | ||
|
|
6f6bc38a55 | ||
|
|
ee59ae91ec | ||
|
|
8aecd663f8 | ||
|
|
a5ec01792b | ||
|
|
91740ef5be | ||
|
|
56fb8c832e | ||
|
|
a1f2df0b2c | ||
|
|
e8b3042a38 | ||
|
|
8d48096c57 | ||
|
|
a0165773a4 | ||
|
|
3f2793c179 | ||
|
|
eef6f92012 | ||
|
|
d3642c7383 | ||
|
|
c57009b646 | ||
|
|
7a66da31c7 | ||
|
|
d3495fc51c | ||
|
|
93197b6cce | ||
|
|
edf8c6cb4a | ||
|
|
2349fb485e | ||
|
|
742290c606 | ||
|
|
bb82b4cd6f | ||
|
|
1ac9ec85c5 | ||
|
|
82f1ed1493 | ||
|
|
49128ba9d3 | ||
|
|
b511d8e180 | ||
|
|
c9be1ef96b | ||
|
|
245c99cc78 | ||
|
|
8c598799b4 | ||
|
|
62d8665484 | ||
|
|
7bf77beb9e | ||
|
|
7e087a6eb8 | ||
|
|
04cb2657bf | ||
|
|
f3342c5155 | ||
|
|
061ec432ff | ||
|
|
74d9ac7241 | ||
|
|
ba03872c57 | ||
|
|
9bf3c33cca | ||
|
|
08b12f34b3 | ||
|
|
8bd8787819 | ||
|
|
8dde49db95 | ||
|
|
c7f752dc96 | ||
|
|
f12b395f2a | ||
|
|
149b6a89ca | ||
|
|
40f735acb1 | ||
|
|
f42546e0c6 | ||
|
|
451d04d759 | ||
|
|
d6c4ebdd37 | ||
|
|
92e2980534 | ||
|
|
c8a87ceaab | ||
|
|
f6d093ef5c | ||
|
|
8c3e72c8c8 | ||
|
|
5ae2590667 | ||
|
|
eab93cb09e | ||
|
|
04249e8682 | ||
|
|
ed7f00692e | ||
|
|
21d0f85cc2 | ||
|
|
ff93070d25 | ||
|
|
70b56136aa | ||
|
|
437f6f451a | ||
|
|
13b84870ec | ||
|
|
71b7dddb59 | ||
|
|
0e9ed36b85 | ||
|
|
063c5de985 | ||
|
|
f50488d7e3 | ||
|
|
c9c721be16 | ||
|
|
8e1547e616 | ||
|
|
20d6ccffdb | ||
|
|
336f264c77 | ||
|
|
23887d5bd9 | ||
|
|
d9be666e8a | ||
|
|
18df27d8e7 | ||
|
|
0098d71717 | ||
|
|
60ef7848fb | ||
|
|
fa6d6806d1 | ||
|
|
5cd7cf182a | ||
|
|
b6d6e2de8c | ||
|
|
b4b63ed898 | ||
|
|
d9ed4a63df | ||
|
|
f8b6bc7243 | ||
|
|
205aae364c | ||
|
|
b418338af7 | ||
|
|
34f36665a6 | ||
|
|
7ae3e353ea | ||
|
|
7b99d1f851 | ||
|
|
12edad89e8 | ||
|
|
4c5c6a84dc | ||
|
|
84ff5e334b | ||
|
|
24c47c805d | ||
|
|
11034a0986 | ||
|
|
b0ae7d5725 | ||
|
|
cc9e5f68da | ||
|
|
ead0c375f6 | ||
|
|
8adcb37964 | ||
|
|
01f97a8aaa | ||
|
|
d9fc93e0c5 | ||
|
|
3182447fbf | ||
|
|
8e05e1cfed | ||
|
|
bc7c121713 | ||
|
|
9280ca8830 | ||
|
|
b7e2d66557 | ||
|
|
a9cb687899 | ||
|
|
b1a2aaf1f5 | ||
|
|
bd011bf418 | ||
|
|
38cd8ad6a1 | ||
|
|
96ff998d18 | ||
|
|
fb9c03186c | ||
|
|
2cf42bf7a4 | ||
|
|
8d015f5c9f | ||
|
|
bc7907728c | ||
|
|
1471bd5b53 | ||
|
|
acf186490c | ||
|
|
2988ac3839 | ||
|
|
97d39e0c28 | ||
|
|
3e3e050aaf | ||
|
|
223ade9b3f | ||
|
|
0d80021433 | ||
|
|
62fcb6bd96 | ||
|
|
406cf7adcd | ||
|
|
48ae8ce0a8 | ||
|
|
143151f284 | ||
|
|
9120f5fada | ||
|
|
e612ccda92 | ||
|
|
5198c87597 | ||
|
|
5c1aa578ef | ||
|
|
54c659f4aa | ||
|
|
ac87f7a977 | ||
|
|
833320a34a | ||
|
|
a981f99b06 | ||
|
|
7477b7c869 | ||
|
|
a2f99cc69e | ||
|
|
d54d27cda4 | ||
|
|
1faa1b5df6 | ||
|
|
a2a3233f5e | ||
|
|
a05d05088e | ||
|
|
347bed8be5 | ||
|
|
c6d718d126 | ||
|
|
ae4cff4982 | ||
|
|
7defc4b87d | ||
|
|
7b3140fbb3 | ||
|
|
c56f495cf1 | ||
|
|
cfc0247e5c | ||
|
|
58d46ddd46 | ||
|
|
4ec15c84fa | ||
|
|
542e1db913 | ||
|
|
59ce9e6dc7 | ||
|
|
95f76efd80 | ||
|
|
d89ea4dac7 | ||
|
|
c0a1e6ea15 | ||
|
|
2a6b7dbaf9 | ||
|
|
5c8962823e | ||
|
|
daae8253c6 | ||
|
|
763a25e934 | ||
|
|
cab2ea757d | ||
|
|
b565258f12 | ||
|
|
2f1bc7ab93 | ||
|
|
340332cf5b | ||
|
|
854762092d | ||
|
|
fe7dbb42b3 | ||
|
|
ed2789a0e4 | ||
|
|
732489ee4a | ||
|
|
ca87fb8bc5 | ||
|
|
e0697763f8 | ||
|
|
7032499e2a | ||
|
|
cb87787ffb | ||
|
|
b6cf2ce524 | ||
|
|
5543689c14 | ||
|
|
a5ccf97a64 | ||
|
|
7555952738 | ||
|
|
195a1c1810 | ||
|
|
84282ca016 | ||
|
|
4039488654 | ||
|
|
a3db80af04 | ||
|
|
7140d01336 | ||
|
|
a029925818 | ||
|
|
162913ccd0 | ||
|
|
f6bb10503f | ||
|
|
af1acf6e60 | ||
|
|
379013a5da | ||
|
|
881f3e4255 | ||
|
|
715e027183 | ||
|
|
f4c7339870 | ||
|
|
ab268b6e77 | ||
|
|
7e2157fbed | ||
|
|
de50a985b4 | ||
|
|
fb1740f208 | ||
|
|
b426d87d82 | ||
|
|
c8bb4e961c | ||
|
|
6c7f6a425e | ||
|
|
0c9a0707ce | ||
|
|
1eb3a3e6d1 |
@@ -129,7 +129,7 @@ csharp_indent_braces = false
|
||||
csharp_indent_switch_labels = true
|
||||
|
||||
# Space preferences
|
||||
csharp_space_after_cast = true
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_after_comma = true
|
||||
csharp_space_after_dot = false
|
||||
|
||||
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -7,11 +7,11 @@
|
||||
<!-- Зачем нужно это изменение? Прикрепите любые обсуждения или проблемы здесь. Опишите, как это повлияет на текущий баланс игры. -->
|
||||
|
||||
## Media
|
||||
<!--
|
||||
<!--
|
||||
PRs which make ingame changes (adding clothing, items, new features, etc) are required to have media attached that showcase the changes.
|
||||
Small fixes/refactors are exempt.
|
||||
-->
|
||||
<!--
|
||||
<!--
|
||||
Пулл реквесты, которые несут за собой игровые изменения (добавления одежды, предметов и так далее) требуют чтобы вы прикрепили скриншоты или видеоролики, демонстрирующие эти изменения.
|
||||
Небольшие исправления не считаются.
|
||||
-->
|
||||
|
||||
8
.github/labeler.yml
vendored
8
.github/labeler.yml
vendored
@@ -5,13 +5,17 @@
|
||||
"Changes: Map":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- 'Resources/Maps/*.yml'
|
||||
- 'Resources/Prototypes/Maps/*.yml'
|
||||
- 'Resources/Maps/**/*.yml'
|
||||
- 'Resources/Prototypes/Maps/**/*.yml'
|
||||
|
||||
"Changes: UI":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: '**/*.xaml*'
|
||||
|
||||
"Changes: Shaders":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: '**/*.swsl'
|
||||
|
||||
"No C#":
|
||||
- changed-files:
|
||||
# Equiv to any-glob-to-all as long as this has one matcher. If ALL changed files are not C# files, then apply label.
|
||||
|
||||
42
.github/workflows/publish.yml
vendored
42
.github/workflows/publish.yml
vendored
@@ -41,31 +41,22 @@ jobs:
|
||||
- name: Package client
|
||||
run: dotnet run --project Content.Packaging client --no-wipe-release
|
||||
|
||||
- name: Update Build Info
|
||||
run: Tools/gen_build_info.py
|
||||
|
||||
- name: Shuffle files around
|
||||
run: |
|
||||
mkdir "release/${{ github.sha }}"
|
||||
mv release/*.zip "release/${{ github.sha }}"
|
||||
|
||||
- name: Upload files to centcomm
|
||||
uses: appleboy/scp-action@master
|
||||
- name: Upload build artifact
|
||||
id: artifact-upload-step
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
host: centcomm.spacestation14.io
|
||||
username: wizards-build-push
|
||||
key: ${{ secrets.CENTCOMM_WIZARDS_BUILDS_PUSH_KEY }}
|
||||
source: "release/${{ github.sha }}"
|
||||
target: "/home/wizards-build-push/builds_dir/builds/"
|
||||
strip_components: 1
|
||||
name: build
|
||||
path: release/*.zip
|
||||
compression-level: 0
|
||||
retention-days: 0
|
||||
|
||||
- name: Update manifest JSON
|
||||
uses: appleboy/ssh-action@master
|
||||
with:
|
||||
host: centcomm.spacestation14.io
|
||||
username: wizards-build-push
|
||||
key: ${{ secrets.CENTCOMM_WIZARDS_BUILDS_PUSH_KEY }}
|
||||
script: /home/wizards-build-push/push.ps1 ${{ github.sha }}
|
||||
- name: Publish version
|
||||
run: Tools/publish_github_artifact.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
|
||||
ARTIFACT_ID: ${{ steps.artifact-upload-step.outputs.artifact-id }}
|
||||
GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }}
|
||||
|
||||
- name: Publish changelog (Discord)
|
||||
run: Tools/actions_changelogs_since_last_run.py
|
||||
@@ -77,3 +68,8 @@ jobs:
|
||||
run: Tools/actions_changelog_rss.py
|
||||
env:
|
||||
CHANGELOG_RSS_KEY: ${{ secrets.CHANGELOG_RSS_KEY }}
|
||||
|
||||
- uses: geekyeggo/delete-artifact@v5
|
||||
if: always()
|
||||
with:
|
||||
name: build
|
||||
|
||||
8
.github/workflows/test-packaging.yml
vendored
8
.github/workflows/test-packaging.yml
vendored
@@ -64,11 +64,3 @@ jobs:
|
||||
|
||||
- name: Package client
|
||||
run: dotnet run --project Content.Packaging client --no-wipe-release
|
||||
|
||||
- name: Update Build Info
|
||||
run: Tools/gen_build_info.py
|
||||
|
||||
- name: Shuffle files around
|
||||
run: |
|
||||
mkdir "release/${{ github.sha }}"
|
||||
mv release/*.zip "release/${{ github.sha }}"
|
||||
|
||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"omnisharp.analyzeOpenDocumentsOnly": true,
|
||||
"dotnet.defaultSolution": "SpaceStation14.sln"
|
||||
}
|
||||
@@ -12,11 +12,18 @@ namespace Content.Client.Access.UI;
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class AccessLevelControl : GridContainer
|
||||
{
|
||||
[Dependency] private readonly ILogManager _logManager = default!;
|
||||
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
public readonly Dictionary<ProtoId<AccessLevelPrototype>, Button> ButtonsList = new();
|
||||
|
||||
public AccessLevelControl()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_sawmill = _logManager.GetSawmill("accesslevelcontrol");
|
||||
}
|
||||
|
||||
public void Populate(List<ProtoId<AccessLevelPrototype>> accessLevels, IPrototypeManager prototypeManager)
|
||||
@@ -25,7 +32,7 @@ public sealed partial class AccessLevelControl : GridContainer
|
||||
{
|
||||
if (!prototypeManager.TryIndex(access, out var accessLevel))
|
||||
{
|
||||
Logger.Error($"Unable to find accesslevel for {access}");
|
||||
_sawmill.Error($"Unable to find accesslevel for {access}");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Access;
|
||||
using Content.Shared.Access.Components;
|
||||
using Content.Shared.Access.Systems;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
using static Content.Shared.Access.Components.AccessOverriderComponent;
|
||||
|
||||
@@ -23,6 +24,28 @@ namespace Content.Client.Access.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = this.CreateWindow<AccessOverriderWindow>();
|
||||
RefreshAccess();
|
||||
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
||||
_window.OnSubmit += SubmitData;
|
||||
|
||||
_window.PrivilegedIdButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(PrivilegedIdCardSlotId));
|
||||
}
|
||||
|
||||
public override void OnProtoReload(PrototypesReloadedEventArgs args)
|
||||
{
|
||||
base.OnProtoReload(args);
|
||||
if (!args.WasModified<AccessLevelPrototype>())
|
||||
return;
|
||||
|
||||
RefreshAccess();
|
||||
|
||||
if (State != null)
|
||||
_window?.UpdateState(_prototypeManager, (AccessOverriderBoundUserInterfaceState) State);
|
||||
}
|
||||
|
||||
private void RefreshAccess()
|
||||
{
|
||||
List<ProtoId<AccessLevelPrototype>> accessLevels;
|
||||
|
||||
if (EntMan.TryGetComponent<AccessOverriderComponent>(Owner, out var accessOverrider))
|
||||
@@ -30,38 +53,20 @@ namespace Content.Client.Access.UI
|
||||
accessLevels = accessOverrider.AccessLevels;
|
||||
accessLevels.Sort();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
accessLevels = new List<ProtoId<AccessLevelPrototype>>();
|
||||
_accessOverriderSystem.Log.Error($"No AccessOverrider component found for {EntMan.ToPrettyString(Owner)}!");
|
||||
}
|
||||
|
||||
_window = new AccessOverriderWindow(this, _prototypeManager, accessLevels)
|
||||
{
|
||||
Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName
|
||||
};
|
||||
|
||||
_window.PrivilegedIdButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(PrivilegedIdCardSlotId));
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_window?.Dispose();
|
||||
_window?.SetAccessLevels(_prototypeManager, accessLevels);
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
{
|
||||
base.UpdateState(state);
|
||||
var castState = (AccessOverriderBoundUserInterfaceState) state;
|
||||
_window?.UpdateState(castState);
|
||||
_window?.UpdateState(_prototypeManager, castState);
|
||||
}
|
||||
|
||||
public void SubmitData(List<ProtoId<AccessLevelPrototype>> newAccessList)
|
||||
|
||||
@@ -13,26 +13,24 @@ namespace Content.Client.Access.UI
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class AccessOverriderWindow : DefaultWindow
|
||||
{
|
||||
[Dependency] private readonly ILogManager _logManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
private readonly AccessOverriderBoundUserInterface _owner;
|
||||
private readonly Dictionary<string, Button> _accessButtons = new();
|
||||
|
||||
public AccessOverriderWindow(AccessOverriderBoundUserInterface owner, IPrototypeManager prototypeManager,
|
||||
List<ProtoId<AccessLevelPrototype>> accessLevels)
|
||||
public event Action<List<ProtoId<AccessLevelPrototype>>>? OnSubmit;
|
||||
|
||||
public AccessOverriderWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
var logMill = _logManager.GetSawmill(SharedAccessOverriderSystem.Sawmill);
|
||||
}
|
||||
|
||||
_owner = owner;
|
||||
public void SetAccessLevels(IPrototypeManager protoManager, List<ProtoId<AccessLevelPrototype>> accessLevels)
|
||||
{
|
||||
_accessButtons.Clear();
|
||||
AccessLevelGrid.DisposeAllChildren();
|
||||
|
||||
foreach (var access in accessLevels)
|
||||
{
|
||||
if (!prototypeManager.TryIndex(access, out var accessLevel))
|
||||
if (!protoManager.TryIndex(access, out var accessLevel))
|
||||
{
|
||||
logMill.Error($"Unable to find accesslevel for {access}");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -44,11 +42,16 @@ namespace Content.Client.Access.UI
|
||||
|
||||
AccessLevelGrid.AddChild(newButton);
|
||||
_accessButtons.Add(accessLevel.ID, newButton);
|
||||
newButton.OnPressed += _ => SubmitData();
|
||||
newButton.OnPressed += _ =>
|
||||
{
|
||||
OnSubmit?.Invoke(
|
||||
// Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair
|
||||
_accessButtons.Where(x => x.Value.Pressed).Select(x => new ProtoId<AccessLevelPrototype>(x.Key)).ToList());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateState(AccessOverriderBoundUserInterfaceState state)
|
||||
public void UpdateState(IPrototypeManager protoManager, AccessOverriderBoundUserInterfaceState state)
|
||||
{
|
||||
PrivilegedIdLabel.Text = state.PrivilegedIdName;
|
||||
PrivilegedIdButton.Text = state.IsPrivilegedIdPresent
|
||||
@@ -66,11 +69,11 @@ namespace Content.Client.Access.UI
|
||||
|
||||
if (state.MissingPrivilegesList != null && state.MissingPrivilegesList.Any())
|
||||
{
|
||||
List<string> missingPrivileges = new List<string>();
|
||||
var missingPrivileges = new List<string>();
|
||||
|
||||
foreach (string tag in state.MissingPrivilegesList)
|
||||
{
|
||||
string privilege = Loc.GetString(_prototypeManager.Index<AccessLevelPrototype>(tag)?.Name ?? "generic-unknown");
|
||||
var privilege = Loc.GetString(protoManager.Index<AccessLevelPrototype>(tag)?.Name ?? "generic-unknown");
|
||||
missingPrivileges.Add(privilege);
|
||||
}
|
||||
|
||||
@@ -90,13 +93,5 @@ namespace Content.Client.Access.UI
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SubmitData()
|
||||
{
|
||||
_owner.SubmitData(
|
||||
|
||||
// Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair
|
||||
_accessButtons.Where(x => x.Value.Pressed).Select(x => new ProtoId<AccessLevelPrototype>(x.Key)).ToList());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Shared.Access.Systems;
|
||||
using Content.Shared.StatusIcon;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Access.UI
|
||||
@@ -20,16 +21,11 @@ namespace Content.Client.Access.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window?.Dispose();
|
||||
_window = new AgentIDCardWindow(this);
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
_window = this.CreateWindow<AgentIDCardWindow>();
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window.OnNameChanged += OnNameChanged;
|
||||
_window.OnJobChanged += OnJobChanged;
|
||||
_window.OnJobIconChanged += OnJobIconChanged;
|
||||
}
|
||||
|
||||
private void OnNameChanged(string newName)
|
||||
@@ -61,14 +57,5 @@ namespace Content.Client.Access.UI
|
||||
_window.SetCurrentJob(cast.CurrentJob);
|
||||
_window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,19 +17,19 @@ namespace Content.Client.Access.UI
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IEntitySystemManager _entitySystem = default!;
|
||||
private readonly SpriteSystem _spriteSystem;
|
||||
private readonly AgentIDCardBoundUserInterface _bui;
|
||||
|
||||
private const int JobIconColumnCount = 10;
|
||||
|
||||
public event Action<string>? OnNameChanged;
|
||||
public event Action<string>? OnJobChanged;
|
||||
|
||||
public AgentIDCardWindow(AgentIDCardBoundUserInterface bui)
|
||||
public event Action<ProtoId<StatusIconPrototype>>? OnJobIconChanged;
|
||||
|
||||
public AgentIDCardWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
_spriteSystem = _entitySystem.GetEntitySystem<SpriteSystem>();
|
||||
_bui = bui;
|
||||
|
||||
NameLineEdit.OnTextEntered += e => OnNameChanged?.Invoke(e.Text);
|
||||
NameLineEdit.OnFocusExit += e => OnNameChanged?.Invoke(e.Text);
|
||||
@@ -67,7 +67,7 @@ namespace Content.Client.Access.UI
|
||||
};
|
||||
|
||||
// Generate buttons textures
|
||||
TextureRect jobIconTexture = new TextureRect
|
||||
var jobIconTexture = new TextureRect
|
||||
{
|
||||
Texture = _spriteSystem.Frame0(jobIcon.Icon),
|
||||
TextureScale = new Vector2(2.5f, 2.5f),
|
||||
@@ -75,7 +75,7 @@ namespace Content.Client.Access.UI
|
||||
};
|
||||
|
||||
jobIconButton.AddChild(jobIconTexture);
|
||||
jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIconId);
|
||||
jobIconButton.OnPressed += _ => OnJobIconChanged?.Invoke(jobIcon.ID);
|
||||
IconGrid.AddChild(jobIconButton);
|
||||
|
||||
if (jobIconId.Equals(currentJobIconId))
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace Content.Client.Actions
|
||||
UpdateAction(uid, component);
|
||||
}
|
||||
|
||||
protected override void UpdateAction(EntityUid? actionId, BaseActionComponent? action = null)
|
||||
public override void UpdateAction(EntityUid? actionId, BaseActionComponent? action = null)
|
||||
{
|
||||
if (!ResolveActionData(actionId, ref action))
|
||||
return;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Client.Stylesheets;
|
||||
using Content.Client.Stylesheets;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Shared.Timing;
|
||||
using Robust.Shared.Utility;
|
||||
@@ -77,9 +77,12 @@ namespace Content.Client.Actions.UI
|
||||
MaxWidth = TooltipTextMaxWidth,
|
||||
StyleClasses = {StyleNano.StyleClassTooltipActionRequirements}
|
||||
};
|
||||
requiresLabel.SetMessage(FormattedMessage.FromMarkup("[color=#635c5c]" +
|
||||
requires +
|
||||
"[/color]"));
|
||||
|
||||
if (!FormattedMessage.TryFromMarkup("[color=#635c5c]" + requires + "[/color]", out var markup))
|
||||
return;
|
||||
|
||||
requiresLabel.SetMessage(markup);
|
||||
|
||||
vbox.AddChild(requiresLabel);
|
||||
}
|
||||
}
|
||||
@@ -97,8 +100,11 @@ namespace Content.Client.Actions.UI
|
||||
if (timeLeft > TimeSpan.Zero)
|
||||
{
|
||||
var duration = Cooldown.Value.End - Cooldown.Value.Start;
|
||||
_cooldownLabel.SetMessage(FormattedMessage.FromMarkup(
|
||||
$"[color=#a10505]{(int) duration.TotalSeconds} sec cooldown ({(int) timeLeft.TotalSeconds + 1} sec remaining)[/color]"));
|
||||
|
||||
if (!FormattedMessage.TryFromMarkup($"[color=#a10505]{(int) duration.TotalSeconds} sec cooldown ({(int) timeLeft.TotalSeconds + 1} sec remaining)[/color]", out var markup))
|
||||
return;
|
||||
|
||||
_cooldownLabel.SetMessage(markup);
|
||||
_cooldownLabel.Visible = true;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<Popup xmlns="https://spacestation14.io"
|
||||
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
|
||||
<PanelContainer StyleClasses="BackgroundDark">
|
||||
<PanelContainer>
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BorderThickness="1" BorderColor="#18181B"/>
|
||||
<gfx:StyleBoxFlat BorderThickness="2" BorderColor="#18181B" BackgroundColor="#25252a"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Orientation="Vertical" Margin="4 4 4 4">
|
||||
<Label Name="PlayerNameLabel"/>
|
||||
<Label Name="IdLabel"/>
|
||||
<Label Name="TypeLabel"/>
|
||||
|
||||
@@ -14,7 +14,6 @@ namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
|
||||
public sealed partial class ObjectsTab : Control
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
private readonly Color _altColor = Color.FromHex("#292B38");
|
||||
private readonly Color _defaultColor = Color.FromHex("#2F2F3B");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Ame.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Ame.UI
|
||||
{
|
||||
@@ -16,9 +17,8 @@ namespace Content.Client.Ame.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new AmeWindow(this);
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
_window = this.CreateWindow<AmeWindow>();
|
||||
_window.OnAmeButton += ButtonPressed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -40,15 +40,5 @@ namespace Content.Client.Ame.UI
|
||||
{
|
||||
SendMessage(new UiButtonPressedMessage(button));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Shared.Ame.Components;
|
||||
using Robust.Client.AutoGenerated;
|
||||
@@ -9,15 +10,17 @@ namespace Content.Client.Ame.UI
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class AmeWindow : DefaultWindow
|
||||
{
|
||||
public AmeWindow(AmeControllerBoundUserInterface ui)
|
||||
public event Action<UiButton>? OnAmeButton;
|
||||
|
||||
public AmeWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
EjectButton.OnPressed += _ => ui.ButtonPressed(UiButton.Eject);
|
||||
ToggleInjection.OnPressed += _ => ui.ButtonPressed(UiButton.ToggleInjection);
|
||||
IncreaseFuelButton.OnPressed += _ => ui.ButtonPressed(UiButton.IncreaseFuel);
|
||||
DecreaseFuelButton.OnPressed += _ => ui.ButtonPressed(UiButton.DecreaseFuel);
|
||||
EjectButton.OnPressed += _ => OnAmeButton?.Invoke(UiButton.Eject);
|
||||
ToggleInjection.OnPressed += _ => OnAmeButton?.Invoke(UiButton.ToggleInjection);
|
||||
IncreaseFuelButton.OnPressed += _ => OnAmeButton?.Invoke(UiButton.IncreaseFuel);
|
||||
DecreaseFuelButton.OnPressed += _ => OnAmeButton?.Invoke(UiButton.DecreaseFuel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -29,7 +32,7 @@ namespace Content.Client.Ame.UI
|
||||
var castState = (AmeControllerBoundUserInterfaceState) state;
|
||||
|
||||
// Disable all buttons if not powered
|
||||
if (Contents.Children != null)
|
||||
if (Contents.Children.Any())
|
||||
{
|
||||
ButtonHelpers.SetButtonDisabledRecursive(Contents, !castState.HasPower);
|
||||
EjectButton.Disabled = false;
|
||||
@@ -65,8 +68,8 @@ namespace Content.Client.Ame.UI
|
||||
CoreCount.Text = $"{castState.CoreCount}";
|
||||
InjectionAmount.Text = $"{castState.InjectionAmount}";
|
||||
// format power statistics to pretty numbers
|
||||
CurrentPowerSupply.Text = $"{castState.CurrentPowerSupply.ToString("N1")}";
|
||||
TargetedPowerSupply.Text = $"{castState.TargetedPowerSupply.ToString("N1")}";
|
||||
CurrentPowerSupply.Text = $"{castState.CurrentPowerSupply:N1}";
|
||||
TargetedPowerSupply.Text = $"{castState.TargetedPowerSupply:N1}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Anomaly;
|
||||
using Content.Shared.Gravity;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Anomaly.Ui;
|
||||
|
||||
@@ -18,10 +19,8 @@ public sealed class AnomalyGeneratorBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new(Owner);
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<AnomalyGeneratorWindow>();
|
||||
_window.SetEntity(Owner);
|
||||
|
||||
_window.OnGenerateButtonPressed += () =>
|
||||
{
|
||||
@@ -37,18 +36,5 @@ public sealed class AnomalyGeneratorBoundUserInterface : BoundUserInterface
|
||||
return;
|
||||
_window?.UpdateState(msg);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
|
||||
public void SetPowerSwitch(bool on)
|
||||
{
|
||||
SendMessage(new SharedGravityGeneratorComponent.SwitchGeneratorMessage(on));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,17 +18,21 @@ public sealed partial class AnomalyGeneratorWindow : FancyWindow
|
||||
|
||||
public Action? OnGenerateButtonPressed;
|
||||
|
||||
public AnomalyGeneratorWindow(EntityUid gen)
|
||||
public AnomalyGeneratorWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
EntityView.SetEntity(gen);
|
||||
EntityView.SpriteOffset = false;
|
||||
|
||||
GenerateButton.OnPressed += _ => OnGenerateButtonPressed?.Invoke();
|
||||
}
|
||||
|
||||
public void SetEntity(EntityUid uid)
|
||||
{
|
||||
EntityView.SetEntity(uid);
|
||||
}
|
||||
|
||||
public void UpdateState(AnomalyGeneratorUserInterfaceState state)
|
||||
{
|
||||
_cooldownEnd = state.CooldownEndTime;
|
||||
|
||||
@@ -28,8 +28,6 @@ namespace Content.Client.Arcade
|
||||
|
||||
private static readonly Vector2 BlockSize = new(15, 15);
|
||||
|
||||
private readonly BlockGameBoundUserInterface _owner;
|
||||
|
||||
private readonly PanelContainer _mainPanel;
|
||||
|
||||
private readonly BoxContainer _gameRootContainer;
|
||||
@@ -58,10 +56,11 @@ namespace Content.Client.Arcade
|
||||
private bool _isPlayer = false;
|
||||
private bool _gameOver = false;
|
||||
|
||||
public BlockGameMenu(BlockGameBoundUserInterface owner)
|
||||
public event Action<BlockGamePlayerAction>? OnAction;
|
||||
|
||||
public BlockGameMenu()
|
||||
{
|
||||
Title = Loc.GetString("blockgame-menu-title");
|
||||
_owner = owner;
|
||||
|
||||
MinSize = SetSize = new Vector2(410, 490);
|
||||
|
||||
@@ -176,7 +175,7 @@ namespace Content.Client.Arcade
|
||||
};
|
||||
_newGameButton.OnPressed += (e) =>
|
||||
{
|
||||
_owner.SendAction(BlockGamePlayerAction.NewGame);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.NewGame);
|
||||
};
|
||||
pauseMenuContainer.AddChild(_newGameButton);
|
||||
pauseMenuContainer.AddChild(new Control { MinSize = new Vector2(1, 10) });
|
||||
@@ -186,7 +185,10 @@ namespace Content.Client.Arcade
|
||||
Text = Loc.GetString("blockgame-menu-button-scoreboard"),
|
||||
TextAlign = Label.AlignMode.Center
|
||||
};
|
||||
_scoreBoardButton.OnPressed += (e) => _owner.SendAction(BlockGamePlayerAction.ShowHighscores);
|
||||
_scoreBoardButton.OnPressed += (e) =>
|
||||
{
|
||||
OnAction?.Invoke(BlockGamePlayerAction.ShowHighscores);
|
||||
};
|
||||
pauseMenuContainer.AddChild(_scoreBoardButton);
|
||||
_unpauseButtonMargin = new Control { MinSize = new Vector2(1, 10), Visible = false };
|
||||
pauseMenuContainer.AddChild(_unpauseButtonMargin);
|
||||
@@ -199,7 +201,7 @@ namespace Content.Client.Arcade
|
||||
};
|
||||
_unpauseButton.OnPressed += (e) =>
|
||||
{
|
||||
_owner.SendAction(BlockGamePlayerAction.Unpause);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Unpause);
|
||||
};
|
||||
pauseMenuContainer.AddChild(_unpauseButton);
|
||||
|
||||
@@ -257,7 +259,7 @@ namespace Content.Client.Arcade
|
||||
};
|
||||
_finalNewGameButton.OnPressed += (e) =>
|
||||
{
|
||||
_owner.SendAction(BlockGamePlayerAction.NewGame);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.NewGame);
|
||||
};
|
||||
gameOverMenuContainer.AddChild(_finalNewGameButton);
|
||||
|
||||
@@ -327,7 +329,10 @@ namespace Content.Client.Arcade
|
||||
Text = Loc.GetString("blockgame-menu-button-back"),
|
||||
TextAlign = Label.AlignMode.Center
|
||||
};
|
||||
_highscoreBackButton.OnPressed += (e) => _owner.SendAction(BlockGamePlayerAction.Pause);
|
||||
_highscoreBackButton.OnPressed += (e) =>
|
||||
{
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Pause);
|
||||
};
|
||||
menuContainer.AddChild(_highscoreBackButton);
|
||||
|
||||
menuInnerPanel.AddChild(menuContainer);
|
||||
@@ -375,7 +380,7 @@ namespace Content.Client.Arcade
|
||||
{
|
||||
PanelOverride = back,
|
||||
HorizontalExpand = true,
|
||||
SizeFlagsStretchRatio = 60
|
||||
SizeFlagsStretchRatio = 34.25f
|
||||
};
|
||||
var backgroundPanel = new PanelContainer
|
||||
{
|
||||
@@ -473,7 +478,7 @@ namespace Content.Client.Arcade
|
||||
|
||||
private void TryPause()
|
||||
{
|
||||
_owner.SendAction(BlockGamePlayerAction.Pause);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Pause);
|
||||
}
|
||||
|
||||
public void SetStarted()
|
||||
@@ -576,19 +581,19 @@ namespace Content.Client.Arcade
|
||||
return;
|
||||
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeLeft)
|
||||
_owner.SendAction(BlockGamePlayerAction.StartLeft);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.StartLeft);
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeRight)
|
||||
_owner.SendAction(BlockGamePlayerAction.StartRight);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.StartRight);
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeUp)
|
||||
_owner.SendAction(BlockGamePlayerAction.Rotate);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Rotate);
|
||||
else if (args.Function == ContentKeyFunctions.Arcade3)
|
||||
_owner.SendAction(BlockGamePlayerAction.CounterRotate);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.CounterRotate);
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeDown)
|
||||
_owner.SendAction(BlockGamePlayerAction.SoftdropStart);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.SoftdropStart);
|
||||
else if (args.Function == ContentKeyFunctions.Arcade2)
|
||||
_owner.SendAction(BlockGamePlayerAction.Hold);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Hold);
|
||||
else if (args.Function == ContentKeyFunctions.Arcade1)
|
||||
_owner.SendAction(BlockGamePlayerAction.Harddrop);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.Harddrop);
|
||||
}
|
||||
|
||||
protected override void KeyBindUp(GUIBoundKeyEventArgs args)
|
||||
@@ -599,11 +604,11 @@ namespace Content.Client.Arcade
|
||||
return;
|
||||
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeLeft)
|
||||
_owner.SendAction(BlockGamePlayerAction.EndLeft);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.EndLeft);
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeRight)
|
||||
_owner.SendAction(BlockGamePlayerAction.EndRight);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.EndRight);
|
||||
else if (args.Function == ContentKeyFunctions.ArcadeDown)
|
||||
_owner.SendAction(BlockGamePlayerAction.SoftdropEnd);
|
||||
OnAction?.Invoke(BlockGamePlayerAction.SoftdropEnd);
|
||||
}
|
||||
|
||||
public void UpdateNextBlock(BlockGameBlock[] blocks)
|
||||
|
||||
@@ -8,8 +8,6 @@ namespace Content.Client.Arcade
|
||||
{
|
||||
public sealed class SpaceVillainArcadeMenu : DefaultWindow
|
||||
{
|
||||
public SpaceVillainArcadeBoundUserInterface Owner { get; set; }
|
||||
|
||||
private readonly Label _enemyNameLabel;
|
||||
private readonly Label _playerInfoLabel;
|
||||
private readonly Label _enemyInfoLabel;
|
||||
@@ -17,11 +15,13 @@ namespace Content.Client.Arcade
|
||||
private readonly Label _enemyActionLabel;
|
||||
|
||||
private readonly Button[] _gameButtons = new Button[3]; //used to disable/enable all game buttons
|
||||
public SpaceVillainArcadeMenu(SpaceVillainArcadeBoundUserInterface owner)
|
||||
|
||||
public event Action<SharedSpaceVillainArcadeComponent.PlayerAction>? OnPlayerAction;
|
||||
|
||||
public SpaceVillainArcadeMenu()
|
||||
{
|
||||
MinSize = SetSize = new Vector2(300, 225);
|
||||
Title = Loc.GetString("spacevillain-menu-title");
|
||||
Owner = owner;
|
||||
|
||||
var grid = new GridContainer { Columns = 1 };
|
||||
|
||||
@@ -47,32 +47,43 @@ namespace Content.Client.Arcade
|
||||
grid.AddChild(_enemyActionLabel);
|
||||
|
||||
var buttonGrid = new GridContainer { Columns = 3 };
|
||||
_gameButtons[0] = new ActionButton(Owner, SharedSpaceVillainArcadeComponent.PlayerAction.Attack)
|
||||
_gameButtons[0] = new Button()
|
||||
{
|
||||
Text = Loc.GetString("spacevillain-menu-button-attack")
|
||||
};
|
||||
|
||||
_gameButtons[0].OnPressed +=
|
||||
_ => OnPlayerAction?.Invoke(SharedSpaceVillainArcadeComponent.PlayerAction.Attack);
|
||||
buttonGrid.AddChild(_gameButtons[0]);
|
||||
|
||||
_gameButtons[1] = new ActionButton(Owner, SharedSpaceVillainArcadeComponent.PlayerAction.Heal)
|
||||
_gameButtons[1] = new Button()
|
||||
{
|
||||
Text = Loc.GetString("spacevillain-menu-button-heal")
|
||||
};
|
||||
|
||||
_gameButtons[1].OnPressed +=
|
||||
_ => OnPlayerAction?.Invoke(SharedSpaceVillainArcadeComponent.PlayerAction.Heal);
|
||||
buttonGrid.AddChild(_gameButtons[1]);
|
||||
|
||||
_gameButtons[2] = new ActionButton(Owner, SharedSpaceVillainArcadeComponent.PlayerAction.Recharge)
|
||||
_gameButtons[2] = new Button()
|
||||
{
|
||||
Text = Loc.GetString("spacevillain-menu-button-recharge")
|
||||
};
|
||||
|
||||
_gameButtons[2].OnPressed +=
|
||||
_ => OnPlayerAction?.Invoke(SharedSpaceVillainArcadeComponent.PlayerAction.Recharge);
|
||||
buttonGrid.AddChild(_gameButtons[2]);
|
||||
|
||||
centerContainer = new CenterContainer();
|
||||
centerContainer.AddChild(buttonGrid);
|
||||
grid.AddChild(centerContainer);
|
||||
|
||||
var newGame = new ActionButton(Owner, SharedSpaceVillainArcadeComponent.PlayerAction.NewGame)
|
||||
var newGame = new Button()
|
||||
{
|
||||
Text = Loc.GetString("spacevillain-menu-button-new-game")
|
||||
};
|
||||
|
||||
newGame.OnPressed += _ => OnPlayerAction?.Invoke(SharedSpaceVillainArcadeComponent.PlayerAction.NewGame);
|
||||
grid.AddChild(newGame);
|
||||
|
||||
Contents.AddChild(grid);
|
||||
@@ -99,23 +110,5 @@ namespace Content.Client.Arcade
|
||||
_playerActionLabel.Text = message.PlayerActionMessage;
|
||||
_enemyActionLabel.Text = message.EnemyActionMessage;
|
||||
}
|
||||
|
||||
private sealed class ActionButton : Button
|
||||
{
|
||||
private readonly SpaceVillainArcadeBoundUserInterface _owner;
|
||||
private readonly SharedSpaceVillainArcadeComponent.PlayerAction _playerAction;
|
||||
|
||||
public ActionButton(SpaceVillainArcadeBoundUserInterface owner, SharedSpaceVillainArcadeComponent.PlayerAction playerAction)
|
||||
{
|
||||
_owner = owner;
|
||||
_playerAction = playerAction;
|
||||
OnPressed += Clicked;
|
||||
}
|
||||
|
||||
private void Clicked(ButtonEventArgs e)
|
||||
{
|
||||
_owner.SendAction(_playerAction);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Arcade;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Arcade.UI;
|
||||
|
||||
@@ -15,9 +16,8 @@ public sealed class BlockGameBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new BlockGameMenu(this);
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
_menu = this.CreateWindow<BlockGameMenu>();
|
||||
_menu.OnAction += SendAction;
|
||||
}
|
||||
|
||||
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.ViewVariables;
|
||||
using static Content.Shared.Arcade.SharedSpaceVillainArcadeComponent;
|
||||
@@ -9,8 +10,6 @@ public sealed class SpaceVillainArcadeBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
[ViewVariables] private SpaceVillainArcadeMenu? _menu;
|
||||
|
||||
//public SharedSpaceVillainArcadeComponent SpaceVillainArcade;
|
||||
|
||||
public SpaceVillainArcadeBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
SendAction(PlayerAction.RequestData);
|
||||
@@ -25,10 +24,8 @@ public sealed class SpaceVillainArcadeBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new SpaceVillainArcadeMenu(this);
|
||||
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
_menu = this.CreateWindow<SpaceVillainArcadeMenu>();
|
||||
_menu.OnPlayerAction += SendAction;
|
||||
}
|
||||
|
||||
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
|
||||
@@ -36,12 +33,4 @@ public sealed class SpaceVillainArcadeBoundUserInterface : BoundUserInterface
|
||||
if (message is SpaceVillainArcadeDataUpdateMessage msg)
|
||||
_menu?.UpdateInfo(msg);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Monitor;
|
||||
using Content.Shared.Atmos.Monitor.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Log;
|
||||
@@ -20,16 +21,9 @@ public sealed class AirAlarmBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new AirAlarmWindow(this);
|
||||
_window = this.CreateWindow<AirAlarmWindow>();
|
||||
_window.SetEntity(Owner);
|
||||
|
||||
if (State != null)
|
||||
{
|
||||
UpdateState(State);
|
||||
}
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window.AtmosDeviceDataChanged += OnDeviceDataChanged;
|
||||
_window.AtmosDeviceDataCopied += OnDeviceDataCopied;
|
||||
_window.AtmosAlarmThresholdChanged += OnThresholdChanged;
|
||||
|
||||
@@ -47,7 +47,7 @@ public sealed partial class AirAlarmWindow : FancyWindow
|
||||
|
||||
private CheckBox _autoMode => AutoModeCheckBox;
|
||||
|
||||
public AirAlarmWindow(BoundUserInterface owner)
|
||||
public AirAlarmWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
@@ -95,8 +95,11 @@ public sealed partial class AirAlarmWindow : FancyWindow
|
||||
_sensors.Clear();
|
||||
ResyncAllRequested!.Invoke();
|
||||
};
|
||||
}
|
||||
|
||||
EntityView.SetEntity(owner.Owner);
|
||||
public void SetEntity(EntityUid uid)
|
||||
{
|
||||
EntityView.SetEntity(uid);
|
||||
}
|
||||
|
||||
public void UpdateState(AirAlarmUIState state)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Shared.Atmos.Piping.Binary.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -21,14 +22,8 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GasCanisterWindow();
|
||||
_window = this.CreateWindow<GasCanisterWindow>();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window.ReleaseValveCloseButtonPressed += OnReleaseValveClosePressed;
|
||||
_window.ReleaseValveOpenButtonPressed += OnReleaseValveOpenPressed;
|
||||
_window.ReleasePressureSet += OnReleasePressureSet;
|
||||
|
||||
@@ -3,6 +3,7 @@ using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Piping.Trinary.Components;
|
||||
using Content.Shared.Localizations;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -28,14 +29,8 @@ namespace Content.Client.Atmos.UI
|
||||
|
||||
var atmosSystem = EntMan.System<AtmosphereSystem>();
|
||||
|
||||
_window = new GasFilterWindow(atmosSystem.Gases);
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GasFilterWindow>();
|
||||
_window.PopulateGasList(atmosSystem.Gases);
|
||||
|
||||
_window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed;
|
||||
_window.FilterTransferRateChanged += OnFilterTransferRatePressed;
|
||||
|
||||
@@ -26,10 +26,9 @@ namespace Content.Client.Atmos.UI
|
||||
public event Action<string>? FilterTransferRateChanged;
|
||||
public event Action? SelectGasPressed;
|
||||
|
||||
public GasFilterWindow(IEnumerable<GasPrototype> gases)
|
||||
public GasFilterWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
PopulateGasList(gases);
|
||||
|
||||
ToggleStatusButton.OnPressed += _ => SetFilterStatus(!FilterStatus);
|
||||
ToggleStatusButton.OnPressed += _ => ToggleStatusButtonPressed?.Invoke();
|
||||
@@ -73,7 +72,7 @@ namespace Content.Client.Atmos.UI
|
||||
SelectGasButton.Disabled = true;
|
||||
}
|
||||
|
||||
private void PopulateGasList(IEnumerable<GasPrototype> gases)
|
||||
public void PopulateGasList(IEnumerable<GasPrototype> gases)
|
||||
{
|
||||
GasList.Add(new ItemList.Item(GasList)
|
||||
{
|
||||
@@ -81,7 +80,7 @@ namespace Content.Client.Atmos.UI
|
||||
Text = Loc.GetString("comp-gas-filter-ui-filter-gas-none")
|
||||
});
|
||||
|
||||
foreach (GasPrototype gas in gases)
|
||||
foreach (var gas in gases)
|
||||
{
|
||||
var gasName = Loc.GetString(gas.Name);
|
||||
GasList.Add(GetGasItem(gas.ID, gasName, GasList));
|
||||
|
||||
@@ -2,7 +2,7 @@ using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Piping.Trinary.Components;
|
||||
using Content.Shared.Localizations;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -26,14 +26,7 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GasMixerWindow();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GasMixerWindow>();
|
||||
|
||||
_window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed;
|
||||
_window.MixerOutputPressureChanged += OnMixerOutputPressurePressed;
|
||||
@@ -83,12 +76,5 @@ namespace Content.Client.Atmos.UI
|
||||
_window.SetOutputPressure(cast.OutputPressure);
|
||||
_window.SetNodePercentages(cast.NodeOne);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using Content.Shared.Atmos.Piping.Binary.Components;
|
||||
using Content.Shared.Localizations;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -26,14 +27,7 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GasPressurePumpWindow();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GasPressurePumpWindow>();
|
||||
|
||||
_window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed;
|
||||
_window.PumpOutputPressureChanged += OnPumpOutputPressurePressed;
|
||||
@@ -67,12 +61,5 @@ namespace Content.Client.Atmos.UI
|
||||
_window.SetPumpStatus(cast.Enabled);
|
||||
_window.SetOutputPressure(cast.OutputPressure);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using Content.Shared.Atmos.Piping.Unary.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -31,14 +32,7 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GasThermomachineWindow();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GasThermomachineWindow>();
|
||||
|
||||
_window.ToggleStatusButton.OnPressed += _ => OnToggleStatusButtonPressed();
|
||||
_window.TemperatureSpinbox.OnValueChanged += _ => OnTemperatureChanged(_window.TemperatureSpinbox.Value);
|
||||
@@ -91,12 +85,5 @@ namespace Content.Client.Atmos.UI
|
||||
true => Loc.GetString("comp-gas-thermomachine-ui-title-heater")
|
||||
};
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using Content.Shared.Atmos.Piping.Binary.Components;
|
||||
using Content.Shared.Localizations;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Atmos.UI
|
||||
{
|
||||
@@ -26,14 +27,7 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GasVolumePumpWindow();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GasVolumePumpWindow>();
|
||||
|
||||
_window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed;
|
||||
_window.PumpTransferRateChanged += OnPumpTransferRatePressed;
|
||||
@@ -64,16 +58,9 @@ namespace Content.Client.Atmos.UI
|
||||
if (_window == null || state is not GasVolumePumpBoundUserInterfaceState cast)
|
||||
return;
|
||||
|
||||
_window.Title = (cast.PumpLabel);
|
||||
_window.Title = cast.PumpLabel;
|
||||
_window.SetPumpStatus(cast.Enabled);
|
||||
_window.SetTransferRate(cast.TransferRate);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Atmos.Piping.Portable.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
|
||||
namespace Content.Client.Atmos.UI;
|
||||
@@ -21,14 +22,7 @@ public sealed class SpaceHeaterBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new SpaceHeaterWindow();
|
||||
|
||||
if (State != null)
|
||||
UpdateState(State);
|
||||
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<SpaceHeaterWindow>();
|
||||
|
||||
_window.ToggleStatusButton.OnPressed += _ => OnToggleStatusButtonPressed();
|
||||
_window.IncreaseTempRange.OnPressed += _ => OnTemperatureRangeChanged(_window.TemperatureChangeDelta);
|
||||
|
||||
@@ -54,7 +54,7 @@ public sealed class AudioUIController : UIController
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
var resource = _cache.GetResource<AudioResource>(value);
|
||||
var resource = GetSoundOrFallback(value, CCVars.UIClickSound.DefaultValue);
|
||||
var source =
|
||||
_audioManager.CreateAudioSource(resource);
|
||||
|
||||
@@ -77,7 +77,7 @@ public sealed class AudioUIController : UIController
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
var hoverResource = _cache.GetResource<AudioResource>(value);
|
||||
var hoverResource = GetSoundOrFallback(value, CCVars.UIHoverSound.DefaultValue);
|
||||
var hoverSource =
|
||||
_audioManager.CreateAudioSource(hoverResource);
|
||||
|
||||
@@ -95,4 +95,12 @@ public sealed class AudioUIController : UIController
|
||||
UIManager.SetHoverSound(null);
|
||||
}
|
||||
}
|
||||
|
||||
private AudioResource GetSoundOrFallback(string path, string fallback)
|
||||
{
|
||||
if (!_cache.TryGetResource(path, out AudioResource? resource))
|
||||
return _cache.GetResource<AudioResource>(fallback);
|
||||
|
||||
return resource;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using Content.Shared.Audio;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Random;
|
||||
using Content.Shared.Random.Rules;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.ResourceManagement;
|
||||
@@ -116,6 +117,7 @@ public sealed partial class ContentAudioSystem
|
||||
|
||||
private void OnRoundEndMessage(RoundEndMessageEvent ev)
|
||||
{
|
||||
OnRoundEndMessageAmbientLoop(); //CP14
|
||||
// If scoreboard shows then just stop the music
|
||||
_ambientMusicStream = _audio.Stop(_ambientMusicStream);
|
||||
_nextAudio = TimeSpan.FromMinutes(3);
|
||||
|
||||
122
Content.Client/Audio/ContentAudioSystem.CP14AmbientLoop.cs
Normal file
122
Content.Client/Audio/ContentAudioSystem.CP14AmbientLoop.cs
Normal file
@@ -0,0 +1,122 @@
|
||||
using System.Linq;
|
||||
using Content.Client.Gameplay;
|
||||
using Content.Shared.Audio;
|
||||
using Content.Shared.CCVar;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Client.Audio;
|
||||
|
||||
public sealed partial class ContentAudioSystem
|
||||
{
|
||||
private const float AmbientLoopFadeInTime = 1f;
|
||||
private const float AmbientLoopFadeOutTime = 4f;
|
||||
|
||||
private Dictionary<CP14AmbientLoopPrototype, EntityUid> _loopStreams = new();
|
||||
|
||||
private TimeSpan _nextUpdateTime = TimeSpan.Zero;
|
||||
private readonly TimeSpan _updateFrequency = TimeSpan.FromSeconds(1f);
|
||||
|
||||
private void CP14InitializeAmbientLoops()
|
||||
{
|
||||
Subs.CVar(_configManager, CCVars.AmbientMusicVolume, AmbienceCVarChangedAmbientMusic, true);
|
||||
}
|
||||
|
||||
private void AmbienceCVarChangedAmbientMusic(float obj)
|
||||
{
|
||||
_volumeSlider = SharedAudioSystem.GainToVolume(obj);
|
||||
|
||||
foreach (var loop in _loopStreams)
|
||||
{
|
||||
_audio.SetVolume(loop.Value, loop.Key.Sound.Params.Volume + _volumeSlider);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRoundEndMessageAmbientLoop()
|
||||
{
|
||||
foreach (var loop in _loopStreams)
|
||||
{
|
||||
StopAmbientLoop(loop.Key);
|
||||
}
|
||||
}
|
||||
|
||||
private void CP14UpdateAmbientLoops()
|
||||
{
|
||||
if (_timing.CurTime <= _nextUpdateTime)
|
||||
return;
|
||||
|
||||
_nextUpdateTime = _timing.CurTime + _updateFrequency;
|
||||
|
||||
|
||||
if (_state.CurrentState is not GameplayState)
|
||||
return;
|
||||
|
||||
var requiredLoops = GetAmbientLoops();
|
||||
|
||||
foreach (var loop in _loopStreams)
|
||||
{
|
||||
if (!requiredLoops.Contains(loop.Key)) //If ambient is playing and it shouldn't, stop it.
|
||||
StopAmbientLoop(loop.Key);
|
||||
}
|
||||
|
||||
foreach (var loop in requiredLoops)
|
||||
{
|
||||
if (!_loopStreams.ContainsKey(loop)) //If it's not playing, but should, run it
|
||||
StartAmbientLoop(loop);
|
||||
}
|
||||
}
|
||||
|
||||
private void StartAmbientLoop(CP14AmbientLoopPrototype proto)
|
||||
{
|
||||
if (_loopStreams.ContainsKey(proto))
|
||||
return;
|
||||
|
||||
var newLoop = _audio.PlayGlobal(
|
||||
proto.Sound,
|
||||
Filter.Local(),
|
||||
false,
|
||||
AudioParams.Default
|
||||
.WithLoop(true)
|
||||
.WithVolume(proto.Sound.Params.Volume + _volumeSlider)
|
||||
.WithPlayOffset(_random.NextFloat(0f, 100f)));
|
||||
_loopStreams.Add(proto, newLoop.Value.Entity);
|
||||
|
||||
FadeIn(newLoop.Value.Entity, newLoop.Value.Component, AmbientLoopFadeInTime);
|
||||
}
|
||||
|
||||
private void StopAmbientLoop(CP14AmbientLoopPrototype proto)
|
||||
{
|
||||
if (!_loopStreams.TryGetValue(proto, out var audioEntity))
|
||||
return;
|
||||
|
||||
FadeOut(audioEntity, duration: AmbientLoopFadeOutTime);
|
||||
_loopStreams.Remove(proto);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks the player's environment, and returns a list of all ambients that should currently be playing around the player
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private List<CP14AmbientLoopPrototype> GetAmbientLoops()
|
||||
{
|
||||
List<CP14AmbientLoopPrototype> list = new();
|
||||
|
||||
var player = _player.LocalEntity;
|
||||
|
||||
if (player == null)
|
||||
return list;
|
||||
|
||||
var ambientLoops = _proto.EnumeratePrototypes<CP14AmbientLoopPrototype>().ToList();
|
||||
|
||||
foreach (var loop in ambientLoops)
|
||||
{
|
||||
if (_rules.IsTrue(player.Value, _proto.Index(loop.Rules)))
|
||||
{
|
||||
list.Add(loop);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -29,13 +29,14 @@ public sealed partial class ContentAudioSystem : SharedContentAudioSystem
|
||||
public const float AmbientMusicMultiplier = 3f;
|
||||
public const float LobbyMultiplier = 3f;
|
||||
public const float InterfaceMultiplier = 2f;
|
||||
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
UpdatesOutsidePrediction = true;
|
||||
InitializeAmbientMusic();
|
||||
CP14InitializeAmbientLoops(); //CP14 ambient loops
|
||||
InitializeLobbyMusic();
|
||||
SubscribeNetworkEvent<RoundRestartCleanupEvent>(OnRoundCleanup);
|
||||
}
|
||||
@@ -82,6 +83,7 @@ public sealed partial class ContentAudioSystem : SharedContentAudioSystem
|
||||
return;
|
||||
|
||||
UpdateAmbientMusic();
|
||||
CP14UpdateAmbientLoops(); //CP14
|
||||
UpdateLobbyMusic();
|
||||
UpdateFades(frameTime);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
using Content.Shared.Audio.Jukebox;
|
||||
using Robust.Client.Audio;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Audio.Components;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Audio.Jukebox;
|
||||
@@ -23,9 +22,7 @@ public sealed class JukeboxBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new JukeboxMenu();
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
_menu = this.CreateWindow<JukeboxMenu>();
|
||||
|
||||
_menu.OnPlayPressed += args =>
|
||||
{
|
||||
@@ -100,19 +97,5 @@ public sealed class JukeboxBoundUserInterface : BoundUserInterface
|
||||
|
||||
SendMessage(new JukeboxSetTimeMessage(sentTime));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
if (_menu == null)
|
||||
return;
|
||||
|
||||
_menu.OnClose -= Close;
|
||||
_menu.Dispose();
|
||||
_menu = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Content.Client.BarSign.Ui;
|
||||
using Content.Shared.BarSign;
|
||||
using Content.Shared.Power;
|
||||
using Robust.Client.GameObjects;
|
||||
@@ -8,6 +9,7 @@ namespace Content.Client.BarSign;
|
||||
public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _ui = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -17,6 +19,9 @@ public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
|
||||
|
||||
private void OnAfterAutoHandleState(EntityUid uid, BarSignComponent component, ref AfterAutoHandleStateEvent args)
|
||||
{
|
||||
if (_ui.TryGetOpenUi<BarSignBoundUserInterface>(uid, BarSignUiKey.Key, out var bui))
|
||||
bui.Update(component.Current);
|
||||
|
||||
UpdateAppearance(uid, component);
|
||||
}
|
||||
|
||||
@@ -34,9 +39,9 @@ public sealed class BarSignSystem : VisualizerSystem<BarSignComponent>
|
||||
|
||||
if (powered
|
||||
&& sign.Current != null
|
||||
&& _prototypeManager.TryIndex(sign.Current, out BarSignPrototype? proto))
|
||||
&& _prototypeManager.TryIndex(sign.Current, out var proto))
|
||||
{
|
||||
sprite.LayerSetState(0, proto.Icon);
|
||||
sprite.LayerSetSprite(0, proto.Icon);
|
||||
sprite.LayerSetShader(0, "unshaded");
|
||||
}
|
||||
else
|
||||
|
||||
50
Content.Client/BarSign/Ui/BarSignBoundUserInterface.cs
Normal file
50
Content.Client/BarSign/Ui/BarSignBoundUserInterface.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System.Linq;
|
||||
using Content.Shared.BarSign;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.BarSign.Ui;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed class BarSignBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
|
||||
private BarSignMenu? _menu;
|
||||
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
|
||||
var sign = EntMan.GetComponentOrNull<BarSignComponent>(Owner)?.Current is { } current
|
||||
? _prototype.Index(current)
|
||||
: null;
|
||||
var allSigns = Shared.BarSign.BarSignSystem.GetAllBarSigns(_prototype)
|
||||
.OrderBy(p => Loc.GetString(p.Name))
|
||||
.ToList();
|
||||
_menu = new(sign, allSigns);
|
||||
|
||||
_menu.OnSignSelected += id =>
|
||||
{
|
||||
SendMessage(new SetBarSignMessage(id));
|
||||
};
|
||||
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
public void Update(ProtoId<BarSignPrototype>? sign)
|
||||
{
|
||||
if (_prototype.TryIndex(sign, out var signPrototype))
|
||||
_menu?.UpdateState(signPrototype);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
19
Content.Client/BarSign/Ui/BarSignMenu.xaml
Normal file
19
Content.Client/BarSign/Ui/BarSignMenu.xaml
Normal file
@@ -0,0 +1,19 @@
|
||||
<controls:FancyWindow
|
||||
xmlns="https://spacestation14.io"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
||||
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
|
||||
Title="{Loc 'barsign-ui-menu'}"
|
||||
MinSize="280 180"
|
||||
SetSize="280 180">
|
||||
<BoxContainer VerticalExpand="True" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10 5 10 10">
|
||||
<BoxContainer Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
|
||||
<BoxContainer Orientation="Vertical" HorizontalAlignment="Center">
|
||||
<Label Text="{Loc 'barsign-ui-set-label'}" HorizontalAlignment="Center" StyleClasses="LabelSubText" Margin="30 0"/>
|
||||
<customControls:HSeparator Margin="0 0 0 5"/>
|
||||
</BoxContainer>
|
||||
<OptionButton Name="SignOptions" HorizontalAlignment="Center" VerticalAlignment="Center" MinSize="175 60" Margin="0 0 0 20"/>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</controls:FancyWindow>
|
||||
|
||||
|
||||
50
Content.Client/BarSign/Ui/BarSignMenu.xaml.cs
Normal file
50
Content.Client/BarSign/Ui/BarSignMenu.xaml.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.BarSign;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
|
||||
namespace Content.Client.BarSign.Ui;
|
||||
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class BarSignMenu : FancyWindow
|
||||
{
|
||||
private string? _currentId;
|
||||
|
||||
private readonly List<BarSignPrototype> _cachedPrototypes = new();
|
||||
|
||||
public event Action<string>? OnSignSelected;
|
||||
|
||||
public BarSignMenu(BarSignPrototype? currentSign, List<BarSignPrototype> signs)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
_currentId = currentSign?.ID;
|
||||
|
||||
_cachedPrototypes.Clear();
|
||||
_cachedPrototypes = signs;
|
||||
foreach (var proto in _cachedPrototypes)
|
||||
{
|
||||
SignOptions.AddItem(Loc.GetString(proto.Name));
|
||||
}
|
||||
|
||||
SignOptions.OnItemSelected += idx =>
|
||||
{
|
||||
OnSignSelected?.Invoke(_cachedPrototypes[idx.Id].ID);
|
||||
SignOptions.SelectId(idx.Id);
|
||||
};
|
||||
|
||||
if (currentSign != null)
|
||||
{
|
||||
var idx = _cachedPrototypes.IndexOf(currentSign);
|
||||
SignOptions.TrySelectId(idx);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateState(BarSignPrototype newSign)
|
||||
{
|
||||
if (_currentId != null && newSign.ID == _currentId)
|
||||
return;
|
||||
_currentId = newSign.ID;
|
||||
var idx = _cachedPrototypes.IndexOf(newSign);
|
||||
SignOptions.TrySelectId(idx);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Bed.Cryostorage;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Bed.Cryostorage;
|
||||
|
||||
@@ -17,9 +18,7 @@ public sealed class CryostorageBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new();
|
||||
|
||||
_menu.OnClose += Close;
|
||||
_menu = this.CreateWindow<CryostorageMenu>();
|
||||
|
||||
_menu.SlotRemoveButtonPressed += (ent, slot) =>
|
||||
{
|
||||
@@ -30,8 +29,6 @@ public sealed class CryostorageBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
SendMessage(new CryostorageRemoveItemBuiMessage(ent, hand, CryostorageRemoveItemBuiMessage.RemovalType.Hand));
|
||||
};
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -45,12 +42,4 @@ public sealed class CryostorageBoundUserInterface : BoundUserInterface
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Client.Cargo.UI;
|
||||
using Content.Shared.Cargo.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Cargo.BUI;
|
||||
|
||||
@@ -18,9 +19,7 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new();
|
||||
|
||||
_menu.OnClose += Close;
|
||||
_menu = this.CreateWindow<CargoBountyMenu>();
|
||||
|
||||
_menu.OnLabelButtonPressed += id =>
|
||||
{
|
||||
@@ -31,8 +30,6 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
SendMessage(new BountySkipMessage(id));
|
||||
};
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState message)
|
||||
@@ -44,14 +41,4 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
|
||||
|
||||
_menu?.UpdateEntries(state.Bounties, state.UntilNextSkip);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Client.Cargo.UI;
|
||||
using Content.Shared.Cargo.BUI;
|
||||
using Content.Shared.Cargo.Events;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Cargo.BUI;
|
||||
|
||||
@@ -18,21 +19,9 @@ public sealed class CargoPalletConsoleBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new CargoPalletMenu();
|
||||
_menu = this.CreateWindow<CargoPalletMenu>();
|
||||
_menu.AppraiseRequested += OnAppraisal;
|
||||
_menu.SellRequested += OnSell;
|
||||
_menu.OnClose += Close;
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (disposing)
|
||||
{
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAppraisal()
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Client.Cargo.UI;
|
||||
using Content.Shared.Cargo.BUI;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Cargo.BUI;
|
||||
@@ -9,6 +10,8 @@ namespace Content.Client.Cargo.BUI;
|
||||
[UsedImplicitly]
|
||||
public sealed class CargoShuttleConsoleBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
||||
|
||||
[ViewVariables]
|
||||
private CargoShuttleMenu? _menu;
|
||||
|
||||
@@ -19,24 +22,7 @@ public sealed class CargoShuttleConsoleBoundUserInterface : BoundUserInterface
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
var collection = IoCManager.Instance;
|
||||
|
||||
if (collection == null)
|
||||
return;
|
||||
|
||||
_menu = new CargoShuttleMenu(collection.Resolve<IPrototypeManager>(), collection.Resolve<IEntitySystemManager>().GetEntitySystem<SpriteSystem>());
|
||||
_menu.OnClose += Close;
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (disposing)
|
||||
{
|
||||
_menu?.Dispose();
|
||||
}
|
||||
_menu = this.CreateWindow<CargoShuttleMenu>();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -45,6 +31,6 @@ public sealed class CargoShuttleConsoleBoundUserInterface : BoundUserInterface
|
||||
if (state is not CargoShuttleConsoleBoundUserInterfaceState cargoState) return;
|
||||
_menu?.SetAccountName(cargoState.AccountName);
|
||||
_menu?.SetShuttleName(cargoState.ShuttleName);
|
||||
_menu?.SetOrders(cargoState.Orders);
|
||||
_menu?.SetOrders(EntMan.System<SpriteSystem>(), _protoManager, cargoState.Orders);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,14 +12,9 @@ namespace Content.Client.Cargo.UI
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class CargoShuttleMenu : FancyWindow
|
||||
{
|
||||
private readonly IPrototypeManager _protoManager;
|
||||
private readonly SpriteSystem _spriteSystem;
|
||||
|
||||
public CargoShuttleMenu(IPrototypeManager protoManager, SpriteSystem spriteSystem)
|
||||
public CargoShuttleMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
_protoManager = protoManager;
|
||||
_spriteSystem = spriteSystem;
|
||||
Title = Loc.GetString("cargo-shuttle-console-menu-title");
|
||||
}
|
||||
|
||||
@@ -33,19 +28,19 @@ namespace Content.Client.Cargo.UI
|
||||
ShuttleNameLabel.Text = name;
|
||||
}
|
||||
|
||||
public void SetOrders(List<CargoOrderData> orders)
|
||||
public void SetOrders(SpriteSystem sprites, IPrototypeManager protoManager, List<CargoOrderData> orders)
|
||||
{
|
||||
Orders.DisposeAllChildren();
|
||||
|
||||
foreach (var order in orders)
|
||||
{
|
||||
var product = _protoManager.Index<EntityPrototype>(order.ProductId);
|
||||
var product = protoManager.Index<EntityPrototype>(order.ProductId);
|
||||
var productName = product.Name;
|
||||
|
||||
var row = new CargoOrderRow
|
||||
{
|
||||
Order = order,
|
||||
Icon = { Texture = _spriteSystem.Frame0(product) },
|
||||
Icon = { Texture = sprites.Frame0(product) },
|
||||
ProductName =
|
||||
{
|
||||
Text = Loc.GetString(
|
||||
|
||||
@@ -31,7 +31,7 @@ public sealed partial class NewsReaderUiFragment : BoxContainer
|
||||
Author.Visible = true;
|
||||
|
||||
PageName.Text = article.Title;
|
||||
PageText.SetMarkup(article.Content);
|
||||
PageText.SetMarkupPermissive(article.Content);
|
||||
|
||||
PageNum.Text = $"{targetNum}/{totalNum}";
|
||||
|
||||
|
||||
@@ -2,21 +2,36 @@
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Content.Shared.Inventory;
|
||||
|
||||
namespace Content.Client.Chat.TypingIndicator;
|
||||
|
||||
public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingIndicatorComponent>
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
|
||||
|
||||
protected override void OnAppearanceChange(EntityUid uid, TypingIndicatorComponent component, ref AppearanceChangeEvent args)
|
||||
{
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
if (!_prototypeManager.TryIndex<TypingIndicatorPrototype>(component.Prototype, out var proto))
|
||||
var currentTypingIndicator = component.TypingIndicatorPrototype;
|
||||
|
||||
var evt = new BeforeShowTypingIndicatorEvent();
|
||||
|
||||
if (TryComp<InventoryComponent>(uid, out var inventoryComp))
|
||||
_inventory.RelayEvent((uid, inventoryComp), ref evt);
|
||||
|
||||
var overrideIndicator = evt.GetMostRecentIndicator();
|
||||
|
||||
if (overrideIndicator != null)
|
||||
currentTypingIndicator = overrideIndicator.Value;
|
||||
|
||||
if (!_prototypeManager.TryIndex(currentTypingIndicator, out var proto))
|
||||
{
|
||||
Log.Error($"Unknown typing indicator id: {component.Prototype}");
|
||||
Log.Error($"Unknown typing indicator id: {component.TypingIndicatorPrototype}");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Chemistry;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Chemistry.UI
|
||||
{
|
||||
@@ -27,13 +28,8 @@ namespace Content.Client.Chemistry.UI
|
||||
base.Open();
|
||||
|
||||
// Setup window layout/elements
|
||||
_window = new ChemMasterWindow
|
||||
{
|
||||
Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName,
|
||||
};
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<ChemMasterWindow>();
|
||||
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
||||
|
||||
// Setup static button actions.
|
||||
_window.InputEjectButton.OnPressed += _ => SendMessage(
|
||||
@@ -75,15 +71,5 @@ namespace Content.Client.Chemistry.UI
|
||||
|
||||
_window?.UpdateState(castState); // Update window state
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using Content.Shared.Chemistry;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Chemistry.UI
|
||||
{
|
||||
@@ -15,9 +16,6 @@ namespace Content.Client.Chemistry.UI
|
||||
[ViewVariables]
|
||||
private ReagentDispenserWindow? _window;
|
||||
|
||||
[ViewVariables]
|
||||
private ReagentDispenserBoundUserInterfaceState? _lastState;
|
||||
|
||||
public ReagentDispenserBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
}
|
||||
@@ -32,14 +30,9 @@ namespace Content.Client.Chemistry.UI
|
||||
base.Open();
|
||||
|
||||
// Setup window layout/elements
|
||||
_window = new()
|
||||
{
|
||||
Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName,
|
||||
HelpGuidebookIds = EntMan.GetComponent<GuideHelpComponent>(Owner).Guides
|
||||
};
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<ReagentDispenserWindow>();
|
||||
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
||||
_window.HelpGuidebookIds = EntMan.GetComponent<GuideHelpComponent>(Owner).Guides;
|
||||
|
||||
// Setup static button actions.
|
||||
_window.EjectButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(SharedReagentDispenser.OutputSlotName));
|
||||
@@ -63,19 +56,7 @@ namespace Content.Client.Chemistry.UI
|
||||
base.UpdateState(state);
|
||||
|
||||
var castState = (ReagentDispenserBoundUserInterfaceState) state;
|
||||
_lastState = castState;
|
||||
|
||||
_window?.UpdateState(castState); //Update window state
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Chemistry;
|
||||
using Content.Shared.FixedPoint;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Chemistry.UI
|
||||
{
|
||||
@@ -18,7 +19,7 @@ namespace Content.Client.Chemistry.UI
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_window = new TransferAmountWindow();
|
||||
_window = this.CreateWindow<TransferAmountWindow>();
|
||||
|
||||
_window.ApplyButton.OnPressed += _ =>
|
||||
{
|
||||
@@ -28,15 +29,6 @@ namespace Content.Client.Chemistry.UI
|
||||
_window.Close();
|
||||
}
|
||||
};
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace Content.Client.Clickable
|
||||
Angle cardinalSnapping = sprite.SnapCardinals ? relativeRotation.GetCardinalDir().ToAngle() : Angle.Zero;
|
||||
|
||||
// First we get `localPos`, the clicked location in the sprite-coordinate frame.
|
||||
var entityXform = Matrix3Helpers.CreateInverseTransform(transform.WorldPosition, sprite.NoRotation ? -eye.Rotation : spriteRot - cardinalSnapping);
|
||||
var entityXform = Matrix3Helpers.CreateInverseTransform(spritePos, sprite.NoRotation ? -eye.Rotation : spriteRot - cardinalSnapping);
|
||||
var localPos = Vector2.Transform(Vector2.Transform(worldPos, entityXform), invSpriteMatrix);
|
||||
|
||||
// Check explicitly defined click-able bounds
|
||||
@@ -58,8 +58,11 @@ namespace Content.Client.Clickable
|
||||
// Next check each individual sprite layer using automatically computed click maps.
|
||||
foreach (var spriteLayer in sprite.AllLayers)
|
||||
{
|
||||
if (!spriteLayer.Visible || spriteLayer is not Layer layer)
|
||||
// TODO: Move this to a system and also use SpriteSystem.IsVisible instead.
|
||||
if (!spriteLayer.Visible || spriteLayer is not Layer layer || layer.CopyToShaderParameters != null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check the layer's texture, if it has one
|
||||
if (layer.Texture != null)
|
||||
|
||||
26
Content.Client/Clock/ClockSystem.cs
Normal file
26
Content.Client/Clock/ClockSystem.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using Content.Shared.Clock;
|
||||
using Robust.Client.GameObjects;
|
||||
|
||||
namespace Content.Client.Clock;
|
||||
|
||||
public sealed class ClockSystem : SharedClockSystem
|
||||
{
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
var query = EntityQueryEnumerator<ClockComponent, SpriteComponent>();
|
||||
while (query.MoveNext(out var uid, out var comp, out var sprite))
|
||||
{
|
||||
if (!sprite.LayerMapTryGet(ClockVisualLayers.HourHand, out var hourLayer) ||
|
||||
!sprite.LayerMapTryGet(ClockVisualLayers.MinuteHand, out var minuteLayer))
|
||||
continue;
|
||||
|
||||
var time = GetClockTime((uid, comp));
|
||||
var hourState = $"{comp.HoursBase}{time.Hours % 12}";
|
||||
var minuteState = $"{comp.MinutesBase}{time.Minutes / 5}";
|
||||
sprite.LayerSetState(hourLayer, hourState);
|
||||
sprite.LayerSetState(minuteLayer, minuteState);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Content.Shared.Cloning.CloningConsole;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.CloningConsole.UI
|
||||
{
|
||||
@@ -17,13 +18,11 @@ namespace Content.Client.CloningConsole.UI
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_window = new CloningConsoleWindow
|
||||
{
|
||||
Title = Loc.GetString("cloning-console-window-title")
|
||||
};
|
||||
_window.OnClose += Close;
|
||||
|
||||
_window = this.CreateWindow<CloningConsoleWindow>();
|
||||
_window.Title = Loc.GetString("cloning-console-window-title");
|
||||
|
||||
_window.CloneButton.OnPressed += _ => SendMessage(new UiButtonPressedMessage(UiButton.Clone));
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -32,19 +31,5 @@ namespace Content.Client.CloningConsole.UI
|
||||
|
||||
_window?.Populate((CloningConsoleBoundUserInterfaceState) state);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
if (_window != null)
|
||||
{
|
||||
_window.OnClose -= Close;
|
||||
_window.CloneButton.OnPressed -= _ => SendMessage(new UiButtonPressedMessage(UiButton.Clone));
|
||||
}
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Content.Client.DisplacementMap;
|
||||
using Content.Client.Inventory;
|
||||
using Content.Shared.Clothing;
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.DisplacementMap;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Inventory.Events;
|
||||
@@ -57,6 +59,7 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
[Dependency] private readonly IResourceCache _cache = default!;
|
||||
[Dependency] private readonly ISerializationManager _serialization = default!;
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
[Dependency] private readonly DisplacementMapSystem _displacement = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -71,15 +74,14 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
|
||||
private void OnAppearanceUpdate(EntityUid uid, InventoryComponent component, ref AppearanceChangeEvent args)
|
||||
{
|
||||
// May need to update jumpsuit stencils if the sex changed. Also required to properly set the stencil on init
|
||||
// May need to update displacement maps if the sex changed. Also required to properly set the stencil on init
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
if (_inventorySystem.TryGetSlotEntity(uid, Jumpsuit, out var suit, component)
|
||||
&& TryComp(suit, out ClothingComponent? clothing))
|
||||
var enumerator = _inventorySystem.GetSlotEnumerator((uid, component));
|
||||
while (enumerator.NextItem(out var item, out var slot))
|
||||
{
|
||||
SetGenderedMask(uid, args.Sprite, clothing);
|
||||
return;
|
||||
RenderEquipment(uid, item, slot.Name, component);
|
||||
}
|
||||
|
||||
// No clothing equipped -> make sure the layer is hidden, though this should already be handled by on-unequip.
|
||||
@@ -186,14 +188,6 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
|
||||
private void OnDidUnequip(EntityUid uid, SpriteComponent component, DidUnequipEvent args)
|
||||
{
|
||||
// Hide jumpsuit mask layer.
|
||||
if (args.Slot == Jumpsuit
|
||||
&& TryComp(uid, out SpriteComponent? sprite)
|
||||
&& sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var maskLayer))
|
||||
{
|
||||
sprite.LayerSetVisible(maskLayer, false);
|
||||
}
|
||||
|
||||
if (!TryComp(uid, out InventorySlotsComponent? inventorySlots))
|
||||
return;
|
||||
|
||||
@@ -238,9 +232,6 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
return;
|
||||
}
|
||||
|
||||
if (slot == Jumpsuit)
|
||||
SetGenderedMask(equipee, sprite, clothingComponent);
|
||||
|
||||
if (!_inventorySystem.TryGetSlot(equipee, slot, out var slotDef, inventory))
|
||||
return;
|
||||
|
||||
@@ -272,7 +263,25 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
// temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a
|
||||
// bookmark to determine where in the list of layers we should insert the clothing layers.
|
||||
bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index);
|
||||
var displacementData = inventory.Displacements.GetValueOrDefault(slot);
|
||||
|
||||
// Select displacement maps
|
||||
var displacementData = inventory.Displacements.GetValueOrDefault(slot); //Default unsexed map
|
||||
|
||||
var equipeeSex = CompOrNull<HumanoidAppearanceComponent>(equipee)?.Sex;
|
||||
if (equipeeSex != null)
|
||||
{
|
||||
switch (equipeeSex)
|
||||
{
|
||||
case Sex.Male:
|
||||
if (inventory.MaleDisplacements.Count > 0)
|
||||
displacementData = inventory.MaleDisplacements.GetValueOrDefault(slot);
|
||||
break;
|
||||
case Sex.Female:
|
||||
if (inventory.FemaleDisplacements.Count > 0)
|
||||
displacementData = inventory.FemaleDisplacements.GetValueOrDefault(slot);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// add the new layers
|
||||
foreach (var (key, layerData) in ev.Layers)
|
||||
@@ -299,7 +308,7 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
index = sprite.LayerMapReserveBlank(key);
|
||||
|
||||
if (sprite[index] is not Layer layer)
|
||||
return;
|
||||
continue;
|
||||
|
||||
// In case no RSI is given, use the item's base RSI as a default. This cuts down on a lot of unnecessary yaml entries.
|
||||
if (layerData.RsiPath == null
|
||||
@@ -310,90 +319,19 @@ public sealed class ClientClothingSystem : ClothingSystem
|
||||
layer.SetRsi(clothingSprite.BaseRSI);
|
||||
}
|
||||
|
||||
// Another "temporary" fix for clothing stencil masks.
|
||||
// Sprite layer redactor when
|
||||
// Sprite "redactor" just a week away.
|
||||
if (slot == Jumpsuit)
|
||||
layerData.Shader ??= "StencilDraw";
|
||||
|
||||
sprite.LayerSetData(index, layerData);
|
||||
layer.Offset += slotDef.Offset;
|
||||
|
||||
if (displacementData != null)
|
||||
if (displacementData is not null)
|
||||
{
|
||||
if (displacementData.ShaderOverride != null)
|
||||
sprite.LayerSetShader(index, displacementData.ShaderOverride);
|
||||
|
||||
var displacementKey = $"{key}-displacement";
|
||||
if (!revealedLayers.Add(displacementKey))
|
||||
{
|
||||
Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}.");
|
||||
//Checking that the state is not tied to the current race. In this case we don't need to use the displacement maps.
|
||||
if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId))
|
||||
continue;
|
||||
}
|
||||
|
||||
//CP14 48*48 displacement maps support
|
||||
var displacementDataLayer = displacementData.Layer;
|
||||
var actualRSI = sprite.LayerGetActualRSI(index);
|
||||
if (actualRSI != null)
|
||||
{
|
||||
var layerSize = actualRSI.Size;
|
||||
if (layerSize.X == 48 && displacementData.Layer48 != null)
|
||||
displacementDataLayer = displacementData.Layer48;
|
||||
}
|
||||
|
||||
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
|
||||
//CP14 48*48 displacement maps support end
|
||||
|
||||
displacementLayer.CopyToShaderParameters!.LayerKey = key;
|
||||
|
||||
// Add before main layer for this item.
|
||||
sprite.AddLayer(displacementLayer, index);
|
||||
sprite.LayerMapSet(displacementKey, index);
|
||||
|
||||
revealedLayers.Add(displacementKey);
|
||||
_displacement.TryAddDisplacement(displacementData, sprite, index, key, revealedLayers);
|
||||
}
|
||||
}
|
||||
|
||||
RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Sets a sprite's gendered mask based on gender (obviously).
|
||||
/// </summary>
|
||||
/// <param name="sprite">Sprite to modify</param>
|
||||
/// <param name="humanoid">Humanoid, to get gender from</param>
|
||||
/// <param name="clothing">Clothing component, to get mask sprite type</param>
|
||||
private void SetGenderedMask(EntityUid uid, SpriteComponent sprite, ClothingComponent clothing)
|
||||
{
|
||||
if (!sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var layer))
|
||||
return;
|
||||
|
||||
ClothingMask mask;
|
||||
string prefix;
|
||||
|
||||
switch (CompOrNull<HumanoidAppearanceComponent>(uid)?.Sex)
|
||||
{
|
||||
case Sex.Male:
|
||||
mask = clothing.MaleMask;
|
||||
prefix = "male_";
|
||||
break;
|
||||
case Sex.Female:
|
||||
mask = clothing.FemaleMask;
|
||||
prefix = "female_";
|
||||
break;
|
||||
default:
|
||||
mask = clothing.UnisexMask;
|
||||
prefix = "unisex_";
|
||||
break;
|
||||
}
|
||||
|
||||
sprite.LayerSetState(layer, mask switch
|
||||
{
|
||||
ClothingMask.NoMask => $"{prefix}none",
|
||||
ClothingMask.UniformTop => $"{prefix}top",
|
||||
_ => $"{prefix}full",
|
||||
});
|
||||
sprite.LayerSetVisible(layer, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using Content.Shared.Clothing.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Clothing.UI;
|
||||
|
||||
@@ -22,10 +23,8 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new ChameleonMenu();
|
||||
_menu.OnClose += Close;
|
||||
_menu = this.CreateWindow<ChameleonMenu>();
|
||||
_menu.OnIdSelected += OnIdSelected;
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -42,15 +41,4 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
SendMessage(new ChameleonPrototypeSelectedMessage(selectedId));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_menu?.Close();
|
||||
_menu = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public sealed class ZoomCommand : LocalizedCommands
|
||||
public override void Execute(IConsoleShell shell, string argStr, string[] args)
|
||||
{
|
||||
Vector2 zoom;
|
||||
if (args.Length is not (1 or 2))
|
||||
if (args.Length is not (1 or 2 or 3))
|
||||
{
|
||||
shell.WriteLine(Help);
|
||||
return;
|
||||
@@ -57,11 +57,18 @@ public sealed class ZoomCommand : LocalizedCommands
|
||||
}
|
||||
}
|
||||
|
||||
var scalePvs = true;
|
||||
if (args.Length == 3 && !bool.TryParse(args[2], out scalePvs))
|
||||
{
|
||||
shell.WriteError(LocalizationManager.GetString("cmd-parse-failure-bool", ("arg", args[2])));
|
||||
return;
|
||||
}
|
||||
|
||||
var player = _playerManager.LocalSession?.AttachedEntity;
|
||||
|
||||
if (_entityManager.TryGetComponent<ContentEyeComponent>(player, out var content))
|
||||
{
|
||||
_entityManager.System<ContentEyeSystem>().RequestZoom(player.Value, zoom, true, content);
|
||||
_entityManager.System<ContentEyeSystem>().RequestZoom(player.Value, zoom, true, scalePvs, content);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Communications;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
@@ -8,34 +9,11 @@ namespace Content.Client.Communications.UI
|
||||
{
|
||||
public sealed class CommunicationsConsoleBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
|
||||
[ViewVariables]
|
||||
private CommunicationsConsoleMenu? _menu;
|
||||
|
||||
[ViewVariables]
|
||||
public bool CanAnnounce { get; private set; }
|
||||
[ViewVariables]
|
||||
public bool CanBroadcast { get; private set; }
|
||||
|
||||
[ViewVariables]
|
||||
public bool CanCall { get; private set; }
|
||||
|
||||
[ViewVariables]
|
||||
public bool CountdownStarted { get; private set; }
|
||||
|
||||
[ViewVariables]
|
||||
public bool AlertLevelSelectable { get; private set; }
|
||||
|
||||
[ViewVariables]
|
||||
public string CurrentLevel { get; private set; } = default!;
|
||||
|
||||
[ViewVariables]
|
||||
private TimeSpan? _expectedCountdownTime;
|
||||
|
||||
public int Countdown => _expectedCountdownTime == null ? 0 : Math.Max((int) _expectedCountdownTime.Value.Subtract(_gameTiming.CurTime).TotalSeconds, 0);
|
||||
|
||||
public CommunicationsConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
}
|
||||
@@ -44,23 +22,25 @@ namespace Content.Client.Communications.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new CommunicationsConsoleMenu(this);
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
_menu = this.CreateWindow<CommunicationsConsoleMenu>();
|
||||
_menu.OnAnnounce += AnnounceButtonPressed;
|
||||
_menu.OnBroadcast += BroadcastButtonPressed;
|
||||
_menu.OnAlertLevel += AlertLevelSelected;
|
||||
_menu.OnEmergencyLevel += EmergencyShuttleButtonPressed;
|
||||
}
|
||||
|
||||
public void AlertLevelSelected(string level)
|
||||
{
|
||||
if (AlertLevelSelectable)
|
||||
if (_menu!.AlertLevelSelectable)
|
||||
{
|
||||
CurrentLevel = level;
|
||||
_menu.CurrentLevel = level;
|
||||
SendMessage(new CommunicationsConsoleSelectAlertLevelMessage(level));
|
||||
}
|
||||
}
|
||||
|
||||
public void EmergencyShuttleButtonPressed()
|
||||
{
|
||||
if (CountdownStarted)
|
||||
if (_menu!.CountdownStarted)
|
||||
RecallShuttle();
|
||||
else
|
||||
CallShuttle();
|
||||
@@ -95,31 +75,23 @@ namespace Content.Client.Communications.UI
|
||||
if (state is not CommunicationsConsoleInterfaceState commsState)
|
||||
return;
|
||||
|
||||
CanAnnounce = commsState.CanAnnounce;
|
||||
CanBroadcast = commsState.CanBroadcast;
|
||||
CanCall = commsState.CanCall;
|
||||
_expectedCountdownTime = commsState.ExpectedCountdownEnd;
|
||||
CountdownStarted = commsState.CountdownStarted;
|
||||
AlertLevelSelectable = commsState.AlertLevels != null && !float.IsNaN(commsState.CurrentAlertDelay) && commsState.CurrentAlertDelay <= 0;
|
||||
CurrentLevel = commsState.CurrentAlert;
|
||||
|
||||
if (_menu != null)
|
||||
{
|
||||
_menu.CanAnnounce = commsState.CanAnnounce;
|
||||
_menu.CanBroadcast = commsState.CanBroadcast;
|
||||
_menu.CanCall = commsState.CanCall;
|
||||
_menu.CountdownStarted = commsState.CountdownStarted;
|
||||
_menu.AlertLevelSelectable = commsState.AlertLevels != null && !float.IsNaN(commsState.CurrentAlertDelay) && commsState.CurrentAlertDelay <= 0;
|
||||
_menu.CurrentLevel = commsState.CurrentAlert;
|
||||
_menu.CountdownEnd = commsState.ExpectedCountdownEnd;
|
||||
|
||||
_menu.UpdateCountdown();
|
||||
_menu.UpdateAlertLevels(commsState.AlertLevels, CurrentLevel);
|
||||
_menu.AlertLevelButton.Disabled = !AlertLevelSelectable;
|
||||
_menu.EmergencyShuttleButton.Disabled = !CanCall;
|
||||
_menu.AnnounceButton.Disabled = !CanAnnounce;
|
||||
_menu.BroadcastButton.Disabled = !CanBroadcast;
|
||||
_menu.UpdateAlertLevels(commsState.AlertLevels, _menu.CurrentLevel);
|
||||
_menu.AlertLevelButton.Disabled = !_menu.AlertLevelSelectable;
|
||||
_menu.EmergencyShuttleButton.Disabled = !_menu.CanCall;
|
||||
_menu.AnnounceButton.Disabled = !_menu.CanAnnounce;
|
||||
_menu.BroadcastButton.Disabled = !_menu.CanBroadcast;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,40 @@
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using System.Threading;
|
||||
using System.Globalization;
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.CCVar;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Timing;
|
||||
using Robust.Shared.Utility;
|
||||
using Timer = Robust.Shared.Timing.Timer;
|
||||
|
||||
namespace Content.Client.Communications.UI
|
||||
{
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class CommunicationsConsoleMenu : FancyWindow
|
||||
{
|
||||
private CommunicationsConsoleBoundUserInterface Owner { get; set; }
|
||||
private readonly CancellationTokenSource _timerCancelTokenSource = new();
|
||||
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly ILocalizationManager _loc = default!;
|
||||
|
||||
public CommunicationsConsoleMenu(CommunicationsConsoleBoundUserInterface owner)
|
||||
public bool CanAnnounce;
|
||||
public bool CanBroadcast;
|
||||
public bool CanCall;
|
||||
public bool AlertLevelSelectable;
|
||||
public bool CountdownStarted;
|
||||
public string CurrentLevel = string.Empty;
|
||||
public TimeSpan? CountdownEnd;
|
||||
|
||||
public event Action? OnEmergencyLevel;
|
||||
public event Action<string>? OnAlertLevel;
|
||||
public event Action<string>? OnAnnounce;
|
||||
public event Action<string>? OnBroadcast;
|
||||
|
||||
public CommunicationsConsoleMenu()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
Owner = owner;
|
||||
|
||||
var loc = IoCManager.Resolve<ILocalizationManager>();
|
||||
MessageInput.Placeholder = new Rope.Leaf(loc.GetString("comms-console-menu-announcement-placeholder"));
|
||||
MessageInput.Placeholder = new Rope.Leaf(_loc.GetString("comms-console-menu-announcement-placeholder"));
|
||||
|
||||
var maxAnnounceLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
|
||||
MessageInput.OnTextChanged += (args) =>
|
||||
@@ -37,33 +46,38 @@ namespace Content.Client.Communications.UI
|
||||
}
|
||||
else
|
||||
{
|
||||
AnnounceButton.Disabled = !owner.CanAnnounce;
|
||||
AnnounceButton.Disabled = !CanAnnounce;
|
||||
AnnounceButton.ToolTip = null;
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
AnnounceButton.OnPressed += (_) => Owner.AnnounceButtonPressed(Rope.Collapse(MessageInput.TextRope));
|
||||
AnnounceButton.Disabled = !owner.CanAnnounce;
|
||||
AnnounceButton.OnPressed += _ => OnAnnounce?.Invoke(Rope.Collapse(MessageInput.TextRope));
|
||||
AnnounceButton.Disabled = !CanAnnounce;
|
||||
|
||||
BroadcastButton.OnPressed += (_) => Owner.BroadcastButtonPressed(Rope.Collapse(MessageInput.TextRope));
|
||||
BroadcastButton.Disabled = !owner.CanBroadcast;
|
||||
BroadcastButton.OnPressed += _ => OnBroadcast?.Invoke(Rope.Collapse(MessageInput.TextRope));
|
||||
BroadcastButton.Disabled = !CanBroadcast;
|
||||
|
||||
AlertLevelButton.OnItemSelected += args =>
|
||||
{
|
||||
var metadata = AlertLevelButton.GetItemMetadata(args.Id);
|
||||
if (metadata != null && metadata is string cast)
|
||||
{
|
||||
Owner.AlertLevelSelected(cast);
|
||||
OnAlertLevel?.Invoke(cast);
|
||||
}
|
||||
};
|
||||
AlertLevelButton.Disabled = !owner.AlertLevelSelectable;
|
||||
|
||||
EmergencyShuttleButton.OnPressed += (_) => Owner.EmergencyShuttleButtonPressed();
|
||||
EmergencyShuttleButton.Disabled = !owner.CanCall;
|
||||
|
||||
AlertLevelButton.Disabled = !AlertLevelSelectable;
|
||||
|
||||
EmergencyShuttleButton.OnPressed += _ => OnEmergencyLevel?.Invoke();
|
||||
EmergencyShuttleButton.Disabled = !CanCall;
|
||||
}
|
||||
|
||||
protected override void FrameUpdate(FrameEventArgs args)
|
||||
{
|
||||
base.FrameUpdate(args);
|
||||
UpdateCountdown();
|
||||
Timer.SpawnRepeating(1000, UpdateCountdown, _timerCancelTokenSource.Token);
|
||||
}
|
||||
|
||||
// The current alert could make levels unselectable, so we need to ensure that the UI reacts properly.
|
||||
@@ -105,30 +119,19 @@ namespace Content.Client.Communications.UI
|
||||
|
||||
public void UpdateCountdown()
|
||||
{
|
||||
if (!Owner.CountdownStarted)
|
||||
if (!CountdownStarted)
|
||||
{
|
||||
CountdownLabel.SetMessage("");
|
||||
CountdownLabel.SetMessage(string.Empty);
|
||||
EmergencyShuttleButton.Text = Loc.GetString("comms-console-menu-call-shuttle");
|
||||
return;
|
||||
}
|
||||
|
||||
var diff = MathHelper.Max((CountdownEnd - _timing.CurTime) ?? TimeSpan.Zero, TimeSpan.Zero);
|
||||
|
||||
EmergencyShuttleButton.Text = Loc.GetString("comms-console-menu-recall-shuttle");
|
||||
CountdownLabel.SetMessage($"Time remaining\n{Owner.Countdown.ToString()}s");
|
||||
}
|
||||
|
||||
public override void Close()
|
||||
{
|
||||
base.Close();
|
||||
|
||||
_timerCancelTokenSource.Cancel();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
_timerCancelTokenSource.Cancel();
|
||||
var infoText = Loc.GetString($"comms-console-menu-time-remaining",
|
||||
("time", diff.TotalSeconds.ToString(CultureInfo.CurrentCulture)));
|
||||
CountdownLabel.SetMessage(infoText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
|
||||
namespace Content.Client.Computer
|
||||
@@ -19,10 +20,8 @@ namespace Content.Client.Computer
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = (TWindow) _dynamicTypeFactory.CreateInstance(typeof(TWindow));
|
||||
_window = this.CreateWindow<TWindow>();
|
||||
_window.SetupComputerWindow(this);
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
// Alas, this constructor has to be copied to the subclass. :(
|
||||
@@ -42,16 +41,6 @@ namespace Content.Client.Computer
|
||||
_window.UpdateState((TState) state);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
|
||||
{
|
||||
_window?.ReceiveMessage(message);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using static Content.Shared.Configurable.ConfigurationComponent;
|
||||
|
||||
namespace Content.Client.Configurable.UI
|
||||
@@ -9,9 +10,6 @@ namespace Content.Client.Configurable.UI
|
||||
[ViewVariables]
|
||||
private ConfigurationMenu? _menu;
|
||||
|
||||
[ViewVariables]
|
||||
public Regex? Validation { get; internal set; }
|
||||
|
||||
public ConfigurationBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
}
|
||||
@@ -19,10 +17,8 @@ namespace Content.Client.Configurable.UI
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_menu = new ConfigurationMenu(this);
|
||||
|
||||
_menu.OnClose += Close;
|
||||
_menu.OpenCentered();
|
||||
_menu = this.CreateWindow<ConfigurationMenu>();
|
||||
_menu.OnConfiguration += SendConfiguration;
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -30,9 +26,7 @@ namespace Content.Client.Configurable.UI
|
||||
base.UpdateState(state);
|
||||
|
||||
if (state is not ConfigurationBoundUserInterfaceState configurationState)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_menu?.Populate(configurationState);
|
||||
}
|
||||
@@ -41,9 +35,12 @@ namespace Content.Client.Configurable.UI
|
||||
{
|
||||
base.ReceiveMessage(message);
|
||||
|
||||
if (_menu == null)
|
||||
return;
|
||||
|
||||
if (message is ValidationUpdateMessage msg)
|
||||
{
|
||||
Validation = new Regex(msg.ValidationString, RegexOptions.Compiled);
|
||||
_menu.Validation = new Regex(msg.ValidationString, RegexOptions.Compiled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,16 +48,5 @@ namespace Content.Client.Configurable.UI
|
||||
{
|
||||
SendMessage(new ConfigurationUpdatedMessage(config));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing && _menu != null)
|
||||
{
|
||||
_menu.OnClose -= Close;
|
||||
_menu.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
using System.Text.RegularExpressions;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
@@ -13,23 +14,25 @@ namespace Content.Client.Configurable.UI
|
||||
{
|
||||
public sealed class ConfigurationMenu : DefaultWindow
|
||||
{
|
||||
public ConfigurationBoundUserInterface Owner { get; }
|
||||
|
||||
private readonly BoxContainer _column;
|
||||
private readonly BoxContainer _row;
|
||||
|
||||
private readonly List<(string name, LineEdit input)> _inputs;
|
||||
|
||||
public ConfigurationMenu(ConfigurationBoundUserInterface owner)
|
||||
[ViewVariables]
|
||||
public Regex? Validation { get; internal set; }
|
||||
|
||||
public event Action<Dictionary<string, string>>? OnConfiguration;
|
||||
|
||||
public ConfigurationMenu()
|
||||
{
|
||||
MinSize = SetSize = new Vector2(300, 250);
|
||||
Owner = owner;
|
||||
|
||||
_inputs = new List<(string name, LineEdit input)>();
|
||||
|
||||
Title = Loc.GetString("configuration-menu-device-title");
|
||||
|
||||
BoxContainer baseContainer = new BoxContainer
|
||||
var baseContainer = new BoxContainer
|
||||
{
|
||||
Orientation = LayoutOrientation.Vertical,
|
||||
VerticalExpand = true,
|
||||
@@ -116,14 +119,13 @@ namespace Content.Client.Configurable.UI
|
||||
private void OnConfirm(ButtonEventArgs args)
|
||||
{
|
||||
var config = GenerateDictionary(_inputs, "Text");
|
||||
|
||||
Owner.SendConfiguration(config);
|
||||
OnConfiguration?.Invoke(config);
|
||||
Close();
|
||||
}
|
||||
|
||||
private bool Validate(string value)
|
||||
{
|
||||
return Owner.Validation == null || Owner.Validation.IsMatch(value);
|
||||
return Validation?.IsMatch(value) != false;
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GenerateDictionary(IEnumerable<(string name, LineEdit input)> inputs, string propertyName)
|
||||
|
||||
@@ -26,7 +26,6 @@ namespace Content.Client.Construction
|
||||
{
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
|
||||
[Dependency] private readonly ExamineSystemShared _examineSystem = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
@@ -48,11 +47,11 @@ namespace Content.Client.Construction
|
||||
|
||||
CommandBinds.Builder
|
||||
.Bind(ContentKeyFunctions.OpenCraftingMenu,
|
||||
new PointerInputCmdHandler(HandleOpenCraftingMenu, outsidePrediction:true))
|
||||
new PointerInputCmdHandler(HandleOpenCraftingMenu, outsidePrediction: true))
|
||||
.Bind(EngineKeyFunctions.Use,
|
||||
new PointerInputCmdHandler(HandleUse, outsidePrediction: true))
|
||||
.Bind(ContentKeyFunctions.EditorFlipObject,
|
||||
new PointerInputCmdHandler(HandleFlip, outsidePrediction:true))
|
||||
new PointerInputCmdHandler(HandleFlip, outsidePrediction: true))
|
||||
.Register<ConstructionSystem>();
|
||||
|
||||
SubscribeLocalEvent<ConstructionGhostComponent, ExaminedEvent>(HandleConstructionGhostExamined);
|
||||
@@ -196,7 +195,7 @@ namespace Content.Client.Construction
|
||||
if (GhostPresent(loc))
|
||||
return false;
|
||||
|
||||
var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager, _transformSystem));
|
||||
var predicate = GetPredicate(prototype.CanBuildInImpassable, _transformSystem.ToMapCoordinates(loc));
|
||||
if (!_examineSystem.InRangeUnOccluded(user, loc, 20f, predicate: predicate))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Construction.Components;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Construction.UI
|
||||
{
|
||||
@@ -17,8 +18,8 @@ namespace Content.Client.Construction.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = new FlatpackCreatorMenu(Owner);
|
||||
_menu.OnClose += Close;
|
||||
_menu = this.CreateWindow<FlatpackCreatorMenu>();
|
||||
_menu.SetEntity(Owner);
|
||||
|
||||
_menu.PackButtonPressed += () =>
|
||||
{
|
||||
@@ -27,14 +28,5 @@ namespace Content.Client.Construction.UI
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_menu?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ public sealed partial class FlatpackCreatorMenu : FancyWindow
|
||||
private readonly FlatpackSystem _flatpack;
|
||||
private readonly MaterialStorageSystem _materialStorage;
|
||||
|
||||
private readonly EntityUid _owner;
|
||||
private EntityUid _owner;
|
||||
|
||||
[ValidatePrototypeId<EntityPrototype>]
|
||||
public const string NoBoardEffectId = "FlatpackerNoBoardEffect";
|
||||
@@ -33,7 +33,7 @@ public sealed partial class FlatpackCreatorMenu : FancyWindow
|
||||
|
||||
public event Action? PackButtonPressed;
|
||||
|
||||
public FlatpackCreatorMenu(EntityUid uid)
|
||||
public FlatpackCreatorMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
@@ -42,14 +42,17 @@ public sealed partial class FlatpackCreatorMenu : FancyWindow
|
||||
_flatpack = _entityManager.System<FlatpackSystem>();
|
||||
_materialStorage = _entityManager.System<MaterialStorageSystem>();
|
||||
|
||||
_owner = uid;
|
||||
|
||||
PackButton.OnPressed += _ => PackButtonPressed?.Invoke();
|
||||
|
||||
MaterialStorageControl.SetOwner(uid);
|
||||
InsertLabel.SetMarkup(Loc.GetString("flatpacker-ui-insert-board"));
|
||||
}
|
||||
|
||||
public void SetEntity(EntityUid uid)
|
||||
{
|
||||
_owner = uid;
|
||||
MaterialStorageControl.SetOwner(uid);
|
||||
}
|
||||
|
||||
protected override void FrameUpdate(FrameEventArgs args)
|
||||
{
|
||||
base.FrameUpdate(args);
|
||||
|
||||
@@ -170,7 +170,7 @@ namespace Content.Client.ContextMenu.UI
|
||||
if (_combatMode.IsInCombatMode(args.Session?.AttachedEntity))
|
||||
return false;
|
||||
|
||||
var coords = args.Coordinates.ToMap(_entityManager, _xform);
|
||||
var coords = _xform.ToMapCoordinates(args.Coordinates);
|
||||
|
||||
if (_verbSystem.TryGetEntityMenuEntities(coords, out var entities))
|
||||
OpenRootMenu(entities);
|
||||
|
||||
@@ -2,12 +2,15 @@
|
||||
using Content.Shared.Crayon;
|
||||
using Content.Shared.Decals;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Crayon.UI
|
||||
{
|
||||
public sealed class CrayonBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
||||
|
||||
[ViewVariables]
|
||||
private CrayonWindow? _menu;
|
||||
|
||||
@@ -18,15 +21,29 @@ namespace Content.Client.Crayon.UI
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_menu = new CrayonWindow(this);
|
||||
|
||||
_menu.OnClose += Close;
|
||||
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
|
||||
var crayonDecals = prototypeManager.EnumeratePrototypes<DecalPrototype>().Where(x => x.Tags.Contains("crayon"));
|
||||
_menu.Populate(crayonDecals);
|
||||
_menu = this.CreateWindow<CrayonWindow>();
|
||||
_menu.OnColorSelected += SelectColor;
|
||||
_menu.OnSelected += Select;
|
||||
PopulateCrayons();
|
||||
_menu.OpenCenteredLeft();
|
||||
}
|
||||
|
||||
private void PopulateCrayons()
|
||||
{
|
||||
var crayonDecals = _protoManager.EnumeratePrototypes<DecalPrototype>().Where(x => x.Tags.Contains("crayon"));
|
||||
_menu?.Populate(crayonDecals);
|
||||
}
|
||||
|
||||
public override void OnProtoReload(PrototypesReloadedEventArgs args)
|
||||
{
|
||||
base.OnProtoReload(args);
|
||||
|
||||
if (!args.WasModified<DecalPrototype>())
|
||||
return;
|
||||
|
||||
PopulateCrayons();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
{
|
||||
base.UpdateState(state);
|
||||
@@ -43,16 +60,5 @@ namespace Content.Client.Crayon.UI
|
||||
{
|
||||
SendMessage(new CrayonColorMessage(color));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_menu?.Close();
|
||||
_menu = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,18 +18,17 @@ namespace Content.Client.Crayon.UI
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class CrayonWindow : DefaultWindow
|
||||
{
|
||||
public CrayonBoundUserInterface Owner { get; }
|
||||
|
||||
private Dictionary<string, Texture>? _decals;
|
||||
private string? _selected;
|
||||
private Color _color;
|
||||
|
||||
public CrayonWindow(CrayonBoundUserInterface owner)
|
||||
public event Action<Color>? OnColorSelected;
|
||||
public event Action<string>? OnSelected;
|
||||
|
||||
public CrayonWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
Owner = owner;
|
||||
|
||||
Search.OnTextChanged += _ => RefreshList();
|
||||
ColorSelector.OnColorChanged += SelectColor;
|
||||
}
|
||||
@@ -38,16 +37,16 @@ namespace Content.Client.Crayon.UI
|
||||
{
|
||||
_color = color;
|
||||
|
||||
Owner.SelectColor(color);
|
||||
|
||||
OnColorSelected?.Invoke(color);
|
||||
RefreshList();
|
||||
}
|
||||
|
||||
private void RefreshList()
|
||||
{
|
||||
// Clear
|
||||
Grid.RemoveAllChildren();
|
||||
if (_decals == null) return;
|
||||
Grid.DisposeAllChildren();
|
||||
if (_decals == null)
|
||||
return;
|
||||
|
||||
var filter = Search.Text;
|
||||
foreach (var (decal, tex) in _decals)
|
||||
@@ -89,8 +88,8 @@ namespace Content.Client.Crayon.UI
|
||||
{
|
||||
if (obj.Button.Name == null) return;
|
||||
|
||||
Owner.Select(obj.Button.Name);
|
||||
_selected = obj.Button.Name;
|
||||
OnSelected?.Invoke(_selected);
|
||||
RefreshList();
|
||||
}
|
||||
|
||||
|
||||
65
Content.Client/DisplacementMap/DisplacementMapSystem.cs
Normal file
65
Content.Client/DisplacementMap/DisplacementMapSystem.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
using Content.Shared.DisplacementMap;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
|
||||
namespace Content.Client.DisplacementMap;
|
||||
|
||||
public sealed class DisplacementMapSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly ISerializationManager _serialization = default!;
|
||||
|
||||
public bool TryAddDisplacement(DisplacementData data, SpriteComponent sprite, int index, string key, HashSet<string> revealedLayers)
|
||||
{
|
||||
if (data.ShaderOverride != null)
|
||||
sprite.LayerSetShader(index, data.ShaderOverride);
|
||||
|
||||
var displacementKey = $"{key}-displacement";
|
||||
if (!revealedLayers.Add(displacementKey))
|
||||
{
|
||||
Log.Warning($"Duplicate key for DISPLACEMENT: {displacementKey}.");
|
||||
return false;
|
||||
}
|
||||
|
||||
//allows you not to write it every time in the YML
|
||||
foreach (var pair in data.SizeMaps)
|
||||
{
|
||||
pair.Value.CopyToShaderParameters??= new()
|
||||
{
|
||||
LayerKey = "dummy",
|
||||
ParameterTexture = "displacementMap",
|
||||
ParameterUV = "displacementUV",
|
||||
};
|
||||
}
|
||||
|
||||
if (!data.SizeMaps.ContainsKey(32))
|
||||
{
|
||||
Log.Error($"DISPLACEMENT: {displacementKey} don't have 32x32 default displacement map");
|
||||
return false;
|
||||
}
|
||||
|
||||
// We choose a displacement map from the possible ones, matching the size with the original layer size.
|
||||
// If there is no such a map, we use a standard 32 by 32 one
|
||||
var displacementDataLayer = data.SizeMaps[EyeManager.PixelsPerMeter];
|
||||
var actualRSI = sprite.LayerGetActualRSI(index);
|
||||
if (actualRSI is not null)
|
||||
{
|
||||
if (actualRSI.Size.X != actualRSI.Size.Y)
|
||||
Log.Warning($"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked");
|
||||
|
||||
var layerSize = actualRSI.Size.X;
|
||||
if (data.SizeMaps.ContainsKey(layerSize))
|
||||
displacementDataLayer = data.SizeMaps[layerSize];
|
||||
}
|
||||
|
||||
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
|
||||
displacementLayer.CopyToShaderParameters!.LayerKey = key;
|
||||
|
||||
sprite.AddLayer(displacementLayer, index);
|
||||
sprite.LayerMapSet(displacementKey, index);
|
||||
|
||||
revealedLayers.Add(displacementKey);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent;
|
||||
|
||||
namespace Content.Client.Disposal.UI
|
||||
@@ -21,20 +22,16 @@ namespace Content.Client.Disposal.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new DisposalRouterWindow();
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<DisposalRouterWindow>();
|
||||
|
||||
_window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text);
|
||||
_window.TagInput.OnTextEntered += args => ButtonPressed(UiAction.Ok, args.Text);
|
||||
|
||||
}
|
||||
|
||||
private void ButtonPressed(UiAction action, string tag)
|
||||
{
|
||||
SendMessage(new UiActionMessage(action, tag));
|
||||
_window?.Close();
|
||||
Close();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -48,18 +45,5 @@ namespace Content.Client.Disposal.UI
|
||||
|
||||
_window?.UpdateState(cast);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent;
|
||||
|
||||
namespace Content.Client.Disposal.UI
|
||||
@@ -21,20 +22,17 @@ namespace Content.Client.Disposal.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new DisposalTaggerWindow();
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<DisposalTaggerWindow>();
|
||||
|
||||
_window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text);
|
||||
_window.TagInput.OnTextEntered += args => ButtonPressed(UiAction.Ok, args.Text);
|
||||
|
||||
}
|
||||
|
||||
private void ButtonPressed(UiAction action, string tag)
|
||||
{
|
||||
// TODO: This looks copy-pasted with the other mailing stuff...
|
||||
SendMessage(new UiActionMessage(action, tag));
|
||||
_window?.Close();
|
||||
Close();
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -48,18 +46,5 @@ namespace Content.Client.Disposal.UI
|
||||
|
||||
_window?.UpdateState(cast);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Disposal;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Client.Disposal.UI
|
||||
{
|
||||
@@ -11,6 +12,8 @@ namespace Content.Client.Disposal.UI
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class MailingUnitWindow : DefaultWindow
|
||||
{
|
||||
public TimeSpan FullPressure;
|
||||
|
||||
public MailingUnitWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
@@ -26,6 +29,7 @@ namespace Content.Client.Disposal.UI
|
||||
|
||||
Title = Loc.GetString("ui-mailing-unit-window-title", ("tag", state.Tag ?? " "));
|
||||
UnitState.Text = disposalState.UnitState;
|
||||
FullPressure = disposalState.FullPressureTime;
|
||||
var pressureReached = PressureBar.UpdatePressure(disposalState.FullPressureTime);
|
||||
Power.Pressed = disposalState.Powered;
|
||||
Engage.Pressed = disposalState.Engaged;
|
||||
@@ -42,9 +46,10 @@ namespace Content.Client.Disposal.UI
|
||||
return !disposalState.Powered || pressureReached;
|
||||
}
|
||||
|
||||
public bool UpdatePressure(TimeSpan stateFullPressureTime)
|
||||
protected override void FrameUpdate(FrameEventArgs args)
|
||||
{
|
||||
return PressureBar.UpdatePressure(stateFullPressureTime);
|
||||
base.FrameUpdate(args);
|
||||
PressureBar.UpdatePressure(FullPressure);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Shared.Access;
|
||||
using Content.Shared.Doors.Electronics;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Doors.Electronics;
|
||||
@@ -18,6 +19,23 @@ public sealed class DoorElectronicsBoundUserInterface : BoundUserInterface
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_window = this.CreateWindow<DoorElectronicsConfigurationMenu>();
|
||||
_window.OnAccessChanged += UpdateConfiguration;
|
||||
Reset();
|
||||
}
|
||||
|
||||
public override void OnProtoReload(PrototypesReloadedEventArgs args)
|
||||
{
|
||||
base.OnProtoReload(args);
|
||||
|
||||
if (!args.WasModified<AccessLevelPrototype>())
|
||||
return;
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
List<ProtoId<AccessLevelPrototype>> accessLevels = new();
|
||||
|
||||
foreach (var accessLevel in _prototypeManager.EnumeratePrototypes<AccessLevelPrototype>())
|
||||
@@ -29,10 +47,7 @@ public sealed class DoorElectronicsBoundUserInterface : BoundUserInterface
|
||||
}
|
||||
|
||||
accessLevels.Sort();
|
||||
|
||||
_window = new DoorElectronicsConfigurationMenu(this, accessLevels, _prototypeManager);
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
_window?.Reset(_prototypeManager, accessLevels);
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -44,14 +59,6 @@ public sealed class DoorElectronicsBoundUserInterface : BoundUserInterface
|
||||
_window?.UpdateState(castState);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
|
||||
public void UpdateConfiguration(List<ProtoId<AccessLevelPrototype>> newAccessList)
|
||||
{
|
||||
SendMessage(new DoorElectronicsUpdateConfigurationMessage(newAccessList));
|
||||
|
||||
@@ -15,22 +15,23 @@ namespace Content.Client.Doors.Electronics;
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class DoorElectronicsConfigurationMenu : FancyWindow
|
||||
{
|
||||
private readonly DoorElectronicsBoundUserInterface _owner;
|
||||
private AccessLevelControl _buttonsList = new();
|
||||
private readonly AccessLevelControl _buttonsList = new();
|
||||
|
||||
public DoorElectronicsConfigurationMenu(DoorElectronicsBoundUserInterface ui, List<ProtoId<AccessLevelPrototype>> accessLevels, IPrototypeManager prototypeManager)
|
||||
public event Action<List<ProtoId<AccessLevelPrototype>>>? OnAccessChanged;
|
||||
|
||||
public DoorElectronicsConfigurationMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
_owner = ui;
|
||||
|
||||
_buttonsList.Populate(accessLevels, prototypeManager);
|
||||
AccessLevelControlContainer.AddChild(_buttonsList);
|
||||
}
|
||||
|
||||
foreach (var (id, button) in _buttonsList.ButtonsList)
|
||||
public void Reset(IPrototypeManager protoManager, List<ProtoId<AccessLevelPrototype>> accessLevels)
|
||||
{
|
||||
_buttonsList.Populate(accessLevels, protoManager);
|
||||
|
||||
foreach (var button in _buttonsList.ButtonsList.Values)
|
||||
{
|
||||
button.OnPressed += _ => _owner.UpdateConfiguration(
|
||||
_buttonsList.ButtonsList.Where(x => x.Value.Pressed).Select(x => x.Key).ToList());
|
||||
button.OnPressed += _ => OnAccessChanged?.Invoke(_buttonsList.ButtonsList.Where(x => x.Value.Pressed).Select(x => x.Key).ToList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Content.Client.Verbs;
|
||||
using Content.Shared.Eye.Blinding;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Input;
|
||||
@@ -16,8 +15,6 @@ using Robust.Shared.Utility;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Threading;
|
||||
using Content.Shared.Eye.Blinding.Components;
|
||||
using Robust.Client;
|
||||
using static Content.Shared.Interaction.SharedInteractionSystem;
|
||||
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
||||
using Content.Shared.Interaction.Events;
|
||||
@@ -360,10 +357,7 @@ namespace Content.Client.Examine
|
||||
|
||||
FormattedMessage message;
|
||||
|
||||
// Basically this just predicts that we can't make out the entity if we have poor vision.
|
||||
var canSeeClearly = !HasComp<BlurryVisionComponent>(playerEnt);
|
||||
|
||||
OpenTooltip(playerEnt.Value, entity, centeredOnCursor, false, knowTarget: canSeeClearly);
|
||||
OpenTooltip(playerEnt.Value, entity, centeredOnCursor, false);
|
||||
|
||||
// Always update tooltip info from client first.
|
||||
// If we get it wrong, server will correct us later anyway.
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
using Content.Shared.Extinguisher;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Client.Extinguisher;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent;
|
||||
@@ -16,7 +16,7 @@ public sealed class AdminFaxEui : BaseEui
|
||||
_window.OnClose += () => SendMessage(new AdminFaxEuiMsg.Close());
|
||||
_window.OnFollowFax += entity => SendMessage(new AdminFaxEuiMsg.Follow(entity));
|
||||
_window.OnMessageSend += args => SendMessage(new AdminFaxEuiMsg.Send(args.entity, args.title,
|
||||
args.stampedBy, args.message, args.stampSprite, args.stampColor));
|
||||
args.stampedBy, args.message, args.stampSprite, args.stampColor, args.locked));
|
||||
}
|
||||
|
||||
public override void Opened()
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
</BoxContainer>
|
||||
<Label Text="{Loc admin-fax-stamp-color}" />
|
||||
<ColorSelectorSliders Margin="12 0 0 0" Name="StampColorSelector" Color="#BB3232"/>
|
||||
<Control MinHeight="10" />
|
||||
<Button Name="SendButton" Text="{Loc admin-fax-send}"></Button>
|
||||
<CheckBox Name="LockPageCheckbox" Text="{Loc admin-fax-lock-page}" ToolTip="{Loc admin-fax-lock-page-tooltip}"/>
|
||||
<Button Name="SendButton" Text="{Loc admin-fax-send}" Margin="0 10 0 0" />
|
||||
</BoxContainer>
|
||||
</DefaultWindow>
|
||||
|
||||
@@ -14,7 +14,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
|
||||
{
|
||||
private const string StampsRsiPath = "/Textures/Objects/Misc/bureaucracy.rsi";
|
||||
|
||||
public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor)>? OnMessageSend;
|
||||
public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor, bool locked)>? OnMessageSend;
|
||||
public Action<NetEntity>? OnFollowFax;
|
||||
|
||||
[Dependency] private readonly IResourceCache _resCache = default!;
|
||||
@@ -98,6 +98,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
|
||||
|
||||
var from = FromEdit.Text;
|
||||
var stampColor = StampColorSelector.Color;
|
||||
OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor));
|
||||
var locked = LockPageCheckbox.Pressed;
|
||||
OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor, locked));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,24 +25,30 @@ public sealed class FaxVisualsSystem : EntitySystem
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
if (_appearance.TryGetData(uid, FaxMachineVisuals.VisualState, out FaxMachineVisualState visuals) && visuals == FaxMachineVisualState.Inserting)
|
||||
if (_player.HasRunningAnimation(uid, "faxecute"))
|
||||
return;
|
||||
|
||||
if (_appearance.TryGetData(uid, FaxMachineVisuals.VisualState, out FaxMachineVisualState visuals) &&
|
||||
visuals == FaxMachineVisualState.Inserting)
|
||||
{
|
||||
_player.Play(uid, new Animation()
|
||||
{
|
||||
Length = TimeSpan.FromSeconds(2.4),
|
||||
AnimationTracks =
|
||||
_player.Play(uid,
|
||||
new Animation()
|
||||
{
|
||||
new AnimationTrackSpriteFlick()
|
||||
Length = TimeSpan.FromSeconds(2.4),
|
||||
AnimationTracks =
|
||||
{
|
||||
LayerKey = FaxMachineVisuals.VisualState,
|
||||
KeyFrames =
|
||||
new AnimationTrackSpriteFlick()
|
||||
{
|
||||
new AnimationTrackSpriteFlick.KeyFrame(component.InsertingState, 0f),
|
||||
new AnimationTrackSpriteFlick.KeyFrame("icon", 2.4f),
|
||||
}
|
||||
}
|
||||
}
|
||||
}, "faxecute");
|
||||
LayerKey = FaxMachineVisuals.VisualState,
|
||||
KeyFrames =
|
||||
{
|
||||
new AnimationTrackSpriteFlick.KeyFrame(component.InsertingState, 0f),
|
||||
new AnimationTrackSpriteFlick.KeyFrame("icon", 2.4f),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"faxecute");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,10 +25,7 @@ public sealed class FaxBoundUi : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new FaxWindow();
|
||||
_window.OpenCentered();
|
||||
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<FaxWindow>();
|
||||
_window.FileButtonPressed += OnFileButtonPressed;
|
||||
_window.CopyButtonPressed += OnCopyButtonPressed;
|
||||
_window.SendButtonPressed += OnSendButtonPressed;
|
||||
@@ -104,11 +101,4 @@ public sealed class FaxBoundUi : BoundUserInterface
|
||||
|
||||
_window.UpdateState(cast);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (disposing)
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,22 @@
|
||||
using Content.Shared.Flash;
|
||||
using Content.Shared.Flash.Components;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Client.Viewport;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.State;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Timing;
|
||||
using SixLabors.ImageSharp.PixelFormats;
|
||||
|
||||
namespace Content.Client.Flash
|
||||
{
|
||||
public sealed class FlashOverlay : Overlay
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IClyde _displayManager = default!;
|
||||
[Dependency] private readonly IStateManager _stateManager = default!;
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
private readonly StatusEffectsSystem _statusSys;
|
||||
private readonly StatusEffectsSystem _statusSys;
|
||||
|
||||
public override OverlaySpace Space => OverlaySpace.WorldSpace;
|
||||
private readonly ShaderInstance _shader;
|
||||
@@ -56,20 +51,6 @@ namespace Content.Client.Flash
|
||||
PercentComplete = timeDone / lastsFor;
|
||||
}
|
||||
|
||||
public void ReceiveFlash()
|
||||
{
|
||||
if (_stateManager.CurrentState is IMainViewportState state)
|
||||
{
|
||||
// take a screenshot
|
||||
// note that the callback takes a while and ScreenshotTexture will be null the first few Draws
|
||||
state.Viewport.Viewport.Screenshot(image =>
|
||||
{
|
||||
var rgba32Image = image.CloneAs<Rgba32>(SixLabors.ImageSharp.Configuration.Default);
|
||||
ScreenshotTexture = _displayManager.LoadTextureFromImage(rgba32Image);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool BeforeDraw(in OverlayDrawArgs args)
|
||||
{
|
||||
if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp))
|
||||
@@ -82,6 +63,11 @@ namespace Content.Client.Flash
|
||||
|
||||
protected override void Draw(in OverlayDrawArgs args)
|
||||
{
|
||||
if (RequestScreenTexture && ScreenTexture != null)
|
||||
{
|
||||
ScreenshotTexture = ScreenTexture;
|
||||
RequestScreenTexture = false; // we only need the first frame, so we can stop the request now for performance reasons
|
||||
}
|
||||
if (ScreenshotTexture == null)
|
||||
return;
|
||||
|
||||
@@ -96,7 +82,6 @@ namespace Content.Client.Flash
|
||||
{
|
||||
base.DisposeBehavior();
|
||||
ScreenshotTexture = null;
|
||||
PercentComplete = 1.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ public sealed class FlashSystem : SharedFlashSystem
|
||||
SubscribeLocalEvent<FlashedComponent, ComponentShutdown>(OnShutdown);
|
||||
SubscribeLocalEvent<FlashedComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
|
||||
SubscribeLocalEvent<FlashedComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
|
||||
SubscribeLocalEvent<FlashedComponent, StatusEffectAddedEvent>(OnStatusAdded);
|
||||
|
||||
_overlay = new();
|
||||
}
|
||||
@@ -34,8 +33,8 @@ public sealed class FlashSystem : SharedFlashSystem
|
||||
|
||||
private void OnPlayerDetached(EntityUid uid, FlashedComponent component, LocalPlayerDetachedEvent args)
|
||||
{
|
||||
_overlay.PercentComplete = 1.0f;
|
||||
_overlay.ScreenshotTexture = null;
|
||||
_overlay.RequestScreenTexture = false;
|
||||
_overlayMan.RemoveOverlay(_overlay);
|
||||
}
|
||||
|
||||
@@ -43,6 +42,7 @@ public sealed class FlashSystem : SharedFlashSystem
|
||||
{
|
||||
if (_player.LocalEntity == uid)
|
||||
{
|
||||
_overlay.RequestScreenTexture = true;
|
||||
_overlayMan.AddOverlay(_overlay);
|
||||
}
|
||||
}
|
||||
@@ -51,17 +51,9 @@ public sealed class FlashSystem : SharedFlashSystem
|
||||
{
|
||||
if (_player.LocalEntity == uid)
|
||||
{
|
||||
_overlay.PercentComplete = 1.0f;
|
||||
_overlay.ScreenshotTexture = null;
|
||||
_overlay.RequestScreenTexture = false;
|
||||
_overlayMan.RemoveOverlay(_overlay);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStatusAdded(EntityUid uid, FlashedComponent component, StatusEffectAddedEvent args)
|
||||
{
|
||||
if (_player.LocalEntity == uid && args.Key == FlashedKey)
|
||||
{
|
||||
_overlay.ReceiveFlash();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Shared.Timing;
|
||||
using Content.Shared.Forensics;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Forensics
|
||||
{
|
||||
@@ -21,11 +22,9 @@ namespace Content.Client.Forensics
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_window = new ForensicScannerMenu();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<ForensicScannerMenu>();
|
||||
_window.Print.OnPressed += _ => Print();
|
||||
_window.Clear.OnPressed += _ => Clear();
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
private void Print()
|
||||
@@ -62,6 +61,7 @@ namespace Content.Client.Forensics
|
||||
|
||||
_printCooldown = cast.PrintCooldown;
|
||||
|
||||
// TODO: Fix this
|
||||
if (cast.PrintReadyAt > _gameTiming.CurTime)
|
||||
Timer.Spawn(cast.PrintReadyAt - _gameTiming.CurTime, () =>
|
||||
{
|
||||
@@ -71,14 +71,5 @@ namespace Content.Client.Forensics
|
||||
|
||||
_window.UpdateState(cast);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,8 @@ namespace Content.Client.Gameplay
|
||||
|
||||
public IEnumerable<EntityUid> GetClickableEntities(EntityCoordinates coordinates)
|
||||
{
|
||||
return GetClickableEntities(coordinates.ToMap(_entityManager, _entitySystemManager.GetEntitySystem<SharedTransformSystem>()));
|
||||
var transformSystem = _entitySystemManager.GetEntitySystem<SharedTransformSystem>();
|
||||
return GetClickableEntities(transformSystem.ToMapCoordinates(coordinates));
|
||||
}
|
||||
|
||||
public IEnumerable<EntityUid> GetClickableEntities(MapCoordinates coordinates)
|
||||
@@ -184,7 +185,7 @@ namespace Content.Client.Gameplay
|
||||
|
||||
EntityCoordinates coordinates = default;
|
||||
EntityUid? entityToClick = null;
|
||||
if (args.Viewport is IViewportControl vp)
|
||||
if (args.Viewport is IViewportControl vp && kArgs.PointerLocation.IsValid)
|
||||
{
|
||||
var mousePosWorld = vp.PixelToMap(kArgs.PointerLocation.Position);
|
||||
entityToClick = GetClickedEntity(mousePosWorld);
|
||||
@@ -193,6 +194,10 @@ namespace Content.Client.Gameplay
|
||||
grid.MapToGrid(mousePosWorld) :
|
||||
EntityCoordinates.FromMap(_mapManager, mousePosWorld);
|
||||
}
|
||||
else
|
||||
{
|
||||
coordinates = EntityCoordinates.Invalid;
|
||||
}
|
||||
|
||||
var message = new ClientFullInputCmdMessage(_timing.CurTick, _timing.TickFraction, funcId)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Content.Shared.Gateway;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Gateway.UI;
|
||||
|
||||
@@ -17,24 +18,13 @@ public sealed class GatewayBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GatewayWindow(EntMan.GetNetEntity(Owner));
|
||||
_window = this.CreateWindow<GatewayWindow>();
|
||||
_window.SetEntity(EntMan.GetNetEntity(Owner));
|
||||
|
||||
_window.OpenPortal += destination =>
|
||||
{
|
||||
SendMessage(new GatewayOpenPortalMessage(destination));
|
||||
};
|
||||
_window.OnClose += Close;
|
||||
_window?.OpenCentered();
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (disposing)
|
||||
{
|
||||
_window?.Dispose();
|
||||
_window = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
|
||||
@@ -22,7 +22,7 @@ public sealed partial class GatewayWindow : FancyWindow,
|
||||
public event Action<NetEntity>? OpenPortal;
|
||||
private List<GatewayDestinationData> _destinations = new();
|
||||
|
||||
public readonly NetEntity Owner;
|
||||
public NetEntity Owner;
|
||||
|
||||
private NetEntity? _current;
|
||||
private TimeSpan _nextReady;
|
||||
@@ -46,16 +46,20 @@ public sealed partial class GatewayWindow : FancyWindow,
|
||||
/// </summary>
|
||||
private bool _isCooldownPending = true;
|
||||
|
||||
public GatewayWindow(NetEntity netEntity)
|
||||
public GatewayWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
var dependencies = IoCManager.Instance!;
|
||||
_timing = dependencies.Resolve<IGameTiming>();
|
||||
Owner = netEntity;
|
||||
|
||||
NextUnlockBar.ForegroundStyleBoxOverride = new StyleBoxFlat(Color.FromHex("#C74EBD"));
|
||||
}
|
||||
|
||||
public void SetEntity(NetEntity entity)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void UpdateState(GatewayBoundUserInterfaceState state)
|
||||
{
|
||||
_destinations = state.Destinations;
|
||||
|
||||
29
Content.Client/Ghost/GhostRoleRadioBoundUserInterface.cs
Normal file
29
Content.Client/Ghost/GhostRoleRadioBoundUserInterface.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using Content.Shared.Ghost.Roles;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client.Ghost;
|
||||
|
||||
public sealed class GhostRoleRadioBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
private GhostRoleRadioMenu? _ghostRoleRadioMenu;
|
||||
|
||||
public GhostRoleRadioBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
}
|
||||
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_ghostRoleRadioMenu = this.CreateWindow<GhostRoleRadioMenu>();
|
||||
_ghostRoleRadioMenu.SetEntity(Owner);
|
||||
_ghostRoleRadioMenu.SendGhostRoleRadioMessageAction += SendGhostRoleRadioMessage;
|
||||
}
|
||||
|
||||
public void SendGhostRoleRadioMessage(ProtoId<GhostRolePrototype> protoId)
|
||||
{
|
||||
SendMessage(new GhostRoleRadioMessage(protoId));
|
||||
}
|
||||
}
|
||||
8
Content.Client/Ghost/GhostRoleRadioMenu.xaml
Normal file
8
Content.Client/Ghost/GhostRoleRadioMenu.xaml
Normal file
@@ -0,0 +1,8 @@
|
||||
<ui:RadialMenu
|
||||
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
|
||||
CloseButtonStyleClass="RadialMenuCloseButton"
|
||||
VerticalExpand="True"
|
||||
HorizontalExpand="True">
|
||||
<ui:RadialContainer Name="Main">
|
||||
</ui:RadialContainer>
|
||||
</ui:RadialMenu>
|
||||
107
Content.Client/Ghost/GhostRoleRadioMenu.xaml.cs
Normal file
107
Content.Client/Ghost/GhostRoleRadioMenu.xaml.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.Ghost.Roles;
|
||||
using Content.Shared.Ghost.Roles.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.Prototypes;
|
||||
using System.Numerics;
|
||||
|
||||
namespace Content.Client.Ghost;
|
||||
|
||||
public sealed partial class GhostRoleRadioMenu : RadialMenu
|
||||
{
|
||||
[Dependency] private readonly EntityManager _entityManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
public event Action<ProtoId<GhostRolePrototype>>? SendGhostRoleRadioMessageAction;
|
||||
|
||||
public EntityUid Entity { get; set; }
|
||||
|
||||
public GhostRoleRadioMenu()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
RobustXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public void SetEntity(EntityUid uid)
|
||||
{
|
||||
Entity = uid;
|
||||
RefreshUI();
|
||||
}
|
||||
|
||||
private void RefreshUI()
|
||||
{
|
||||
// The main control that will contain all of the clickable options
|
||||
var main = FindControl<RadialContainer>("Main");
|
||||
|
||||
// The purpose of this radial UI is for ghost role radios that allow you to select
|
||||
// more than one potential option, such as with kobolds/lizards.
|
||||
// This means that it won't show anything if SelectablePrototypes is empty.
|
||||
if (!_entityManager.TryGetComponent<GhostRoleMobSpawnerComponent>(Entity, out var comp))
|
||||
return;
|
||||
|
||||
foreach (var ghostRoleProtoString in comp.SelectablePrototypes)
|
||||
{
|
||||
// For each prototype we find we want to create a button that uses the name of the ghost role
|
||||
// as the hover tooltip, and the icon is taken from either the ghost role entityprototype
|
||||
// or the indicated icon entityprototype.
|
||||
if (!_prototypeManager.TryIndex<GhostRolePrototype>(ghostRoleProtoString, out var ghostRoleProto))
|
||||
continue;
|
||||
|
||||
var button = new GhostRoleRadioMenuButton()
|
||||
{
|
||||
StyleClasses = { "RadialMenuButton" },
|
||||
SetSize = new Vector2(64, 64),
|
||||
ToolTip = Loc.GetString(ghostRoleProto.Name),
|
||||
ProtoId = ghostRoleProto.ID,
|
||||
};
|
||||
|
||||
var entProtoView = new EntityPrototypeView()
|
||||
{
|
||||
SetSize = new Vector2(48, 48),
|
||||
VerticalAlignment = VAlignment.Center,
|
||||
HorizontalAlignment = HAlignment.Center,
|
||||
Stretch = SpriteView.StretchMode.Fill
|
||||
};
|
||||
|
||||
// pick the icon if it exists, otherwise fallback to the ghost role's entity
|
||||
if (_prototypeManager.TryIndex(ghostRoleProto.IconPrototype, out var iconProto))
|
||||
entProtoView.SetPrototype(iconProto);
|
||||
else
|
||||
entProtoView.SetPrototype(comp.Prototype);
|
||||
|
||||
button.AddChild(entProtoView);
|
||||
main.AddChild(button);
|
||||
AddGhostRoleRadioMenuButtonOnClickActions(main);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddGhostRoleRadioMenuButtonOnClickActions(Control control)
|
||||
{
|
||||
var mainControl = control as RadialContainer;
|
||||
|
||||
if (mainControl == null)
|
||||
return;
|
||||
|
||||
foreach (var child in mainControl.Children)
|
||||
{
|
||||
var castChild = child as GhostRoleRadioMenuButton;
|
||||
|
||||
if (castChild == null)
|
||||
continue;
|
||||
|
||||
castChild.OnButtonUp += _ =>
|
||||
{
|
||||
SendGhostRoleRadioMessageAction?.Invoke(castChild.ProtoId);
|
||||
Close();
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class GhostRoleRadioMenuButton : RadialMenuTextureButton
|
||||
{
|
||||
public ProtoId<GhostRolePrototype> ProtoId { get; set; }
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using Content.Shared.Gravity;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Gravity.UI
|
||||
{
|
||||
@@ -18,17 +18,8 @@ namespace Content.Client.Gravity.UI
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new GravityGeneratorWindow(this);
|
||||
|
||||
/*
|
||||
_window.Switch.OnPressed += _ =>
|
||||
{
|
||||
SendMessage(new SharedGravityGeneratorComponent.SwitchGeneratorMessage(!IsOn));
|
||||
};
|
||||
*/
|
||||
|
||||
_window.OpenCentered();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<GravityGeneratorWindow>();
|
||||
_window.SetEntity(Owner);
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
@@ -39,14 +30,6 @@ namespace Content.Client.Gravity.UI
|
||||
_window?.UpdateState(castState);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing) return;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
|
||||
public void SetPowerSwitch(bool on)
|
||||
{
|
||||
SendMessage(new SharedGravityGeneratorComponent.SwitchGeneratorMessage(on));
|
||||
|
||||
@@ -12,22 +12,23 @@ namespace Content.Client.Gravity.UI
|
||||
{
|
||||
private readonly ButtonGroup _buttonGroup = new();
|
||||
|
||||
private readonly GravityGeneratorBoundUserInterface _owner;
|
||||
public event Action<bool>? OnPowerSwitch;
|
||||
|
||||
public GravityGeneratorWindow(GravityGeneratorBoundUserInterface owner)
|
||||
public GravityGeneratorWindow()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_owner = owner;
|
||||
|
||||
OnButton.Group = _buttonGroup;
|
||||
OffButton.Group = _buttonGroup;
|
||||
|
||||
OnButton.OnPressed += _ => _owner.SetPowerSwitch(true);
|
||||
OffButton.OnPressed += _ => _owner.SetPowerSwitch(false);
|
||||
OnButton.OnPressed += _ => OnPowerSwitch?.Invoke(true);
|
||||
OffButton.OnPressed += _ => OnPowerSwitch?.Invoke(false);
|
||||
}
|
||||
|
||||
EntityView.SetEntity(owner.Owner);
|
||||
public void SetEntity(EntityUid uid)
|
||||
{
|
||||
EntityView.SetEntity(uid);
|
||||
}
|
||||
|
||||
public void UpdateState(SharedGravityGeneratorComponent.GeneratorState state)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Client.DisplacementMap;
|
||||
using Content.Client.Examine;
|
||||
using Content.Client.Strip;
|
||||
using Content.Client.Verbs.UI;
|
||||
@@ -15,7 +16,6 @@ using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Client.Hands.Systems
|
||||
@@ -29,7 +29,7 @@ namespace Content.Client.Hands.Systems
|
||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||
[Dependency] private readonly StrippableSystem _stripSys = default!;
|
||||
[Dependency] private readonly ExamineSystem _examine = default!;
|
||||
[Dependency] private readonly ISerializationManager _serialization = default!; //CP14
|
||||
[Dependency] private readonly DisplacementMapSystem _displacement = default!;
|
||||
|
||||
public event Action<string, HandLocation>? OnPlayerAddHand;
|
||||
public event Action<string>? OnPlayerRemoveHand;
|
||||
@@ -324,8 +324,6 @@ namespace Content.Client.Hands.Systems
|
||||
return;
|
||||
}
|
||||
|
||||
var displacementData = handComp.Displacements.GetValueOrDefault("Hands"); //CP14 hands displacements
|
||||
|
||||
// add the new layers
|
||||
foreach (var (key, layerData) in ev.Layers)
|
||||
{
|
||||
@@ -350,38 +348,9 @@ namespace Content.Client.Hands.Systems
|
||||
|
||||
sprite.LayerSetData(index, layerData);
|
||||
|
||||
//CP14 Hands displacement maps
|
||||
if (displacementData != null)
|
||||
{
|
||||
if (displacementData.ShaderOverride != null)
|
||||
sprite.LayerSetShader(index, displacementData.ShaderOverride);
|
||||
|
||||
var displacementKey = $"{key}-displacement";
|
||||
if (!revealedLayers.Add(displacementKey))
|
||||
{
|
||||
Log.Warning($"Duplicate key for inhand layers DISPLACEMENT: {displacementKey}.");
|
||||
continue;
|
||||
}
|
||||
|
||||
var displacementDataLayer = displacementData.Layer;
|
||||
var actualRSI = sprite.LayerGetActualRSI(index);
|
||||
if (actualRSI != null)
|
||||
{
|
||||
var layerSize = actualRSI.Size;
|
||||
if (layerSize.X == 48 && displacementData.Layer48 != null)
|
||||
displacementDataLayer = displacementData.Layer48;
|
||||
}
|
||||
|
||||
var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
|
||||
displacementLayer.CopyToShaderParameters!.LayerKey = key;
|
||||
|
||||
// Add before main layer for this item.
|
||||
sprite.AddLayer(displacementLayer, index);
|
||||
sprite.LayerMapSet(displacementKey, index);
|
||||
|
||||
revealedLayers.Add(displacementKey);
|
||||
}
|
||||
//CP14 Hands displacement maps - end
|
||||
//Add displacement maps
|
||||
if (handComp.HandDisplacement is not null)
|
||||
_displacement.TryAddDisplacement(handComp.HandDisplacement, sprite, index, key, revealedLayers);
|
||||
}
|
||||
|
||||
RaiseLocalEvent(held, new HeldVisualsUpdatedEvent(uid, revealedLayers), true);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using Content.Shared.MedicalScanner;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.HealthAnalyzer.UI
|
||||
{
|
||||
@@ -17,12 +17,9 @@ namespace Content.Client.HealthAnalyzer.UI
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_window = new HealthAnalyzerWindow
|
||||
{
|
||||
Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName,
|
||||
};
|
||||
_window.OnClose += Close;
|
||||
_window.OpenCentered();
|
||||
_window = this.CreateWindow<HealthAnalyzerWindow>();
|
||||
|
||||
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
|
||||
}
|
||||
|
||||
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
|
||||
@@ -35,17 +32,5 @@ namespace Content.Client.HealthAnalyzer.UI
|
||||
|
||||
_window.Populate(cast);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
if (_window != null)
|
||||
_window.OnClose -= Close;
|
||||
|
||||
_window?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,8 +85,19 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
||||
if (protoId == null)
|
||||
return;
|
||||
|
||||
//if (sexMorph)
|
||||
// protoId = HumanoidVisualLayersExtension.GetSexMorph(key, component.Sex, protoId);
|
||||
|
||||
//CP14 female bodies support
|
||||
if (sexMorph)
|
||||
protoId = HumanoidVisualLayersExtension.GetSexMorph(key, component.Sex, protoId);
|
||||
{
|
||||
var tempProto = HumanoidVisualLayersExtension.GetSexMorph(key, component.Sex, protoId);
|
||||
if (_prototypeManager.TryIndex<HumanoidSpeciesSpriteLayer>(tempProto, out _))
|
||||
{
|
||||
protoId = tempProto;
|
||||
}
|
||||
}
|
||||
//CP14 female bodies support end
|
||||
|
||||
var proto = _prototypeManager.Index<HumanoidSpeciesSpriteLayer>(protoId);
|
||||
component.BaseLayers[key] = proto;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Humanoid.Markings;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Humanoid;
|
||||
|
||||
@@ -20,8 +21,7 @@ public sealed class HumanoidMarkingModifierBoundUserInterface : BoundUserInterfa
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_window = new();
|
||||
_window.OnClose += Close;
|
||||
_window = this.CreateWindow<HumanoidMarkingModifierWindow>();
|
||||
_window.OnMarkingAdded += SendMarkingSet;
|
||||
_window.OnMarkingRemoved += SendMarkingSet;
|
||||
_window.OnMarkingColorChange += SendMarkingSetNoResend;
|
||||
|
||||
29
Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs
Normal file
29
Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using Content.Shared.IconSmoothing;
|
||||
using Robust.Client.GameObjects;
|
||||
|
||||
namespace Content.Client.IconSmoothing;
|
||||
|
||||
public sealed class ClientRandomIconSmoothSystem : SharedRandomIconSmoothSystem
|
||||
{
|
||||
[Dependency] private readonly IconSmoothSystem _iconSmooth = default!;
|
||||
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<RandomIconSmoothComponent, AppearanceChangeEvent>(OnAppearanceChange);
|
||||
}
|
||||
|
||||
private void OnAppearanceChange(Entity<RandomIconSmoothComponent> ent, ref AppearanceChangeEvent args)
|
||||
{
|
||||
if (!TryComp<IconSmoothComponent>(ent, out var smooth))
|
||||
return;
|
||||
|
||||
if (!_appearance.TryGetData<string>(ent, RandomIconSmoothState.State, out var state, args.Component))
|
||||
return;
|
||||
|
||||
smooth.StateBase = state;
|
||||
_iconSmooth.SetStateBase(ent, smooth, state);
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@ namespace Content.Client.IconSmoothing
|
||||
/// Prepended to the RSI state.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("base")]
|
||||
public string StateBase { get; private set; } = string.Empty;
|
||||
public string StateBase { get; set; } = string.Empty;
|
||||
|
||||
[DataField("shader", customTypeSerializer:typeof(PrototypeIdSerializer<ShaderPrototype>))]
|
||||
public string? Shader;
|
||||
|
||||
@@ -55,6 +55,33 @@ namespace Content.Client.IconSmoothing
|
||||
if (component.Mode != IconSmoothingMode.Corners || !TryComp(uid, out SpriteComponent? sprite))
|
||||
return;
|
||||
|
||||
SetCornerLayers(sprite, component);
|
||||
|
||||
if (component.Shader != null)
|
||||
{
|
||||
sprite.LayerSetShader(CornerLayers.SE, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.NE, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.NW, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.SW, component.Shader);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetStateBase(EntityUid uid, IconSmoothComponent component, string newState)
|
||||
{
|
||||
if (!TryComp<SpriteComponent>(uid, out var sprite))
|
||||
return;
|
||||
|
||||
component.StateBase = newState;
|
||||
SetCornerLayers(sprite, component);
|
||||
}
|
||||
|
||||
private void SetCornerLayers(SpriteComponent sprite, IconSmoothComponent component)
|
||||
{
|
||||
sprite.LayerMapRemove(CornerLayers.SE);
|
||||
sprite.LayerMapRemove(CornerLayers.NE);
|
||||
sprite.LayerMapRemove(CornerLayers.NW);
|
||||
sprite.LayerMapRemove(CornerLayers.SW);
|
||||
|
||||
var state0 = $"{component.StateBase}0";
|
||||
sprite.LayerMapSet(CornerLayers.SE, sprite.AddLayerState(state0));
|
||||
sprite.LayerSetDirOffset(CornerLayers.SE, DirectionOffset.None);
|
||||
@@ -64,14 +91,6 @@ namespace Content.Client.IconSmoothing
|
||||
sprite.LayerSetDirOffset(CornerLayers.NW, DirectionOffset.Flip);
|
||||
sprite.LayerMapSet(CornerLayers.SW, sprite.AddLayerState(state0));
|
||||
sprite.LayerSetDirOffset(CornerLayers.SW, DirectionOffset.Clockwise);
|
||||
|
||||
if (component.Shader != null)
|
||||
{
|
||||
sprite.LayerSetShader(CornerLayers.SE, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.NE, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.NW, component.Shader);
|
||||
sprite.LayerSetShader(CornerLayers.SW, component.Shader);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnShutdown(EntityUid uid, IconSmoothComponent component, ComponentShutdown args)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user