mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-10-20 15:26:51 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d6224db08 | ||
|
|
4f53b058fa | ||
|
|
fdca73405e | ||
|
|
003087ee94 | ||
|
|
0a72a1acfc | ||
|
|
e88519f474 | ||
|
|
6d8c92b512 | ||
|
|
efe800c606 | ||
|
|
1634454700 | ||
|
|
d31a9605d5 | ||
|
|
f061b5848a | ||
|
|
a4b47dee6c | ||
|
|
54331d8e76 | ||
|
|
1a7ba74517 | ||
|
|
6285651194 | ||
|
|
3339f77e1c | ||
|
|
8b124bf298 | ||
|
|
0a2e3e5e88 | ||
|
|
6873051bcb | ||
|
|
5e2438d6f6 | ||
|
|
9d4caa7be4 | ||
|
|
cbfad43467 | ||
|
|
cc70a30315 | ||
|
|
c209895389 | ||
|
|
1f9f7101e2 | ||
|
|
ed89e7c845 | ||
|
|
80dff702fc | ||
|
|
43bd96a679 | ||
|
|
a87c83dae2 | ||
|
|
490d2b69e3 | ||
|
|
7eac936431 | ||
|
|
588b261d52 | ||
|
|
daf2cf02b3 | ||
|
|
b9d97f2434 | ||
|
|
1467dc963d | ||
|
|
89bf687fc4 | ||
|
|
2e7c80562b | ||
|
|
5d54b82be0 | ||
|
|
2ae1df4d42 | ||
|
|
26782e6f0c | ||
|
|
cc84d5b562 | ||
|
|
8bb1efdca3 | ||
|
|
7a5794c8e2 | ||
|
|
9dd20661f5 | ||
|
|
ad0ab66711 | ||
|
|
82396b5145 | ||
|
|
246e974dc1 | ||
|
|
203b6a4b4f | ||
|
|
f204f3a209 | ||
|
|
ba8e060370 | ||
|
|
c51172acbc | ||
|
|
39100a5011 | ||
|
|
fcee61a703 | ||
|
|
ce8cc2cf37 | ||
|
|
3b5bdcfb51 | ||
|
|
4d67e97973 | ||
|
|
da09f4d6d8 | ||
|
|
dbc7e2e0bf | ||
|
|
dd804b6665 | ||
|
|
33eb878834 | ||
|
|
2a2c456011 | ||
|
|
05a12f3899 | ||
|
|
eb04710f71 | ||
|
|
257760453e | ||
|
|
d11baeb08a | ||
|
|
47d322c993 | ||
|
|
d316207a61 | ||
|
|
e6daabbb47 | ||
|
|
53156449f1 | ||
|
|
e3d4c32d03 | ||
|
|
9cd5c39bbe | ||
|
|
a1fbf25465 | ||
|
|
ec74037f05 | ||
|
|
fff650b766 | ||
|
|
bae2a18e24 | ||
|
|
fd8a7ebb4c | ||
|
|
4a3a1491d4 | ||
|
|
9aa2c5ed8a | ||
|
|
d5699a7472 | ||
|
|
df98f8f626 | ||
|
|
d37b298f07 | ||
|
|
62f7fc17d1 | ||
|
|
6e4929246d | ||
|
|
909461975a | ||
|
|
dec191e5e7 | ||
|
|
07b0cd6f5a | ||
|
|
b7a892ecfe | ||
|
|
79d16102fa | ||
|
|
67efdb47aa | ||
|
|
751c233b49 | ||
|
|
f51734fea0 | ||
|
|
516a7111a7 | ||
|
|
1e3ff59b26 | ||
|
|
4c48f812d5 | ||
|
|
a63a6f751f | ||
|
|
923860a90b | ||
|
|
5a4ca2f907 | ||
|
|
ccc2ed0806 | ||
|
|
44c707e059 | ||
|
|
e7c458de3f | ||
|
|
11b05b10a4 | ||
|
|
d133ac0088 | ||
|
|
8951fcdebd | ||
|
|
ecbd5677ce | ||
|
|
e31b9c1a28 | ||
|
|
faa7b7c742 | ||
|
|
d08f326477 | ||
|
|
6500ed2075 | ||
|
|
56eb775a0f | ||
|
|
e225bcfb96 | ||
|
|
4be6abe416 | ||
|
|
c3de8b33de | ||
|
|
5658d6709c | ||
|
|
192538a741 | ||
|
|
b8b9d7bf8c | ||
|
|
1db8603910 | ||
|
|
1c5774fca5 | ||
|
|
0b332b06b6 | ||
|
|
0be9b049a3 | ||
|
|
6993639cc0 | ||
|
|
74172e3123 | ||
|
|
6e1c4f682e | ||
|
|
af0d282a1f | ||
|
|
09bf15fa05 | ||
|
|
43f7d95b4c | ||
|
|
8b536b1775 | ||
|
|
60a7f4bc35 | ||
|
|
0ed0e0c983 | ||
|
|
f4b1ca9f21 | ||
|
|
609104cfa8 | ||
|
|
935d11b433 | ||
|
|
e9eeb8335d | ||
|
|
4a2f42437f | ||
|
|
51b0693c99 | ||
|
|
185b366d8d | ||
|
|
a40e533068 | ||
|
|
5b3918fcb1 | ||
|
|
d315e99b63 | ||
|
|
8090ba0259 | ||
|
|
584400d011 | ||
|
|
124ad23a95 | ||
|
|
6b59aa38ae | ||
|
|
03554eb372 | ||
|
|
dabfe41f29 | ||
|
|
6e2c6fc51e | ||
|
|
d81986bcc5 | ||
|
|
ea17e916b8 | ||
|
|
ce56224038 | ||
|
|
9978932391 | ||
|
|
2ebc9e0deb | ||
|
|
7ddc621009 | ||
|
|
aa4e574eef | ||
|
|
15bc964fcc | ||
|
|
99713ac964 | ||
|
|
f9a6bd1343 | ||
|
|
f4bee872e1 | ||
|
|
be99b286b3 | ||
|
|
c7d5212f82 | ||
|
|
75726b3d34 | ||
|
|
8d7e76ed81 | ||
|
|
01b08b2297 | ||
|
|
cf51581ac1 | ||
|
|
d99fd56995 | ||
|
|
d149051c27 | ||
|
|
660aaa87ca | ||
|
|
4010f03b05 | ||
|
|
e2d2dcf337 | ||
|
|
b11aaf3f0c | ||
|
|
30ae065cb4 | ||
|
|
7f5b0559aa | ||
|
|
851954efb2 | ||
|
|
b8c6a459a6 | ||
|
|
4523089440 | ||
|
|
217fe47878 | ||
|
|
525e3db24a | ||
|
|
c3cac7d8c7 | ||
|
|
a92717bb1d | ||
|
|
9dc32eada2 | ||
|
|
d1644c0454 | ||
|
|
81ce84b3f1 | ||
|
|
18a8a405e0 | ||
|
|
07840b3b55 | ||
|
|
f639c5b14e | ||
|
|
a6851554e8 | ||
|
|
6859b83fe0 | ||
|
|
699da3cd26 | ||
|
|
6d429ef57b | ||
|
|
0bc7c20106 | ||
|
|
d8f83d09ee | ||
|
|
43874d35ec | ||
|
|
5a186e4b02 | ||
|
|
70b3ac21ef | ||
|
|
7f24782aee | ||
|
|
009835c17f | ||
|
|
18db39d480 | ||
|
|
5956c358d0 | ||
|
|
f18232eb6c | ||
|
|
ac69d57de0 | ||
|
|
9297d4a7d2 | ||
|
|
e6fd4e2255 | ||
|
|
c0fa6db602 | ||
|
|
d61d732a75 | ||
|
|
e9c0ac3c6b | ||
|
|
e071ecc1d7 | ||
|
|
14f6ef3da0 | ||
|
|
edac6d1f22 | ||
|
|
525dfab3e3 | ||
|
|
0b77986034 | ||
|
|
f0ab72db92 | ||
|
|
6243555db1 | ||
|
|
abefb652c1 | ||
|
|
483e3ff800 | ||
|
|
0642e5a67e | ||
|
|
9553aa6e15 | ||
|
|
090fb1a33e | ||
|
|
c4896a1c07 | ||
|
|
5f165d0a89 | ||
|
|
df2c1ca6f2 | ||
|
|
5e41b6c471 | ||
|
|
1d3fff08ed | ||
|
|
73ffcbcb41 | ||
|
|
510535fdd4 | ||
|
|
4ade79a307 | ||
|
|
954abb974e | ||
|
|
8f3093ea2b | ||
|
|
2ead5b3c40 | ||
|
|
47cab96d10 | ||
|
|
7cfcebf0f5 | ||
|
|
12e310f1fe | ||
|
|
f28b855189 | ||
|
|
43ed3aba41 | ||
|
|
1da4ee04d3 | ||
|
|
17b5e4015d | ||
|
|
1a8b8b7232 | ||
|
|
fd2e8cfa8a | ||
|
|
ccd05c04a5 | ||
|
|
e70edffaa3 | ||
|
|
3ecaaf33b6 | ||
|
|
c424ea52fa | ||
|
|
ebb1aaeefd | ||
|
|
f2d1f7bf52 | ||
|
|
deb42da38e | ||
|
|
43df2a754d | ||
|
|
d468d0ca28 | ||
|
|
e586d0aecf | ||
|
|
8e36fed7bf | ||
|
|
2e3bf585ea | ||
|
|
f57ad5a888 | ||
|
|
47fa31515d | ||
|
|
7e45c17078 | ||
|
|
32a0fc9b17 | ||
|
|
62c2757afc | ||
|
|
7a7596fb7b | ||
|
|
708b0d6365 | ||
|
|
daf1a1baa2 | ||
|
|
59150a655a | ||
|
|
5594ad1ce3 | ||
|
|
f12bd1368f | ||
|
|
6921ad49db | ||
|
|
4430fd21f5 | ||
|
|
64d8f22757 | ||
|
|
2a73524a19 | ||
|
|
bfd7a02c9d | ||
|
|
b108a0164a | ||
|
|
9f1aa916e4 | ||
|
|
5144a2a2df | ||
|
|
c9c2deae1a | ||
|
|
b220db9d85 | ||
|
|
f9e3d96673 | ||
|
|
6c2b65055b | ||
|
|
5fa1efb1f2 | ||
|
|
6b5d4fc557 | ||
|
|
369b125c52 | ||
|
|
732e049252 | ||
|
|
cdb419c3f1 | ||
|
|
2dde426df6 | ||
|
|
8c00499e76 | ||
|
|
32dac5fbe2 | ||
|
|
0d3f8de811 | ||
|
|
90b8747775 | ||
|
|
5333d23ad8 | ||
|
|
e38e11b890 | ||
|
|
79303c90d7 | ||
|
|
4eac0978ed | ||
|
|
aef5b9a057 | ||
|
|
c65b951493 | ||
|
|
75385e5c01 | ||
|
|
ad19baf1f6 | ||
|
|
fb7acbac0a | ||
|
|
7cd752ceb7 | ||
|
|
9df288e7e3 | ||
|
|
26396bbe1a | ||
|
|
a21850e85f | ||
|
|
b19358914a | ||
|
|
5a296f2d06 | ||
|
|
755c84039a | ||
|
|
136ea44509 | ||
|
|
ba758470fc | ||
|
|
878c39413a | ||
|
|
a63a3a8fa5 | ||
|
|
6a2e1f0271 | ||
|
|
21f1ecfa15 | ||
|
|
9c5966c49c | ||
|
|
ffc1d01a0a | ||
|
|
e66e6e0b51 | ||
|
|
b40a86e114 | ||
|
|
ef23d6d51a | ||
|
|
4fea28b313 | ||
|
|
5502fa4584 | ||
|
|
0e2ae6840b | ||
|
|
3a4493c914 | ||
|
|
66deda7c76 | ||
|
|
44beeec1d7 | ||
|
|
824f74a4ce | ||
|
|
8d72d2b3a4 | ||
|
|
876f1231ee | ||
|
|
ffbf395074 | ||
|
|
550b513f6b | ||
|
|
3f4ee39ca9 | ||
|
|
a4887ec3c3 | ||
|
|
f1185d8f34 | ||
|
|
030b2998eb | ||
|
|
3f8ae692ff | ||
|
|
07df92d75c | ||
|
|
8bbf98979e | ||
|
|
24408e53a3 | ||
|
|
f8160e254b | ||
|
|
ff9b585b29 | ||
|
|
095f413147 | ||
|
|
3dd1162a59 | ||
|
|
436225e341 | ||
|
|
ca89073537 | ||
|
|
7663145821 | ||
|
|
eed75eea58 | ||
|
|
194955770e | ||
|
|
3c3820cb38 | ||
|
|
fc25a328bf | ||
|
|
c7e857506d | ||
|
|
d343cd4f08 | ||
|
|
b4aa1b74ab | ||
|
|
b043c5eade | ||
|
|
c1a6ca80f5 | ||
|
|
a010ef0f60 | ||
|
|
1240632dae | ||
|
|
87df6e08ca | ||
|
|
d7ad947cbb | ||
|
|
434e7f75fa | ||
|
|
6f6e74e015 | ||
|
|
24f3176b1b | ||
|
|
2d0df240f4 | ||
|
|
def658ccc6 | ||
|
|
676b35fb1c | ||
|
|
18a1a693b5 | ||
|
|
617a797743 | ||
|
|
e1711b5d03 | ||
|
|
28ef4a0b2b | ||
|
|
8ee17150b8 | ||
|
|
b52017625d | ||
|
|
60ac9dfca2 | ||
|
|
c671735e84 | ||
|
|
29e5247131 | ||
|
|
f5c533094e | ||
|
|
06a8e08244 | ||
|
|
30eda70dda | ||
|
|
38ec4cc3ce | ||
|
|
435271becf | ||
|
|
991bb12c80 | ||
|
|
b8b643ebdf | ||
|
|
42ad8ba1ee | ||
|
|
9f425cce4c | ||
|
|
8be08acfa2 | ||
|
|
6422772530 | ||
|
|
a008a425ec | ||
|
|
0936015d84 | ||
|
|
488a59df2e | ||
|
|
5bf1533067 | ||
|
|
77024cd651 | ||
|
|
d0e209b2eb | ||
|
|
d934fc181c | ||
|
|
2ca6235b5d | ||
|
|
a271ed000e | ||
|
|
4d64ad8bb8 | ||
|
|
66a717b927 | ||
|
|
79114a90f5 | ||
|
|
4427748b8b | ||
|
|
ae9b8326a4 | ||
|
|
619c240e62 | ||
|
|
19889e7d6f | ||
|
|
107d1fc8ff | ||
|
|
636fddd642 | ||
|
|
13532a1f0a | ||
|
|
e1ace2ba08 | ||
|
|
96f0c1d148 | ||
|
|
03ecf8fe82 | ||
|
|
1c03a7fc5c | ||
|
|
85fe65612e | ||
|
|
88469f6141 | ||
|
|
d81ba4a8c8 | ||
|
|
734c0a37f7 | ||
|
|
7becca450a | ||
|
|
f2a5489363 | ||
|
|
c7a8cb566b | ||
|
|
a80031c3c5 | ||
|
|
b6d9eb3dcc | ||
|
|
4a594a8e4f | ||
|
|
384a28c517 | ||
|
|
57ef3842e9 | ||
|
|
5b509466e6 | ||
|
|
7019947083 | ||
|
|
5ddc9243dd | ||
|
|
1dd89597fd | ||
|
|
2ac1de4ae9 | ||
|
|
1f783ddf44 | ||
|
|
bee920f96a | ||
|
|
333e158ca5 | ||
|
|
67baf07efc | ||
|
|
4ba8ecd3fd | ||
|
|
aee42cdecc | ||
|
|
adb2a32fda | ||
|
|
d2c373b27d | ||
|
|
b0060bcb82 | ||
|
|
4f63db3f70 | ||
|
|
0d356514f2 | ||
|
|
6ce37944a7 | ||
|
|
8ef75f7c34 | ||
|
|
bf2da499d6 | ||
|
|
ef2fe6a775 | ||
|
|
2ac84f14be | ||
|
|
5078becbb3 | ||
|
|
e19784a429 | ||
|
|
1628652264 | ||
|
|
668c7d301b | ||
|
|
d56a63e712 | ||
|
|
8070b211ab | ||
|
|
5ed59d0282 | ||
|
|
70223cfcd6 | ||
|
|
7d0ff90b01 | ||
|
|
ecc09a710a | ||
|
|
846b4faefa | ||
|
|
66da382789 | ||
|
|
3378723bdd | ||
|
|
56723330b3 | ||
|
|
08e2244975 | ||
|
|
f9e934fa1a | ||
|
|
30eacc5019 | ||
|
|
3ba7c18288 | ||
|
|
958a09b280 | ||
|
|
cc66e7e7c8 | ||
|
|
7f58e0413c | ||
|
|
3c256ddc5d | ||
|
|
d2f8e62ecc | ||
|
|
5ce479b1af | ||
|
|
be2b893a3f | ||
|
|
32994ce4af | ||
|
|
0c6a43fe0a | ||
|
|
81e0376102 | ||
|
|
f21306a19d | ||
|
|
5f3dcac8e1 | ||
|
|
600bf94044 | ||
|
|
3b38b69034 | ||
|
|
faa8f0f9b6 | ||
|
|
125624b09e | ||
|
|
7186afda93 | ||
|
|
ee542abb5d | ||
|
|
c7638a6485 | ||
|
|
16795871c3 | ||
|
|
54eff0e27f | ||
|
|
0a85521028 | ||
|
|
587af255a6 | ||
|
|
06326f4d55 | ||
|
|
b73f9798e4 | ||
|
|
7ef5031717 | ||
|
|
ba30258ee6 | ||
|
|
940a65cac0 | ||
|
|
7878b05030 | ||
|
|
16eb63d2ea | ||
|
|
8539bc5ade | ||
|
|
02f357a88d | ||
|
|
92f72b45d5 | ||
|
|
7755b19abc | ||
|
|
6b62ba1c5b | ||
|
|
2514aa2e3c | ||
|
|
82982c54f9 | ||
|
|
726718a6f5 | ||
|
|
1609e232a2 | ||
|
|
fda2e265af | ||
|
|
5c19ae0e94 | ||
|
|
f01b3caeb1 | ||
|
|
9e7262660f | ||
|
|
4489197d01 | ||
|
|
3d411fc6f3 | ||
|
|
d4f26577a5 | ||
|
|
c744f761a1 | ||
|
|
7224ca43f3 | ||
|
|
b95cea35a2 | ||
|
|
d891791929 | ||
|
|
826b0ad4ce | ||
|
|
c99c61cc7a | ||
|
|
5eb57de264 | ||
|
|
976cfdbbc2 | ||
|
|
a7aea8d1ed | ||
|
|
9caa89b733 | ||
|
|
e42515c1ea | ||
|
|
901169775d | ||
|
|
3d86540d1d | ||
|
|
6cb97d067e | ||
|
|
ad323ebf2b | ||
|
|
18efedf7c5 | ||
|
|
4eaf4ff26b | ||
|
|
b1d2ac7822 | ||
|
|
87e6e583a6 | ||
|
|
2897e1a3ad | ||
|
|
dfd5a7c21d | ||
|
|
093f6411c7 | ||
|
|
845bea522b | ||
|
|
d0175f9c39 | ||
|
|
0b1d59e398 | ||
|
|
93bcb8994f | ||
|
|
ecee464b34 | ||
|
|
42789fcc24 | ||
|
|
f26b36f3e8 | ||
|
|
9f09052900 | ||
|
|
95a7ba0785 | ||
|
|
ef4a3b405d | ||
|
|
7096fcd43e | ||
|
|
eeab12ed86 | ||
|
|
ca961e8498 | ||
|
|
40b0a37110 | ||
|
|
6daf0861c9 | ||
|
|
03bc1e722e | ||
|
|
ce94c5e237 | ||
|
|
88aad1e107 | ||
|
|
c4fe14bd45 | ||
|
|
2191b539e3 | ||
|
|
dcd3495564 | ||
|
|
30559841d5 | ||
|
|
0dc0d5c981 | ||
|
|
3b981e2818 | ||
|
|
47bfc74ba9 | ||
|
|
8858e1bce8 | ||
|
|
04be430b8c | ||
|
|
d46351b866 | ||
|
|
d3ec29aa42 | ||
|
|
357abee462 | ||
|
|
c86a040768 | ||
|
|
d9e7dc158d | ||
|
|
46591968c0 | ||
|
|
bb7c256ecf | ||
|
|
d239ed1c9f | ||
|
|
604dece366 | ||
|
|
8b55f20684 | ||
|
|
8bf12ff32c | ||
|
|
0596482a8d | ||
|
|
b5a77aa62a | ||
|
|
5db27d9d93 | ||
|
|
a630e4937b | ||
|
|
96d27d17ce | ||
|
|
742b848f42 | ||
|
|
57884e3400 | ||
|
|
40459f4e01 | ||
|
|
a461072113 | ||
|
|
0105931414 | ||
|
|
c0b7b871ba | ||
|
|
1250c94600 | ||
|
|
ccbd5b17d3 | ||
|
|
2fd3abbb14 | ||
|
|
5bc019d3d3 | ||
|
|
91c24d5501 | ||
|
|
cd7f192fba | ||
|
|
7d0555fb67 | ||
|
|
3864708cf1 | ||
|
|
ef22a58631 | ||
|
|
acf4fa106f | ||
|
|
5a5704ee0b | ||
|
|
7e65416f10 | ||
|
|
2d7bc59db4 | ||
|
|
930469a006 | ||
|
|
c657ba52ad | ||
|
|
46499512eb | ||
|
|
c2779570fa | ||
|
|
750dc609bb | ||
|
|
1037183f4c | ||
|
|
979f959291 | ||
|
|
86cfe0465c | ||
|
|
61d461eea5 | ||
|
|
ff1733225a | ||
|
|
784fca98c8 | ||
|
|
1f0ebd8ba1 | ||
|
|
2e645f04e7 | ||
|
|
debe8eb81c | ||
|
|
2e8f8f258d | ||
|
|
697f40595e | ||
|
|
37404b6619 | ||
|
|
4b3a016d70 | ||
|
|
ed2af5f9b4 | ||
|
|
5418ab52b7 | ||
|
|
61037af138 | ||
|
|
f86cd11d74 | ||
|
|
e46b335dc0 | ||
|
|
79299112eb | ||
|
|
3d5bee3a2c | ||
|
|
466cc84c16 | ||
|
|
27f9e2ea9f | ||
|
|
593e10eec2 | ||
|
|
5d5b8b78d4 | ||
|
|
620c4087bc | ||
|
|
c5bf0e0cb7 | ||
|
|
7f7d53e00a | ||
|
|
073466bd6a | ||
|
|
151e88046d | ||
|
|
c3b1d6735e | ||
|
|
e3a5da64a5 | ||
|
|
3c4599423d | ||
|
|
2bb1f27e07 | ||
|
|
e3adbbbd0b | ||
|
|
5e6838bdc9 | ||
|
|
fc6720e090 | ||
|
|
e29f671363 | ||
|
|
6e501c7b8a | ||
|
|
7dd3cc6f9f | ||
|
|
f346f080ee | ||
|
|
9f19e585db | ||
|
|
bc74487301 | ||
|
|
693baa8cef | ||
|
|
9ae60d4859 | ||
|
|
281efef207 | ||
|
|
d893537ae6 | ||
|
|
986de265fe | ||
|
|
d25633e213 | ||
|
|
0c8c7157f6 | ||
|
|
e393442df9 | ||
|
|
fc94fe30d0 | ||
|
|
1065079be6 | ||
|
|
e426172b18 | ||
|
|
effe93286a | ||
|
|
2a669618a2 | ||
|
|
44cd0e1e10 | ||
|
|
621155f06f | ||
|
|
6c116e261d | ||
|
|
bcc89d91f7 | ||
|
|
8e874afbd5 | ||
|
|
9421cd0b2d | ||
|
|
37c46042c3 | ||
|
|
c5429f0515 | ||
|
|
f0375ca446 | ||
|
|
b34bac9b5e | ||
|
|
f42e418346 | ||
|
|
a060c01f58 | ||
|
|
f41686fab4 | ||
|
|
be88d584cf | ||
|
|
80aa87935d | ||
|
|
405073cca9 | ||
|
|
22cb831138 | ||
|
|
95c8c75789 | ||
|
|
e8e3cadeff | ||
|
|
8123ba9a01 | ||
|
|
5aa6c98dc1 | ||
|
|
8e16b8e4a8 | ||
|
|
90f0a5eac6 | ||
|
|
892d3be144 | ||
|
|
164242ae4b | ||
|
|
07b8c5087b | ||
|
|
abba2e969b | ||
|
|
0a4b57ea01 | ||
|
|
422ecb758f | ||
|
|
20f953b9cb | ||
|
|
d2f1488ef1 | ||
|
|
a3aedd5fad | ||
|
|
e2d07f7e78 | ||
|
|
3aa0fac852 | ||
|
|
238243a7d4 | ||
|
|
9533b62ebf | ||
|
|
d06445e04b | ||
|
|
69255a938b | ||
|
|
773f24238f | ||
|
|
548ed4a1f0 | ||
|
|
76bf764262 | ||
|
|
075882b7b0 | ||
|
|
d25299e1ba | ||
|
|
0160d42302 | ||
|
|
6ca7a013d6 | ||
|
|
60ed93e13b | ||
|
|
747e2e2e27 | ||
|
|
16d1694a78 | ||
|
|
17e74d9ed2 | ||
|
|
923a42e9a3 | ||
|
|
bac66dfbf9 | ||
|
|
6895c0b392 | ||
|
|
ef08319670 | ||
|
|
1aee758f87 | ||
|
|
3d0eca9432 | ||
|
|
93936a7498 | ||
|
|
8e873ccd00 | ||
|
|
7a188af002 | ||
|
|
aaffeb9fac | ||
|
|
67711bcb0d | ||
|
|
f93c158caa | ||
|
|
c74d05a47b | ||
|
|
f867c0f8a1 | ||
|
|
98d024295e | ||
|
|
963d3de709 | ||
|
|
e20fa7f3a2 | ||
|
|
719d262a00 | ||
|
|
9ad9f28f33 | ||
|
|
6ac4a405b5 | ||
|
|
64fbdff13d | ||
|
|
65011f42da | ||
|
|
d763967d4b | ||
|
|
44c807aedd | ||
|
|
6e6bb72245 | ||
|
|
ca96b45637 | ||
|
|
d8ff7786df | ||
|
|
35ed07e0ba | ||
|
|
7b002606bf | ||
|
|
ac0d0a6680 | ||
|
|
e5033cceec | ||
|
|
b5d7e2969f | ||
|
|
6b4bd90bfa | ||
|
|
b2aff55160 | ||
|
|
569c34bca0 | ||
|
|
e63c966756 | ||
|
|
43f9efb9e4 | ||
|
|
82666d62ef | ||
|
|
72b62481a7 | ||
|
|
9cf13e320a | ||
|
|
c8c4a0f61b | ||
|
|
801c44389e | ||
|
|
fbdb060e10 | ||
|
|
09edc78bdc | ||
|
|
6951817088 | ||
|
|
2a22d25975 | ||
|
|
875adc8bdf | ||
|
|
b8b914a99c | ||
|
|
59401d27ca | ||
|
|
26cb21f541 | ||
|
|
49154759c0 | ||
|
|
abc07968e5 | ||
|
|
d28899ae84 | ||
|
|
04c44de145 | ||
|
|
7997d52df5 | ||
|
|
f3d899cbf5 | ||
|
|
e540596c20 | ||
|
|
b1aa7a8e88 | ||
|
|
3eef5b2c02 | ||
|
|
443aa0040c | ||
|
|
48c1db6a8a | ||
|
|
b9f2530e2f | ||
|
|
3cb7c0206a | ||
|
|
a7360f1145 | ||
|
|
c4e3c4b34f | ||
|
|
ae763ae25d | ||
|
|
dd0b4f27d4 | ||
|
|
faf5bcb32b | ||
|
|
93f2c83c0e | ||
|
|
63b5545502 | ||
|
|
31c99517d7 | ||
|
|
2e3a2ff69a | ||
|
|
4aa2c83e03 | ||
|
|
376d7a8878 | ||
|
|
dd5f55f4fc | ||
|
|
d2806c7ec0 | ||
|
|
2db34f4d49 | ||
|
|
a451189d83 | ||
|
|
f3a2be4a06 | ||
|
|
dddd97bc22 | ||
|
|
8e53be6810 | ||
|
|
d24b9ec0ae | ||
|
|
d8900341ac | ||
|
|
0465d047e7 | ||
|
|
cf1f3677ae | ||
|
|
354b02612d | ||
|
|
f06d5b806a | ||
|
|
49385a08ad | ||
|
|
d07c8c8851 | ||
|
|
803c3678e3 | ||
|
|
3118f743a0 | ||
|
|
2fa5c7eca4 | ||
|
|
a09829ed4b | ||
|
|
cf3d92d6e1 | ||
|
|
524b63e88c | ||
|
|
0a930db7d6 | ||
|
|
e6338bbde1 | ||
|
|
e4f7dd21b6 | ||
|
|
b0bae93d06 | ||
|
|
9b93a5cd04 | ||
|
|
3142717154 | ||
|
|
3dcfacfeed | ||
|
|
a51f5fefc4 | ||
|
|
fcc3bbf9b6 | ||
|
|
109390d21e | ||
|
|
c7dd91ef90 | ||
|
|
3d15abfdae | ||
|
|
a9caaefd16 | ||
|
|
261c786a10 | ||
|
|
a5270ccea8 | ||
|
|
08865dc218 | ||
|
|
3f50767e48 | ||
|
|
8ff5887955 | ||
|
|
2aa240337c | ||
|
|
44d75d9955 | ||
|
|
3b61b87501 | ||
|
|
04de362bc9 | ||
|
|
e06175f600 | ||
|
|
fe78d4f1e7 | ||
|
|
4a1de4c0da | ||
|
|
22b77411ec | ||
|
|
3f730ead84 | ||
|
|
d52d70a014 | ||
|
|
0a7b485514 | ||
|
|
151c384313 | ||
|
|
8586d44d7e | ||
|
|
5c8b600cb1 | ||
|
|
afd67d2f00 | ||
|
|
125a3fdc5e | ||
|
|
9963ff9c8e | ||
|
|
8547ea4c6a | ||
|
|
fd434e8b21 | ||
|
|
1524866432 | ||
|
|
19fa9390ff | ||
|
|
a335050332 | ||
|
|
8aa9ecffc5 | ||
|
|
ef02e5169d | ||
|
|
ba31a56949 | ||
|
|
6b7bd75b18 | ||
|
|
013d6625d5 | ||
|
|
ca228ca23e | ||
|
|
1dce68212f | ||
|
|
2683c2433b | ||
|
|
2929800a9f | ||
|
|
c1b04ace78 | ||
|
|
04a54dbc2a | ||
|
|
e7c1f31315 | ||
|
|
62f6917d81 | ||
|
|
babefc7bd3 | ||
|
|
a09c9f4a2e | ||
|
|
5876598ca0 | ||
|
|
f45d643739 | ||
|
|
c1ba176e27 | ||
|
|
9b3013c51a | ||
|
|
a746720a6e | ||
|
|
a95c61c1d8 | ||
|
|
d5da8e4e2b | ||
|
|
861e11a713 | ||
|
|
23ac209c05 | ||
|
|
8df789ae34 | ||
|
|
432e95e4ec | ||
|
|
401ed0a7a5 | ||
|
|
dae6957093 | ||
|
|
7b6405fba7 | ||
|
|
6dc3e74607 | ||
|
|
617066340b | ||
|
|
2dd6db352f | ||
|
|
56e13641df | ||
|
|
9d62113388 | ||
|
|
47b4a6c498 | ||
|
|
7dfe3a1c59 | ||
|
|
44acfc7ec8 | ||
|
|
7933f5e357 | ||
|
|
858c5a27ad | ||
|
|
28e41a0ae9 | ||
|
|
ae79f9be66 | ||
|
|
4a6d58c36e | ||
|
|
5bf6687f1f | ||
|
|
beb80f0422 | ||
|
|
0e86d6fbdb | ||
|
|
2a8e4f19af | ||
|
|
6ed8b6d058 | ||
|
|
33812b3f4a | ||
|
|
b62e542801 | ||
|
|
0080110fad | ||
|
|
19ef661457 | ||
|
|
7946221f0b | ||
|
|
203a42c043 | ||
|
|
d3998dd03b | ||
|
|
e752a48343 | ||
|
|
71955b777b | ||
|
|
d686d07d53 | ||
|
|
72b4c9c6ab | ||
|
|
4b991ab67a | ||
|
|
59399124fa | ||
|
|
3eb4962d7d | ||
|
|
42d3b4c326 | ||
|
|
f3931567f9 | ||
|
|
154adafbcb | ||
|
|
4a1e511262 | ||
|
|
3fc907e50f | ||
|
|
bbf441c3b4 | ||
|
|
bbf660d80e | ||
|
|
a1c3bc26c9 | ||
|
|
fc73e0e482 | ||
|
|
e7727afbe8 | ||
|
|
de5ce2660d | ||
|
|
2e661cb2f8 | ||
|
|
ebeaad0b4e | ||
|
|
ce60c048f8 | ||
|
|
6795ff7db9 | ||
|
|
931f1fb27d | ||
|
|
74625a8d65 | ||
|
|
03e8ccee7d | ||
|
|
01b9e4cb55 | ||
|
|
b5d5014ba2 | ||
|
|
4f7bfd14c0 | ||
|
|
7347300f05 | ||
|
|
aa6bdd2786 | ||
|
|
db0aeeabbd | ||
|
|
9aa426ed56 | ||
|
|
30f9348c26 | ||
|
|
baf76c51f9 | ||
|
|
6abef569e8 | ||
|
|
ade88a6055 | ||
|
|
11d0274a1b | ||
|
|
957de5d6f7 | ||
|
|
f5f4c5c672 | ||
|
|
5924495035 | ||
|
|
c486f65e74 | ||
|
|
b19a7d45d8 | ||
|
|
7f7397f684 | ||
|
|
39142909f6 | ||
|
|
23f5b84c5e | ||
|
|
630b6e6313 | ||
|
|
4396ca9420 | ||
|
|
5286a69c34 | ||
|
|
059d5542c9 | ||
|
|
a09e77a17d | ||
|
|
5a236e3bea | ||
|
|
aba5add7f9 | ||
|
|
a4190672d3 | ||
|
|
10da9182d1 | ||
|
|
2de5bc2855 | ||
|
|
b32db945be | ||
|
|
44d02e6dfd | ||
|
|
fc096dc6fa | ||
|
|
1d52bbde58 | ||
|
|
1a049e854b | ||
|
|
5b15ef81f5 | ||
|
|
05088c1063 | ||
|
|
04c09efd75 | ||
|
|
2c0576099a | ||
|
|
27b49f9d7e | ||
|
|
6a247c425a | ||
|
|
7910034916 | ||
|
|
c56e5d17be | ||
|
|
522eabce5e | ||
|
|
0e4b874994 | ||
|
|
319cc8a5f9 | ||
|
|
b5c26392e1 | ||
|
|
7d53c55cc1 | ||
|
|
3e30994541 | ||
|
|
a669fcba7a | ||
|
|
851053fd9a | ||
|
|
b71a87e803 | ||
|
|
c72658d21a | ||
|
|
d0b8c59769 | ||
|
|
583b74fb7e | ||
|
|
cf6f28aa3e | ||
|
|
f3ece64635 | ||
|
|
6343b7087d | ||
|
|
e279dc4cea | ||
|
|
fc5763c8e8 | ||
|
|
9e32fcda88 | ||
|
|
7fe8c7b547 | ||
|
|
38329514f9 | ||
|
|
37705dfc71 | ||
|
|
e8e7e3144f | ||
|
|
0da229e8f4 | ||
|
|
1029b2523d | ||
|
|
477b520cf0 | ||
|
|
d54fdf5452 | ||
|
|
bfb47aba87 | ||
|
|
d241a57d38 | ||
|
|
01479a82de | ||
|
|
198820d95d | ||
|
|
86741a4e95 | ||
|
|
7d859661ba | ||
|
|
d04c95514e | ||
|
|
e6e3953a85 | ||
|
|
104f1232f3 | ||
|
|
b55bf6e6c1 | ||
|
|
d79af8fcc2 | ||
|
|
ff05429f58 | ||
|
|
0dbabe629a | ||
|
|
3348d46b5a | ||
|
|
aff1a245c2 | ||
|
|
51802f71a5 | ||
|
|
32f34f1444 | ||
|
|
b7309ccdf1 | ||
|
|
8abaac56ff | ||
|
|
a462ab98e9 | ||
|
|
af602a414a | ||
|
|
67e426354c | ||
|
|
e2f8e31fa0 | ||
|
|
d67cce4184 | ||
|
|
ca63b412cb | ||
|
|
89e372c229 | ||
|
|
4ae5b49764 | ||
|
|
1057f32b34 | ||
|
|
e3948eb4ba | ||
|
|
6d363235a5 | ||
|
|
fb50b4fa78 | ||
|
|
85fbaa2b97 | ||
|
|
1440453640 | ||
|
|
e364959d25 | ||
|
|
89642e71b5 | ||
|
|
d8413b3b7d | ||
|
|
92ba038af7 | ||
|
|
2ac2cc2ebf | ||
|
|
990ed86283 | ||
|
|
953d702ed6 | ||
|
|
1fa828ad1a | ||
|
|
9f16fa189f | ||
|
|
a7e78cc3fb | ||
|
|
353c40cc46 | ||
|
|
3a7c8d660c | ||
|
|
b2c9108ffc | ||
|
|
ef447e2ba1 | ||
|
|
85f0b37b03 | ||
|
|
9f6cdfcd11 | ||
|
|
376477767b | ||
|
|
f1376be2e0 | ||
|
|
5e57ec0e67 | ||
|
|
15721f1279 | ||
|
|
e8fe58438d | ||
|
|
8ef04b1ad0 | ||
|
|
a3d6776c02 | ||
|
|
e7a529257a | ||
|
|
714afabf30 | ||
|
|
f1df8d07bb | ||
|
|
a18c4b6449 | ||
|
|
2099342352 | ||
|
|
50ee2727a2 | ||
|
|
571e918ee0 | ||
|
|
7c5d8721c0 | ||
|
|
b5984a965e | ||
|
|
0e0bd94251 | ||
|
|
a9d2d52c1e | ||
|
|
b7c67a16d9 | ||
|
|
35615526a1 | ||
|
|
c43ce52e78 | ||
|
|
61a313f24b | ||
|
|
d71393cead | ||
|
|
64bb6714a3 | ||
|
|
f8336d6adb | ||
|
|
30245f4aed | ||
|
|
a861652d6f | ||
|
|
5fe5ba78da | ||
|
|
8fa9977617 | ||
|
|
0df2dd3ce2 | ||
|
|
80893f2592 | ||
|
|
91cf10541b | ||
|
|
aaccfdee44 | ||
|
|
a8449de731 | ||
|
|
9d98641a94 | ||
|
|
4f13227d9e | ||
|
|
70e9ee0dd1 | ||
|
|
d43932a9d2 | ||
|
|
7118261fee | ||
|
|
89b171db36 | ||
|
|
1c4778790a | ||
|
|
d20d1488de | ||
|
|
c969f277ee | ||
|
|
cf4a77af75 | ||
|
|
4042592420 | ||
|
|
a750241ec3 | ||
|
|
8ab79ec1ae | ||
|
|
a9289df93f | ||
|
|
f6c42c4b53 | ||
|
|
bfb121938a | ||
|
|
20d26d4bcd | ||
|
|
474b851275 | ||
|
|
5c541275c5 | ||
|
|
486e92dfc9 | ||
|
|
959ce3bc92 | ||
|
|
3866c740e9 | ||
|
|
a65a85fb67 | ||
|
|
c921b7bb1c | ||
|
|
7acf2d80d2 | ||
|
|
01b2d6cb39 | ||
|
|
e2665e3cbe | ||
|
|
9b95094207 | ||
|
|
59b637c317 | ||
|
|
52963e8e80 | ||
|
|
43f42ac917 | ||
|
|
0352951d8c | ||
|
|
fe334d0aed | ||
|
|
f2371d8735 | ||
|
|
3c9608efbd | ||
|
|
8dff3b55c9 | ||
|
|
b42b6303ae | ||
|
|
263e6d5cca | ||
|
|
5b5622b4a7 | ||
|
|
e328bf616f | ||
|
|
52ba831b1c | ||
|
|
12b1016d66 | ||
|
|
a471bfec6a | ||
|
|
3b6d3116bd | ||
|
|
5c0c680f56 | ||
|
|
3af8f4772f | ||
|
|
10b2593389 | ||
|
|
cf67d58236 | ||
|
|
748227319c | ||
|
|
94c18e835a | ||
|
|
cfb5693ffe | ||
|
|
3e1f3d5a51 | ||
|
|
c0bf529a6b | ||
|
|
f951ee1f91 | ||
|
|
e8ac971f9e | ||
|
|
b1278aff2e | ||
|
|
c26c14227c | ||
|
|
ce36bcc951 | ||
|
|
1134cd7788 | ||
|
|
7920d2225c | ||
|
|
d0faaf2d53 | ||
|
|
fc60878c25 | ||
|
|
1b941536d0 | ||
|
|
4215bfc6fe | ||
|
|
22d215b2c7 | ||
|
|
69eb7979c1 | ||
|
|
0f0c24d31b | ||
|
|
30c5a0d9cd | ||
|
|
93e0773758 | ||
|
|
c92e64afbd | ||
|
|
6ba9dc74d8 | ||
|
|
f69c244080 | ||
|
|
f1b4a973a8 | ||
|
|
efe49ee4c1 | ||
|
|
51573cb9f5 | ||
|
|
f6ab374718 | ||
|
|
7ace88ae0d | ||
|
|
5f5e04506c | ||
|
|
9a58e121e8 | ||
|
|
7153347d67 | ||
|
|
611ccd9605 | ||
|
|
0befa2eb39 | ||
|
|
b0677bb66d | ||
|
|
f476f1447c | ||
|
|
c8907232da | ||
|
|
864ca81d1d | ||
|
|
636427ac6b | ||
|
|
3d68caed6b | ||
|
|
4f7e25038c | ||
|
|
ba0a95ed26 | ||
|
|
0cd25be408 | ||
|
|
c6fa0ddde3 | ||
|
|
b64a9b7a44 | ||
|
|
326bf39bed | ||
|
|
ac4c37ba48 | ||
|
|
305017d523 | ||
|
|
19d1c552fe | ||
|
|
7d6908d146 | ||
|
|
9cf399f956 | ||
|
|
a0b4450e5b | ||
|
|
9d983a7c96 | ||
|
|
89be08bc58 | ||
|
|
6dcf3e15da | ||
|
|
e66cb9479f | ||
|
|
bd8d9cc3aa | ||
|
|
9453b86907 | ||
|
|
ecf9441fae | ||
|
|
70b659acbe | ||
|
|
2ebb9f2763 | ||
|
|
1231b13dfd | ||
|
|
bebad4d361 | ||
|
|
ed5a1887f4 | ||
|
|
342e689825 | ||
|
|
c5c1a9b25b | ||
|
|
7637905de2 | ||
|
|
ec780b7b93 | ||
|
|
3728c59f1d | ||
|
|
4442d9a706 | ||
|
|
8928b35f30 | ||
|
|
fca189ee4c | ||
|
|
d0fb3dde66 | ||
|
|
fc4377abaf | ||
|
|
97a62752c6 | ||
|
|
87e1e55da7 | ||
|
|
5410cda182 | ||
|
|
ee240ca201 | ||
|
|
98ffa0a256 | ||
|
|
2f450b7ea0 | ||
|
|
099b50dbfa | ||
|
|
ece7a443fe | ||
|
|
984f2669b8 | ||
|
|
9b94b9e3fe | ||
|
|
a781bcb7f4 | ||
|
|
b596f38ab5 | ||
|
|
f2b4d6f829 | ||
|
|
d2d2dc64db | ||
|
|
5b8171a719 | ||
|
|
838ad5ec1a | ||
|
|
3d16323e33 | ||
|
|
ba25eaa788 | ||
|
|
747412e522 | ||
|
|
059ff25d8e | ||
|
|
831143427d | ||
|
|
de51d4860e | ||
|
|
6569038777 | ||
|
|
075aec3ac0 | ||
|
|
734847db68 | ||
|
|
a99f2b78a1 | ||
|
|
037473f2e1 | ||
|
|
378f735e9f | ||
|
|
4cdac76ca5 | ||
|
|
9ed3c8a6bb | ||
|
|
252d289a8d | ||
|
|
832bad1fee | ||
|
|
d5b99316e5 | ||
|
|
3723c5dae5 | ||
|
|
7c3fa7aef5 | ||
|
|
4ee31db7a0 | ||
|
|
0d8cb7393c | ||
|
|
0d3d0a8da1 | ||
|
|
e45eb7f2be | ||
|
|
128e5c414c | ||
|
|
5a70d98c71 | ||
|
|
69d4215397 | ||
|
|
722190305b | ||
|
|
428d4859da | ||
|
|
9455860554 | ||
|
|
eb4b42c089 | ||
|
|
79b3d7359a | ||
|
|
c95ea19da1 | ||
|
|
a8b3f2af14 | ||
|
|
2b8ccc38bb | ||
|
|
baebadb7a6 | ||
|
|
f73db056f2 | ||
|
|
429ac1e71c | ||
|
|
07cd91dda4 | ||
|
|
956f61e775 | ||
|
|
14fc2d2c70 | ||
|
|
9c07240948 | ||
|
|
7e2260578e | ||
|
|
7f2d781241 | ||
|
|
df05ade4a7 | ||
|
|
e4b45e512f | ||
|
|
623bb52fd8 | ||
|
|
ab809dabf8 | ||
|
|
2ebf26c156 | ||
|
|
1ffc598fd4 | ||
|
|
0495d954bc | ||
|
|
cc6a7a6a72 | ||
|
|
b081bbb444 | ||
|
|
69cbb262ba | ||
|
|
ba2a398da3 | ||
|
|
a8a87e7f79 | ||
|
|
2ffd1e6e47 | ||
|
|
efaebb43aa | ||
|
|
d201350a08 | ||
|
|
81184d77fe | ||
|
|
b9d60e0018 | ||
|
|
f50ac49ede | ||
|
|
70d8b8a88a | ||
|
|
535f1b5988 | ||
|
|
366c903f84 | ||
|
|
1781ff36c6 | ||
|
|
4e131d9a54 | ||
|
|
7f6fec5530 | ||
|
|
2d43014029 | ||
|
|
33ea66ea88 | ||
|
|
b74e449efd | ||
|
|
afd4820713 | ||
|
|
8e032fa26a | ||
|
|
897669a069 | ||
|
|
03ea78b40b | ||
|
|
18465cf6cb | ||
|
|
ac6ccd2dc7 | ||
|
|
fb32d11d64 | ||
|
|
ec75e911bd | ||
|
|
603f032e28 | ||
|
|
cf76e43898 | ||
|
|
a0df548dd3 | ||
|
|
dff6048a07 | ||
|
|
478d465cb6 | ||
|
|
271f308c36 | ||
|
|
956958fa0e | ||
|
|
6a68da0559 | ||
|
|
6683eee49a | ||
|
|
f258d5f932 | ||
|
|
600995a220 | ||
|
|
803dfed9f7 | ||
|
|
771cb45b49 | ||
|
|
a2a7689881 | ||
|
|
e9f4c3d0c7 | ||
|
|
a5ef5769b9 | ||
|
|
9d251f94e5 | ||
|
|
d1e8d52f5c | ||
|
|
14d2ae0c0e | ||
|
|
dafa3bde8b | ||
|
|
cb923cef47 | ||
|
|
93888aeed3 | ||
|
|
c41e34e9d8 | ||
|
|
154aea7a61 | ||
|
|
bc53cd1aa4 | ||
|
|
ef51aa7e98 | ||
|
|
705c5ce790 | ||
|
|
26dee50e68 | ||
|
|
be3d7ef11d | ||
|
|
ef5897969f | ||
|
|
d9cd0257ba | ||
|
|
95bb8cb1e5 | ||
|
|
e1aa2f651a | ||
|
|
03c535e80d | ||
|
|
6f9c4f220e | ||
|
|
6f3813b685 | ||
|
|
510dde6923 | ||
|
|
a7761c1867 | ||
|
|
a2af965bad | ||
|
|
28b6ed500b | ||
|
|
6991fa39cc | ||
|
|
274469d299 | ||
|
|
a0b8581ec5 | ||
|
|
b844a0e98d | ||
|
|
e5f14ac176 | ||
|
|
a1110a847d | ||
|
|
a3889fe369 | ||
|
|
bd93918d9b | ||
|
|
421a6ba143 | ||
|
|
f091256edb | ||
|
|
c0e4733eb8 | ||
|
|
e636a6ad58 | ||
|
|
071617bfc5 | ||
|
|
8a079c98cc | ||
|
|
fa95f96a6d | ||
|
|
c198abe5ac | ||
|
|
ef5ba0f1d1 | ||
|
|
fff7cd53cc | ||
|
|
64ce5138e1 | ||
|
|
3c07e7a0d8 | ||
|
|
a1510ffcb5 | ||
|
|
1b96bce44f | ||
|
|
294a5e39a6 | ||
|
|
65fdd6e25f | ||
|
|
6d2ef1f985 | ||
|
|
14af19873c | ||
|
|
2f5dd470d2 | ||
|
|
dc4592ae4d | ||
|
|
baa3cfa636 | ||
|
|
ad324df937 | ||
|
|
f2b301cb17 | ||
|
|
6e369ea787 | ||
|
|
f640abda91 | ||
|
|
77f8f11d99 | ||
|
|
12b4c27468 | ||
|
|
75f3073cbf | ||
|
|
5eddfaed98 | ||
|
|
89b4fdef56 | ||
|
|
6f08c1f758 | ||
|
|
1155789a75 | ||
|
|
8c4a74179d | ||
|
|
bdbc94e54a | ||
|
|
30f880361e | ||
|
|
c5ac347538 | ||
|
|
008da9467f | ||
|
|
ee78249c2f | ||
|
|
412c67b47a | ||
|
|
f4191ad984 | ||
|
|
ea8d1100ac | ||
|
|
20e8c033cc | ||
|
|
ff2d10e0e1 | ||
|
|
672c39e58d | ||
|
|
36d3849118 | ||
|
|
43d7dfde4c | ||
|
|
51a056b3d7 | ||
|
|
6e22d6687c | ||
|
|
369fdf07e2 | ||
|
|
8c6c1b3ccc | ||
|
|
160bdf5472 | ||
|
|
18c70002cb | ||
|
|
4b8cfd9fdd | ||
|
|
ffa5fd5b2a | ||
|
|
9fb4798c77 | ||
|
|
a6039278c3 | ||
|
|
c50702c83b | ||
|
|
d4c1e62c72 | ||
|
|
488c609109 | ||
|
|
0a6e24104e | ||
|
|
d6acac0208 | ||
|
|
b02f61ef21 | ||
|
|
eb82b44726 | ||
|
|
ca035f9447 | ||
|
|
19aa3c0854 | ||
|
|
93675d90bb | ||
|
|
0d90c1d960 | ||
|
|
d826f968b5 | ||
|
|
f682d7489f | ||
|
|
649b1adfdd | ||
|
|
3d67ea736f | ||
|
|
ba88f837fe | ||
|
|
6728703473 | ||
|
|
55521afe35 | ||
|
|
8820b02406 | ||
|
|
e79ba6117b | ||
|
|
668d29a9d7 | ||
|
|
6b97acdb50 | ||
|
|
9a11021560 | ||
|
|
ee18217520 | ||
|
|
16de60f82d | ||
|
|
8cd94f976c | ||
|
|
9ab0662cbf | ||
|
|
5cceed1fd7 | ||
|
|
03a1b51bd7 | ||
|
|
1edf567ea7 | ||
|
|
fa73eddf50 | ||
|
|
1923ae6f4b | ||
|
|
229f3dc061 | ||
|
|
cc95042a94 | ||
|
|
302f54971d | ||
|
|
dff88403b5 | ||
|
|
cd3f9af232 | ||
|
|
b217162cad | ||
|
|
7d24a61ae8 | ||
|
|
ca1b37dbcf | ||
|
|
0e887fb2ea | ||
|
|
a122adf05d | ||
|
|
04fc1e25e4 | ||
|
|
cff402affb | ||
|
|
e1e0368f8c | ||
|
|
8ee39d3822 | ||
|
|
e2b533db64 | ||
|
|
fc5db74f16 | ||
|
|
42e62a3698 | ||
|
|
62f03356ca | ||
|
|
25bb0912fb | ||
|
|
beff1d8d42 | ||
|
|
7dc56cc075 | ||
|
|
394d653978 | ||
|
|
742fa27029 | ||
|
|
18b962dc57 | ||
|
|
233a179dad | ||
|
|
9cc76c5ee6 | ||
|
|
401ba40373 | ||
|
|
6dad50aab1 | ||
|
|
9a43f868aa | ||
|
|
294e9bb590 | ||
|
|
d101311109 | ||
|
|
e0e920bfe0 | ||
|
|
3a090d7c1d | ||
|
|
dc851d856d | ||
|
|
2f8fe43ea3 | ||
|
|
959f96dd74 | ||
|
|
6620d2d023 | ||
|
|
408742494a | ||
|
|
f7ae9c06d8 | ||
|
|
b4c0d8e829 | ||
|
|
b2a410d6cf | ||
|
|
16fa453163 | ||
|
|
fc678684f5 | ||
|
|
8f7db7e52f | ||
|
|
e9d6cf278a | ||
|
|
d1c6f5f98e | ||
|
|
48f581525e | ||
|
|
8d967856b5 | ||
|
|
ee83cf2989 | ||
|
|
cb304d35e2 | ||
|
|
65185c5854 | ||
|
|
91526674be | ||
|
|
3e11ff65db | ||
|
|
4a3ac17a2f | ||
|
|
2283f1ddc9 | ||
|
|
ae78887746 | ||
|
|
9de4bf839f | ||
|
|
295e51181b | ||
|
|
287e3a0090 | ||
|
|
4d150e71a3 | ||
|
|
0debbc263e | ||
|
|
a9e5e40a54 | ||
|
|
cf61080980 | ||
|
|
3e33731cf0 | ||
|
|
d7cda90acd | ||
|
|
9a7dcc8c1a | ||
|
|
d477121790 | ||
|
|
60e7a21e39 | ||
|
|
b915ca2add | ||
|
|
e90ef7aaee | ||
|
|
e918daaa9b | ||
|
|
83b4f645db | ||
|
|
1797df7017 | ||
|
|
3beda9c201 | ||
|
|
68e6bd668c | ||
|
|
696cf61fe9 | ||
|
|
7fe56766fc | ||
|
|
1e62f8c951 | ||
|
|
82b995f96f | ||
|
|
05aa0c2482 | ||
|
|
bca5f4bec4 | ||
|
|
8b599f78c0 | ||
|
|
38776e74bc | ||
|
|
21ce09a5b5 | ||
|
|
5fabec6a42 | ||
|
|
64f361d4b1 | ||
|
|
f8ae842971 | ||
|
|
ca01d6efb8 | ||
|
|
498ab6d165 | ||
|
|
8e8524ccc8 | ||
|
|
714936f710 | ||
|
|
11c0477a34 | ||
|
|
4f65c6bbcc | ||
|
|
c7ee183fe4 | ||
|
|
80545ce1f2 | ||
|
|
c80edcfe9f | ||
|
|
74318fb3c0 | ||
|
|
83a8942724 | ||
|
|
48f57068d8 | ||
|
|
3f85916764 | ||
|
|
ab0f544267 | ||
|
|
14e16c874e | ||
|
|
7fb87ad67f | ||
|
|
1b85417ae6 | ||
|
|
8d41e6fece | ||
|
|
ab2906991d | ||
|
|
ac85c75cc4 | ||
|
|
7f1fae307c | ||
|
|
cce41082a1 | ||
|
|
902a489b04 | ||
|
|
30006fe520 | ||
|
|
2ce1bb9c3f | ||
|
|
c468fa2a95 | ||
|
|
06ef342953 | ||
|
|
02121105de | ||
|
|
e24788157a | ||
|
|
63905c608e | ||
|
|
69127e6952 | ||
|
|
87a84f02a3 | ||
|
|
0b5bea9965 | ||
|
|
0d5e3a080c | ||
|
|
a4ba07de99 | ||
|
|
970a5ec763 | ||
|
|
6f338c44c4 | ||
|
|
f360fadd3f | ||
|
|
846fa4722b | ||
|
|
9752f1d492 | ||
|
|
ce2d386b7e | ||
|
|
993d433d03 | ||
|
|
ede344db3a | ||
|
|
6c397da1f8 | ||
|
|
1d9862fe11 | ||
|
|
2d3db00639 | ||
|
|
7269233134 | ||
|
|
27be0ad808 | ||
|
|
51e875694c | ||
|
|
92d64d77c5 | ||
|
|
579e9e0b8c | ||
|
|
25b9c491c3 | ||
|
|
8f1b48b0ab | ||
|
|
611d3c3b63 | ||
|
|
3a658e10f1 | ||
|
|
92a182e5a8 | ||
|
|
954f0cc26f | ||
|
|
5e0b4e1be6 | ||
|
|
c72511da6a | ||
|
|
15c65ad4e1 | ||
|
|
d06657e2ff | ||
|
|
5dae1ee34f | ||
|
|
88a5d33bad | ||
|
|
42e02a6129 | ||
|
|
7d56164882 | ||
|
|
3e60ad21bf | ||
|
|
55c4e9635a | ||
|
|
101d0212a7 | ||
|
|
f0338b5247 | ||
|
|
80136b4aff | ||
|
|
f0a89e99f5 | ||
|
|
09f830c315 | ||
|
|
ace92f8be0 | ||
|
|
7e08f495a7 | ||
|
|
a8299b4f54 | ||
|
|
bdb00b8d58 | ||
|
|
4e18127371 | ||
|
|
e5165e6fba | ||
|
|
77dc237549 | ||
|
|
e3cc04f538 | ||
|
|
322d1ad75c | ||
|
|
4767903a07 | ||
|
|
0064ce97f0 | ||
|
|
71f067f678 | ||
|
|
8f37dc8570 | ||
|
|
b15b640652 | ||
|
|
3e892f30ca | ||
|
|
20f3efced9 | ||
|
|
25bcd0f2a9 | ||
|
|
d990bf794a | ||
|
|
aa25feb57e | ||
|
|
b203fc7c68 | ||
|
|
9298e045d3 | ||
|
|
e3255588d3 | ||
|
|
514f23cf4d | ||
|
|
ab206b2abf | ||
|
|
2f8a65d364 | ||
|
|
a30e47d094 | ||
|
|
0a78a87a17 | ||
|
|
886ec9c574 | ||
|
|
434fe894bc | ||
|
|
cde9dbe406 | ||
|
|
c5262f188e | ||
|
|
8f57364547 | ||
|
|
eb193f230b | ||
|
|
6a868f975e | ||
|
|
66a8db598f | ||
|
|
bfa13583e3 | ||
|
|
d865e646b9 | ||
|
|
f630537897 | ||
|
|
aaf7ae8fc3 | ||
|
|
52cba23190 | ||
|
|
c48c74a0cf | ||
|
|
9c6c27909d | ||
|
|
3ba3e5cf76 | ||
|
|
df4040a96a | ||
|
|
6932e468cf | ||
|
|
a82279b068 | ||
|
|
0ae7b9c120 | ||
|
|
72f86069a2 | ||
|
|
509c32db70 | ||
|
|
7fa45c0658 | ||
|
|
4e81a6af83 | ||
|
|
66d3eb3400 | ||
|
|
7e36cb76ba | ||
|
|
fc47651c33 | ||
|
|
6948d70d94 | ||
|
|
eee2db8ad9 | ||
|
|
318a36a831 | ||
|
|
4d90bd9e31 | ||
|
|
4e81151e11 | ||
|
|
18195b778a | ||
|
|
326bddad2a | ||
|
|
f4b41a43cf | ||
|
|
38c762f775 | ||
|
|
9833d466c4 | ||
|
|
4d965333ef | ||
|
|
a6ec18690d | ||
|
|
d3fe0b48d8 | ||
|
|
35220e1c4d | ||
|
|
de7bc9870d | ||
|
|
680a3a5d13 | ||
|
|
cf8612c99f | ||
|
|
e817d3355c | ||
|
|
53b7f33ec4 | ||
|
|
5ed9a29f81 | ||
|
|
89406c4754 | ||
|
|
b27b26837f | ||
|
|
0595008fce | ||
|
|
d6b2e019c7 | ||
|
|
25cfb1f5c0 | ||
|
|
10a159b315 | ||
|
|
60c113b0e8 | ||
|
|
ec4330aea7 | ||
|
|
f263fe30a4 | ||
|
|
0ec2f68a96 | ||
|
|
1156b909eb | ||
|
|
9ed246e482 | ||
|
|
c342c5c4f6 | ||
|
|
3b7ef5b262 | ||
|
|
79bf3d8d4f | ||
|
|
cfe91a8722 | ||
|
|
c3e2d34372 | ||
|
|
56b6ee5d2a | ||
|
|
3f34ac1c75 | ||
|
|
be5015d16b | ||
|
|
2c1d4cfc40 | ||
|
|
5bf75e122c | ||
|
|
aa51048990 | ||
|
|
6d117f824d | ||
|
|
0a591e748f | ||
|
|
be2cb5d2f2 | ||
|
|
280ec22348 | ||
|
|
f9a815bba6 | ||
|
|
1534dcc932 | ||
|
|
e19ae7af59 | ||
|
|
1726d6f59e | ||
|
|
756f395158 | ||
|
|
90d2cf4970 | ||
|
|
37e70fd5bb | ||
|
|
126481833b | ||
|
|
b2630cfb49 | ||
|
|
579e2e95e3 | ||
|
|
6580436900 | ||
|
|
a0ecf72a1c | ||
|
|
bc3aaa94de | ||
|
|
482ca5ed15 | ||
|
|
66894c2e8a | ||
|
|
5d5a1fadd9 | ||
|
|
2d531c3a15 | ||
|
|
e4da11727a | ||
|
|
309f97b443 | ||
|
|
98240e910e | ||
|
|
6d79d3d1f8 | ||
|
|
def4e19359 | ||
|
|
6cfd055bec | ||
|
|
1208b25b66 | ||
|
|
b25bf70224 | ||
|
|
7ecb139dba | ||
|
|
2a7720852a | ||
|
|
627eb556cb | ||
|
|
e251155f4f | ||
|
|
4e9c44e574 | ||
|
|
5b662df7cd | ||
|
|
802574fb44 | ||
|
|
51f3334711 | ||
|
|
254b5c963b | ||
|
|
d5f64a79b2 | ||
|
|
dd54a714cb | ||
|
|
d40e9e3d73 | ||
|
|
d5066adb4b | ||
|
|
f933aae562 | ||
|
|
db65a80a7f | ||
|
|
2f9658fa22 | ||
|
|
ab06365a81 | ||
|
|
2bc27bd6f5 | ||
|
|
078ac1abe4 | ||
|
|
05259eb0d2 | ||
|
|
8c272ea032 | ||
|
|
f58f29389c | ||
|
|
854b137820 | ||
|
|
fb8b5ac6b6 | ||
|
|
35106f5e67 | ||
|
|
a5ea58dbf7 | ||
|
|
b4ddc8e5fc | ||
|
|
2223405e79 | ||
|
|
7260e0d0f5 | ||
|
|
44cf7f7330 | ||
|
|
465ceab271 | ||
|
|
fa818d50d1 | ||
|
|
deb75df77a | ||
|
|
aae47e103b | ||
|
|
957dbecb3d | ||
|
|
75fe59ef79 | ||
|
|
63ba5cf39d | ||
|
|
8a0b7fbc47 | ||
|
|
ea9fb5bcb0 | ||
|
|
21d8ceacf0 | ||
|
|
986cf025a0 | ||
|
|
85b936ead2 | ||
|
|
f241679087 | ||
|
|
6618cdc0ad | ||
|
|
fe2de5d8ae | ||
|
|
bd954e7292 | ||
|
|
86367298cc | ||
|
|
08346a2326 | ||
|
|
1bb9090434 | ||
|
|
879bcdf8d8 | ||
|
|
1b7658d8f9 | ||
|
|
d635705449 | ||
|
|
af1b17cb98 | ||
|
|
944ef83805 | ||
|
|
20b3e95b4f | ||
|
|
c2de0dd613 | ||
|
|
2a7f5f55b0 | ||
|
|
a03539ad8b | ||
|
|
c420a8a686 | ||
|
|
8d6a2e8882 | ||
|
|
8da9156bb5 | ||
|
|
ffc8a5188d | ||
|
|
4eb1117659 | ||
|
|
b4602c1e48 | ||
|
|
80ede42191 | ||
|
|
ea6937c0ac | ||
|
|
2f99ba8526 | ||
|
|
16324e16c7 | ||
|
|
c2e1ecf5b1 | ||
|
|
cd353217d6 | ||
|
|
6903f67f0f | ||
|
|
487dab793a | ||
|
|
4cd3f9bd38 | ||
|
|
f581e76057 | ||
|
|
312aa856ad | ||
|
|
6f4363e95b | ||
|
|
595ba92f06 | ||
|
|
df9114d7b0 | ||
|
|
1496d0e482 | ||
|
|
92f5783f35 | ||
|
|
da1895125a | ||
|
|
bcdd470567 | ||
|
|
7cd0070d90 | ||
|
|
8217949fa2 | ||
|
|
4bdf1553c9 | ||
|
|
6fd5d38cd8 | ||
|
|
8a737104ef | ||
|
|
a608da759b | ||
|
|
c828625cc1 | ||
|
|
7ead247fcb | ||
|
|
7a62af78d0 | ||
|
|
9896d6e6b2 | ||
|
|
9c376183e0 | ||
|
|
e5cc9a3cbf | ||
|
|
985979ab14 | ||
|
|
377a4c2284 | ||
|
|
24242db981 | ||
|
|
73a4152b5d | ||
|
|
b5eb094566 | ||
|
|
71140381e0 | ||
|
|
22387b2610 | ||
|
|
da53a7d469 | ||
|
|
b9b30f9f53 | ||
|
|
c984eb9b8c | ||
|
|
eef548f6a1 | ||
|
|
2da8ffb8cd | ||
|
|
8188c21641 | ||
|
|
19dca8c5bb | ||
|
|
5de5b6047a | ||
|
|
695c4159dc | ||
|
|
2624315bd5 | ||
|
|
fff6e50702 | ||
|
|
753b69726a | ||
|
|
df273aca7e | ||
|
|
9e9feb5980 | ||
|
|
e71eb465fb | ||
|
|
e9f2550a26 | ||
|
|
12bfd98011 | ||
|
|
2b45056842 | ||
|
|
c86fdf07db | ||
|
|
385ffd5b27 | ||
|
|
ad6b746124 | ||
|
|
57e8b59db6 | ||
|
|
ecb869695e | ||
|
|
c99c7ee6c9 | ||
|
|
d3c47fe1a4 | ||
|
|
1c21b23e8e | ||
|
|
bb55cd3c42 | ||
|
|
4a74190241 | ||
|
|
586f9594fb | ||
|
|
e68facfd51 | ||
|
|
7d423fa49d | ||
|
|
886553a923 | ||
|
|
ff4a00d103 | ||
|
|
dbdf8a97ae | ||
|
|
2433e31db0 | ||
|
|
5538aac732 | ||
|
|
c05f169d54 | ||
|
|
24aaefe342 | ||
|
|
c167e881fb | ||
|
|
9a8c22f487 | ||
|
|
fd8077a5cd | ||
|
|
6dd196a7a6 | ||
|
|
bdfe14e278 | ||
|
|
1c7b318c3f | ||
|
|
a6acc30eea | ||
|
|
c54a849243 | ||
|
|
1f2871f649 | ||
|
|
147d5902ed | ||
|
|
ec47ca1983 | ||
|
|
6ca6fc6989 | ||
|
|
f29015426f | ||
|
|
57f09fd64d | ||
|
|
2477ee4952 | ||
|
|
2bd7fd2aa7 | ||
|
|
bc5529ded8 | ||
|
|
b05736e4fb | ||
|
|
6a187881c0 | ||
|
|
d1accc4e09 | ||
|
|
e7e130460e | ||
|
|
d33a02f6cd | ||
|
|
8f6c511598 | ||
|
|
7fb04d51ae | ||
|
|
64d5275554 | ||
|
|
76041a9f55 | ||
|
|
502f7de040 | ||
|
|
a86512e807 | ||
|
|
2e19dbe05f | ||
|
|
18d8f07242 | ||
|
|
fb0ff734d7 | ||
|
|
13a5482f91 | ||
|
|
4a5794ad5f | ||
|
|
7652aca406 | ||
|
|
f1dfb1c952 | ||
|
|
b4f866be03 | ||
|
|
4fed35d189 | ||
|
|
c3cff6a911 | ||
|
|
91f718f39d | ||
|
|
e4ea01cfd2 | ||
|
|
dd7d5a46e8 | ||
|
|
3be4b08bb0 | ||
|
|
2fde7b7879 | ||
|
|
60777e5714 | ||
|
|
9d7fcc4987 | ||
|
|
95ed1c3ac3 | ||
|
|
7e285969a7 | ||
|
|
083f1be766 | ||
|
|
d39ed3c03f | ||
|
|
a068bda34f | ||
|
|
559f37e5d2 | ||
|
|
d50b7de668 | ||
|
|
35c5191a4d | ||
|
|
6df6296cd1 | ||
|
|
b88a565344 | ||
|
|
d98bc1ec63 | ||
|
|
74886db10d | ||
|
|
48e4fd8088 | ||
|
|
54c7f896ad | ||
|
|
ccd14e6505 | ||
|
|
dc33534478 | ||
|
|
83d79e23d5 | ||
|
|
151f99e343 | ||
|
|
ccea63f1e2 | ||
|
|
1019419d85 | ||
|
|
a234823d0a | ||
|
|
d2015845e8 | ||
|
|
1857cca081 | ||
|
|
195bbf4652 | ||
|
|
af76d937e1 | ||
|
|
885780a92b | ||
|
|
547bfe26d7 | ||
|
|
bc87fdde1f | ||
|
|
6fc8324337 | ||
|
|
5103d91db0 | ||
|
|
b67ab5ecd3 | ||
|
|
3aa085f17e | ||
|
|
1b9a78827a | ||
|
|
3299e0fa6a | ||
|
|
79e12c8dd8 | ||
|
|
ced33114cc | ||
|
|
294324e31b | ||
|
|
1b27d652af | ||
|
|
e98209249f | ||
|
|
9ddf09e187 | ||
|
|
73e975cfa1 | ||
|
|
a942ea6ee2 | ||
|
|
38ca7c030f | ||
|
|
7d59edc8a5 | ||
|
|
7d05450244 | ||
|
|
8e5ba70706 | ||
|
|
d43c40fc59 | ||
|
|
02ce707546 | ||
|
|
4a11ed6dc4 | ||
|
|
72d07fc3fb | ||
|
|
9b910b26a9 | ||
|
|
4a9be7b4a5 | ||
|
|
34958c654f | ||
|
|
bf91156182 | ||
|
|
b774b6920d | ||
|
|
56f6143873 | ||
|
|
7ba051c7ff | ||
|
|
63f5c240a4 | ||
|
|
ba91e433c3 | ||
|
|
2818b207db | ||
|
|
0527066a4c | ||
|
|
a48400535f | ||
|
|
fa201d21e2 | ||
|
|
c9222ff6f6 | ||
|
|
a45d311339 | ||
|
|
b59278601c | ||
|
|
b48a913fbf | ||
|
|
a0ef779aee | ||
|
|
861ff636b1 | ||
|
|
bbce4bdeb0 | ||
|
|
df0ceb4850 | ||
|
|
b1e45756dd | ||
|
|
4b52878dc1 | ||
|
|
62a4f18866 | ||
|
|
b00faf3930 | ||
|
|
d6ddb2b247 | ||
|
|
900510e7f2 | ||
|
|
7370af0084 | ||
|
|
9644693de3 | ||
|
|
b6bc269505 | ||
|
|
82161c10f8 | ||
|
|
c939033031 | ||
|
|
8c8c040fb3 | ||
|
|
48a07e2b34 | ||
|
|
7bdfbb17b5 | ||
|
|
492646edc3 | ||
|
|
975096b221 | ||
|
|
0c4c790a65 | ||
|
|
012539b5d3 | ||
|
|
f4cd9f27e4 | ||
|
|
449c2322b8 | ||
|
|
7efdcdc592 | ||
|
|
356aa27f70 | ||
|
|
a579c7882f | ||
|
|
3077cf6bb5 | ||
|
|
7c46ee50a4 | ||
|
|
1d37910bd4 | ||
|
|
5555ff2ac1 | ||
|
|
2ad93d79f5 | ||
|
|
6d32fe743b | ||
|
|
f2dd96c3bf | ||
|
|
9b4384d3e6 | ||
|
|
c1831e58f5 | ||
|
|
991f241209 | ||
|
|
b565cf4be1 | ||
|
|
8a5e1cd4f1 | ||
|
|
4445121023 | ||
|
|
1421869094 | ||
|
|
24480ef13a | ||
|
|
73bd7991bb | ||
|
|
6e74761977 | ||
|
|
a7f7a226d6 | ||
|
|
491cdc5fef | ||
|
|
98fe47d085 | ||
|
|
2290627c5f | ||
|
|
656d436028 | ||
|
|
cff8e822f2 | ||
|
|
5dfd46f809 | ||
|
|
97a6395ddd | ||
|
|
5226106ff0 | ||
|
|
5e838e3f10 | ||
|
|
574860f117 | ||
|
|
c19857d463 | ||
|
|
6741d58bec | ||
|
|
eb806dbca5 | ||
|
|
7d8aa683ff | ||
|
|
3bceaa7a2f | ||
|
|
bfa45b66ac | ||
|
|
e39b89859f | ||
|
|
1f14a01994 | ||
|
|
91310ce98c | ||
|
|
94dcfbf197 | ||
|
|
d2b4b8b279 | ||
|
|
aaa9495ceb | ||
|
|
a8b75c9b13 | ||
|
|
f21685e81d | ||
|
|
e24a7f887a | ||
|
|
54b5ab6d79 | ||
|
|
361b2ed7c7 | ||
|
|
cee6c7c999 | ||
|
|
3e5efd4090 | ||
|
|
10b8ba1ec8 | ||
|
|
be90380775 | ||
|
|
3b2e775698 | ||
|
|
01ba90689f | ||
|
|
e53fa82c46 | ||
|
|
48ccbfd860 | ||
|
|
601d4e1f48 | ||
|
|
7fce3bdd25 | ||
|
|
4b1bccd4b5 | ||
|
|
28e809f92f | ||
|
|
866e0e3fa9 | ||
|
|
ecaa388bbe | ||
|
|
4cfdc5bf30 | ||
|
|
ed1090430a | ||
|
|
3322cd73ea | ||
|
|
824f6ac4aa | ||
|
|
d5dfa89fdd | ||
|
|
9628a98568 | ||
|
|
cc3428d24b | ||
|
|
fe684e9bbd | ||
|
|
f31ea9b7cf | ||
|
|
7eeebb66ab | ||
|
|
e4f53c1daf | ||
|
|
98bd58a92c | ||
|
|
f9a7c12620 | ||
|
|
d04223e174 | ||
|
|
e71c514ef6 | ||
|
|
57b089ac89 | ||
|
|
b97ff6fe14 | ||
|
|
c57ac4c9fe | ||
|
|
9cf60ca227 | ||
|
|
8c9684e35c | ||
|
|
00854e2ea7 | ||
|
|
dcae312d2c | ||
|
|
963a851382 | ||
|
|
1d233c5250 | ||
|
|
34919ec961 | ||
|
|
d15228656f | ||
|
|
dd20a06f80 | ||
|
|
a4bbad3243 | ||
|
|
343ae99b54 | ||
|
|
41d1714d28 | ||
|
|
c20a2ecd9a | ||
|
|
b609daf89d | ||
|
|
f1cdcdaf3e | ||
|
|
01da323ddb | ||
|
|
9675a608a8 | ||
|
|
8231f28ded | ||
|
|
772ecea71a | ||
|
|
63a74f2dc9 | ||
|
|
4f3286f520 | ||
|
|
26ca025070 | ||
|
|
49b1c553ba | ||
|
|
55948d5b79 | ||
|
|
3aeee71873 | ||
|
|
d669e733cd | ||
|
|
d9af34ee81 | ||
|
|
8649dbda35 | ||
|
|
c7d05fbdb1 | ||
|
|
f2cfd50a44 | ||
|
|
a8146a2e81 | ||
|
|
d166cc2a4a | ||
|
|
4558cb4846 | ||
|
|
143349be3a | ||
|
|
82ac92dfed | ||
|
|
2643eb2e37 | ||
|
|
ac03b9f539 | ||
|
|
a4370ba55a | ||
|
|
7aa4a01355 | ||
|
|
349a9de592 | ||
|
|
58c0b45ac8 | ||
|
|
af0a923210 | ||
|
|
9bcaeee794 | ||
|
|
b6d8771792 | ||
|
|
f5fed50e4d | ||
|
|
5a00f56a39 | ||
|
|
0bb48f8af0 | ||
|
|
f3ceda1b3d | ||
|
|
24c4cbe901 | ||
|
|
26e2b2507d | ||
|
|
d3378c638a | ||
|
|
aa90274cc2 | ||
|
|
d0a281c116 | ||
|
|
4cbf192e74 | ||
|
|
1edafc40d0 | ||
|
|
6a4a25db40 | ||
|
|
e5ca66305c | ||
|
|
3250566949 | ||
|
|
4ced362dd0 | ||
|
|
4b87ac2907 | ||
|
|
44e1b8f159 | ||
|
|
81b1f06eec | ||
|
|
441d36e2e3 | ||
|
|
7cba76b1e8 | ||
|
|
c3304a78fb | ||
|
|
e6113b4aa1 | ||
|
|
044c7f997d | ||
|
|
abfba739a8 | ||
|
|
cec67484e5 | ||
|
|
aafed9b1b7 | ||
|
|
552a87462a | ||
|
|
4c8013e6d2 | ||
|
|
4f5efba173 | ||
|
|
e0c94af535 | ||
|
|
a8ff0b5e62 | ||
|
|
21a6a19caf | ||
|
|
b1d25ec35c | ||
|
|
685de56fbb | ||
|
|
e8adb7d533 | ||
|
|
c2af0e8b48 | ||
|
|
8ea7b09482 | ||
|
|
5180d1a17a | ||
|
|
d7e3493a59 | ||
|
|
5ea0a53995 | ||
|
|
dd4c66dbd8 | ||
|
|
0e8c2476b2 | ||
|
|
53fdcce361 | ||
|
|
a4a8d78b1f | ||
|
|
8b7bb7faa2 | ||
|
|
28430cc1c3 |
No files matched your search
-49
@@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
<attribute name="test" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="src" path="target/generated-sources/annotations">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
<attribute name="ignore_optional_problems" value="true"/>
|
|
||||||
<attribute name="m2e-apt" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="optional" value="true"/>
|
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
|
||||||
<attribute name="ignore_optional_problems" value="true"/>
|
|
||||||
<attribute name="m2e-apt" value="true"/>
|
|
||||||
<attribute name="test" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
|
||||||
</classpath>
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
<factorypath>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/spigotmc/spigot-api/1.16.1-R0.1-SNAPSHOT/spigot-api-1.16.1-R0.1-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/commons-lang/commons-lang/2.6/commons-lang-2.6.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/bungeecord-chat/1.16-R0.3/bungeecord-chat-1.16-R0.3.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/io/papermc/paperlib/1.0.5/paperlib-1.0.5.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/bukkit/craftbukkit/cb-1.16.2/1.16.2/cb-1.16.2-1.16.2.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/sk89q/worldedit/worldedit-bukkit/7.2.0-SNAPSHOT/worldedit-bukkit-7.2.0-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/sk89q/worldedit/worldedit-core/7.2.0-SNAPSHOT/worldedit-core-7.2.0-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/sk89q/worldedit/worldedit-libs/core/7.2.0-SNAPSHOT/core-7.2.0-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/de/schlichtherle/truezip/6.8.3/truezip-6.8.3.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-profile-default_2.13/0.12.1/truevfs-profile-default_2.13-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/scala-lang/scala-library/2.13.1/scala-library-2.13.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-http/0.12.1/truevfs-driver-http-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-kernel-spec/0.12.1/truevfs-kernel-spec-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-annotations/2.5.0/truecommons-annotations-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/annotations/3.0.0/annotations-3.0.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-cio/2.5.0/truecommons-cio-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-io/2.5.0/truecommons-io-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-services/2.5.0/truecommons-services-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-logging/2.5.0/truecommons-logging-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/javax/inject/javax.inject/1/javax.inject-1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpclient/4.5.10/httpclient-4.5.10.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/httpcomponents/httpcore/4.4.12/httpcore-4.4.12.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/jcl-over-slf4j/1.7.28/jcl-over-slf4j-1.7.28.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-odf/0.12.1/truevfs-driver-odf-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-comp-zipdriver/0.12.1/truevfs-comp-zipdriver-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-comp-zip/0.12.1/truevfs-comp-zip-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/bouncycastle/bcprov-jdk15on/1.63/bcprov-jdk15on-1.63.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-tar/0.12.1/truevfs-driver-tar-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-comp-tardriver/0.12.1/truevfs-comp-tardriver-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-tar-bzip2/0.12.1/truevfs-driver-tar-bzip2-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-tar-gzip/0.12.1/truevfs-driver-tar-gzip-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-tar-xz/0.12.1/truevfs-driver-tar-xz-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/tukaani/xz/1.8/xz-1.8.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-zip-raes/0.12.1/truevfs-driver-zip-raes-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-profile-base_2.13/0.12.1/truevfs-profile-base_2.13-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-access-swing/0.12.1/truevfs-access-swing-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-access/0.12.1/truevfs-access-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-file/0.12.1/truevfs-driver-file-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-jar/0.12.1/truevfs-driver-jar-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-driver-zip/0.12.1/truevfs-driver-zip-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-comp-ibm437/0.12.1/truevfs-comp-ibm437-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truevfs/truevfs-kernel-impl_2.13/0.12.1/truevfs-kernel-impl_2.13-0.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-key-console/2.5.0/truecommons-key-console-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-key-default/2.5.0/truecommons-key-default-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-key-swing/2.5.0/truecommons-key-swing-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-key-macosx/2.5.0/truecommons-key-macosx-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-key-spec/2.5.0/truecommons-key-spec-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/truecommons/truecommons-shed/2.5.0/truecommons-shed-2.5.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/4.1.0/jna-4.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/mozilla/rhino-runtime/1.7.12/rhino-runtime-1.7.12.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/antlr/antlr4-runtime/4.7.2/antlr4-runtime-4.7.2.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/sk89q/worldedit/worldedit-libs/bukkit/7.2.0-SNAPSHOT/bukkit-7.2.0-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-slf4j-impl/2.8.1/log4j-slf4j-impl-2.8.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.8.1/log4j-api-2.8.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/bstats/bstats-bukkit/1.7/bstats-bukkit-1.7.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/it/unimi/dsi/fastutil/8.2.1/fastutil-8.2.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/io/lumine/xikage/MythicMobs/4.9.1/MythicMobs-4.9.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/zeroturnaround/zt-zip/1.14/zt-zip-1.14.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
<factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.6.6/slf4j-api-1.6.6.jar" enabled="true" runInBatchMode="false"/>
|
|
||||||
</factorypath>
|
|
||||||
+7
-11
@@ -1,16 +1,12 @@
|
|||||||
/target/
|
|
||||||
|
|
||||||
lib/
|
build/
|
||||||
|
|
||||||
dependency-reduced-pom.xml
|
.gradle/
|
||||||
|
|
||||||
release/
|
.idea/
|
||||||
|
|
||||||
lint/in.jar
|
|
||||||
|
|
||||||
lint/out.jar
|
|
||||||
|
|
||||||
lint/mapping.txt
|
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea/
|
|
||||||
|
collection/
|
||||||
|
|
||||||
|
src/main/java/com/volmit/iris/util/uniques/
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>Iris</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
|
||||||
</natures>
|
|
||||||
<filteredResources>
|
|
||||||
<filter>
|
|
||||||
<id>1604627025065</id>
|
|
||||||
<name></name>
|
|
||||||
<type>30</type>
|
|
||||||
<matcher>
|
|
||||||
<id>org.eclipse.core.resources.regexFilterMatcher</id>
|
|
||||||
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
|
|
||||||
</matcher>
|
|
||||||
</filter>
|
|
||||||
</filteredResources>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
encoding//src/main/java=UTF-8
|
|
||||||
encoding//src/main/resources=UTF-8
|
|
||||||
encoding/<project>=UTF-8
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.apt.aptEnabled=true
|
|
||||||
org.eclipse.jdt.apt.genSrcDir=target\\generated-sources\\annotations
|
|
||||||
org.eclipse.jdt.apt.genTestSrcDir=target\\generated-test-sources\\test-annotations
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
|
||||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
|
||||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
|
|
||||||
org.eclipse.jdt.core.compiler.processAnnotations=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.release=disabled
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
activeProfiles=
|
|
||||||
eclipse.preferences.version=1
|
|
||||||
resolveWorkspaceProjects=true
|
|
||||||
version=1
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="EclipseModuleManager">
|
|
||||||
<conelement value="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" />
|
|
||||||
<src_description expected_position="2">
|
|
||||||
<src_folder value="file://$MODULE_DIR$/src/main/java" expected_position="0" />
|
|
||||||
<src_folder value="file://$MODULE_DIR$/src/main/resources" expected_position="1" />
|
|
||||||
<src_folder value="file://$MODULE_DIR$/src/test/java" expected_position="4" />
|
|
||||||
</src_description>
|
|
||||||
</component>
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="false" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="JavaSE-1.8" jdkType="JavaSDK" />
|
|
||||||
<orderEntry type="library" name="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" level="application" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="library" name="Maven: io.timeandspace:smoothie-map:2.0.2" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.timeandspace:jpsg-core:1.4" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:2.11.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.16.1-R0.1-SNAPSHOT" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.3" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.papermc:paperlib:1.0.5" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit.craftbukkit:1.16.3:1.16.3" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit.craftbukkit:1.16.4:1.16.4" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.bergerkiller.bukkit:BKCommonLib:1.16.4-v2" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-core:7.2.0-SNAPSHOT" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit.worldedit-libs:core:7.2.0-SNAPSHOT" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: de.schlichtherle:truezip:6.8.3" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-default_2.13:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.scala-lang:scala-library:2.13.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-http:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-spec:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-annotations:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:annotations:3.0.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-cio:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-io:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-services:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-logging:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.inject:javax.inject:1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpcore:4.4.12" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.11" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.28" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-odf:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zipdriver:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zip:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bouncycastle:bcprov-jdk15on:1.63" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-tardriver:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-bzip2:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-gzip:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-xz:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.tukaani:xz:1.8" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip-raes:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-base_2.13:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access-swing:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-file:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-jar:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-ibm437:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-impl_2.13:0.12.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-console:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-default:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-swing:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-macosx:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-spec:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-shed:2.5.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.dev.jna:jna:4.1.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.mozilla:rhino-runtime:1.7.12" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.antlr:antlr4-runtime:4.7.2" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit.worldedit-libs:bukkit:7.2.0-SNAPSHOT" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.logging.log4j:log4j-slf4j-impl:2.8.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.logging.log4j:log4j-api:2.8.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bstats:bstats-bukkit:1.7" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: it.unimi.dsi:fastutil:8.2.1" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: io.lumine.xikage:MythicMobs:4.9.1" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.5" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.4.0" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.10" level="project" />
|
|
||||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: org.zeroturnaround:zt-zip:1.14" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.6.6" level="project" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
@@ -1,2 +1,83 @@
|
|||||||
# Iris
|
# IrisBukkit
|
||||||
Dimension Generator
|
|
||||||
|
The master branch is for the latest version of minecraft.
|
||||||
|
|
||||||
|
# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) **
|
||||||
|
|** [Git](https://github.com/IrisDimensions)
|
||||||
|
|
||||||
|
# Building
|
||||||
|
|
||||||
|
Building IrisBukkit is fairly simple, though you will need to setup a few things if your system has never been used for
|
||||||
|
java
|
||||||
|
development.
|
||||||
|
|
||||||
|
Consider supporting our development by buying IrisBukkit on spigot! We work hard to make IrisBukkit the best it can be
|
||||||
|
for everyone.
|
||||||
|
|
||||||
|
### Command Line Builds
|
||||||
|
|
||||||
|
1. Install [Java JDK 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||||
|
2. Set the JDK installation path to `JAVA_HOME` as an environment variable.
|
||||||
|
* Windows
|
||||||
|
1. Start > Type `env` and press Enter
|
||||||
|
2. Advanced > Environment Variables
|
||||||
|
3. Under System Variables, click `New...`
|
||||||
|
4. Variable Name: `JAVA_HOME`
|
||||||
|
5. Variable Value: `C:\Program Files\Java\jdk-17.0.1` (verify this exists after installing java don't just copy
|
||||||
|
the example text)
|
||||||
|
* MacOS
|
||||||
|
1. Run `/usr/libexec/java_home -V` and look for Java 17
|
||||||
|
2. Run `sudo nano ~/.zshenv`
|
||||||
|
3. Add `export JAVA_HOME=$(/usr/libexec/java_home)` as a new line
|
||||||
|
4. Use `CTRL + X`, then Press `Y`, Then `ENTER`
|
||||||
|
5. Quit & Reopen Terminal and verify with `echo $JAVA_HOME`. It should print a directory
|
||||||
|
3. If this is your first time building IrisBukkit for MC 1.18+ run `gradlew setup` inside the root IrisBukkit project
|
||||||
|
folder.
|
||||||
|
Otherwise, skip this step. Grab a coffee, this may take up to 5 minutes depending on your cpu & internet connection.
|
||||||
|
4. Once the project has setup, run `gradlew iris`
|
||||||
|
5. The IrisBukkit jar will be placed in `IrisBukkit/build/IrisBukkit-XXX-XXX.jar` Enjoy! Consider supporting us by
|
||||||
|
buying it on spigot!
|
||||||
|
|
||||||
|
### IDE Builds (for development)
|
||||||
|
|
||||||
|
* Run `gradlew setup` any time you get dependency issues with craftbukkit
|
||||||
|
* Configure ITJ Gradle to use JDK 17 (in settings, search for gradle)
|
||||||
|
* Add a build line in the build.gradle for your own build task to directly compile IrisBukkit into your plugins folder
|
||||||
|
if you
|
||||||
|
prefer.
|
||||||
|
* Resync the project & run your newly created task (under the development folder in gradle tasks!)
|
||||||
|
|
||||||
|
# IrisBukkit Toolbelt
|
||||||
|
|
||||||
|
Everyone needs a tool-belt.
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.volmit.iris.core.tools;
|
||||||
|
|
||||||
|
// Get IrisDataManager from a world
|
||||||
|
IrisToolbelt.access(anyWorld).getCompound().getData();
|
||||||
|
|
||||||
|
// Get Default Engine from world
|
||||||
|
IrisToolbelt.access(anyWorld).getCompound().getDefaultEngine();
|
||||||
|
|
||||||
|
// Get the engine at the given height
|
||||||
|
IrisToolbelt.access(anyWorld).getCompound().getEngineForHeight(68);
|
||||||
|
|
||||||
|
// IS THIS THING ON?
|
||||||
|
boolean yes=IrisToolbelt.isIrisWorld(world);
|
||||||
|
|
||||||
|
// GTFO for worlds (moves players to any other world, just not this one)
|
||||||
|
IrisToolbelt.evacuate(world);
|
||||||
|
|
||||||
|
IrisAccess access=IrisToolbelt.createWorld() // If you like builders...
|
||||||
|
.name("myWorld") // The world name
|
||||||
|
.dimension("terrifyinghands")
|
||||||
|
.seed(69133742) // The world seed
|
||||||
|
.headless(true) // Headless make gen go fast
|
||||||
|
.pregen(PregenTask // Define a pregen job to run
|
||||||
|
.builder()
|
||||||
|
.center(new Position2(0,0)) // REGION coords (1 region = 32x32 chunks)
|
||||||
|
.radius(4) // Radius in REGIONS. Rad of 4 means a 9x9 Region map.
|
||||||
|
.build())
|
||||||
|
.create();
|
||||||
|
```
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
id "io.freefair.lombok" version "6.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
group 'com.volmit.iris'
|
||||||
|
version '1.0-SNAPSHOT'
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
attributes('Contains-Sources': 'java,class')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
apply plugin: 'java'
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven { url "https://arcanearts.jfrog.io/artifactory/archives" }
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'org.projectlombok:lombok:1.18.24'
|
||||||
|
annotationProcessor 'org.projectlombok:lombok:1.18.24'
|
||||||
|
annotationProcessor 'systems.manifold:manifold-ext:2022.1.19'
|
||||||
|
implementation 'art.arcane:Source:22.9.3'
|
||||||
|
implementation 'art.arcane:Cram:22.9.3'
|
||||||
|
implementation 'art.arcane:Amulet:22.9.5'
|
||||||
|
implementation 'com.google.code.gson:gson:2.9.0'
|
||||||
|
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.1'
|
||||||
|
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
|
||||||
|
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
|
||||||
|
testAnnotationProcessor 'systems.manifold:manifold-ext:2022.1.19'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,290 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
id "io.freefair.lombok" version "6.3.0"
|
||||||
|
id "com.github.johnrengelman.shadow" version "7.1.2"
|
||||||
|
id "de.undercouch.download" version "5.0.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
group rootProject.group
|
||||||
|
version rootProject.version
|
||||||
|
|
||||||
|
def nmsVersion = "1.19"
|
||||||
|
def apiVersion = '1.19'
|
||||||
|
def spigotJarVersion = '1.19-R0.1-SNAPSHOT'
|
||||||
|
def name = getRootProject().getName() // Defined in settings.gradle
|
||||||
|
def main = 'com.volmit.iris.platform.bukkit.IrisBukkit'
|
||||||
|
|
||||||
|
// ADD YOURSELF AS A NEW LINE IF YOU WANT YOUR OWN BUILD TASK GENERATED
|
||||||
|
// ======================== WINDOWS =============================
|
||||||
|
registerCustomOutputTask('Cyberpwn', 'C://Users/cyberpwn/Documents/development/server/plugins')
|
||||||
|
registerCustomOutputTask('Psycho', 'D://Dan/MinecraftDevelopment/server/plugins')
|
||||||
|
registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/server/plugins')
|
||||||
|
registerCustomOutputTask('Coco', 'D://Documents/MC/plugins')
|
||||||
|
registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins')
|
||||||
|
registerCustomOutputTask('Vatuu', 'D://Minecraft/Servers/1.19/plugins')
|
||||||
|
// ========================== UNIX ==============================
|
||||||
|
registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins')
|
||||||
|
registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins')
|
||||||
|
// ==============================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gradle is weird sometimes, we need to delete the plugin yml from the build folder to actually filter properly.
|
||||||
|
*/
|
||||||
|
file(jar.archiveFile.get().getAsFile().getParentFile().getParentFile().getParentFile().getAbsolutePath() + '/build/resources/main/plugin.yml').delete()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expand properties into plugin yml
|
||||||
|
*/
|
||||||
|
processResources {
|
||||||
|
filesMatching('**/plugin.yml') {
|
||||||
|
expand(
|
||||||
|
'name': name.toString(),
|
||||||
|
'version': version.toString(),
|
||||||
|
'main': main.toString(),
|
||||||
|
'apiversion': apiVersion.toString()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We need parameter meta for the decree command system
|
||||||
|
*/
|
||||||
|
compileJava {
|
||||||
|
options.compilerArgs << '-parameters'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure Iris for shading
|
||||||
|
*/
|
||||||
|
shadowJar {
|
||||||
|
//minimize()
|
||||||
|
append("plugin.yml")
|
||||||
|
relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic'
|
||||||
|
relocate 'art.arcane', 'com.volmit.iris.util.arcane'
|
||||||
|
relocate 'manifold', 'com.volmit.iris.util.manifold'
|
||||||
|
relocate 'art.arcane.source', 'com.volmit.iris.util.source'
|
||||||
|
relocate 'ChumBukkit.extensions', 'com.volmit.iris.util.extensions'
|
||||||
|
relocate 'IrisBukkit.extensions', 'com.volmit.iris.util.extensions'
|
||||||
|
relocate 'Fukkit.extensions', 'com.volmit.iris.util.extensions'
|
||||||
|
relocate 'Amulet.extensions', 'com.volmit.iris.util.extensions'
|
||||||
|
relocate 'Iris.extensions', 'com.volmit.iris.util.extensions'
|
||||||
|
dependencies {
|
||||||
|
include(dependency('art.arcane:'))
|
||||||
|
include(dependency('systems.manifold:'))
|
||||||
|
include(dependency("com.dfsek:Paralithic:"))
|
||||||
|
include(dependency(":engine"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Faster dependency caches
|
||||||
|
*/
|
||||||
|
configurations.all {
|
||||||
|
resolutionStrategy.cacheChangingModulesFor 60, 'minutes'
|
||||||
|
resolutionStrategy.cacheDynamicVersionsFor 60, 'minutes'
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
testImplementation.extendsFrom annotationProcessor
|
||||||
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(17)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven { url "https://arcanearts.jfrog.io/artifactory/archives" }
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
||||||
|
implementation 'art.arcane:Fukkit:22.9.2'
|
||||||
|
implementation project(":engine")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JavaVersion.current() != JavaVersion.VERSION_1_8 &&
|
||||||
|
sourceSets.main.allJava.files.any { it.name == "module-info.java" }) {
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs += ['-Xplugin:Manifold', '--module-path', it.classpath.asPath]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs += ['-Xplugin:Manifold']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JavaVersion.current().toString() != "17") {
|
||||||
|
System.err.println()
|
||||||
|
System.err.println("=========================================================================================================")
|
||||||
|
System.err.println("You must run gradle on Java 17. You are using " + JavaVersion.current())
|
||||||
|
System.err.println()
|
||||||
|
System.err.println("=== For IDEs ===")
|
||||||
|
System.err.println("1. Configure the project for Java 17")
|
||||||
|
System.err.println("2. Configure the bundled gradle to use Java 17 in settings")
|
||||||
|
System.err.println()
|
||||||
|
System.err.println("=== For Command Line (gradlew) ===")
|
||||||
|
System.err.println("1. Install JDK 17 from https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html")
|
||||||
|
System.err.println("2. Set JAVA_HOME environment variable to the new jdk installation folder such as C:\\Program Files\\Java\\jdk-17.0.1")
|
||||||
|
System.err.println("3. Open a new command prompt window to get the new environment variables if need be.")
|
||||||
|
System.err.println("=========================================================================================================")
|
||||||
|
System.err.println()
|
||||||
|
System.exit(69);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println(buildDir);
|
||||||
|
def buildToolsJar = new File(buildDir, "buildtools/BuildTools.jar");
|
||||||
|
def specialSourceJar = new File(buildDir, "specialsource/SpecialSource.jar");
|
||||||
|
def buildToolsFolder = new File(buildDir, "buildtools");
|
||||||
|
def specialSourceFolder = new File(buildDir, "specialsource");
|
||||||
|
def buildToolsHint = new File(buildDir, "buildtools/craftbukkit-" + nmsVersion + ".jar");
|
||||||
|
def outputShadeJar = new File(buildDir, "libs/bukkit-" + version + "-all.jar");
|
||||||
|
def ssiJar = new File(buildDir, "specialsource/bukkit-" + version + "-all.jar");
|
||||||
|
def ssobfJar = new File(buildDir, "specialsource/Iris-" + version + "-rmo.jar");
|
||||||
|
def ssJar = new File(buildDir, "specialsource/Iris-" + version + "-rma.jar");
|
||||||
|
def homePath = System.properties['user.home']
|
||||||
|
def m2 = new File(homePath + "/.m2/repository")
|
||||||
|
def m2s = m2.getAbsolutePath();
|
||||||
|
|
||||||
|
// ======================== Building Mapped Jars =============================
|
||||||
|
task downloadBuildtools(type: Download) {
|
||||||
|
group "remapping"
|
||||||
|
src 'https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar'
|
||||||
|
dest buildToolsJar
|
||||||
|
onlyIf {
|
||||||
|
!buildToolsJar.exists()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task downloadSpecialSource(type: Download) {
|
||||||
|
group "remapping"
|
||||||
|
src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/1.10.0/SpecialSource-1.10.0-shaded.jar'
|
||||||
|
dest specialSourceJar
|
||||||
|
onlyIf {
|
||||||
|
!specialSourceJar.exists()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task executeBuildTools(dependsOn: downloadBuildtools, type: JavaExec)
|
||||||
|
{
|
||||||
|
group "remapping"
|
||||||
|
classpath = files(buildToolsJar)
|
||||||
|
workingDir = buildToolsFolder
|
||||||
|
args = [
|
||||||
|
"--rev",
|
||||||
|
nmsVersion,
|
||||||
|
"--compile",
|
||||||
|
"craftbukkit",
|
||||||
|
"--remap"
|
||||||
|
]
|
||||||
|
onlyIf {
|
||||||
|
!buildToolsHint.exists()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task copyBuildToSpecialSource(type: Copy)
|
||||||
|
{
|
||||||
|
group "remapping"
|
||||||
|
from outputShadeJar
|
||||||
|
into specialSourceFolder
|
||||||
|
dependsOn(downloadSpecialSource, shadowJar)
|
||||||
|
}
|
||||||
|
|
||||||
|
task specialSourceRemapObfuscate(type: JavaExec)
|
||||||
|
{
|
||||||
|
group "remapping"
|
||||||
|
dependsOn(copyBuildToSpecialSource, downloadSpecialSource, shadowJar)
|
||||||
|
workingDir = specialSourceFolder
|
||||||
|
classpath = files(specialSourceJar,
|
||||||
|
new File(m2s + "/org/spigotmc/spigot/" + spigotJarVersion + "/spigot-" + spigotJarVersion + "-remapped-mojang.jar"))
|
||||||
|
mainClass = "net.md_5.specialsource.SpecialSource"
|
||||||
|
args = [
|
||||||
|
"--live",
|
||||||
|
"-i",
|
||||||
|
ssiJar.getName(),
|
||||||
|
"-o",
|
||||||
|
ssobfJar.getName(),
|
||||||
|
"-m",
|
||||||
|
m2s + "/org/spigotmc/minecraft-server/" + spigotJarVersion + "/minecraft-server-" + spigotJarVersion + "-maps-mojang.txt",
|
||||||
|
"--reverse",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
task specialSourceRemap(type: JavaExec)
|
||||||
|
{
|
||||||
|
group "remapping"
|
||||||
|
dependsOn(specialSourceRemapObfuscate)
|
||||||
|
workingDir = specialSourceFolder
|
||||||
|
classpath = files(specialSourceJar,
|
||||||
|
new File(m2s + "/org/spigotmc/spigot/" + spigotJarVersion + "/spigot-" + spigotJarVersion + "-remapped-obf.jar"))
|
||||||
|
mainClass = "net.md_5.specialsource.SpecialSource"
|
||||||
|
args = [
|
||||||
|
"--live",
|
||||||
|
"-i",
|
||||||
|
ssobfJar.getName(),
|
||||||
|
"-o",
|
||||||
|
ssJar.getName(),
|
||||||
|
"-m",
|
||||||
|
m2s + "/org/spigotmc/minecraft-server/" + spigotJarVersion + "/minecraft-server-" + spigotJarVersion + "-maps-spigot.csrg"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.compileJava.dependsOn(executeBuildTools)
|
||||||
|
|
||||||
|
compileJava {
|
||||||
|
options.encoding = "UTF-8"
|
||||||
|
}
|
||||||
|
|
||||||
|
task setup()
|
||||||
|
{
|
||||||
|
group("iris")
|
||||||
|
dependsOn(clean, executeBuildTools)
|
||||||
|
}
|
||||||
|
|
||||||
|
task iris(type: Copy)
|
||||||
|
{
|
||||||
|
group "iris"
|
||||||
|
from ssJar
|
||||||
|
into buildDir
|
||||||
|
rename { String fileName ->
|
||||||
|
fileName.replace('Iris-' + version + '-rma.jar', "Iris-" + version + ".jar")
|
||||||
|
}
|
||||||
|
dependsOn(specialSourceRemap)
|
||||||
|
}
|
||||||
|
|
||||||
|
def registerCustomOutputTask(name, path) {
|
||||||
|
if (!System.properties['os.name'].toLowerCase().contains('windows')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('build' + name, Copy) {
|
||||||
|
group('development')
|
||||||
|
outputs.upToDateWhen { false }
|
||||||
|
dependsOn(iris)
|
||||||
|
from(new File(buildDir, "Iris-" + version + ".jar"))
|
||||||
|
into(file(path))
|
||||||
|
rename { String fileName ->
|
||||||
|
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def registerCustomOutputTaskUnix(name, path) {
|
||||||
|
if (System.properties['os.name'].toLowerCase().contains('windows')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register('build' + name, Copy) {
|
||||||
|
group('development')
|
||||||
|
outputs.upToDateWhen { false }
|
||||||
|
dependsOn(iris)
|
||||||
|
from(new File(buildDir, "Iris-" + version + ".jar"))
|
||||||
|
into(file(path))
|
||||||
|
rename { String fileName ->
|
||||||
|
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit;
|
||||||
|
|
||||||
|
import art.arcane.amulet.io.IO;
|
||||||
|
import art.arcane.amulet.logging.LogListener;
|
||||||
|
import com.volmit.iris.engine.EngineConfiguration;
|
||||||
|
import com.volmit.iris.platform.IrisPlatform;
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.platform.PlatformWorld;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitBiome;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitBlock;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitKey;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitWorld;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Warning;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class IrisBukkit extends JavaPlugin implements IrisPlatform, LogListener {
|
||||||
|
private static final String TAG = ChatColor.DARK_GRAY + "[" + ChatColor.GREEN + "Iris" + ChatColor.DARK_GREEN + "/";
|
||||||
|
private static final String TAG_STRIPPED = ChatColor.stripColor(TAG);
|
||||||
|
private static IrisBukkit instance;
|
||||||
|
private ConsoleCommandSender consoleSender;
|
||||||
|
|
||||||
|
public void onEnable() {
|
||||||
|
instance = this;
|
||||||
|
consoleSender = Bukkit.getConsoleSender();
|
||||||
|
LogListener.listener.set(this);
|
||||||
|
|
||||||
|
getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
|
||||||
|
World world = Bukkit.createWorld(new WorldCreator("iristests/" + UUID.randomUUID()).generator(new IrisBukkitChunkGenerator(this, EngineConfiguration.builder()
|
||||||
|
.timings(true).mutable(true)
|
||||||
|
.build())));
|
||||||
|
for(Player i : Bukkit.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
i.teleport(world.getSpawnLocation());
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDisable() {
|
||||||
|
World w = null;
|
||||||
|
for(World i : Bukkit.getWorlds()) {
|
||||||
|
if(!i.getName().startsWith("iristest")) {
|
||||||
|
w = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(World i : Bukkit.getWorlds()) {
|
||||||
|
if(i.getName().startsWith("iristest"))
|
||||||
|
{
|
||||||
|
for(Player j : i.getPlayers())
|
||||||
|
{
|
||||||
|
j.teleport(w.getSpawnLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(i.getGenerator() instanceof Closeable c)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
c.close();
|
||||||
|
} catch(IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BukkitWorld.of(i).unloadChunks(false, true);
|
||||||
|
File folder = i.getWorldFolder();
|
||||||
|
Bukkit.unloadWorld(i, false);
|
||||||
|
IO.delete(folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisBukkit getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void messageConsole(String color, String key, Object o) {
|
||||||
|
try {
|
||||||
|
consoleSender.sendMessage(TAG + key + ChatColor.DARK_GRAY + "]: " + color + o.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Throwable e) {
|
||||||
|
System.out.println(TAG_STRIPPED + key + "]: " + o.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logError(String k, Object o) {
|
||||||
|
messageConsole(ChatColor.RED.toString(), k, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logInfo(String k, Object o) {
|
||||||
|
messageConsole(ChatColor.WHITE.toString(), k, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logWarning(String k, Object o) {
|
||||||
|
messageConsole(ChatColor.YELLOW.toString(), k, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logDebug(String k, Object o) {
|
||||||
|
messageConsole(ChatColor.GRAY.toString(), k, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPlatformName() {
|
||||||
|
return "Bukkit";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<PlatformBlock> getBlocks() {
|
||||||
|
//This is because it's a method extension
|
||||||
|
//noinspection Convert2MethodRef
|
||||||
|
return Arrays.stream(Material.values())
|
||||||
|
.filter(i -> !i.isLegacy())
|
||||||
|
.filter(Material::isBlock)
|
||||||
|
.map(Material::createBlockData).map(i -> BukkitBlock.of(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<PlatformBiome> getBiomes() {
|
||||||
|
//This is because it's a method extension
|
||||||
|
//noinspection Convert2MethodRef
|
||||||
|
return Arrays.stream(Biome.values()).parallel().filter((i) -> i != Biome.CUSTOM).map(i -> BukkitBiome.of(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isWorldLoaded(String name) {
|
||||||
|
return Bukkit.getWorlds().keepWhere(i -> i.getName().equals(name)).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformWorld getWorld(String name) {
|
||||||
|
World w = Bukkit.getWorld(name);
|
||||||
|
|
||||||
|
if(w == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BukkitWorld.of(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformBlock parseBlock(String raw) {
|
||||||
|
return BukkitBlock.of(Bukkit.createBlockData(raw));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformNamespaceKey key(String namespace, String key) {
|
||||||
|
return BukkitKey.of(namespace, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getStudioFolder(String dimension) {
|
||||||
|
File f = new File(getDataFolder(), "packs/" + dimension);
|
||||||
|
f.mkdirs();
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getStudioFolder() {
|
||||||
|
File f = new File(getDataFolder(), "packs/");
|
||||||
|
f.mkdirs();
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
|
||||||
|
return new IrisBukkitChunkGenerator(this, EngineConfiguration.builder()
|
||||||
|
.threads(4)
|
||||||
|
.mutable(true)
|
||||||
|
.timings(true)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void i(String s, Object o) {
|
||||||
|
logInfo(s, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void f(String s, Object o) {
|
||||||
|
logError(s, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void w(String s, Object o) {
|
||||||
|
logWarning(s, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void d(String s, Object o) {
|
||||||
|
logDebug(s, o);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit;
|
||||||
|
|
||||||
|
import art.arcane.chrono.Average;
|
||||||
|
import art.arcane.chrono.PrecisionStopwatch;
|
||||||
|
import art.arcane.spatial.hunk.Hunk;
|
||||||
|
import com.volmit.iris.engine.EngineConfiguration;
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureSizedTarget;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import com.volmit.iris.engine.pipeline.PipedHunkStack;
|
||||||
|
import com.volmit.iris.platform.IrisPlatform;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.bukkit.util.StaticBiomeProvider;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitWorld;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.generator.BiomeProvider;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
import com.volmit.iris.platform.bukkit.util.ChunkDataHunkView;
|
||||||
|
import org.bukkit.generator.WorldInfo;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class IrisBukkitChunkGenerator extends ChunkGenerator implements Closeable {
|
||||||
|
private final IrisPlatform platform;
|
||||||
|
private final EngineConfiguration configuration;
|
||||||
|
private final AtomicReference<Engine> engine;
|
||||||
|
private final ReentrantLock engineLock;
|
||||||
|
private final AtomicInteger perSecond;
|
||||||
|
private final PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
private final Average a = new Average(128);
|
||||||
|
private final StaticBiomeProvider staticBiomeProvider;
|
||||||
|
|
||||||
|
public IrisBukkitChunkGenerator(IrisPlatform platform, EngineConfiguration configuration) {
|
||||||
|
this.perSecond = new AtomicInteger(0);
|
||||||
|
this.platform = platform;
|
||||||
|
this.configuration = configuration;
|
||||||
|
this.staticBiomeProvider = new StaticBiomeProvider(Biome.PLAINS);
|
||||||
|
this.engine = new AtomicReference<>();
|
||||||
|
this.engineLock = new ReentrantLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) {
|
||||||
|
PrecisionStopwatch pp = PrecisionStopwatch.start();
|
||||||
|
initEngine(world);
|
||||||
|
ChunkData data = Bukkit.createChunkData(world);
|
||||||
|
Hunk<PlatformBlock> chunk = new ChunkDataHunkView(data);
|
||||||
|
FeatureSizedTarget targetSize = FeatureSizedTarget.builder()
|
||||||
|
.width(chunk.getWidth())
|
||||||
|
.height(chunk.getHeight())
|
||||||
|
.depth(chunk.getDepth())
|
||||||
|
.offsetX(x << 4)
|
||||||
|
.offsetZ(z << 4)
|
||||||
|
.offsetY(0)
|
||||||
|
.build();
|
||||||
|
FeatureTarget<PlatformBlock> blockTarget = new FeatureTarget<>(chunk, targetSize);
|
||||||
|
PipedHunkStack stack = new PipedHunkStack();
|
||||||
|
stack.register(PlatformBlock.class, blockTarget);
|
||||||
|
engine.get().getPlumbing().generate(engine.get(), targetSize, stack);
|
||||||
|
perSecond.incrementAndGet();
|
||||||
|
a.put(pp.getMilliseconds());
|
||||||
|
|
||||||
|
if(p.getMilliseconds() > 1000)
|
||||||
|
{
|
||||||
|
p.reset();
|
||||||
|
p.begin();
|
||||||
|
System.out.println("PERSECOND: " + perSecond.getAndSet(0) + " AMS: " + ((int)Math.round(a.getAverage())) + "ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initEngine(World world) {
|
||||||
|
if(engine.get() == null)
|
||||||
|
{
|
||||||
|
engineLock.lock();
|
||||||
|
|
||||||
|
if(engine.get() == null)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
engine.set(new Engine(platform, BukkitWorld.of(world), configuration));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
engineLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canSpawn(World world, int x, int z) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeProvider getDefaultBiomeProvider(WorldInfo worldInfo) {
|
||||||
|
return staticBiomeProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
engine.get().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateNoise() {
|
||||||
|
return super.shouldGenerateNoise();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateSurface() {
|
||||||
|
return super.shouldGenerateSurface();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateBedrock() {
|
||||||
|
return super.shouldGenerateBedrock();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateCaves() {
|
||||||
|
return super.shouldGenerateCaves();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateDecorations() {
|
||||||
|
return super.shouldGenerateDecorations();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateMobs() {
|
||||||
|
return super.shouldGenerateMobs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateStructures() {
|
||||||
|
return super.shouldGenerateStructures();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.util;
|
||||||
|
|
||||||
|
import art.arcane.spatial.hunk.Hunk;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.bukkit.wrapper.BukkitBlock;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
|
||||||
|
@SuppressWarnings("ClassCanBeRecord")
|
||||||
|
public class ChunkDataHunkView implements Hunk<PlatformBlock> {
|
||||||
|
private final ChunkGenerator.ChunkData chunk;
|
||||||
|
|
||||||
|
public ChunkDataHunkView(ChunkGenerator.ChunkData chunk) {
|
||||||
|
this.chunk = chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth() {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDepth() {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight() {
|
||||||
|
return chunk.getMaxHeight() - chunk.getMinHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void set(int x1, int y1, int z1, int x2, int y2, int z2, PlatformBlock t) {
|
||||||
|
if(t == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk.setRegion(x1, y1 + chunk.getMinHeight(), z1, x2, y2 + chunk.getMinHeight(), z2, ((BukkitBlock)t).getDelegate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void setRaw(int x, int y, int z, PlatformBlock t) {
|
||||||
|
if(t == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk.setBlock(x, y + chunk.getMinHeight(), z, ((BukkitBlock)t).getDelegate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformBlock getRaw(int x, int y, int z) {
|
||||||
|
return BukkitBlock.of(chunk.getBlockData(x, y + chunk.getMinHeight(), z));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.util;
|
||||||
|
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.generator.BiomeProvider;
|
||||||
|
import org.bukkit.generator.WorldInfo;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StaticBiomeProvider extends BiomeProvider {
|
||||||
|
private static final List<Biome> ALL_BIOMES = Arrays.stream(Biome.values()).without((i) -> i.equals(Biome.CUSTOM)).toList().unmodifiable();
|
||||||
|
private final Biome defaultBiome;
|
||||||
|
|
||||||
|
public StaticBiomeProvider(Biome defaultBiome) {
|
||||||
|
this.defaultBiome = defaultBiome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(WorldInfo worldInfo, int x, int y, int z) {
|
||||||
|
return defaultBiome;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Biome> getBiomes(WorldInfo worldInfo) {
|
||||||
|
return ALL_BIOMES;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BukkitBiome implements PlatformBiome {
|
||||||
|
private final Biome delegate;
|
||||||
|
|
||||||
|
private BukkitBiome(Biome delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformNamespaceKey getKey() {
|
||||||
|
return BukkitKey.of(delegate.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitBiome of(Biome biome) {
|
||||||
|
return new BukkitBiome(biome);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.data.Ageable;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BukkitBlock implements PlatformBlock {
|
||||||
|
private final BlockData delegate;
|
||||||
|
private final Map<String, String> properties;
|
||||||
|
|
||||||
|
private BukkitBlock(BlockData delegate, Map<String, String> properties) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
this.properties = properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BukkitBlock(BlockData delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
String s = delegate.getAsString(true);
|
||||||
|
|
||||||
|
if(s.contains("[")) {
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
String[] props = new String[] {s.split("\\Q[\\E")[1].split("\\Q]\\E")[0]};
|
||||||
|
String[] p;
|
||||||
|
if(props[0].contains(",")) {
|
||||||
|
for(String i : props[0].split("\\Q,\\E")) {
|
||||||
|
p = i.split("\\Q=\\E");
|
||||||
|
properties.put(p[0], p[1]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p = props[0].split("\\Q=\\E");
|
||||||
|
properties.put(p[0], p[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.properties = Collections.unmodifiableMap(properties);
|
||||||
|
} else {
|
||||||
|
this.properties = Map.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> getProperties() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformNamespaceKey getKey() {
|
||||||
|
return BukkitKey.of(delegate.getMaterial().getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitBlock of(BlockData blockData) {
|
||||||
|
return new BukkitBlock(blockData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitBlock of(Material material) {
|
||||||
|
return of(material.createBlockData());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitBlock of(String raw) {
|
||||||
|
return of(Bukkit.createBlockData(raw));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformChunk;
|
||||||
|
import org.bukkit.Chunk;
|
||||||
|
|
||||||
|
public class BukkitChunk implements PlatformChunk {
|
||||||
|
private final Chunk delegate;
|
||||||
|
|
||||||
|
private BukkitChunk(Chunk delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getX() {
|
||||||
|
return delegate.getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getZ() {
|
||||||
|
return delegate.getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unload(boolean save, boolean force) {
|
||||||
|
if(force) {
|
||||||
|
delegate.getPluginChunkTickets().forEach(delegate::removePluginChunkTicket);
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate.unload(save);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitChunk of(Chunk chunk) {
|
||||||
|
return new BukkitChunk(chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BukkitKey implements PlatformNamespaceKey {
|
||||||
|
private final NamespacedKey delegate;
|
||||||
|
|
||||||
|
private BukkitKey(NamespacedKey delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNamespace() {
|
||||||
|
return delegate.getNamespace();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return delegate.getKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return delegate.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitKey of(String nsk) {
|
||||||
|
if(nsk.contains(":")) {
|
||||||
|
String[] f = nsk.split("\\Q:\\E");
|
||||||
|
return of(f[0], f[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return of("minecraft", nsk);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitKey of(String namespace, String key) {
|
||||||
|
return of(new NamespacedKey(namespace, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitKey of(NamespacedKey key) {
|
||||||
|
return new BukkitKey(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import art.arcane.amulet.geometry.Vec;
|
||||||
|
import com.volmit.iris.platform.PlatformPlayer;
|
||||||
|
import com.volmit.iris.platform.PlatformWorld;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class BukkitPlayer implements PlatformPlayer {
|
||||||
|
private final Player delegate;
|
||||||
|
|
||||||
|
private BukkitPlayer(Player delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getUUID() {
|
||||||
|
return delegate.getUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return delegate.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vec getLocation() {
|
||||||
|
return delegate.getLocation().vec();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformWorld getWorld() {
|
||||||
|
return BukkitWorld.of(delegate.getWorld());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canUseIris() {
|
||||||
|
return delegate.isOp();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(String message) {
|
||||||
|
delegate.sendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendActionBar(String message) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendTitleMessage(String title, String subtitle, int in, int stay, int out) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitPlayer of(Player player) {
|
||||||
|
return new BukkitPlayer(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package com.volmit.iris.platform.bukkit.wrapper;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformChunk;
|
||||||
|
import com.volmit.iris.platform.PlatformPlayer;
|
||||||
|
import com.volmit.iris.platform.PlatformWorld;
|
||||||
|
import com.volmit.iris.util.WorldHeight;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BukkitWorld implements PlatformWorld {
|
||||||
|
private final World delegate;
|
||||||
|
private final WorldHeight worldHeight;
|
||||||
|
|
||||||
|
private BukkitWorld(World delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
this.worldHeight = new WorldHeight(delegate.getMinHeight(), delegate.getMaxHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WorldHeight getHeight() {
|
||||||
|
return worldHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return delegate.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getFolder() {
|
||||||
|
return delegate.getWorldFolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<PlatformPlayer> getPlayers() {
|
||||||
|
//noinspection Convert2MethodRef
|
||||||
|
return delegate.getPlayers().stream().map(i -> BukkitPlayer.of(i)).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<PlatformChunk> getLoadedChunks() {
|
||||||
|
//noinspection Convert2MethodRef
|
||||||
|
return Arrays.stream(delegate.getLoadedChunks()).map(i -> BukkitChunk.of(i)).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformChunk getOrLoadChunk(int x, int z) {
|
||||||
|
return BukkitChunk.of(delegate.getChunkAt(x, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformBlock getBlock(int x, int y, int z) {
|
||||||
|
return BukkitBlock.of(delegate.getBlockAt(x, y, z).getBlockData());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformBiome getBiome(int x, int y, int z) {
|
||||||
|
return BukkitBiome.of(delegate.getBiome(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getSeed() {
|
||||||
|
return delegate.getSeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isChunkLoaded(int x, int z) {
|
||||||
|
return delegate.isChunkLoaded(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBlock(int x, int y, int z, PlatformBlock block) {
|
||||||
|
delegate.setBlockData(x, y, z, ((BukkitBlock) block).getDelegate());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBiome(int x, int y, int z, PlatformBiome biome) {
|
||||||
|
delegate.setBiome(x, y, z, ((BukkitBiome) biome).getDelegate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BukkitWorld of(World world) {
|
||||||
|
return new BukkitWorld(world);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
name: Iris
|
||||||
|
main: com.volmit.iris.platform.bukkit.IrisBukkit
|
||||||
|
version: 1.0.0
|
||||||
|
api-version: 1.19
|
||||||
|
libraries:
|
||||||
|
- org.apache-extras.beanshell:bsh:2.0b6
|
||||||
|
- com.google.code.gson:gson:2.8.9
|
||||||
|
- com.github.ben-manes.caffeine:caffeine:3.1.1
|
||||||
@@ -1,392 +0,0 @@
|
|||||||
#Fri Sep 04 02:39:39 EDT 2020
|
|
||||||
\!/=
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_with_spaces=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_additive_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_assignment=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_logical_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_record_components=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=49
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_after_package=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_field=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_method=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_package=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_block_comments=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_header=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_html=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_line_comments=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_source_code=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.line_length=80
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.compact_else_if=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.continuation_indentation=2
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.disabling_tag=@NoArgsConstructor
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.enabling_tag=@done
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_empty_lines=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indentation.size=4
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.join_lines_in_comments=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.join_wrapped_lines=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.lineSplit=120
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.tabulation.char=tab
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.tabulation.size=4
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.text_block_indentation=0
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.use_on_off_tags=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
|
|
||||||
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=false
|
|
||||||
/instance/org.eclipse.jdt.ui/formatter_profile=_Dan Formatter
|
|
||||||
/instance/org.eclipse.jdt.ui/formatter_settings_version=19
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.exception.name=e
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<profiles version\="13">\r\n<profile kind\="CodeFormatterProfile" name\="Dan Formatter" version\="13">\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value\="common_lines"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value\="common_lines"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value\="common_lines"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indentation.size" value\="4"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value\="common_lines"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.disabling_tag" value\="@NoArgsConstructor"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.continuation_indentation" value\="2"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value\="49"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_package" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value\="common_lines"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.enabling_tag" value\="@done"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_Line truncated
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=19
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.gettersetter.use.is=true
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.ignorelowercasenames=true
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.importorder=java;javax;org;com;
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.ondemandthreshold=99
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.staticondemandthreshold=1
|
|
||||||
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
|
|
||||||
@org.eclipse.jdt.core=3.22.0.v20200530-2032
|
|
||||||
@org.eclipse.jdt.ui=3.21.100.v20200602-0959
|
|
||||||
file_export_version=3.0
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
id "io.freefair.lombok" version "6.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
group rootProject.group
|
||||||
|
version rootProject.version
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
attributes('Contains-Sources': 'java,class')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
testImplementation.extendsFrom annotationProcessor
|
||||||
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(17)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JavaVersion.current() != JavaVersion.VERSION_1_8 &&
|
||||||
|
sourceSets.main.allJava.files.any { it.name == "module-info.java" }) {
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs += ['-Xplugin:Manifold', '--module-path', it.classpath.asPath]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs += ['-Xplugin:Manifold']
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.feature.features.FeatureError;
|
||||||
|
import com.volmit.iris.engine.feature.features.FeatureTerrain;
|
||||||
|
import com.volmit.iris.engine.pipeline.EnginePipeline;
|
||||||
|
import com.volmit.iris.engine.pipeline.EnginePlumbing;
|
||||||
|
import com.volmit.iris.engine.pipeline.PipelinePhase;
|
||||||
|
import com.volmit.iris.engine.pipeline.PipelineTask;
|
||||||
|
import com.volmit.iris.platform.IrisPlatform;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.platform.PlatformRegistry;
|
||||||
|
import com.volmit.iris.platform.PlatformWorld;
|
||||||
|
import lombok.Data;
|
||||||
|
import manifold.util.concurrent.ConcurrentWeakHashMap;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Engine implements Closeable {
|
||||||
|
private static final Map<Thread, WeakReference<Engine>> engineContext = new ConcurrentWeakHashMap<>();
|
||||||
|
private final IrisPlatform platform;
|
||||||
|
private final EngineRegistry registry;
|
||||||
|
private final EngineConfiguration configuration;
|
||||||
|
private final PlatformWorld world;
|
||||||
|
private final EngineBlockCache blockCache;
|
||||||
|
private final EngineExecutor executor;
|
||||||
|
private final EnginePlumbing plumbing;
|
||||||
|
private final EngineSeedManager seedManager;
|
||||||
|
private final EngineData data;
|
||||||
|
|
||||||
|
public Engine(IrisPlatform platform, PlatformWorld world, EngineConfiguration configuration) throws IOException {
|
||||||
|
this.configuration = configuration.validate();
|
||||||
|
this.platform = platform;
|
||||||
|
this.world = world;
|
||||||
|
i("Initializing Iris Engine for " + platform.getPlatformName() + " in " + world.getName()
|
||||||
|
+ " with " + configuration.getThreads() + " priority " + configuration.getThreadPriority()
|
||||||
|
+ " threads in " + (configuration.isMutable() ? "edit mode" : "production mode"));
|
||||||
|
this.blockCache = new EngineBlockCache(this);
|
||||||
|
this.registry = EngineRegistry.builder()
|
||||||
|
.blockRegistry(new PlatformRegistry<>("Block", platform.getBlocks()))
|
||||||
|
.biomeRegistry(new PlatformRegistry<>("Biome", platform.getBiomes()))
|
||||||
|
.build();
|
||||||
|
this.data = new EngineData(this).loadData(
|
||||||
|
getConfiguration().isMutable()
|
||||||
|
? getPlatform().getStudioFolder()
|
||||||
|
: getWorld().getIrisDataFolder(), getConfiguration().getDimension());
|
||||||
|
this.seedManager = getSeedManager();
|
||||||
|
this.executor = new EngineExecutor(this);
|
||||||
|
this.plumbing = EnginePlumbing.builder().engine(this)
|
||||||
|
.errorPipeline(EnginePipeline.builder()
|
||||||
|
.phase(PipelinePhase.builder()
|
||||||
|
.task(new PipelineTask<>(new FeatureError(this), PlatformBlock.class))
|
||||||
|
.build())
|
||||||
|
.build())
|
||||||
|
.pipeline(EnginePipeline.builder()
|
||||||
|
.phase(PipelinePhase.builder()
|
||||||
|
.task(new PipelineTask<>(new FeatureTerrain(this), PlatformBlock.class))
|
||||||
|
.build())
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlatformBlock block(String block) {
|
||||||
|
return blockCache.get(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlatformNamespaceKey key(String nsk) {
|
||||||
|
return getPlatform().key(nsk);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<Engine> context() {
|
||||||
|
WeakReference<Engine> reference = engineContext.get(Thread.currentThread());
|
||||||
|
|
||||||
|
if(reference != null)
|
||||||
|
{
|
||||||
|
return Optional.ofNullable(reference.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
getExecutor().close();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class EngineBlockCache
|
||||||
|
{
|
||||||
|
private final Engine engine;
|
||||||
|
private final Map<String, PlatformBlock> cache;
|
||||||
|
|
||||||
|
public EngineBlockCache(Engine engine)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.cache = new ConcurrentHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlatformBlock get(String t)
|
||||||
|
{
|
||||||
|
return cache.computeIfAbsent(t, (key) -> engine.getPlatform().parseBlock(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.platform.PlatformWorld;
|
||||||
|
import com.volmit.iris.util.NSK;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class EngineConfiguration {
|
||||||
|
@Builder.Default
|
||||||
|
private int chunkSize = 16;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private boolean mutable = false;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private boolean timings = false;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private int threads = Runtime.getRuntime().availableProcessors();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private int threadPriority = 3;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private PlatformNamespaceKey dimension = new NSK("overworld", "main");
|
||||||
|
|
||||||
|
public EngineConfiguration validate() throws IOException {
|
||||||
|
validateChunkSize();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateChunkSize() throws IOException {
|
||||||
|
if(Arrays.binarySearch(allowedChunkSizes, chunkSize) < 0) {
|
||||||
|
throw new IOException("Invalid Chunk Size: " + chunkSize + " Allowed Chunk Sizes are: " + Arrays.toString(allowedChunkSizes));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int[] allowedChunkSizes;
|
||||||
|
|
||||||
|
static {
|
||||||
|
allowedChunkSizes = new int[16];
|
||||||
|
|
||||||
|
for(int i = 0; i < allowedChunkSizes.length; i++) {
|
||||||
|
allowedChunkSizes[i] = (int) Math.pow(2, i+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Arrays.sort(allowedChunkSizes); // for binary sorting
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,276 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import art.arcane.amulet.concurrent.J;
|
||||||
|
import art.arcane.amulet.io.IO;
|
||||||
|
import art.arcane.amulet.io.JarLoader;
|
||||||
|
import art.arcane.cram.PakFile;
|
||||||
|
import art.arcane.cram.PakKey;
|
||||||
|
import art.arcane.cram.PakResource;
|
||||||
|
import com.google.gson.*;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.dimension.IrisDimension;
|
||||||
|
import com.volmit.iris.engine.dimension.IrisGenerator;
|
||||||
|
import com.volmit.iris.engine.dimension.IrisRange;
|
||||||
|
import com.volmit.iris.engine.resolver.*;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.util.NSK;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class EngineData implements TypeAdapterFactory {
|
||||||
|
private final Engine engine;
|
||||||
|
private final Gson gson;
|
||||||
|
private List<Resolvable> resolvableTypes;
|
||||||
|
private final Map<Class<?>, Resolver<?>> resolvers;
|
||||||
|
|
||||||
|
public EngineData(Engine engine) throws IOException {
|
||||||
|
this.engine = engine;
|
||||||
|
this.resolvers = new HashMap<>();
|
||||||
|
this.resolvableTypes = J.attempt(() -> new JarLoader(getClass()).all().parallel()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.filter(i -> !i.isInterface() && !i.isEnum())
|
||||||
|
.filter(i -> i.isAssignableFrom(Resolvable.class) || Resolvable.class.isAssignableFrom(i))
|
||||||
|
.filter(i -> !i.equals(EngineResolvable.class))
|
||||||
|
.map(i -> J.attempt(() -> (Resolvable) i.getDeclaredConstructor().newInstance(), null)).toList(), List.of());
|
||||||
|
GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapterFactory(this);
|
||||||
|
resolvableTypes.forEach(i -> i.apply(gsonBuilder));
|
||||||
|
this.gson = gsonBuilder.setPrettyPrinting().create();
|
||||||
|
i("Registered " + resolvableTypes.size() + " Mutators with " + resolvableTypes.stream().filter(i -> i instanceof TypeAdapterFactory).count() + " Type Adapter Factories");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateSchemas(File folder) throws IOException {
|
||||||
|
folder.mkdirs();
|
||||||
|
|
||||||
|
for(Resolvable i : resolvableTypes) {
|
||||||
|
IO.writeAll(new File(folder, i.entity().getId() + ".json"), i.generateSchema(this).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends Resolvable> T resolve(Class<T> clazz, PlatformNamespaceKey key)
|
||||||
|
{
|
||||||
|
Resolver<?> r = resolvers.get(clazz);
|
||||||
|
|
||||||
|
if(r == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T) r.resolve(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerResolver(Class<?> type, Resolver<?> resolver, String namespace)
|
||||||
|
{
|
||||||
|
if(resolvers.containsKey(type)) {
|
||||||
|
Resolver r = resolvers.get(type);
|
||||||
|
resolvers.put(type, r.and(namespace, r));
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
resolvers.put(type, resolver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public EngineData loadData(File folder, PlatformNamespaceKey dimension) throws IOException {
|
||||||
|
i("Loading Data in " + folder.getPath());
|
||||||
|
for(File i : folder.listFiles()) {
|
||||||
|
if(i.isDirectory() && i.getName().equals(dimension.getNamespace())) {
|
||||||
|
loadDataNamespaced(i, i.getName());
|
||||||
|
|
||||||
|
if(getEngine().getConfiguration().isMutable()) {
|
||||||
|
generateSchemas(new File(i, ".iris/schema"));
|
||||||
|
i("Generated " + new File(i, ".iris/schema").listFiles().length + " Schemas");
|
||||||
|
generateCodeWorkspace(new File(i, dimension.getNamespace() + ".code-workspace"));
|
||||||
|
i("Generated Code Workspace");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(i.getName().equals(dimension.getNamespace() + ".dat")) {
|
||||||
|
loadPakFile(folder, i.getName().split("\\Q.\\E")[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IrisDimension dim = resolve(IrisDimension.class, dimension);
|
||||||
|
|
||||||
|
if(dim == null) {
|
||||||
|
f("Failed to load dimension " + dimension);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateCodeWorkspace(File file) throws IOException {
|
||||||
|
file.getParentFile().mkdirs();
|
||||||
|
JsonObject ws = new JsonObject();
|
||||||
|
JsonArray folders = new JsonArray();
|
||||||
|
JsonObject folder = new JsonObject();
|
||||||
|
folder.add("path", new JsonPrimitive("."));
|
||||||
|
folders.add(folder);
|
||||||
|
ws.add("folders", folders);
|
||||||
|
JsonObject settings = new JsonObject();
|
||||||
|
settings.add("workbench.colorTheme", new JsonPrimitive("Monokai"));
|
||||||
|
settings.add("workbench.preferredDarkColorTheme", new JsonPrimitive("Solarized Dark"));
|
||||||
|
settings.add("workbench.tips.enabled", new JsonPrimitive(false));
|
||||||
|
settings.add("workbench.tree.indent", new JsonPrimitive(24));
|
||||||
|
settings.add("files.autoSave", new JsonPrimitive("onFocusChange"));
|
||||||
|
JsonObject jc = new JsonObject();
|
||||||
|
jc.add("editor.autoIndent", new JsonPrimitive("brackets"));
|
||||||
|
jc.add("editor.acceptSuggestionOnEnter", new JsonPrimitive("smart"));
|
||||||
|
jc.add("editor.cursorSmoothCaretAnimation", new JsonPrimitive(true));
|
||||||
|
jc.add("editor.dragAndDrop", new JsonPrimitive(false));
|
||||||
|
jc.add("files.trimTrailingWhitespace", new JsonPrimitive(true));
|
||||||
|
jc.add("diffEditor.ignoreTrimWhitespace", new JsonPrimitive(true));
|
||||||
|
jc.add("files.trimFinalNewlines", new JsonPrimitive(true));
|
||||||
|
jc.add("editor.suggest.showKeywords", new JsonPrimitive(false));
|
||||||
|
jc.add("editor.suggest.showSnippets", new JsonPrimitive(false));
|
||||||
|
jc.add("editor.suggest.showWords", new JsonPrimitive(false));
|
||||||
|
JsonObject st = new JsonObject();
|
||||||
|
st.add("strings", new JsonPrimitive(true));
|
||||||
|
jc.add("editor.quickSuggestions", st);
|
||||||
|
jc.add("editor.suggest.insertMode", new JsonPrimitive("replace"));
|
||||||
|
settings.add("[json]", jc);
|
||||||
|
settings.add("json.maxItemsComputed", new JsonPrimitive(30000));
|
||||||
|
JsonArray schemas = new JsonArray();
|
||||||
|
|
||||||
|
for(Resolvable i : resolvableTypes) {
|
||||||
|
String id = i.entity().getId();
|
||||||
|
JsonObject o = new JsonObject();
|
||||||
|
JsonArray fileMatch = new JsonArray();
|
||||||
|
fileMatch.add("/" + id + "/*.json");
|
||||||
|
o.add("fileMatch", fileMatch);
|
||||||
|
o.add("url", new JsonPrimitive(".iris/schema/" + id + ".json"));
|
||||||
|
schemas.add(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.add("json.schemas", schemas);
|
||||||
|
ws.add("settings", settings);
|
||||||
|
IO.writeAll(file, ws.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadDataNamespaced(File folder, String namespace) throws IOException {
|
||||||
|
i("Loading Namespace " + namespace + " in " + folder.getPath());
|
||||||
|
for(Resolvable i : resolvableTypes)
|
||||||
|
{
|
||||||
|
new File(folder, i.entity().getId()).mkdirs();
|
||||||
|
IO.writeAll(new File(new File(folder, i.entity().getId()), "example.json"), gson.toJson(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(File i : folder.listFiles())
|
||||||
|
{
|
||||||
|
if(i.isDirectory()) {
|
||||||
|
loadDataFolder(i, namespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadDataFolder(File folder, String namespace) {
|
||||||
|
for(Resolvable i : resolvableTypes)
|
||||||
|
{
|
||||||
|
if(!folder.getName().equals(i.entity().getId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerResolver(i.getClass(), Resolver.hotDirectoryJson(namespace, i.getClass(), folder, gson), namespace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadPakFile(File folder, String name) throws IOException {
|
||||||
|
PakFile pakFile = new PakFile(folder, name);
|
||||||
|
Map<PakKey, PakResource> resources = pakFile.getAllResources();
|
||||||
|
|
||||||
|
for(Resolvable i : resolvableTypes)
|
||||||
|
{
|
||||||
|
Class<? extends Resolvable> resolvableClass = i.getClass();
|
||||||
|
CompositeResolver<?> composite = Resolver.frozen(resources, (p) -> p.getClass().equals(resolvableClass));
|
||||||
|
|
||||||
|
for(String j : composite.getResolvers().keySet())
|
||||||
|
{
|
||||||
|
Resolver<? extends Resolvable> resolver = composite.getResolvers().get(i);
|
||||||
|
this.registerResolver(i.getClass(), resolver, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printResolvers() {
|
||||||
|
resolvers.forEach((k, i) -> i.print(k.simpleName(), this));
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> void writeSafeJson(TypeAdapter<T> delegate, JsonWriter out, T value) {
|
||||||
|
try {
|
||||||
|
delegate.write(out, value);
|
||||||
|
} catch (IOException e) {
|
||||||
|
try {
|
||||||
|
delegate.write(out, null);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
for(Resolvable i : resolvableTypes) {
|
||||||
|
if(type.getRawType().equals(i.getClass())) {
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {writeSafeJson(delegate, out, value);}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.STRING) {
|
||||||
|
Resolver<?> resolver = getResolvers().get(i.getClass());
|
||||||
|
String key = in.nextString();
|
||||||
|
|
||||||
|
if(resolver == null) {
|
||||||
|
w("Unable to find a resolver for " + i.getClass() + " received " + key);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
T t = (T) resolver.resolve(new NSK(key));
|
||||||
|
|
||||||
|
if(t == null) {
|
||||||
|
w("Unable to resolve " + i.getClass() + " " + key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Resolvable getInstance(Class<?> type) {
|
||||||
|
for(Resolvable i : resolvableTypes) {
|
||||||
|
if(i.getClass().equals(type)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PlatformNamespaceKey> getAllKeys(Class<?> type) {
|
||||||
|
List<PlatformNamespaceKey> keys = new ArrayList<>();
|
||||||
|
Resolver<?> resolver = resolvers.get(type);
|
||||||
|
|
||||||
|
if(resolver != null) {
|
||||||
|
resolver.addAllKeys(keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import art.arcane.amulet.concurrent.J;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
import java.util.concurrent.ForkJoinWorkerThread;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class EngineExecutor implements ForkJoinPool.ForkJoinWorkerThreadFactory, Thread.UncaughtExceptionHandler, Closeable {
|
||||||
|
private final Engine engine;
|
||||||
|
private final ForkJoinPool forks;
|
||||||
|
|
||||||
|
public EngineExecutor(Engine engine)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
forks = new ForkJoinPool(engine.getConfiguration().getThreads(), this, this, true);
|
||||||
|
i("Started Pool with " + engine.getConfiguration().getThreads() + " priority " + engine.getConfiguration().getThreadPriority() + " threads.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uncaughtException(Thread t, Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
|
||||||
|
final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
|
||||||
|
worker.setName("Iris " + engine.getWorld().getName() + " Executor " + worker.getPoolIndex());
|
||||||
|
return worker;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
i("Shutting down generator pool");
|
||||||
|
forks.shutdownNow().forEach((i) -> {
|
||||||
|
try
|
||||||
|
{
|
||||||
|
i.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Throwable e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
i("Generator pool shutdown");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformRegistry;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
public class EngineRegistry {
|
||||||
|
private final PlatformRegistry<PlatformBlock> blockRegistry;
|
||||||
|
private final PlatformRegistry<PlatformBiome> biomeRegistry;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class EngineSeedManager {
|
||||||
|
private final Engine engine;
|
||||||
|
private final long worldSeed;
|
||||||
|
|
||||||
|
public EngineSeedManager(Engine engine)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.worldSeed = engine.getWorld().getSeed();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "author")
|
||||||
|
public class IrisAuthor extends EngineResolvable
|
||||||
|
{
|
||||||
|
private String name;
|
||||||
|
private Map<String, String> social;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "biome")
|
||||||
|
public class IrisBiome extends EngineResolvable {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisSurface surface = new IrisSurface();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisRange height = IrisRange.flat(1);
|
||||||
|
|
||||||
|
public PlatformBiome toPlatformBiome()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "chance", jsonTypes = {JsonToken.STRING, JsonToken.BEGIN_OBJECT})
|
||||||
|
public class IrisChance extends EngineResolvable implements TypeAdapterFactory {
|
||||||
|
@Builder.Default
|
||||||
|
@TokenConstructor(JsonToken.NUMBER)
|
||||||
|
private double threshold = 0.5;
|
||||||
|
|
||||||
|
@TokenConstructor(JsonToken.STRING)
|
||||||
|
@Builder.Default
|
||||||
|
private IrisGenerator generator = IrisGenerator.WHITE;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
if(!type.getRawType().equals(getClass())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {writeSafeJson(delegate, out, value);}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.STRING) {
|
||||||
|
return (T) IrisChance.half(gson.fromJson(in.nextString(), IrisGenerator.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisChance half(IrisGenerator generator) {
|
||||||
|
return IrisChance.builder()
|
||||||
|
.threshold(0.5)
|
||||||
|
.generator(generator)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisChance white(double chance) {
|
||||||
|
return IrisChance.builder()
|
||||||
|
.threshold(chance)
|
||||||
|
.generator(IrisGenerator.WHITE)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "decorator")
|
||||||
|
public class IrisDecorator extends EngineResolvable {
|
||||||
|
@Builder.Default
|
||||||
|
private IrisPalette palette = IrisPalette.flat("minecraft:grass");
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisChance chance = IrisChance.white(0.25);
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Singular;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "dimension")
|
||||||
|
public class IrisDimension extends EngineResolvable {
|
||||||
|
@Builder.Default
|
||||||
|
private IrisDimensionMeta meta = new IrisDimensionMeta();
|
||||||
|
|
||||||
|
@Singular
|
||||||
|
@Type(IrisBiome.class)
|
||||||
|
private List<IrisBiome> biomes = new ArrayList<>();
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Singular;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "dimension-meta")
|
||||||
|
public class IrisDimensionMeta extends EngineResolvable
|
||||||
|
{
|
||||||
|
private String name;
|
||||||
|
private String description;
|
||||||
|
private String version;
|
||||||
|
@Singular
|
||||||
|
@Resolvable.Type(IrisAuthor.class)
|
||||||
|
private List<IrisAuthor> authors = new ArrayList<>();
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import art.arcane.source.NoisePlane;
|
||||||
|
import art.arcane.source.script.NoisePlaneConstructor;
|
||||||
|
import art.arcane.source.util.NoisePreset;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.script.ScriptException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "generator", jsonTypes = {JsonToken.STRING, JsonToken.BEGIN_OBJECT})
|
||||||
|
public class IrisGenerator extends EngineResolvable implements TypeAdapterFactory {
|
||||||
|
public static final IrisGenerator NATURAL = IrisGenerator.builder().java("art.arcane.source.api.util.NoisePreset.NATURAL.create(seed)").build();
|
||||||
|
public static final IrisGenerator WHITE = IrisGenerator.builder().java("Noise.white(seed)").build();
|
||||||
|
public static final IrisGenerator FLAT = IrisGenerator.builder().java("Noise.flat(seed)").build();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private String java = "art.arcane.source.api.util.NoisePreset.NATURAL.create(seed)";
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisSeed seed = new IrisSeed();
|
||||||
|
|
||||||
|
public NoisePlane getNoisePlane(long seed)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return NoisePlaneConstructor.execute(seed, java);
|
||||||
|
} catch(ScriptException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return NoisePreset.NATURAL.create(seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
if(!type.getRawType().equals(getClass())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {writeSafeJson(delegate, out, value);}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.STRING) {
|
||||||
|
return (T) IrisGenerator.builder().java(in.nextString()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Singular;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "palette", jsonTypes = {JsonToken.STRING, JsonToken.BEGIN_OBJECT})
|
||||||
|
public class IrisPalette extends EngineResolvable implements TypeAdapterFactory {
|
||||||
|
@Singular
|
||||||
|
@PlatformType(PlatformBlock.class)
|
||||||
|
@Type(String.class)
|
||||||
|
@TokenConstructor(JsonToken.STRING)
|
||||||
|
private List<String> blocks = new ArrayList<>();
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisGenerator generator = IrisGenerator.WHITE;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
if(!type.getRawType().equals(getClass())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {
|
||||||
|
writeSafeJson(delegate, out, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.STRING) {
|
||||||
|
return (T) IrisPalette.flat(in.nextString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisPalette flat(String block){
|
||||||
|
return IrisPalette.builder()
|
||||||
|
.block(block)
|
||||||
|
.generator(IrisGenerator.FLAT)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "range", jsonTypes = {JsonToken.NUMBER, JsonToken.BEGIN_OBJECT})
|
||||||
|
public class IrisRange extends EngineResolvable implements TypeAdapterFactory {
|
||||||
|
@Builder.Default
|
||||||
|
@TokenConstructor(JsonToken.NUMBER)
|
||||||
|
private double max = 1;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private double min = 1;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisGenerator generator = IrisGenerator.NATURAL;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
if(!type.getRawType().equals(getClass())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {writeSafeJson(delegate, out, value);}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.NUMBER) {
|
||||||
|
double d = in.nextDouble();
|
||||||
|
return (T) IrisRange.builder().min(d).max(d).generator(IrisGenerator.FLAT).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisRange flat(double v) {
|
||||||
|
return IrisRange.builder()
|
||||||
|
.max(v)
|
||||||
|
.min(v)
|
||||||
|
.generator(IrisGenerator.FLAT)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "seed", jsonTypes = {JsonToken.NUMBER, JsonToken.STRING, JsonToken.BEGIN_OBJECT})
|
||||||
|
public class IrisSeed extends EngineResolvable implements TypeAdapterFactory {
|
||||||
|
@Builder.Default
|
||||||
|
private IrisSeedSetMode mode = IrisSeedSetMode.LOCAL_OFFSET;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
@TokenConstructor(JsonToken.NUMBER)
|
||||||
|
private long offset = 0;
|
||||||
|
|
||||||
|
@TokenConstructor(JsonToken.STRING)
|
||||||
|
private String hashOffset;
|
||||||
|
|
||||||
|
public long getOffset() {
|
||||||
|
if(hashOffset != null && hashOffset.isNotEmpty()) {
|
||||||
|
return hashOffset.hashCode() + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getSeed(Engine engine, long localSeed) {
|
||||||
|
return switch(mode)
|
||||||
|
{
|
||||||
|
case WORLD -> engine.getSeedManager().getWorldSeed();
|
||||||
|
case LOCAL -> localSeed;
|
||||||
|
case LOCAL_OFFSET -> localSeed + getOffset();
|
||||||
|
case RAW -> getOffset();
|
||||||
|
case WORLD_OFFSET -> engine.getSeedManager().getWorldSeed() + getOffset();
|
||||||
|
case RANDOM -> (Math.random() * Long.MAX_VALUE) + (Math.random() * Long.MAX_VALUE);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
|
||||||
|
|
||||||
|
if(!type.getRawType().equals(getClass())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TypeAdapter<>() {
|
||||||
|
public void write(JsonWriter out, T value) {writeSafeJson(delegate, out, value);}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T read(JsonReader in) throws IOException {
|
||||||
|
JsonToken token = in.peek();
|
||||||
|
|
||||||
|
if(token == JsonToken.STRING) {
|
||||||
|
return (T) IrisSeed.builder().hashOffset(in.nextString()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(token == JsonToken.NUMBER) {
|
||||||
|
return (T) IrisSeed.builder().offset(Double.doubleToLongBits(in.nextDouble())).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.read(in);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
public enum IrisSeedSetMode
|
||||||
|
{
|
||||||
|
WORLD,
|
||||||
|
RAW,
|
||||||
|
WORLD_OFFSET,
|
||||||
|
LOCAL,
|
||||||
|
LOCAL_OFFSET,
|
||||||
|
RANDOM
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Singular;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "surface")
|
||||||
|
public class IrisSurface extends EngineResolvable {
|
||||||
|
@Singular
|
||||||
|
@Type(IrisSurfaceLayer.class)
|
||||||
|
private List<IrisSurfaceLayer> layers = new ArrayList<>();
|
||||||
|
|
||||||
|
@Singular
|
||||||
|
@Type(IrisDecorator.class)
|
||||||
|
private List<IrisDecorator> decorators = new ArrayList<>();
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.volmit.iris.engine.dimension;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.engine.resolver.Resolvable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=false)
|
||||||
|
@Accessors(fluent = true, chain = true)
|
||||||
|
@Resolvable.Entity(id = "surface-layer")
|
||||||
|
public class IrisSurfaceLayer extends EngineResolvable {
|
||||||
|
@Builder.Default
|
||||||
|
private IrisPalette palette = IrisPalette.flat("minecraft:stone");
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private IrisRange thickness = IrisRange.flat(1);
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public abstract class Feature<T extends PlatformNamespaced, S extends FeatureState> {
|
||||||
|
private final String name;
|
||||||
|
private final Engine engine;
|
||||||
|
private boolean optimize;
|
||||||
|
private boolean heightAgnostic;
|
||||||
|
|
||||||
|
public Feature(String name, Engine engine)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.name = name;
|
||||||
|
this.optimize = true;
|
||||||
|
this.heightAgnostic = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FeatureTask<T, S> task(FeatureSizedTarget target, FeatureTarget<T> origin, FeatureStorage storage, int verticalExecutionSize, int horizontalExecutionSize, FeatureTaskTiming timings)
|
||||||
|
{
|
||||||
|
return new FeatureTask<>(engine, this, storage, target, origin, verticalExecutionSize, horizontalExecutionSize, heightAgnostic, timings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FeatureTask<T, S> task(FeatureSizedTarget target, FeatureTarget<T> origin, FeatureStorage storage, int horizontalExecutionSize, FeatureTaskTiming timings)
|
||||||
|
{
|
||||||
|
return new FeatureTask<>(engine, this, storage, target, origin, Integer.MAX_VALUE, horizontalExecutionSize, heightAgnostic, timings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract S prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage);
|
||||||
|
|
||||||
|
public abstract void generate(Engine engine, S state, FeatureTarget<T> target, FeatureStorage storage);
|
||||||
|
}
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import art.arcane.amulet.range.IntegerRange;
|
||||||
|
import art.arcane.spatial.hunk.storage.ArrayHunk;
|
||||||
|
import art.arcane.spatial.hunk.view.HunkView;
|
||||||
|
import art.arcane.spatial.util.Consume;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class FeatureSizedTarget {
|
||||||
|
@Builder.Default
|
||||||
|
private final int width = 16;
|
||||||
|
@Builder.Default
|
||||||
|
private final int height = 0;
|
||||||
|
@Builder.Default
|
||||||
|
private final int depth = 16;
|
||||||
|
@Builder.Default
|
||||||
|
private final int offsetX = 0;
|
||||||
|
@Builder.Default
|
||||||
|
private final int offsetY = 0;
|
||||||
|
@Builder.Default
|
||||||
|
private final int offsetZ = 0;
|
||||||
|
|
||||||
|
public <T extends PlatformNamespaced> FeatureTarget<T> hunked()
|
||||||
|
{
|
||||||
|
return new FeatureTarget<>(new ArrayHunk<>(width, height, depth), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends PlatformNamespaced> FeatureTarget<T> hunked(FeatureTarget<T> origin)
|
||||||
|
{
|
||||||
|
return new FeatureTarget<>(new HunkView<>(origin.getHunk(), width, height, depth, offsetX - origin.getOffsetX(), offsetY - origin.getOffsetY(), offsetZ - origin.getOffsetZ()), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<FeatureSizedTarget> splitX() {
|
||||||
|
if(width <= 1) {
|
||||||
|
return Stream.of(this);
|
||||||
|
}
|
||||||
|
int wo2 = width/2;
|
||||||
|
return Stream.of(FeatureSizedTarget.builder()
|
||||||
|
.width(wo2).height(height).depth(depth)
|
||||||
|
.offsetX(offsetX).offsetY(offsetY).offsetZ(offsetZ).build(),
|
||||||
|
FeatureSizedTarget.builder()
|
||||||
|
.width(width - wo2).height(height).depth(depth)
|
||||||
|
.offsetX(offsetX + wo2).offsetY(offsetY).offsetZ(offsetZ).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<FeatureSizedTarget> splitY() {
|
||||||
|
if(height <= 1) {
|
||||||
|
return Stream.of(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ho2 = height / 2;
|
||||||
|
return Stream.of(FeatureSizedTarget.builder()
|
||||||
|
.width(width).height(ho2).depth(depth)
|
||||||
|
.offsetX(offsetX).offsetY(offsetY).offsetZ(offsetZ).build(),
|
||||||
|
FeatureSizedTarget.builder()
|
||||||
|
.width(width).height(height - ho2).depth(depth)
|
||||||
|
.offsetX(offsetX).offsetY(offsetY + ho2).offsetZ(offsetZ).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream<FeatureSizedTarget> splitZ() {
|
||||||
|
if(depth <= 1) {
|
||||||
|
return Stream.of(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
int do2 = depth / 2;
|
||||||
|
return Stream.of(FeatureSizedTarget.builder()
|
||||||
|
.width(width).height(height).depth(do2)
|
||||||
|
.offsetX(offsetX).offsetY(offsetY).offsetZ(offsetZ).build(),
|
||||||
|
FeatureSizedTarget.builder()
|
||||||
|
.width(width).height(height).depth(depth - do2)
|
||||||
|
.offsetX(offsetX).offsetY(offsetY).offsetZ(offsetZ + do2).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAbsoluteMaxX()
|
||||||
|
{
|
||||||
|
return getOffsetX() + getWidth() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAbsoluteMaxY()
|
||||||
|
{
|
||||||
|
return getOffsetY() + getHeight() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAbsoluteMaxZ()
|
||||||
|
{
|
||||||
|
return getOffsetZ() + getDepth() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange yCap(int max) {
|
||||||
|
return new IntegerRange(y().getLeftEndpoint(), Math.min(y().getRightEndpoint(), max));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void forYCap(Consume.One<Integer> consumer, int max) {
|
||||||
|
for(int y : yCap(max)) {
|
||||||
|
consumer.accept(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void forXZ(Consume.Two<Integer, Integer> consumer) {
|
||||||
|
for(int x : x()) {
|
||||||
|
for(int z : z()) {
|
||||||
|
consumer.accept(x, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange x()
|
||||||
|
{
|
||||||
|
return new IntegerRange(getOffsetX(), getAbsoluteMaxX());
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange y()
|
||||||
|
{
|
||||||
|
return new IntegerRange(getOffsetY(), getAbsoluteMaxY());
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange z()
|
||||||
|
{
|
||||||
|
return new IntegerRange(getOffsetZ(), getAbsoluteMaxZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange localX()
|
||||||
|
{
|
||||||
|
return new IntegerRange(0, getWidth() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange localY()
|
||||||
|
{
|
||||||
|
return new IntegerRange(0, getHeight() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerRange localZ()
|
||||||
|
{
|
||||||
|
return new IntegerRange(0, getDepth() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FeatureSizedTarget mergedSize(Stream<FeatureSizedTarget> targets, boolean x, boolean y, boolean z) {
|
||||||
|
List<FeatureSizedTarget> t = targets.toList();
|
||||||
|
return FeatureSizedTarget.builder()
|
||||||
|
.width(x ? t.stream().mapToInt(FeatureSizedTarget::getWidth).sum() : t[0].getWidth())
|
||||||
|
.height(y ? t.stream().mapToInt(FeatureSizedTarget::getHeight).sum() : t[0].getHeight())
|
||||||
|
.depth(z ? t.stream().mapToInt(FeatureSizedTarget::getDepth).sum() : t[0].getDepth())
|
||||||
|
.offsetX(x ? t.stream().mapToInt(FeatureSizedTarget::getOffsetX).min().orElse(0) : t[0].getOffsetX())
|
||||||
|
.offsetY(y ? t.stream().mapToInt(FeatureSizedTarget::getOffsetY).min().orElse(0) : t[0].getOffsetY())
|
||||||
|
.offsetZ(z ? t.stream().mapToInt(FeatureSizedTarget::getOffsetZ).min().orElse(0) : t[0].getOffsetZ())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
public interface FeatureState {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.dimension.IrisBiome;
|
||||||
|
import com.volmit.iris.util.NoiseCache;
|
||||||
|
import com.volmit.iris.util.ShortNoiseCache;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FeatureStorage {
|
||||||
|
private ShortNoiseCache height;
|
||||||
|
private NoiseCache<IrisBiome> biome;
|
||||||
|
private final int w;
|
||||||
|
private final int h;
|
||||||
|
|
||||||
|
public FeatureStorage(int w, int h)
|
||||||
|
{
|
||||||
|
this.w = w;
|
||||||
|
this.h = h;
|
||||||
|
this.height = new ShortNoiseCache(w, h);
|
||||||
|
this.biome = new NoiseCache<>(w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import art.arcane.spatial.hunk.Hunk;
|
||||||
|
import art.arcane.spatial.hunk.view.HunkView;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class FeatureTarget<T extends PlatformNamespaced> extends FeatureSizedTarget {
|
||||||
|
private final Hunk<T> hunk;
|
||||||
|
|
||||||
|
public FeatureTarget(Hunk<T> hunk, int offsetX, int offsetY, int offsetZ)
|
||||||
|
{
|
||||||
|
super(hunk.getWidth(), hunk.getHeight(), hunk.getDepth(), offsetX, offsetY, offsetZ);
|
||||||
|
this.hunk = hunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FeatureTarget(Hunk<T> hunk, FeatureSizedTarget target)
|
||||||
|
{
|
||||||
|
this(hunk, target.getOffsetX(), target.getOffsetY(), target.getOffsetZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <V extends PlatformNamespaced> FeatureTarget<V> mergedTarget(Stream<FeatureTarget<V>> targets, FeatureTarget<V> origin, boolean x, boolean y, boolean z)
|
||||||
|
{
|
||||||
|
List<FeatureTarget<V>> t = targets.toList();
|
||||||
|
FeatureSizedTarget mergedSize = FeatureSizedTarget.mergedSize(t.stream().map(i -> i), x, y, z);
|
||||||
|
Hunk<V> hunk = new HunkView<>(origin.getHunk(), mergedSize.getWidth(), mergedSize.getHeight(), mergedSize.getDepth(),
|
||||||
|
mergedSize.getOffsetX() - origin.getOffsetX(),
|
||||||
|
mergedSize.getOffsetY() - origin.getOffsetY(),
|
||||||
|
mergedSize.getOffsetZ() - origin.getOffsetZ());
|
||||||
|
return new FeatureTarget<>(hunk, mergedSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import art.arcane.chrono.PrecisionStopwatch;
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.ForkJoinTask;
|
||||||
|
import java.util.concurrent.RecursiveTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Continuously splits up a hunk of work in all 3 dimensions until the job size is within the
|
||||||
|
* specified limits. This allows a single hunk to be split until the ideal amount of tasks can run in parallel.
|
||||||
|
* @param <T> The namespaced object type
|
||||||
|
* @param <S> The feature state type
|
||||||
|
*/
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class FeatureTask<T extends PlatformNamespaced, S extends FeatureState> extends RecursiveTask<FeatureTarget<T>> implements Callable<FeatureTarget<T>> {
|
||||||
|
private final Engine engine;
|
||||||
|
private final Feature<T, S> feature;
|
||||||
|
private final FeatureStorage storage;
|
||||||
|
private final FeatureSizedTarget size;
|
||||||
|
private final FeatureTarget<T> origin;
|
||||||
|
private final int verticalPrepareSize;
|
||||||
|
private final int horizontalPrepareSize;
|
||||||
|
private final boolean heightAgnostic;
|
||||||
|
private final FeatureTaskTiming timings;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FeatureTarget<T> compute() {
|
||||||
|
FeatureTarget<T> result;
|
||||||
|
PrecisionStopwatch p = null;
|
||||||
|
|
||||||
|
if(timings != null) {
|
||||||
|
p = PrecisionStopwatch.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!heightAgnostic && size.getHeight() > verticalPrepareSize * 2) {
|
||||||
|
result = FeatureTarget.mergedTarget(size.splitY()
|
||||||
|
.map(i -> engine.getExecutor().getForks().submit((ForkJoinTask<FeatureTarget<T>>) with(i)))
|
||||||
|
.map(ForkJoinTask::join), origin, false, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(size.getWidth() > horizontalPrepareSize * 2) {
|
||||||
|
result = FeatureTarget.mergedTarget(size.splitX().map(i -> engine.getExecutor().getForks().submit((ForkJoinTask<FeatureTarget<T>>) with(i)))
|
||||||
|
.map(ForkJoinTask::join), origin, true, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(size.getDepth() > horizontalPrepareSize * 2) {
|
||||||
|
result = FeatureTarget.mergedTarget(size.splitZ().map(i -> engine.getExecutor().getForks().submit((ForkJoinTask<FeatureTarget<T>>) with(i)))
|
||||||
|
.map(ForkJoinTask::join), origin, false, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
IrisPreparedFeature<T, S> preparedFeature = new IrisPreparedFeature<>(engine, feature, size, feature.prepare(engine, size, storage));
|
||||||
|
result = preparedFeature.generate(origin, storage);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(timings != null) {
|
||||||
|
timings.onCompleted(p.getMilliseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private FeatureTask<T, S> with(FeatureSizedTarget size)
|
||||||
|
{
|
||||||
|
return new FeatureTask<>(engine, feature, storage, size, origin, verticalPrepareSize, horizontalPrepareSize, heightAgnostic, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeatureTarget<T> call() throws Exception {
|
||||||
|
return compute();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface FeatureTaskTiming {
|
||||||
|
void onCompleted(double ms);
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
public class IrisPreparedFeature<T extends PlatformNamespaced, S extends FeatureState> {
|
||||||
|
private final Engine engine;
|
||||||
|
private final Feature<T, S> feature;
|
||||||
|
private final FeatureSizedTarget size;
|
||||||
|
private final S state;
|
||||||
|
|
||||||
|
public FeatureTarget<T> generate(FeatureTarget<T> origin, FeatureStorage storage) {
|
||||||
|
FeatureTarget<T> target = size.hunked(origin);
|
||||||
|
feature.generate(engine, state, target, storage);
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.volmit.iris.engine.feature;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureStorage;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import com.volmit.iris.engine.feature.features.FeatureTerrain;
|
||||||
|
import com.volmit.iris.engine.resolver.EngineResolvable;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
|
||||||
|
public interface SyntheticFeature<T extends PlatformNamespaced, V extends EngineResolvable, S extends FeatureState> {
|
||||||
|
void generate(Engine engine, V component, FeatureTarget<T> target, S state);
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.volmit.iris.engine.feature.features;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.Feature;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureSizedTarget;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureState;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureStorage;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
public class FeatureError extends Feature<PlatformBlock, FeatureError.State> {
|
||||||
|
private static final State DEFAULT_STATE = new State();
|
||||||
|
private final PlatformBlock ERROR_BLOCK;
|
||||||
|
|
||||||
|
public FeatureError(Engine engine) {
|
||||||
|
super("error", engine);
|
||||||
|
setOptimize(false);
|
||||||
|
ERROR_BLOCK = engine.block("red_sandstone");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public State prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) {
|
||||||
|
return DEFAULT_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generate(Engine engine, State state, FeatureTarget<PlatformBlock> target, FeatureStorage storage) {
|
||||||
|
target.forXZ((x, z) -> target.forYCap((y -> target.getHunk().set(x, y, z, ERROR_BLOCK)), 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class State implements FeatureState {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.volmit.iris.engine.feature.features;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.dimension.IrisBiome;
|
||||||
|
import com.volmit.iris.engine.feature.*;
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.util.NoiseCache;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
public class FeatureOriginBiome extends Feature<PlatformBiome, FeatureOriginBiome.State> {
|
||||||
|
public FeatureOriginBiome(Engine engine) {
|
||||||
|
super("biome-origin", engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public State prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) {
|
||||||
|
final NoiseCache<IrisBiome> noise = storage.getBiome();
|
||||||
|
|
||||||
|
for(int x : target.x()) {
|
||||||
|
for(int z : target.z()) {
|
||||||
|
noise.set(x & storage.getW() - 1, z & storage.getH() - 1, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new State(noise);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generate(Engine engine, State state, FeatureTarget<PlatformBiome> target, FeatureStorage storage) {
|
||||||
|
for(int x : target.x()) {
|
||||||
|
for(int z : target.z()) {
|
||||||
|
IrisBiome b = state.getBiomes().get(x, z);
|
||||||
|
target.getHunk().set(x, 0, z, b.toPlatformBiome());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class State implements FeatureState {
|
||||||
|
private final NoiseCache<IrisBiome> biomes;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package com.volmit.iris.engine.feature.features;
|
||||||
|
|
||||||
|
import art.arcane.source.NoisePlane;
|
||||||
|
import art.arcane.source.interpolator.CubicInterpolator;
|
||||||
|
import art.arcane.source.interpolator.Interpolator;
|
||||||
|
import art.arcane.source.interpolator.LinearInterpolator;
|
||||||
|
import art.arcane.source.interpolator.StarcastInterpolator;
|
||||||
|
import art.arcane.source.noise.provider.MirroredCacheProvider;
|
||||||
|
import art.arcane.source.util.NoisePreset;
|
||||||
|
import art.arcane.spatial.hunk.Hunk;
|
||||||
|
import art.arcane.spatial.hunk.storage.ArrayHunk;
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.*;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
public class FeatureTerrain extends Feature<PlatformBlock, FeatureTerrain.State> {
|
||||||
|
private final PlatformBlock stone;
|
||||||
|
private final NoisePlane generator;
|
||||||
|
private final NoisePlane generator2;
|
||||||
|
|
||||||
|
public FeatureTerrain(Engine engine) {
|
||||||
|
super("terrain", engine);
|
||||||
|
setOptimize(true);
|
||||||
|
stone = engine.block("stone");
|
||||||
|
this.generator = NoisePreset.NATURAL.create(1234);
|
||||||
|
this.generator2 = NoisePreset.NATURAL.create(6664).fit(0, 1).scale(0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public State prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) {
|
||||||
|
Hunk<Double> snc = new ArrayHunk<>(target.getWidth(), target.getHeight(), target.getDepth());
|
||||||
|
short n;
|
||||||
|
int fdx,fdz;
|
||||||
|
for(int x : target.x()) {
|
||||||
|
fdx = Math.floorMod(x, target.getWidth());
|
||||||
|
for(int z : target.z()) {
|
||||||
|
fdz = Math.floorMod(z, target.getDepth());
|
||||||
|
n = (short) generator.noise(x, z);
|
||||||
|
for(int y = 0; y < n; y++) {
|
||||||
|
if(generator2.noise(x,y,z) > 0.5) {
|
||||||
|
snc.set(fdx, y, fdz, 1D);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new State(snc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generate(Engine engine, State state, FeatureTarget<PlatformBlock> target, FeatureStorage storage) {
|
||||||
|
int y;
|
||||||
|
for(int x : target.localX()) {
|
||||||
|
for(int z : target.localZ()) {
|
||||||
|
for(int i = 0; i < target.getHeight(); i++) {
|
||||||
|
Double v = state.getNoise().get(x, i, z);
|
||||||
|
v = v == null ? 0f : v;
|
||||||
|
if(v >= 0.5) {
|
||||||
|
target.getHunk().set(x,i, z, stone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class State implements FeatureState {
|
||||||
|
private final Hunk<Double> noise;
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package com.volmit.iris.engine.feature.features.synthetic;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.dimension.IrisBiome;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureStorage;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import com.volmit.iris.engine.feature.SyntheticFeature;
|
||||||
|
import com.volmit.iris.engine.feature.features.FeatureTerrain;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
|
||||||
|
public class SyntheticBiomeTerrain implements SyntheticFeature<PlatformBlock, IrisBiome, FeatureTerrain.State>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void generate(Engine engine, IrisBiome component, FeatureTarget<PlatformBlock> target, FeatureTerrain.State state) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package com.volmit.iris.engine.network;
|
||||||
|
|
||||||
|
public class Network {
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.volmit.iris.engine.network.server;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class EngineServer extends Thread {
|
||||||
|
private final Engine engine;
|
||||||
|
private final ServerSocket server;
|
||||||
|
private final Map<UUID, EngineServerConnection> connections;
|
||||||
|
|
||||||
|
public EngineServer(Engine engine, int bindPort) throws IOException {
|
||||||
|
this.engine = engine;
|
||||||
|
this.connections = new HashMap<>();
|
||||||
|
this.server = new ServerSocket(bindPort);
|
||||||
|
this.server.setPerformancePreferences(0, 0, 1);
|
||||||
|
this.server.setSoTimeout(5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
while(!interrupted()) {
|
||||||
|
try {
|
||||||
|
Socket socket = server.accept();
|
||||||
|
EngineServerConnection connection = new EngineServerConnection(this, socket);
|
||||||
|
connections.put(connection.getConnectionId(), connection);
|
||||||
|
}
|
||||||
|
catch(SocketTimeoutException e) {
|
||||||
|
continue;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() throws IOException {
|
||||||
|
this.interrupt();
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
package com.volmit.iris.engine.network.server;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class EngineServerConnection extends Thread {
|
||||||
|
private final EngineServer server;
|
||||||
|
private final Socket socket;
|
||||||
|
private final UUID connectionId;
|
||||||
|
|
||||||
|
public EngineServerConnection(EngineServer server, Socket socket) {
|
||||||
|
this.server = server;
|
||||||
|
this.socket = socket;
|
||||||
|
this.connectionId = UUID.randomUUID();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.volmit.iris.engine.optimizer;
|
||||||
|
|
||||||
|
import art.arcane.amulet.range.IntegerRange;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class HunkSlizeConfiguration {
|
||||||
|
private final int verticalSlice;
|
||||||
|
private final int horizontalSlize;
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return "H" + horizontalSlize + "" + ((verticalSlice < 8192) ? ("V" + verticalSlice) : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<HunkSlizeConfiguration> generateConfigurations(IntegerRange vertical, IntegerRange horizontal)
|
||||||
|
{
|
||||||
|
List<HunkSlizeConfiguration> configurations = new ArrayList<>();
|
||||||
|
|
||||||
|
for(int i : slice(vertical))
|
||||||
|
{
|
||||||
|
for(int j : slice(horizontal))
|
||||||
|
{
|
||||||
|
configurations.add(new HunkSlizeConfiguration(i, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return configurations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<HunkSlizeConfiguration> generateConfigurations(int vertical, IntegerRange horizontal)
|
||||||
|
{
|
||||||
|
List<HunkSlizeConfiguration> configurations = new ArrayList<>();
|
||||||
|
|
||||||
|
for(int j : slice(horizontal))
|
||||||
|
{
|
||||||
|
configurations.add(new HunkSlizeConfiguration(vertical, j));
|
||||||
|
}
|
||||||
|
|
||||||
|
return configurations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Integer> slice(IntegerRange range)
|
||||||
|
{
|
||||||
|
List<Integer> v = new ArrayList<>();
|
||||||
|
v.add(range.getRightEndpoint());
|
||||||
|
v.add(range.getLeftEndpoint());
|
||||||
|
int i = (int) (range.getRightEndpoint() / 1.25);
|
||||||
|
|
||||||
|
while(i > range.getLeftEndpoint() && i >= 1)
|
||||||
|
{
|
||||||
|
v.add(i);
|
||||||
|
i /= 1.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
return v.withoutDuplicates();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.volmit.iris.engine.optimizer;
|
||||||
|
|
||||||
|
import art.arcane.chrono.Average;
|
||||||
|
import art.arcane.spatial.hunk.storage.AtomicDoubleHunk;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class IrisOptimizationAttempt<T> {
|
||||||
|
private double value;
|
||||||
|
private final AtomicInteger runs;
|
||||||
|
private final int testRuns;
|
||||||
|
private final T parameters;
|
||||||
|
|
||||||
|
public IrisOptimizationAttempt(T parameters, int testRuns)
|
||||||
|
{
|
||||||
|
this.parameters = parameters;
|
||||||
|
this.testRuns = testRuns;
|
||||||
|
this.value = 0;
|
||||||
|
this.runs = new AtomicInteger(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getAverageTime()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isComplete()
|
||||||
|
{
|
||||||
|
return runs.get() >= testRuns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void report(double ms) {
|
||||||
|
value += ms;
|
||||||
|
runs.incrementAndGet();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package com.volmit.iris.engine.optimizer;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import art.arcane.chrono.Average;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Singular;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class IrisOptimizer<T> {
|
||||||
|
private final String optimizedFeatureName;
|
||||||
|
private final int testRuns;
|
||||||
|
private int dummyRuns;
|
||||||
|
private final List<T> options;
|
||||||
|
private final Map<T, Double> results;
|
||||||
|
private final Map<T, IrisOptimizationAttempt<T>> attempts = new ConcurrentHashMap<>();
|
||||||
|
private T defaultOption;
|
||||||
|
private final double chanceToTest;
|
||||||
|
private double bestTime;
|
||||||
|
|
||||||
|
public IrisOptimizer(int testRuns, List<T> options, T defaultOption, double chanceToTest, String optimizedFeatureName) {
|
||||||
|
this.bestTime = Double.MAX_VALUE;
|
||||||
|
this.dummyRuns = 1024;
|
||||||
|
this.testRuns = testRuns;
|
||||||
|
this.results = new HashMap<>();
|
||||||
|
this.options = options;
|
||||||
|
this.optimizedFeatureName = optimizedFeatureName;
|
||||||
|
this.defaultOption = defaultOption;
|
||||||
|
this.chanceToTest = chanceToTest;
|
||||||
|
|
||||||
|
for(T i : options) {
|
||||||
|
attempts.put(i, new IrisOptimizationAttempt<>(i, testRuns));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "optimizer";
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void report(T parameters, double ms)
|
||||||
|
{
|
||||||
|
if(dummyRuns-- > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IrisOptimizationAttempt<T> attempt = attempts.get(parameters);
|
||||||
|
|
||||||
|
if(attempt != null) {
|
||||||
|
attempt.report(ms);
|
||||||
|
|
||||||
|
if(attempt.isComplete()) {
|
||||||
|
results.put(parameters, attempt.getAverageTime());
|
||||||
|
attempts.remove(parameters);
|
||||||
|
double result = attempt.getAverageTime();
|
||||||
|
|
||||||
|
if(result < bestTime) {
|
||||||
|
bestTime = result;
|
||||||
|
defaultOption = attempt.getParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
d("Attempted " + optimizedFeatureName + " with " + defaultOption.toString() + " " + Form.duration(attempt.getAverageTime(), 2));
|
||||||
|
|
||||||
|
if(attempts.isEmpty()) {
|
||||||
|
d("Fully Optimized " + optimizedFeatureName + " with " + defaultOption.toString());
|
||||||
|
|
||||||
|
for(T i : results.keySet()) {
|
||||||
|
d(i.toString() + ": " + Form.duration(results.get(i), 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T nextParameters() {
|
||||||
|
if(!attempts.isEmpty() && Math.r(chanceToTest)) {
|
||||||
|
return attempts.k().popRandom();
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultOption;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.volmit.iris.engine.pipeline;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureSizedTarget;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureStorage;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Singular;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class EnginePipeline
|
||||||
|
{
|
||||||
|
@Singular
|
||||||
|
private final List<PipelinePhase> phases;
|
||||||
|
|
||||||
|
public void generate(Engine engine, FeatureSizedTarget target, PipedHunkStack stack) {
|
||||||
|
FeatureStorage storage = new FeatureStorage(engine.getConfiguration().getChunkSize(), engine.getConfiguration().getChunkSize());
|
||||||
|
|
||||||
|
for(PipelinePhase i : phases) {
|
||||||
|
i.generate(engine, target, stack, storage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.volmit.iris.engine.pipeline;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureSizedTarget;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Singular;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class EnginePlumbing {
|
||||||
|
private final Engine engine;
|
||||||
|
@Singular
|
||||||
|
private final List<EnginePipeline> pipelines;
|
||||||
|
private final EnginePipeline errorPipeline;
|
||||||
|
|
||||||
|
public void generate(Engine engine, FeatureSizedTarget target, PipedHunkStack stack) {
|
||||||
|
for(EnginePipeline i : pipelines) {
|
||||||
|
i.generate(engine, target, stack);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
getErrorPipeline().generate(engine, target, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.volmit.iris.engine.pipeline;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class PipedHunkStack {
|
||||||
|
private final Map<Class<? extends PlatformNamespaced>, FeatureTarget<? extends PlatformNamespaced>> hunks;
|
||||||
|
|
||||||
|
public PipedHunkStack()
|
||||||
|
{
|
||||||
|
this.hunks = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void register(Class<? extends PlatformNamespaced> clazz, FeatureTarget<? extends PlatformNamespaced> hunk)
|
||||||
|
{
|
||||||
|
hunks.put(clazz, hunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T extends PlatformNamespaced> FeatureTarget<T> hunk(Class<?> hunk)
|
||||||
|
{
|
||||||
|
return (FeatureTarget<T>) hunks.get(hunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.volmit.iris.engine.pipeline;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.Engine;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureSizedTarget;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureStorage;
|
||||||
|
import com.volmit.iris.engine.feature.FeatureTarget;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Singular;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class PipelinePhase
|
||||||
|
{
|
||||||
|
@Singular
|
||||||
|
private final List<PipelineTask<?>> tasks;
|
||||||
|
|
||||||
|
public List<FeatureTarget<?>> generate(Engine engine, FeatureSizedTarget target, PipedHunkStack stack, FeatureStorage storage) {
|
||||||
|
return engine.getExecutor().getForks().invokeAll(tasks.stream().map(i -> i.task(target, stack.hunk(i.getTarget()), storage))
|
||||||
|
.collect(Collectors.toList())).stream().map(i -> {
|
||||||
|
try {
|
||||||
|
return i.get();
|
||||||
|
} catch(Throwable e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.volmit.iris.engine.pipeline;
|
||||||
|
|
||||||
|
import art.arcane.amulet.range.IntegerRange;
|
||||||
|
import com.volmit.iris.engine.feature.*;
|
||||||
|
import com.volmit.iris.engine.optimizer.HunkSlizeConfiguration;
|
||||||
|
import com.volmit.iris.engine.optimizer.IrisOptimizer;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static art.arcane.amulet.MagicalSugar.*;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class PipelineTask<T extends PlatformNamespaced>
|
||||||
|
{
|
||||||
|
private final Feature<T, ?> feature;
|
||||||
|
private final Class<T> target;
|
||||||
|
private final IntegerRange verticalEnvelope;
|
||||||
|
private final IntegerRange horizontalEnvelope;
|
||||||
|
private final IrisOptimizer<HunkSlizeConfiguration> optimizer;
|
||||||
|
|
||||||
|
public PipelineTask(Feature<T, ?> feature, Class<T> target, IntegerRange verticalEnvelope, IntegerRange horizontalEnvelope)
|
||||||
|
{
|
||||||
|
this.feature = feature;
|
||||||
|
this.target = target;
|
||||||
|
this.verticalEnvelope = verticalEnvelope;
|
||||||
|
this.horizontalEnvelope = horizontalEnvelope;
|
||||||
|
List<HunkSlizeConfiguration> configurations = feature.isHeightAgnostic() ? HunkSlizeConfiguration.generateConfigurations(Integer.MAX_VALUE, horizontalEnvelope)
|
||||||
|
: HunkSlizeConfiguration.generateConfigurations(verticalEnvelope, horizontalEnvelope);
|
||||||
|
this.optimizer = new IrisOptimizer<>(128, configurations, configurations[0], 1, feature.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public PipelineTask(Feature<T, ?> feature, Class<T> target) {
|
||||||
|
this(feature, target, 1 to 16, 1 to 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FeatureTask<T, ?> task(FeatureSizedTarget target, FeatureTarget<T> origin, FeatureStorage storage){
|
||||||
|
HunkSlizeConfiguration configuration = getFeature().isOptimize() ? optimizer.nextParameters() : optimizer.getDefaultOption();
|
||||||
|
return feature.task(target, origin, storage, configuration.getVerticalSlice(), configuration.getHorizontalSlize(), (ms) -> optimizer.report(configuration, ms));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class CompositeResolver<T extends Resolvable> implements Resolver<T> {
|
||||||
|
private final Map<String, Resolver<T>> resolvers;
|
||||||
|
private final String[] namespaces;
|
||||||
|
|
||||||
|
public CompositeResolver(Map<String, Resolver<T>> resolvers)
|
||||||
|
{
|
||||||
|
this.resolvers = resolvers;
|
||||||
|
this.namespaces = resolvers.keySet().toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNamespace(String namespace) {
|
||||||
|
return resolvers.containsKey(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(PlatformNamespaceKey key) {
|
||||||
|
return resolvers.get(key.getNamespace()).resolve(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(String key) {
|
||||||
|
for(String i : getNamespaces()) {
|
||||||
|
if(resolvers.get(i).contains(i, key)) {
|
||||||
|
return resolvers.get(i).resolve(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resolver<T> and(String namespace, Resolver<T> resolver) {
|
||||||
|
Map<String, Resolver<T>> resolvers = this.resolvers.copy();
|
||||||
|
|
||||||
|
if(hasNamespace(namespace)) {
|
||||||
|
resolvers.put(namespace, resolvers.get(namespace).and(namespace, resolver));
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
resolvers.put(namespace, resolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompositeResolver<>(resolvers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print(String type, Object printer, int indent) {
|
||||||
|
printer.i(Form.repeat(" ", indent) + "Composite[" + Arrays.toString(getNamespaces()) + "] " + type);
|
||||||
|
|
||||||
|
for(Resolver<T> i : getResolvers().values()) {
|
||||||
|
i.print(type, printer, indent + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addAllKeys(List<PlatformNamespaceKey> keys) {
|
||||||
|
resolvers.forEach((k, v) -> v.addAllKeys(keys));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class EngineResolvable implements Resolvable {
|
||||||
|
private PlatformNamespaceKey key;
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.util.NSK;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FrozenResolver<T extends Resolvable> implements Resolver<T> {
|
||||||
|
private final Map<String, T> registry;
|
||||||
|
private final String namespace;
|
||||||
|
|
||||||
|
public FrozenResolver(String namespace, Map<String, T> registry)
|
||||||
|
{
|
||||||
|
this.registry = Collections.unmodifiableMap(registry);
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNamespace(String namespace) {
|
||||||
|
return this.namespace.equals(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T resolve(PlatformNamespaceKey key) {
|
||||||
|
return registry.get(key.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(String key) {
|
||||||
|
return registry.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print(String type, Object printer, int indent) {
|
||||||
|
printer.i(Form.repeat(" ", indent) + "Frozen[" + namespace + "] " + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addAllKeys(List<PlatformNamespaceKey> keys) {
|
||||||
|
registry.keySet().forEach((k) -> keys.add(new NSK(getNamespace(), k)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resolver<T> and(String namespace, Resolver<T> resolver) {
|
||||||
|
if(!namespace.equals(getNamespace())) {
|
||||||
|
return new CompositeResolver<>(Map.of(namespace, resolver, getNamespace(), this));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MergedNamespaceResolver<>(namespace, this, resolver);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import com.github.benmanes.caffeine.cache.CacheLoader;
|
||||||
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import com.volmit.iris.util.NSK;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class HotResolver<T extends Resolvable> implements Resolver<T>, CacheLoader<String, T> {
|
||||||
|
private final LoadingCache<String, T> cache;
|
||||||
|
private final String namespace;
|
||||||
|
private final Function<String, T> loader;
|
||||||
|
private final Supplier<List<String>> keyGetter;
|
||||||
|
|
||||||
|
public HotResolver(String namespace, Function<String, T> loader, Supplier<List<String>> keyGetter)
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
this.keyGetter = keyGetter;
|
||||||
|
this.loader = loader;
|
||||||
|
cache = Caffeine.newBuilder().build(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T resolve(PlatformNamespaceKey key) {
|
||||||
|
return cache.get(key.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(String key) {
|
||||||
|
return cache.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNamespace(String namespace) {
|
||||||
|
return this.namespace.equals(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FrozenResolver<T> freeze()
|
||||||
|
{
|
||||||
|
cache.cleanUp();
|
||||||
|
Map<String, T> map = new HashMap<>((int) cache.estimatedSize());
|
||||||
|
Map<String, T> view = cache.asMap();
|
||||||
|
|
||||||
|
for(String i : view.keySet()) {
|
||||||
|
map.put(i, view.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new FrozenResolver<>(getNamespace(), Collections.unmodifiableMap(map));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable T load(String key) {
|
||||||
|
return loader.apply(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resolver<T> and(String namespace, Resolver<T> resolver) {
|
||||||
|
if(!namespace.equals(getNamespace())) {
|
||||||
|
return new CompositeResolver<>(Map.of(namespace, resolver, getNamespace(), this));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MergedNamespaceResolver<>(namespace, this, resolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print(String type, Object printer, int indent) {
|
||||||
|
printer.i(Form.repeat(" ", indent) + "Hot[" + namespace + "] " + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addAllKeys(List<PlatformNamespaceKey> keys) {
|
||||||
|
keys.addAll(keyGetter.get().stream().map(i -> new NSK(getNamespace(), i)).toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class MergedNamespaceResolver<T extends Resolvable> implements Resolver<T> {
|
||||||
|
private final String namespace;
|
||||||
|
private final List<Resolver<T>> resolvers;
|
||||||
|
|
||||||
|
public MergedNamespaceResolver(String namespace, Resolver<T>... resolvers)
|
||||||
|
{
|
||||||
|
this(namespace, Arrays.stream(resolvers).toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public MergedNamespaceResolver(String namespace, List<Resolver<T>> resolvers)
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
this.resolvers = resolvers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNamespace(String namespace) {
|
||||||
|
return this.namespace.equals(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(PlatformNamespaceKey key) {
|
||||||
|
for(Resolver<T> i : resolvers) {
|
||||||
|
T t = i.resolve(key);
|
||||||
|
|
||||||
|
if(t != null)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T resolve(String key) {
|
||||||
|
for(Resolver<T> i : resolvers) {
|
||||||
|
T t = i.resolve(key);
|
||||||
|
|
||||||
|
if(t != null)
|
||||||
|
{
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print(String type, Object printer, int indent) {
|
||||||
|
printer.i(Form.repeat(" ", indent) + "Merged[" + namespace + "] " + type);
|
||||||
|
|
||||||
|
for(Resolver<T> i : getResolvers()) {
|
||||||
|
i.print(type, printer, indent + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addAllKeys(List<PlatformNamespaceKey> keys) {
|
||||||
|
resolvers.forEach(i -> i.addAllKeys(keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resolver<T> and(String namespace, Resolver<T> resolver) {
|
||||||
|
if(namespace.equals(getNamespace()))
|
||||||
|
{
|
||||||
|
List<Resolver<T>> r = resolvers.copy();
|
||||||
|
r.add(resolver);
|
||||||
|
return new MergedNamespaceResolver<>(namespace, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompositeResolver<>(Map.of(getNamespace(), this, namespace, resolver));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import art.arcane.cram.PakResource;
|
||||||
|
import com.google.gson.*;
|
||||||
|
import com.google.gson.stream.JsonToken;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import com.volmit.iris.engine.EngineData;
|
||||||
|
import com.volmit.iris.platform.PlatformBiome;
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespacedMutable;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface Resolvable extends PlatformNamespaced, PlatformNamespacedMutable, PakResource {
|
||||||
|
String SCHEMA = "http://json-schema.org/draft-07/schema#";
|
||||||
|
|
||||||
|
default String getSchemaId() {
|
||||||
|
return "https://art.arcane/iris/schemas/"+entity().getId()+".json";
|
||||||
|
}
|
||||||
|
|
||||||
|
default String getSchemaRefId() {
|
||||||
|
return entity().getId()+".json";
|
||||||
|
}
|
||||||
|
|
||||||
|
default JsonObject generateSchema(EngineData data) {
|
||||||
|
JsonObject object = new JsonObject();
|
||||||
|
Entity.ResolverEntityData entity = entity();
|
||||||
|
object.add("$schema", new JsonPrimitive(SCHEMA));
|
||||||
|
object.add("$id", new JsonPrimitive(getSchemaId()));
|
||||||
|
object.add("type", new JsonPrimitive("object"));
|
||||||
|
object.add("description", new JsonPrimitive("No Description for " + entity.getName()));
|
||||||
|
|
||||||
|
JsonObject properties = new JsonObject();
|
||||||
|
JsonObject definitions = new JsonObject();
|
||||||
|
|
||||||
|
for(Field i : getClass().getDeclaredFields()) {
|
||||||
|
i.access();
|
||||||
|
|
||||||
|
if (Modifier.isStatic(i.getModifiers()) || Modifier.isTransient(i.getModifiers())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
properties.add(i.getName(), generateSchemaProperty(data, i.getName(), i.getType(), i.getDeclaredAnnotation(Type.class), i.getDeclaredAnnotation(PlatformType.class), definitions));
|
||||||
|
}
|
||||||
|
|
||||||
|
object.add("properties", properties);
|
||||||
|
object.add("definitions", definitions);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
default String getSchemaDefinition(String name) {
|
||||||
|
return "D" + name.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
default JsonObject generateSchemaProperty(EngineData data, String name, Class<?> type, Type listType, PlatformType platformType, JsonObject definitions) {
|
||||||
|
JsonObject main = new JsonObject();
|
||||||
|
JsonArray anyOf = new JsonArray();
|
||||||
|
JsonObject object = new JsonObject();
|
||||||
|
anyOf.add(object);
|
||||||
|
object.add("description", new JsonPrimitive("No Description for field " + name));
|
||||||
|
|
||||||
|
if(type.isAssignableFrom(Resolvable.class) || Resolvable.class.isAssignableFrom(type)) {
|
||||||
|
Resolvable r = data.getInstance(type);
|
||||||
|
|
||||||
|
if(r != null) {
|
||||||
|
String def = getSchemaDefinition(r.getClass().simpleName());
|
||||||
|
object.add("$ref", new JsonPrimitive(r.getSchemaRefId()));
|
||||||
|
JsonObject registry = new JsonObject();
|
||||||
|
registry.add("description", new JsonPrimitive("No Description for field " + name));
|
||||||
|
String defName = getSchemaDefinition("resolve" + type.getCanonicalName());
|
||||||
|
registry.add("type", new JsonPrimitive("string"));
|
||||||
|
registry.add("$ref", new JsonPrimitive("#/definitions/" + defName));
|
||||||
|
|
||||||
|
if(!definitions.has(defName)) {
|
||||||
|
JsonObject enumDef = new JsonObject();
|
||||||
|
JsonArray enums = new JsonArray();
|
||||||
|
data.getAllKeys(type).forEach(i -> enums.add(i.toString()));
|
||||||
|
enumDef.add("enum", enums);
|
||||||
|
definitions.add(defName, enumDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
anyOf.add(registry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.isAssignableFrom(List.class) || List.class.isAssignableFrom(type)) {
|
||||||
|
if(listType != null) {
|
||||||
|
JsonObject internal = generateSchemaProperty(data, "list", listType.value(), null, platformType, definitions);
|
||||||
|
object.add("items", internal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.isEnum()) {
|
||||||
|
String defName = getSchemaDefinition(type.getCanonicalName());
|
||||||
|
object.add("type", new JsonPrimitive("string"));
|
||||||
|
object.add("$ref", new JsonPrimitive("#/definitions/" + defName));
|
||||||
|
|
||||||
|
if(!definitions.has(defName)) {
|
||||||
|
try {
|
||||||
|
JsonObject enumDef = new JsonObject();
|
||||||
|
JsonArray enums = new JsonArray();
|
||||||
|
Arrays.stream((Enum<?>[])type.getDeclaredMethod("values").invoke(null)).forEach(i -> enums.add(i.name()));
|
||||||
|
enumDef.add("enum", enums);
|
||||||
|
definitions.add(defName, enumDef);
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.equals(String.class)) {
|
||||||
|
object.add("type", new JsonPrimitive("string"));
|
||||||
|
|
||||||
|
if(platformType != null) {
|
||||||
|
String defName = getSchemaDefinition(platformType.value().getCanonicalName());
|
||||||
|
object.add("$ref", new JsonPrimitive("#/definitions/" + defName));
|
||||||
|
|
||||||
|
if(!definitions.has(defName)) {
|
||||||
|
JsonObject enumDef = new JsonObject();
|
||||||
|
JsonArray enums = buildSchemaPlatformEnum(data, platformType.value());
|
||||||
|
enumDef.add("enum", enums);
|
||||||
|
definitions.add(defName, enumDef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.equals(int.class) || type.equals(Integer.class)
|
||||||
|
|| type.equals(long.class) || type.equals(Long.class)
|
||||||
|
|| type.equals(byte.class) || type.equals(Byte.class)
|
||||||
|
|| type.equals(short.class) || type.equals(Short.class))
|
||||||
|
{
|
||||||
|
object.add("type", new JsonPrimitive("integer"));
|
||||||
|
|
||||||
|
if(type.equals(int.class) || type.equals(Integer.class)) {
|
||||||
|
object.add("minimum", new JsonPrimitive(Integer.MIN_VALUE));
|
||||||
|
object.add("maximum", new JsonPrimitive(Integer.MAX_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.equals(long.class) || type.equals(Long.class)) {
|
||||||
|
object.add("minimum", new JsonPrimitive(Long.MIN_VALUE));
|
||||||
|
object.add("maximum", new JsonPrimitive(Long.MAX_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(type.equals(short.class) || type.equals(Short.class)) {
|
||||||
|
object.add("minimum", new JsonPrimitive(Short.MIN_VALUE));
|
||||||
|
object.add("maximum", new JsonPrimitive(Short.MAX_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
object.add("minimum", new JsonPrimitive(Byte.MIN_VALUE));
|
||||||
|
object.add("maximum", new JsonPrimitive(Byte.MAX_VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(anyOf.size() == 1)
|
||||||
|
{
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
main.add("anyOf", anyOf);
|
||||||
|
return main;
|
||||||
|
}
|
||||||
|
|
||||||
|
default JsonArray buildSchemaPlatformEnum(EngineData data, Class<? extends PlatformNamespaced> value) {
|
||||||
|
JsonArray a = new JsonArray();
|
||||||
|
|
||||||
|
if(value.equals(PlatformBlock.class)) {
|
||||||
|
data.getEngine().getPlatform().getBlocks().map(i -> i.getKey().toString()).forEach(a::add);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(value.equals(PlatformBiome.class)) {
|
||||||
|
data.getEngine().getPlatform().getBiomes().map(i -> i.getKey().toString()).forEach(a::add);
|
||||||
|
}
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void apply(GsonBuilder builder) {
|
||||||
|
if(this instanceof TypeAdapterFactory f) {
|
||||||
|
builder.registerTypeAdapterFactory(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default Entity.ResolverEntityData entity() {
|
||||||
|
return new Entity.ResolverEntityData(getClass().getDeclaredAnnotation(Resolvable.Entity.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
default <T> void writeSafeJson(TypeAdapter<T> delegate, JsonWriter out, T value) {
|
||||||
|
try {
|
||||||
|
delegate.write(out, value);
|
||||||
|
} catch (IOException e) {
|
||||||
|
try {
|
||||||
|
delegate.write(out, null);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@interface Entity {
|
||||||
|
String id();
|
||||||
|
String name() default "";
|
||||||
|
String namePlural() default "";
|
||||||
|
JsonToken[] jsonTypes() default JsonToken.BEGIN_OBJECT;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@lombok.Data
|
||||||
|
class ResolverEntityData
|
||||||
|
{
|
||||||
|
private final Entity annotation;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return annotation.id();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return annotation.name().isEmpty() ? Form.capitalizeWords(getId().replaceAll("\\Q-\\E", " ")) : annotation.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamePlural() {
|
||||||
|
return annotation.namePlural().isEmpty() ? getName() + "s" : annotation.namePlural();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@interface TokenConstructor {
|
||||||
|
JsonToken[] value();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@interface Type {
|
||||||
|
Class<?> value();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@interface PlatformType {
|
||||||
|
Class<? extends PlatformNamespaced> value();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
package com.volmit.iris.engine.resolver;
|
||||||
|
|
||||||
|
import art.arcane.cram.PakKey;
|
||||||
|
import art.arcane.cram.PakResource;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public interface Resolver<T extends Resolvable> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
static <F extends Resolvable> CompositeResolver<F> frozen(Map<PakKey, PakResource> resources, Predicate<PakResource> isTypePredicate) {
|
||||||
|
Map<String, Map<String, F>> resolvables = new HashMap<>();
|
||||||
|
Map<String, Resolver<F>> resolvers = new HashMap<>();
|
||||||
|
|
||||||
|
for(PakKey i : resources.keySet()) {
|
||||||
|
PakResource r = resources.get(i);
|
||||||
|
|
||||||
|
if(isTypePredicate.test(r)) {
|
||||||
|
Map<String, F> rs = resolvables.computeIfAbsent(i.getNamespace(), (k) -> new HashMap<>());
|
||||||
|
rs.put(i.getKey(), (F) i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String i : resolvables.keySet()) {
|
||||||
|
resolvers.put(i, frozen(i, resolvables.get(i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompositeResolver<>(resolvers);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <F extends Resolvable> Resolver<F> frozen(String namespace, Map<String, F> map) {
|
||||||
|
return new FrozenResolver<>(namespace, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <F extends Resolvable> Resolver<F> hot(String namespace, Function<String, F> loader, Supplier<List<String>> keyGetter) {
|
||||||
|
return new HotResolver<>(namespace, loader, keyGetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static <F extends Resolvable> Resolver<F> hotDirectoryJson(String namespace, Class<?> resolvableClass, File folder, Gson gson) {
|
||||||
|
return hotDirectory(namespace, (in) -> (F) gson.fromJson(new InputStreamReader(in), resolvableClass), folder, "json");
|
||||||
|
}
|
||||||
|
|
||||||
|
static <F extends Resolvable> Resolver<F> hotDirectory(String namespace, Function<InputStream, F> loader, File folder, String... extensions) {
|
||||||
|
return new HotResolver<>(namespace, (key) -> {
|
||||||
|
for(String i : extensions)
|
||||||
|
{
|
||||||
|
File f = new File(folder, key + "." + i);
|
||||||
|
if(f.exists())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
FileInputStream in = new FileInputStream(f);
|
||||||
|
F ff = loader.apply(in);
|
||||||
|
in.close();
|
||||||
|
return ff;
|
||||||
|
} catch(IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}, () -> {
|
||||||
|
List<String> s = new ArrayList<>();
|
||||||
|
|
||||||
|
for(File i : folder.listFiles())
|
||||||
|
{
|
||||||
|
if(i.isFile()) {
|
||||||
|
for(String j : extensions)
|
||||||
|
{
|
||||||
|
if(i.getName().endsWith(j))
|
||||||
|
{
|
||||||
|
s.add(i.getName().split("\\Q.\\E")[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean hasNamespace(String namespace);
|
||||||
|
|
||||||
|
T resolve(PlatformNamespaceKey key);
|
||||||
|
|
||||||
|
T resolve(String key);
|
||||||
|
|
||||||
|
default boolean contains(String namespace, String key) {
|
||||||
|
return hasNamespace(namespace) && resolve(key) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
default boolean contains(PlatformNamespaceKey key){
|
||||||
|
return hasNamespace(key.getNamespace()) && resolve(key) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Resolver<T> and(String namespace, Resolver<T> resolver);
|
||||||
|
|
||||||
|
default void print(String type, Object printer)
|
||||||
|
{
|
||||||
|
print(type, printer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print(String type, Object printer, int index);
|
||||||
|
|
||||||
|
void addAllKeys(List<PlatformNamespaceKey> keys);
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public interface IrisPlatform {
|
||||||
|
void logError(String k, Object o);
|
||||||
|
|
||||||
|
void logInfo(String k, Object o);
|
||||||
|
|
||||||
|
void logWarning(String k, Object o);
|
||||||
|
|
||||||
|
void logDebug(String k, Object o);
|
||||||
|
|
||||||
|
String getPlatformName();
|
||||||
|
|
||||||
|
Stream<PlatformBlock> getBlocks();
|
||||||
|
|
||||||
|
Stream<PlatformBiome> getBiomes();
|
||||||
|
|
||||||
|
boolean isWorldLoaded(String name);
|
||||||
|
|
||||||
|
PlatformWorld getWorld(String name);
|
||||||
|
|
||||||
|
PlatformBlock parseBlock(String raw);
|
||||||
|
|
||||||
|
PlatformNamespaceKey key(String namespace, String key);
|
||||||
|
|
||||||
|
default PlatformNamespaceKey key(String nsk)
|
||||||
|
{
|
||||||
|
return key("minecraft", nsk);
|
||||||
|
}
|
||||||
|
|
||||||
|
File getStudioFolder();
|
||||||
|
|
||||||
|
File getStudioFolder(String dimension);
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
public interface PlatformBiome extends PlatformNamespaced {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
public interface PlatformChunk {
|
||||||
|
int getX();
|
||||||
|
|
||||||
|
int getZ();
|
||||||
|
|
||||||
|
void unload(boolean save, boolean force);
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
import art.arcane.cram.PakKey;
|
||||||
|
import com.volmit.iris.util.NSK;
|
||||||
|
|
||||||
|
public interface PlatformNamespaceKey {
|
||||||
|
String getNamespace();
|
||||||
|
|
||||||
|
String getKey();
|
||||||
|
|
||||||
|
String toString();
|
||||||
|
|
||||||
|
static PlatformNamespaceKey of(PakKey key) {
|
||||||
|
return new NSK(key.getNamespace(), key.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
public interface PlatformNamespaced {
|
||||||
|
PlatformNamespaceKey getKey();
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
public interface PlatformNamespacedMutable {
|
||||||
|
void setKey(PlatformNamespaceKey key);
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
import art.arcane.amulet.geometry.Vec;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public interface PlatformPlayer {
|
||||||
|
UUID getUUID();
|
||||||
|
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
Vec getLocation();
|
||||||
|
|
||||||
|
PlatformWorld getWorld();
|
||||||
|
|
||||||
|
boolean canUseIris();
|
||||||
|
|
||||||
|
void sendMessage(String message);
|
||||||
|
|
||||||
|
void sendActionBar(String message);
|
||||||
|
|
||||||
|
void sendTitleMessage(String title, String subtitle, int in, int stay, int out);
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
import art.arcane.amulet.format.Form;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class PlatformRegistry<T extends PlatformNamespaced> {
|
||||||
|
private final Map<PlatformNamespaceKey, T> registry;
|
||||||
|
private final String name;
|
||||||
|
private final String namePlural;
|
||||||
|
|
||||||
|
public PlatformRegistry(String name, String namePlural, Stream<T> stream) {
|
||||||
|
this.name = name;
|
||||||
|
this.namePlural = namePlural;
|
||||||
|
registry = Collections.unmodifiableMap(stream.collect(Collectors.toMap(PlatformNamespaced::getKey, (t) -> t)));
|
||||||
|
i("Registered " + Form.f(registry.size()) + " " + namePlural);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlatformRegistry(String name, Stream<T> stream) {
|
||||||
|
this(name, name + "s", stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public T get(PlatformNamespaceKey key) {
|
||||||
|
return registry.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<PlatformNamespaceKey> getKeys() {
|
||||||
|
return Collections.unmodifiableSet(registry.keySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
package com.volmit.iris.platform;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.block.PlatformBlock;
|
||||||
|
import com.volmit.iris.util.WorldHeight;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public interface PlatformWorld {
|
||||||
|
WorldHeight getHeight();
|
||||||
|
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
File getFolder();
|
||||||
|
|
||||||
|
Iterable<PlatformPlayer> getPlayers();
|
||||||
|
|
||||||
|
Iterable<PlatformChunk> getLoadedChunks();
|
||||||
|
|
||||||
|
PlatformChunk getOrLoadChunk(int x, int z);
|
||||||
|
|
||||||
|
PlatformBlock getBlock(int x, int y, int z);
|
||||||
|
|
||||||
|
PlatformBiome getBiome(int x, int y, int z);
|
||||||
|
|
||||||
|
long getSeed();
|
||||||
|
|
||||||
|
boolean isChunkLoaded(int x, int z);
|
||||||
|
|
||||||
|
void setBlock(int x, int y, int z, PlatformBlock block);
|
||||||
|
|
||||||
|
void setBiome(int x, int y, int z, PlatformBiome biome);
|
||||||
|
|
||||||
|
default File getWorldFolder(String subfolder) {
|
||||||
|
return new File(getFolder(), subfolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
default File getRegionFolder() {
|
||||||
|
return getWorldFolder("region");
|
||||||
|
}
|
||||||
|
|
||||||
|
default File getIrisFolder() {
|
||||||
|
return getWorldFolder("iris");
|
||||||
|
}
|
||||||
|
|
||||||
|
default File getIrisDataFolder() {
|
||||||
|
File f = new File(getWorldFolder("iris"), "data");
|
||||||
|
f.mkdirs();
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
default boolean isRegionLoaded(int x, int z) {
|
||||||
|
for(PlatformChunk i : getLoadedChunks()) {
|
||||||
|
if(i.getX() >> 5 == x && i.getZ() >> 5 == z) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void unloadChunks(boolean save, boolean force) {
|
||||||
|
for(PlatformChunk i : getLoadedChunks()) {
|
||||||
|
i.unload(save, force);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.volmit.iris.platform.block;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaced;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface PlatformBlock extends PlatformNamespaced {
|
||||||
|
Map<String, String> getProperties();
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
public class FloatNoiseCache {
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
private final float[] cache;
|
||||||
|
|
||||||
|
public FloatNoiseCache(int width, int height)
|
||||||
|
{
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
cache = new float[width * height];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int x, int y, float v) {
|
||||||
|
this.cache[y % this.height * this.width + x % this.width] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float get(int x, int y) {
|
||||||
|
return this.cache[y % this.height * this.width + x % this.width];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
import art.arcane.source.NoisePlane;
|
||||||
|
import art.arcane.spatial.hunk.Hunk;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class HunkedNoisePlane implements NoisePlane {
|
||||||
|
private final Hunk<Double> noise;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double noise(double x, double y, double z) {
|
||||||
|
Double d = noise.get(Math.floorMod((int)x, noise.getWidth()), Math.floorMod((int)y, noise.getHeight()), Math.floorMod((int)z, noise.getDepth()));
|
||||||
|
|
||||||
|
return d != null ? d : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
import com.volmit.iris.platform.PlatformNamespaceKey;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class NSK implements PlatformNamespaceKey {
|
||||||
|
private final String namespace;
|
||||||
|
private final String key;
|
||||||
|
|
||||||
|
public NSK(String namespacedkey)
|
||||||
|
{
|
||||||
|
this(namespacedkey.contains(":") ? namespacedkey.split("\\Q:\\E")[0] : "minecraft",
|
||||||
|
namespacedkey.contains(":") ? namespacedkey.split("\\Q:\\E")[1] : namespacedkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNamespace() {
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return namespace + ":" + key;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
public class NoiseCache<T> {
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
private final Object[] cache;
|
||||||
|
|
||||||
|
public NoiseCache(int width, int height)
|
||||||
|
{
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
cache = new Object[width * height];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int x, int y, T v) {
|
||||||
|
this.cache[y % this.height * this.width + x % this.width] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T get(int x, int y) {
|
||||||
|
return (T) this.cache[y % this.height * this.width + x % this.width];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
public class ShortNoiseCache {
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
private final short[] cache;
|
||||||
|
|
||||||
|
public ShortNoiseCache(int width, int height)
|
||||||
|
{
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
cache = new short[width * height];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int x, int y, short v) {
|
||||||
|
this.cache[(Math.floorMod(y,this.height) * this.width) + Math.floorMod(x, this.width)] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short get(int x, int y) {
|
||||||
|
return this.cache[(Math.floorMod(y,this.height) * this.width) + Math.floorMod(x,this.width)];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class WorldHeight {
|
||||||
|
private final int minHeight;
|
||||||
|
private final int maxHeight;
|
||||||
|
|
||||||
|
public WorldHeight(int maxHeight) {
|
||||||
|
this(0, maxHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalHeight() {
|
||||||
|
return maxHeight - minHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
@echo off
|
|
||||||
cd gource
|
|
||||||
gource -f -a 1 -s 0.01 -t 100000 --colour-images --max-file-lag 35 --title MyGuide --user-scale 1.67 --max-user-speed 725 --filename-time 2 -title Chimera --user-friction 2.5 --padding 1.2 --user-scale 1.25 --filename-time 2 --bloom-intensity 0.1 --bloom-multiplier 3 --hide filenames,dirnames
|
|
||||||
@@ -1,674 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
||||||
@@ -1,298 +0,0 @@
|
|||||||
0.51:
|
|
||||||
* Fixed --font-file relative path handling.
|
|
||||||
* Fixed a bug in resolving the repository root directory from a relative path.
|
|
||||||
|
|
||||||
0.50:
|
|
||||||
* Right mouse button rotation now pivots around the camera.
|
|
||||||
* Added --font-file option.
|
|
||||||
* Added --enable-font-file option to configure.
|
|
||||||
* Added --no-time-travel option (Lars Schmertmann).
|
|
||||||
* Added --dir-name-position option (Lars Schmertmann).
|
|
||||||
* Added --file-extension-fallback option (Lars Schmertmann).
|
|
||||||
* Added --user-show-filter option (Victor Lopez).
|
|
||||||
* Added --disable-input option (Joey Parrish).
|
|
||||||
* Added --loop-delay-seconds option (Joey Parrish).
|
|
||||||
* Added --font-scale option.
|
|
||||||
* Added filename, dirname and user font size options (Carl Colena).
|
|
||||||
* Added workaround for FFMpeg error parsing Gource PPM video output.
|
|
||||||
* Fixed a bug in the Mercurial log parser that caused changes to be missed.
|
|
||||||
* Fixed file removal being cancelled by an action with an earlier timestamp.
|
|
||||||
* Fixed a bug in the log file format detection that could result in the wrong
|
|
||||||
first entry being displayed for a custom log.
|
|
||||||
* Fixed a bug where automatically cycling through a config with multiple
|
|
||||||
repositories reset settings to their defaults.
|
|
||||||
|
|
||||||
0.49:
|
|
||||||
* Fixed compatibility with GLM 0.9.9.0.
|
|
||||||
|
|
||||||
0.48:
|
|
||||||
* Can now generate logs from git sub module directories.
|
|
||||||
|
|
||||||
0.47:
|
|
||||||
* Fixed low mouse movement speed with some mice while repositioning camera.
|
|
||||||
|
|
||||||
0.46:
|
|
||||||
* Added --screen option.
|
|
||||||
|
|
||||||
0.45:
|
|
||||||
* Added --window-position XxY option.
|
|
||||||
* Added --frameless option.
|
|
||||||
* Added --file-show-filter REGEX option (swoogles).
|
|
||||||
* Added --filename-time and filename-colour options (gh2k).
|
|
||||||
* Improved handling of very low seconds-per-day values (malengrin).
|
|
||||||
* Fixed crash when SVN log lacks author information (obarthel).
|
|
||||||
* Additional git log command validation (cym13).
|
|
||||||
* Allow lower case hex colours in custom logs (HSorensen).
|
|
||||||
* Enabled STDOUT support with --output-stream '-' on Windows (circulosmeos).
|
|
||||||
* Now requires SDL 2 to build (deprecated SDL 1.2 support removed).
|
|
||||||
|
|
||||||
0.44:
|
|
||||||
* Fixed crash when taking a screenshot with an odd resolution.
|
|
||||||
* Fixed type deduction compilation error with newer versions of GCC.
|
|
||||||
* Documentation improvements.
|
|
||||||
|
|
||||||
0.43:
|
|
||||||
* Updated boost autoconf macros to fix multi-arch detection.
|
|
||||||
|
|
||||||
0.42:
|
|
||||||
* Fixed bzr log command when no start date was specified (chrisf).
|
|
||||||
* Fixed hg log commit order when date range specified.
|
|
||||||
* Fixed hg log command line on Windows.
|
|
||||||
* Fixed parser bug in date range filtering code.
|
|
||||||
|
|
||||||
0.41:
|
|
||||||
* Multi-monitor support using SDL 2.0 when available.
|
|
||||||
* SDL 1.2 support is deprecated.
|
|
||||||
* Full screen mode now uses desktop resolution by default.
|
|
||||||
* Added --start-date, --stop-date 'YYYY-MM-DD hh:mm:ss' options.
|
|
||||||
* Added --dir-name-depth option.
|
|
||||||
* Changed --file-idle-time default value to 0.
|
|
||||||
* Changed screenshot format to PNG.
|
|
||||||
|
|
||||||
0.40:
|
|
||||||
* Added caption support.
|
|
||||||
* Improved command line interoperability on Windows.
|
|
||||||
* Fixed directory deletion short circuiting processing the rest of a commit.
|
|
||||||
* Fixed issue loading non-ascii user image filenames on windows.
|
|
||||||
* Ignore UTF-8 byte order mark at the start of lines in custom log files.
|
|
||||||
* Fix to boost macros for Macs and non-GNU systems (mistydemeo).
|
|
||||||
* Autotools improvements (flameeyes).
|
|
||||||
|
|
||||||
0.39:
|
|
||||||
* Fixed blurry non power of 2 logos.
|
|
||||||
* File colour changes now supported in custom logs (rmyorston).
|
|
||||||
* Fixed building against Boost 1.50 (svenstaro).
|
|
||||||
* Updated boost autoconf macros (flameeyes).
|
|
||||||
* Autogen script (matthiaskrgr).
|
|
||||||
|
|
||||||
0.38:
|
|
||||||
* New high quality sprites.
|
|
||||||
* Fullscreen toggle with alt + enter.
|
|
||||||
* Window is now resizable. -WIDTHxHEIGHT! creates a non-resizable window.
|
|
||||||
* Lowered minimum zoom distance.
|
|
||||||
* Use AM_CPPFLAGS in Makefile.am to allow passing custom CPPFLAGS.
|
|
||||||
* Don't add files that match the path of a known directory.
|
|
||||||
* Fixed divide by zero in text shader causing artifacts on some video cards.
|
|
||||||
* Recursively search for repository directory when log-format not specified
|
|
||||||
(thanks to Jörg Bachmann for original concept / prototype).
|
|
||||||
* New dependency on Boost Filesystem.
|
|
||||||
* Doubled the maximum zoom out distance.
|
|
||||||
* Allow negative timestamps before 1970 in custom log (artzub).
|
|
||||||
* Fix for UTF8-CPP checked.h compilation issue (vszakats).
|
|
||||||
* Fixed bug causing missing characters in text.
|
|
||||||
* Fixed --highlight-users option not using highlight-colour.
|
|
||||||
* highlight-colour default changed to white.
|
|
||||||
* Added --selection-colour option (applied to selected users and files).
|
|
||||||
* Added --dir-colour option (applied to directories).
|
|
||||||
|
|
||||||
0.37:
|
|
||||||
* Made SVN log GMT timestamp conversion fix portable.
|
|
||||||
|
|
||||||
0.36:
|
|
||||||
* Fixed SVN log GMT timestamp conversion.
|
|
||||||
* Fixed issue with sub-dirs of deleted dir not being removed in some cases.
|
|
||||||
|
|
||||||
0.35:
|
|
||||||
* Added long file extension truncation handling to file key (--key).
|
|
||||||
* Treat changes in Mercurial log files with the same time/user as one commit.
|
|
||||||
* Fixed handling of spaces in directory names with Mercurial.
|
|
||||||
* Fixed --font-colour option.
|
|
||||||
|
|
||||||
0.34:
|
|
||||||
* Now using VBOs and shaders for faster rendering when OpenGL 2.0 is available.
|
|
||||||
* Eliminated bloom colour banding artifacts (requires OpenGL 2.0).
|
|
||||||
* New font rendering library derived from FTGL (FTGL no longer required).
|
|
||||||
* Single pass font/shadow rendering (with lots of help from Chris Forbes).
|
|
||||||
* Added --no-vsync option.
|
|
||||||
* Fixed bug where tree is out of alignment with object positions in windowed
|
|
||||||
mode due to using the wrong display dimensions internally.
|
|
||||||
* Removed default max-files limit.
|
|
||||||
|
|
||||||
0.33:
|
|
||||||
* Added --hide root option to not draw branches from the root directory.
|
|
||||||
* Fixed log parsing of Bazaar merges and tagged commits.
|
|
||||||
* --output-custom-log now skips unparsed log entries instead of exiting.
|
|
||||||
|
|
||||||
0.32:
|
|
||||||
* Fixed behaviour of user camera tracking.
|
|
||||||
|
|
||||||
0.31:
|
|
||||||
* Added --with-tinyxml option to configure (use the system TinyXML library).
|
|
||||||
|
|
||||||
0.30:
|
|
||||||
* Fixed crash when SVN log entry contains no 'paths' element.
|
|
||||||
* Handle directory deletion (happens in SVN logs).
|
|
||||||
|
|
||||||
0.29:
|
|
||||||
* SVN built-in support.
|
|
||||||
* cvs2cl log support (cvs-exp support is now deprecated).
|
|
||||||
* Made camera behaviour when zooming and selecting objects more intuitive.
|
|
||||||
* Improved interactive performance.
|
|
||||||
* Added file extension key (--key or toggled with 'K').
|
|
||||||
* Added mouse-over tool tips.
|
|
||||||
* Added --highlight-colour option.
|
|
||||||
* Added --hash-seed option. The S key now randomizes colours.
|
|
||||||
* Added --output-custom-log option.
|
|
||||||
* Exposed --time-scale option (previously only available interactively).
|
|
||||||
* Removed arbitrary 1024 maximum length limit for log lines.
|
|
||||||
* Fixed two file colouring bugs (quoted files from git, period in file path).
|
|
||||||
* Fix handling of avatars for UTF-8 usernames on MACOSX (Christian Köstlin).
|
|
||||||
* Recover from video mode failing to set due to multi-sampling (Siddhesh Poyarekar).
|
|
||||||
|
|
||||||
0.28:
|
|
||||||
* Bazaar support for merged commits (Nick Moffit).
|
|
||||||
* C++ efficiency improvements (Oliver Smith).
|
|
||||||
* Improved cvs-exp log compatibility.
|
|
||||||
* Re-show name of user when adding a new action if user is idle.
|
|
||||||
* Added --padding option to control camera view padding.
|
|
||||||
* More accurate camera tracking (tracks the bounding boxes of objects).
|
|
||||||
* Improved automatic rotation logic.
|
|
||||||
|
|
||||||
0.27:
|
|
||||||
* Display time stops at the time of the last commit.
|
|
||||||
* Users fade out when end reached rather than ending abruptly.
|
|
||||||
* Position slider is now hidden by default if recording a video.
|
|
||||||
* Automatic camera rotation for better use of screen space.
|
|
||||||
* Support international keyboards (Peter Kjellerstedt).
|
|
||||||
* C++ efficiency improvements (Jacob Metcalfe).
|
|
||||||
* Fixed crash when reading from STDIN.
|
|
||||||
* Fixed intermittent crash closing Gource when using --output-ppm-stream.
|
|
||||||
* Added ini style config file support (see --load/save-config).
|
|
||||||
* Added screenshot button (F12). Screenshots respect the alpha channel.
|
|
||||||
* Added --transparent to make the background see-through (for screenshots).
|
|
||||||
* Added --logo and --background-image options.
|
|
||||||
* Added --dont-stop option for manual exiting when recording videos.
|
|
||||||
* Added --stop-at-time option to stop Gource after a number of seconds.
|
|
||||||
* Added --hide 'mouse' option.
|
|
||||||
* Added --highlight-dirs option.
|
|
||||||
* Added --file-extensions to show filename extensions only.
|
|
||||||
* Added --user-filter REGEX option.
|
|
||||||
* Allow --file-idle-time 0 (files will never expire).
|
|
||||||
* Allow --start-position 'random' to set a random start position.
|
|
||||||
* --log-command VCS replaces multiple --log-command-VCS options.
|
|
||||||
* Replaced --disable-progress and --disable-bloom with arguments to --hide.
|
|
||||||
|
|
||||||
0.26a:
|
|
||||||
* Updated to latest version of GL autoconf macros.
|
|
||||||
|
|
||||||
0.26:
|
|
||||||
* Improved mouse dragging.
|
|
||||||
* Holding right mouse button and moving the mouse rotates the view.
|
|
||||||
* The middle mouse button now toggles the camera mode.
|
|
||||||
* Username positions now scale correctly.
|
|
||||||
* Simulation time no longer incremented while paused, counting towards file time lag.
|
|
||||||
* M key now toggles mouse visibility.
|
|
||||||
* Added --hide option to use instead of multiple --hide-ELEMENT options.
|
|
||||||
|
|
||||||
0.25:
|
|
||||||
* Bazaar support (John Arbash Meinel).
|
|
||||||
* Dragging the mouse on the background moves the camera.
|
|
||||||
* Added --camera-mode option (track,overview).
|
|
||||||
* Support DOS line endings in logs.
|
|
||||||
* Improved compatibility of hg log command (Brendan Cully).
|
|
||||||
* Fixed PPM exporter producing blank images on some video cards.
|
|
||||||
* Fixed parsing of negative timezones from cvs-exp.pl logs.
|
|
||||||
* Fixed various gdb and compiler warnings.
|
|
||||||
|
|
||||||
0.24:
|
|
||||||
* PPM output speed improvements, including using a second thread (HighlandSun).
|
|
||||||
* Now using standard autotools (Flameeyes).
|
|
||||||
* Fixed --max-file-lag not working with some custom log files.
|
|
||||||
* Gource will stop at the end of the log by default when recording a video.
|
|
||||||
* Fixed STDIN stopping working after the first lot of records with tail -f.
|
|
||||||
* Added proper exception handling.
|
|
||||||
* Print errors to stderr.
|
|
||||||
|
|
||||||
0.23:
|
|
||||||
* Hiding filenames no longer hides directory names.
|
|
||||||
* Fixed --stop-on-idle option.
|
|
||||||
* Added --stop-at-end option (more intuitive than --stop-position 1.0).
|
|
||||||
|
|
||||||
0.22:
|
|
||||||
* Fixed Mercurial log order.
|
|
||||||
|
|
||||||
0.21b:
|
|
||||||
* Fixed windows build.
|
|
||||||
|
|
||||||
0.21:
|
|
||||||
* Some documentation fixes.
|
|
||||||
|
|
||||||
0.20:
|
|
||||||
* Added bloom effect (turn off with --disable-bloom).
|
|
||||||
* Added support for Mercurial (thanks to Justin Love for gource.style).
|
|
||||||
* --start-position option now works in combination with --disable-progress.
|
|
||||||
|
|
||||||
0.19:
|
|
||||||
* Use time_t instead of long for timestamps.
|
|
||||||
|
|
||||||
0.18:
|
|
||||||
* Fixed camera movement while the simulation is paused.
|
|
||||||
|
|
||||||
0.17:
|
|
||||||
* Show correct month for CVS logs.
|
|
||||||
* Added time scaling (Bitshifter).
|
|
||||||
|
|
||||||
0.16:
|
|
||||||
* Added --hide-dirnames option.
|
|
||||||
* Added --user-scale option.
|
|
||||||
* Added --date-format option (Pat Notz).
|
|
||||||
* Fix bug when encountering long log lines.
|
|
||||||
* Fixed incorrect parsing of trivial merges.
|
|
||||||
* Fixed building issues on OSX.
|
|
||||||
|
|
||||||
0.15:
|
|
||||||
* Added PPM output support for creating videos (Johannes Schindelin).
|
|
||||||
* Added experimental Apache combined access log support (--log-format apache).
|
|
||||||
* Added --stop-position and --stop-on-idle options (useful for making videos).
|
|
||||||
* Added --max-file-lag option to limit how long after a commit file changes can take to appear.
|
|
||||||
* Added --no-renames to the git log command as they don't display correctly.
|
|
||||||
* Added --max-user-speed and --user-friction as options.
|
|
||||||
* Now builds on OSX Leopard (with the required libaries installed).
|
|
||||||
* Caught raw exception from replace_invalid().
|
|
||||||
* Added CXXFLAGS. You may want to override the default (eg CXXFLAGS=-O3 ./configure).
|
|
||||||
|
|
||||||
0.14:
|
|
||||||
* Updated SVN instructions.
|
|
||||||
|
|
||||||
0.13:
|
|
||||||
* Removed single quotes from log command (fixes running gource --git-log-command in back ticks)
|
|
||||||
* Added SVN instructions.
|
|
||||||
* Fixed manpage hyphens.
|
|
||||||
|
|
||||||
0.12:
|
|
||||||
* Added --enable-ttf-font-dir=DIR option to configure (to specify the ttf-freefont directory).
|
|
||||||
* UTF-8 support using UTF8-CPP (http://utfcpp.sourceforge.net/).
|
|
||||||
* Changed the git log command (see --git-log-command) to require less work to parse.
|
|
||||||
Log files generated with the previous git-log command used by gource should continue to work.
|
|
||||||
* Allow --seconds-per-day value less than 1.0.
|
|
||||||
* Added --git-branch command.
|
|
||||||
* Added --loop command.
|
|
||||||
* Added --crop command.
|
|
||||||
|
|
||||||
0.11:
|
|
||||||
* Made N key skip to next entry.
|
|
||||||
* Documented --user-image-dir flag.
|
|
||||||
* temp file name now uses uid instead of time
|
|
||||||
|
|
||||||
0.1:
|
|
||||||
* First release.
|
|
||||||
@@ -1,469 +0,0 @@
|
|||||||
|
|
||||||
Gource
|
|
||||||
|
|
||||||
software version control visualization
|
|
||||||
|
|
||||||
Copyright (C) 2009 Andrew Caudwell
|
|
||||||
|
|
||||||
http://gource.io
|
|
||||||
|
|
||||||
Contents
|
|
||||||
========
|
|
||||||
|
|
||||||
1. Description
|
|
||||||
2. Requirements
|
|
||||||
3. Using Gource
|
|
||||||
4. Copyright
|
|
||||||
|
|
||||||
1. Description
|
|
||||||
==============
|
|
||||||
|
|
||||||
OpenGL-based 3D visualisation tool for source control repositories.
|
|
||||||
|
|
||||||
The repository is displayed as a tree where the root of the repository is the
|
|
||||||
centre, directories are branches and files are leaves. Contributors to the
|
|
||||||
source code appear and disappear as they contribute to specific files and
|
|
||||||
directories.
|
|
||||||
|
|
||||||
2. Requirements
|
|
||||||
===============
|
|
||||||
|
|
||||||
Gource's display is rendered using OpenGL and requires a 3D accelerated video
|
|
||||||
card to run.
|
|
||||||
|
|
||||||
3. Using Gource
|
|
||||||
===============
|
|
||||||
|
|
||||||
gource [options] [path]
|
|
||||||
|
|
||||||
options:
|
|
||||||
|
|
||||||
-h, --help
|
|
||||||
Help ('-H' for extended help).
|
|
||||||
|
|
||||||
-WIDTHxHEIGHT, --viewport WIDTHxHEIGHT
|
|
||||||
Set the viewport size. If -f is also supplied, will attempt to set
|
|
||||||
the video mode to this also. Add ! to make the window non-resizable.
|
|
||||||
|
|
||||||
--screen SCREEN
|
|
||||||
Set the number of the screen to display on.
|
|
||||||
|
|
||||||
--window-position XxY
|
|
||||||
Initial window position on your desktop which may be made up of
|
|
||||||
multiple monitors.
|
|
||||||
|
|
||||||
This will override the screen setting so don't specify both.
|
|
||||||
|
|
||||||
--frameless
|
|
||||||
Frameless window.
|
|
||||||
|
|
||||||
-f, --fullscreen
|
|
||||||
Fullscreen.
|
|
||||||
|
|
||||||
-w, --windowed
|
|
||||||
Windowed.
|
|
||||||
|
|
||||||
--transparent
|
|
||||||
Make the background transparent. Only really useful for screenshots.
|
|
||||||
|
|
||||||
--start-date "YYYY-MM-DD hh:mm:ss +tz"
|
|
||||||
Start with the first entry after the supplied date and optional time.
|
|
||||||
|
|
||||||
If a time zone offset isn't specified the local time zone is used.
|
|
||||||
|
|
||||||
Example accepted formats:
|
|
||||||
|
|
||||||
"2012-06-30"
|
|
||||||
"2012-06-30 12:00"
|
|
||||||
"2012-06-30 12:00:00 +12"
|
|
||||||
|
|
||||||
--stop-date "YYYY-MM-DD hh:mm:ss +tz"
|
|
||||||
Stop after the last entry prior to the supplied date and optional time.
|
|
||||||
|
|
||||||
Uses the same format as --start-date.
|
|
||||||
|
|
||||||
-p, --start-position POSITION
|
|
||||||
Begin at some position in the log (between 0.0 and 1.0 or 'random').
|
|
||||||
|
|
||||||
--stop-position POSITION
|
|
||||||
Stop (exit) at some position in the log (does not work with STDIN).
|
|
||||||
|
|
||||||
-t, --stop-at-time SECONDS
|
|
||||||
Stop (exit) after a specified number of seconds.
|
|
||||||
|
|
||||||
--stop-at-end
|
|
||||||
Stop (exit) at the end of the log / stream.
|
|
||||||
|
|
||||||
--loop
|
|
||||||
Loop back to the start of the log when the end is reached.
|
|
||||||
|
|
||||||
--loop-delay-seconds
|
|
||||||
Seconds to delay before looping.
|
|
||||||
|
|
||||||
-a, --auto-skip-seconds SECONDS
|
|
||||||
Skip to next entry if nothing happens for a number of seconds.
|
|
||||||
|
|
||||||
-s, --seconds-per-day SECONDS
|
|
||||||
Speed of simulation in seconds per day.
|
|
||||||
|
|
||||||
--realtime
|
|
||||||
Realtime playback speed.
|
|
||||||
|
|
||||||
--no-time-travel
|
|
||||||
Use the time of the last commit if the time of a commit is in the past.
|
|
||||||
|
|
||||||
-c, --time-scale SCALE
|
|
||||||
Change simulation time scale.
|
|
||||||
|
|
||||||
-i, --file-idle-time SECONDS
|
|
||||||
Time in seconds files remain idle before they are removed or 0
|
|
||||||
for no limit.
|
|
||||||
|
|
||||||
-e, --elasticity FLOAT
|
|
||||||
Elasticity of nodes.
|
|
||||||
|
|
||||||
-b, --background-colour FFFFFF
|
|
||||||
Background colour in hex.
|
|
||||||
|
|
||||||
--background-image IMAGE
|
|
||||||
Set a background image.
|
|
||||||
|
|
||||||
--logo IMAGE
|
|
||||||
Logo to display in the foreground.
|
|
||||||
|
|
||||||
--logo-offset XxY
|
|
||||||
Offset position of the logo.
|
|
||||||
|
|
||||||
--title TITLE
|
|
||||||
Set a title.
|
|
||||||
|
|
||||||
--font-file FILE
|
|
||||||
Specify the font. Should work with most font file formats supported by FreeType, such as TTF and OTF, among others.
|
|
||||||
|
|
||||||
--font-scale SCALE
|
|
||||||
Scale the size of all fonts.
|
|
||||||
|
|
||||||
--font-size SIZE
|
|
||||||
Font size used by the date and title.
|
|
||||||
|
|
||||||
--file-font-size SIZE
|
|
||||||
Font size of filenames.
|
|
||||||
|
|
||||||
--dir-font-size SIZE
|
|
||||||
Font size of directory names
|
|
||||||
|
|
||||||
--user-font-size SIZE
|
|
||||||
Font size of user names.
|
|
||||||
|
|
||||||
--font-colour FFFFFF
|
|
||||||
Font colour used by the date and title in hex.
|
|
||||||
|
|
||||||
--key
|
|
||||||
Show file extension key.
|
|
||||||
|
|
||||||
--date-format FORMAT
|
|
||||||
Specify display date string (strftime format).
|
|
||||||
|
|
||||||
--log-command VCS
|
|
||||||
Show the VCS log command used by gource (git,svn,hg,bzr,cvs2cl).
|
|
||||||
|
|
||||||
--log-format VCS
|
|
||||||
Specify the log format (git,svn,hg,bzr,cvs2cl,custom).
|
|
||||||
|
|
||||||
Required when reading from STDIN.
|
|
||||||
|
|
||||||
--git-branch
|
|
||||||
Get the git log of a branch other than the current one.
|
|
||||||
|
|
||||||
--follow-user USER
|
|
||||||
Have the camera automatically follow a particular user.
|
|
||||||
|
|
||||||
--highlight-dirs
|
|
||||||
Highlight the names of all directories.
|
|
||||||
|
|
||||||
--highlight-user USER
|
|
||||||
Highlight the names of a particular user.
|
|
||||||
|
|
||||||
--highlight-users
|
|
||||||
Highlight the names of all users.
|
|
||||||
|
|
||||||
--highlight-colour FFFFFF
|
|
||||||
Font colour for highlighted users in hex.
|
|
||||||
|
|
||||||
--selection-colour FFFFFF
|
|
||||||
Font colour for selected users and files.
|
|
||||||
|
|
||||||
--filename-colour FFFFFF
|
|
||||||
Font colour for filenames.
|
|
||||||
|
|
||||||
--dir-colour FFFFFF
|
|
||||||
Font colour for directories.
|
|
||||||
|
|
||||||
--dir-name-depth DEPTH
|
|
||||||
Draw names of directories down to a specific depth in the tree.
|
|
||||||
|
|
||||||
--dir-name-position FLOAT
|
|
||||||
Position along edge of the directory name
|
|
||||||
(between 0.1 and 1.0, default is 0.5).
|
|
||||||
|
|
||||||
--filename-time SECONDS
|
|
||||||
Duration to keep filenames on screen (>= 2.0).
|
|
||||||
|
|
||||||
--file-extensions
|
|
||||||
Show filename extensions only.
|
|
||||||
|
|
||||||
--file-extension-fallback
|
|
||||||
Use filename as extension if the extension is missing or empty.
|
|
||||||
|
|
||||||
--file-filter REGEX
|
|
||||||
Filter out file paths matching the specified regular expression.
|
|
||||||
|
|
||||||
--file-show-filter REGEX
|
|
||||||
Show only file paths matching the specified regular expression.
|
|
||||||
|
|
||||||
--user-filter REGEX
|
|
||||||
Filter usernames matching the specified regular expression.
|
|
||||||
|
|
||||||
--user-show-filter REGEX
|
|
||||||
Show only usernames matching the specified regular expression.
|
|
||||||
|
|
||||||
--user-image-dir DIRECTORY
|
|
||||||
Directory containing .jpg or .png images of users
|
|
||||||
(eg "Full Name.png") to use as avatars.
|
|
||||||
|
|
||||||
--default-user-image IMAGE
|
|
||||||
Path of .jpg or .png to use as the default user image.
|
|
||||||
|
|
||||||
--colour-images
|
|
||||||
Colourize user images.
|
|
||||||
|
|
||||||
--crop AXIS
|
|
||||||
Crop view on an axis (vertical,horizontal).
|
|
||||||
|
|
||||||
--padding FLOAT
|
|
||||||
Camera view padding.
|
|
||||||
|
|
||||||
--multi-sampling
|
|
||||||
Enable multi-sampling.
|
|
||||||
|
|
||||||
--no-vsync
|
|
||||||
Disable vsync.
|
|
||||||
|
|
||||||
--bloom-multiplier FLOAT
|
|
||||||
Adjust the amount of bloom.
|
|
||||||
|
|
||||||
--bloom-intensity FLOAT
|
|
||||||
Adjust the intensity of the bloom.
|
|
||||||
|
|
||||||
--max-files NUMBER
|
|
||||||
Set the maximum number of files or 0 for no limit.
|
|
||||||
|
|
||||||
Excess files will be discarded.
|
|
||||||
|
|
||||||
--max-file-lag SECONDS
|
|
||||||
Max time files of a commit can take to appear.
|
|
||||||
|
|
||||||
Use -1 for no limit.
|
|
||||||
|
|
||||||
--max-user-speed UNITS
|
|
||||||
Max speed users can travel per second.
|
|
||||||
|
|
||||||
--user-friction SECONDS
|
|
||||||
Time users take to come to a halt.
|
|
||||||
|
|
||||||
--user-scale SCALE
|
|
||||||
Change scale of user avatars.
|
|
||||||
|
|
||||||
--camera-mode MODE
|
|
||||||
Camera mode (overview,track).
|
|
||||||
|
|
||||||
--disable-auto-rotate
|
|
||||||
Disable automatic camera rotation.
|
|
||||||
|
|
||||||
--disable-input
|
|
||||||
Disable keyboard and mouse input.
|
|
||||||
|
|
||||||
--hide DISPLAY_ELEMENT
|
|
||||||
Hide one or more display elements from the list below:
|
|
||||||
|
|
||||||
bloom - bloom effect
|
|
||||||
date - current date
|
|
||||||
dirnames - names of directories
|
|
||||||
files - file icons
|
|
||||||
filenames - names of files
|
|
||||||
mouse - mouse cursor
|
|
||||||
progress - progress bar widget
|
|
||||||
root - root directory of tree
|
|
||||||
tree - animated tree structure
|
|
||||||
users - user avatars
|
|
||||||
usernames - names of users
|
|
||||||
|
|
||||||
Separate multiple elements with commas (eg "mouse,progress")
|
|
||||||
|
|
||||||
--hash-seed SEED
|
|
||||||
Change the seed of hash function.
|
|
||||||
|
|
||||||
--caption-file FILE
|
|
||||||
Caption file (see Caption Log Format).
|
|
||||||
|
|
||||||
--caption-size SIZE
|
|
||||||
Caption size.
|
|
||||||
|
|
||||||
--caption-colour FFFFFF
|
|
||||||
Caption colour in hex.
|
|
||||||
|
|
||||||
--caption-duration SECONDS
|
|
||||||
Caption duration.
|
|
||||||
|
|
||||||
--caption-offset X
|
|
||||||
Caption horizontal offset (0 to centre captions).
|
|
||||||
|
|
||||||
-o, --output-ppm-stream FILE
|
|
||||||
Output a PPM image stream to a file ('-' for STDOUT).
|
|
||||||
|
|
||||||
This will automatically hide the progress bar initially and
|
|
||||||
enable 'stop-at-end' unless other behaviour is specified.
|
|
||||||
|
|
||||||
-r, --output-framerate FPS
|
|
||||||
Framerate of output (25,30,60). Used with --output-ppm-stream.
|
|
||||||
|
|
||||||
--output-custom-log FILE
|
|
||||||
Output a custom format log file ('-' for STDOUT).
|
|
||||||
|
|
||||||
--load-config CONFIG_FILE
|
|
||||||
Load a gource conf file.
|
|
||||||
|
|
||||||
--save-config CONFIG_FILE
|
|
||||||
Save a gource conf file with the current options.
|
|
||||||
|
|
||||||
--path PATH
|
|
||||||
|
|
||||||
path Either a supported version control directory, a pre-generated log
|
|
||||||
file (see log commands or the custom log format), a Gource conf
|
|
||||||
file or '-' to read STDIN.
|
|
||||||
|
|
||||||
If path is omitted, gource will attempt to read a log from the
|
|
||||||
current directory.
|
|
||||||
|
|
||||||
Git, Bazaar, Mercurial and SVN Examples:
|
|
||||||
|
|
||||||
View the log of the repository in the current path:
|
|
||||||
|
|
||||||
gource
|
|
||||||
|
|
||||||
View the log of a project in the specified directory:
|
|
||||||
|
|
||||||
gource my-project-dir
|
|
||||||
|
|
||||||
For large projects, generating a log of the project history may take a long
|
|
||||||
time. For centralized VCS like SVN, generating the log may also put load on
|
|
||||||
the central VCS server.
|
|
||||||
|
|
||||||
In these cases, you may like to save a copy of the log for later use.
|
|
||||||
|
|
||||||
You can generate a log in the VCS specific log format using
|
|
||||||
the --log-command VCS option:
|
|
||||||
|
|
||||||
cd my-svn-project
|
|
||||||
`gource --log-command svn` > my-svn-project.log
|
|
||||||
gource my-svn-project.log
|
|
||||||
|
|
||||||
You can also have Gource write a copy of the log file in its own format:
|
|
||||||
|
|
||||||
gource --output-custom-log my-project-custom.log
|
|
||||||
|
|
||||||
CVS Support:
|
|
||||||
|
|
||||||
Use 'cvs2cl' to generate the log and then pass it to Gource:
|
|
||||||
|
|
||||||
cvs2cl --chrono --stdout --xml -g-q > my-cvs-project.log
|
|
||||||
gource my-cvs-project.log
|
|
||||||
|
|
||||||
Custom Log Format:
|
|
||||||
|
|
||||||
If you want to use Gource with something other than the supported systems,
|
|
||||||
there is a pipe ('|') delimited custom log format:
|
|
||||||
|
|
||||||
timestamp - A unix timestamp of when the update occured.
|
|
||||||
username - The name of the user who made the update.
|
|
||||||
type - initial for the update type - (A)dded, (M)odified or (D)eleted.
|
|
||||||
file - Path of the file updated.
|
|
||||||
colour - A colour for the file in hex (FFFFFF) format. Optional.
|
|
||||||
|
|
||||||
Caption Log Format:
|
|
||||||
|
|
||||||
Gource can display captions along the timeline by specifying a caption file
|
|
||||||
(using --caption-file) in the pipe ('|') delimited format below:
|
|
||||||
|
|
||||||
timestamp - A unix timestamp of when to display the caption.
|
|
||||||
caption - The caption
|
|
||||||
|
|
||||||
Recording Videos:
|
|
||||||
|
|
||||||
See the guide on the homepage for examples of recording videos with Gource:
|
|
||||||
|
|
||||||
https://github.com/acaudwell/Gource/wiki/Videos
|
|
||||||
|
|
||||||
More Information:
|
|
||||||
|
|
||||||
Visit the Gource homepage for guides and examples of using Gource with various
|
|
||||||
version control systems:
|
|
||||||
|
|
||||||
http://gource.io
|
|
||||||
|
|
||||||
Interface:
|
|
||||||
|
|
||||||
The time shown in the top left of the screen is set initially from the first
|
|
||||||
log entry read and is incremented according to the simulation speed
|
|
||||||
(--seconds-per-day).
|
|
||||||
|
|
||||||
Pressing SPACE at any time will pause/resume the simulation. While paused you
|
|
||||||
may use the mouse to inspect the detail of individual files and users.
|
|
||||||
|
|
||||||
TAB cycles through selecting the current visible users.
|
|
||||||
|
|
||||||
The camera mode, either tracking activity or showing the entire code tree, can
|
|
||||||
be toggled using the Middle mouse button.
|
|
||||||
|
|
||||||
You can drag the left mouse button to manually control the camera. The right
|
|
||||||
mouse button rotates the view.
|
|
||||||
|
|
||||||
Interactive keyboard commands:
|
|
||||||
|
|
||||||
(V) Toggle camera mode
|
|
||||||
(C) Displays Gource logo
|
|
||||||
(K) Toggle file extension key
|
|
||||||
(M) Toggle mouse visibility
|
|
||||||
(N) Jump forward in time to next log entry
|
|
||||||
(S) Randomize colours
|
|
||||||
(D) Toggle directory name display mode
|
|
||||||
(F) Toggle file name display mode
|
|
||||||
(U) Toggle user name display mode
|
|
||||||
(G) Toggle display of users
|
|
||||||
(T) Toggle display of directory tree edges
|
|
||||||
(R) Toggle display of root directory edges
|
|
||||||
(+-) Adjust simulation speed
|
|
||||||
(<>) Adjust time scale
|
|
||||||
(TAB) Cycle through visible users
|
|
||||||
(F12) Screenshot
|
|
||||||
(Alt+Enter) Fullscreen toggle
|
|
||||||
(ESC) Quit
|
|
||||||
|
|
||||||
4. Copyright
|
|
||||||
============
|
|
||||||
|
|
||||||
Gource - software version control visualization
|
|
||||||
Copyright (C) 2009 Andrew Caudwell <acaudwell@gmail.com>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
Cheers to everyone at Catalyst IT for their support and encouragement.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
GOURCE_CMD_DIR=`dirname "$0"`
|
|
||||||
"$GOURCE_CMD_DIR/../gource.exe" "$@"
|
|
||||||
Loaded 100 of 803 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user