Compare commits
842 Commits
pr/elytra/
...
1.20.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
838e75f025 | ||
|
|
5f0527be71 | ||
|
|
fd49333db6 | ||
|
|
31b30e3a31 | ||
|
|
0fe8c628c7 | ||
|
|
f86f0ab6cd | ||
|
|
40e83423bc | ||
|
|
79f1503c8b | ||
|
|
eace2ad161 | ||
|
|
d74420b265 | ||
|
|
7aab08ae0f | ||
|
|
2fc8490c72 | ||
|
|
ddc2820418 | ||
|
|
9e1e89b91f | ||
|
|
7c4036dfb1 | ||
|
|
bbaa602fe9 | ||
|
|
921822acd7 | ||
|
|
f019b81bd9 | ||
|
|
50df7b2026 | ||
|
|
92130f1642 | ||
|
|
fd13d5cbdc | ||
|
|
209b51b253 | ||
|
|
3fa0f34c1e | ||
|
|
bf0c47c85c | ||
|
|
9de3074041 | ||
|
|
37a95aea97 | ||
|
|
3116405953 | ||
|
|
ed4f9cee78 | ||
|
|
b8ac867fb9 | ||
|
|
3f6c87a8ed | ||
|
|
bf08c4fcf4 | ||
|
|
f357eb230b | ||
|
|
f3086c2231 | ||
|
|
002415425a | ||
|
|
c54d878d1c | ||
|
|
590f5d98ee | ||
|
|
849072f8ca | ||
|
|
59157c1ee0 | ||
|
|
3c9f5b2c91 | ||
|
|
cdfa86c977 | ||
|
|
64fdad424f | ||
|
|
a5668532b1 | ||
|
|
bac24af90e | ||
|
|
497fb74829 | ||
|
|
91a1f05ff2 | ||
|
|
1a258b2bec | ||
|
|
93dee4fd19 | ||
|
|
f6657846d3 | ||
|
|
db163867df | ||
|
|
58fcf328b9 | ||
|
|
8e8cfdd2a6 | ||
|
|
991d822557 | ||
|
|
c25b1325da | ||
|
|
ea1de44ca8 | ||
|
|
f22f4aed00 | ||
|
|
d644c5b754 | ||
|
|
1e2ae34dbe | ||
|
|
a690e1eca4 | ||
|
|
d25d6c2611 | ||
|
|
ef72c56833 | ||
|
|
7e8c852528 | ||
|
|
42032890ed | ||
|
|
6b6931c86d | ||
|
|
b915151ae3 | ||
|
|
7609f3082e | ||
|
|
99f9dd1671 | ||
|
|
1a0cca794c | ||
|
|
e71547b9ef | ||
|
|
246a246cb7 | ||
|
|
b87a1fa420 | ||
|
|
b12c4e9f8c | ||
|
|
330089f1e2 | ||
|
|
f6045b7cb4 | ||
|
|
a07d7d0526 | ||
|
|
edb433ea6e | ||
|
|
a02704e097 | ||
|
|
1947459acf | ||
|
|
52aa609ac7 | ||
|
|
92bc067633 | ||
|
|
64639b377f | ||
|
|
42c62a0559 | ||
|
|
b25a6305ce | ||
|
|
98e90e72f7 | ||
|
|
10851ddf14 | ||
|
|
402079d7db | ||
|
|
b184141db2 | ||
|
|
f9a8aa0c2b | ||
|
|
0c09441154 | ||
|
|
69d3bc0c2e | ||
|
|
b31e0a87cb | ||
|
|
4572b75db7 | ||
|
|
15fdbb2312 | ||
|
|
848b7c6de0 | ||
|
|
2b96a2e463 | ||
|
|
62b2f81ba1 | ||
|
|
5826931eea | ||
|
|
a8119366a1 | ||
|
|
b0575fbe0c | ||
|
|
866cf34f50 | ||
|
|
23908ad14f | ||
|
|
18d3c4c2bd | ||
|
|
faece77e8c | ||
|
|
413c11a23e | ||
|
|
4c9253fa5e | ||
|
|
d86a34a527 | ||
|
|
92aba1b78e | ||
|
|
28ba97c3de | ||
|
|
24c23e28ec | ||
|
|
2a2842361b | ||
|
|
632e05c4c2 | ||
|
|
4144344acd | ||
|
|
e962c39506 | ||
|
|
48f309ac05 | ||
|
|
0688a57a38 | ||
|
|
078b3909b3 | ||
|
|
d51b23bd1e | ||
|
|
9378f7e8a0 | ||
|
|
e7e434a95b | ||
|
|
be1203fabb | ||
|
|
340d2a1d54 | ||
|
|
f84b749ff4 | ||
|
|
a223585daa | ||
|
|
163e97aad6 | ||
|
|
f147519a5c | ||
|
|
19accb0d90 | ||
|
|
44bcd4251d | ||
|
|
5795baab1a | ||
|
|
e183dcba17 | ||
|
|
a945cfaa3c | ||
|
|
ea964a976c | ||
|
|
1409c92e69 | ||
|
|
a0914192d0 | ||
|
|
e19fd1161d | ||
|
|
3a3b012199 | ||
|
|
9accb2bfb0 | ||
|
|
20d62c68bf | ||
|
|
0ca81b14bf | ||
|
|
1dd2a334d6 | ||
|
|
3332ec9e1f | ||
|
|
30f27d43e7 | ||
|
|
74457db125 | ||
|
|
91588caf7d | ||
|
|
9bf890a7b6 | ||
|
|
e1e620a0d9 | ||
|
|
f5d15927de | ||
|
|
7902517663 | ||
|
|
4db988dbef | ||
|
|
9ad273a46c | ||
|
|
81932069d9 | ||
|
|
a1ac87f80d | ||
|
|
97067b9078 | ||
|
|
2cd5c6b0af | ||
|
|
920c3aa280 | ||
|
|
f2679bea29 | ||
|
|
e8bcd0535d | ||
|
|
3b30b06313 | ||
|
|
e492e5f830 | ||
|
|
5a4500177d | ||
|
|
c4f33b72c2 | ||
|
|
5f5567f283 | ||
|
|
301ad40350 | ||
|
|
aee36e4d85 | ||
|
|
e063475ebd | ||
|
|
58d6b80f4f | ||
|
|
fa28a56e84 | ||
|
|
c18fa512ef | ||
|
|
3bdd0a81a5 | ||
|
|
7668952ca8 | ||
|
|
b351ceef71 | ||
|
|
4efa2b1272 | ||
|
|
c2308c650a | ||
|
|
b16590d504 | ||
|
|
51843f7074 | ||
|
|
7969988099 | ||
|
|
fc474cfb49 | ||
|
|
bfc813a802 | ||
|
|
fd8ca8576b | ||
|
|
75b8554a11 | ||
|
|
d9cb2d91a0 | ||
|
|
d4b95110f5 | ||
|
|
8a2a20a1b3 | ||
|
|
7daf1022c0 | ||
|
|
60d6791f0c | ||
|
|
ca4385da7a | ||
|
|
661b16af7e | ||
|
|
f36072c8d3 | ||
|
|
b1be4f29ad | ||
|
|
050e3a570d | ||
|
|
7b911aa0a7 | ||
|
|
9ecb416bf3 | ||
|
|
f35e55ef66 | ||
|
|
b0929991b1 | ||
|
|
bd263e1bf8 | ||
|
|
535eccfc24 | ||
|
|
81e004380f | ||
|
|
d67a3d8bbc | ||
|
|
36534eeb2d | ||
|
|
4e3a7abac9 | ||
|
|
f331124895 | ||
|
|
15a38c4871 | ||
|
|
070523511a | ||
|
|
0edcf65044 | ||
|
|
139fd03470 | ||
|
|
3215824a9e | ||
|
|
f5bd737ee9 | ||
|
|
70640246b6 | ||
|
|
8c1ccd6c19 | ||
|
|
7813a9caba | ||
|
|
231d3a376b | ||
|
|
3791569519 | ||
|
|
7aa3eda3f6 | ||
|
|
0ca173f5dc | ||
|
|
c0a1e6540f | ||
|
|
46f38f2ce7 | ||
|
|
64a881f990 | ||
|
|
541b710ea7 | ||
|
|
cc8afe95c5 | ||
|
|
83feddf6be | ||
|
|
7662810405 | ||
|
|
d921d2e367 | ||
|
|
9630224e78 | ||
|
|
134bfb2a16 | ||
|
|
36df7b17f8 | ||
|
|
7e9cf2e1e9 | ||
|
|
54511f13d9 | ||
|
|
27e45b816d | ||
|
|
3a6e5541fb | ||
|
|
a83d275622 | ||
|
|
d6adb52718 | ||
|
|
976f3439eb | ||
|
|
2821a2a0a7 | ||
|
|
2e2c0ecc0b | ||
|
|
31d1656c48 | ||
|
|
4b5a094f30 | ||
|
|
6b611cf4c7 | ||
|
|
90f2b39fba | ||
|
|
2164857408 | ||
|
|
e0308dee49 | ||
|
|
601a781983 | ||
|
|
f14bb282f0 | ||
|
|
1e0dce8f41 | ||
|
|
45400a9685 | ||
|
|
6ffe31b59e | ||
|
|
293b556b56 | ||
|
|
dbf38efd83 | ||
|
|
e63aad7825 | ||
|
|
212ef4d4cc | ||
|
|
31e082b8dc | ||
|
|
75e8035551 | ||
|
|
f7f0521093 | ||
|
|
684fda2d1b | ||
|
|
886091df50 | ||
|
|
9707dd7ce8 | ||
|
|
b81d712a33 | ||
|
|
3ffacbf375 | ||
|
|
eec85b20be | ||
|
|
c0ead0147a | ||
|
|
bafd41837e | ||
|
|
9bfa2025d5 | ||
|
|
bf63ffbc1d | ||
|
|
985148b49a | ||
|
|
9e78443595 | ||
|
|
58723a33ca | ||
|
|
c9aa1658b2 | ||
|
|
7f9e50bbe2 | ||
|
|
664375a678 | ||
|
|
097e30850f | ||
|
|
a63cbab013 | ||
|
|
37f1c30ad0 | ||
|
|
217dca5363 | ||
|
|
15e97268ed | ||
|
|
29301e8a39 | ||
|
|
dfa838a6f9 | ||
|
|
218de1cb98 | ||
|
|
6a9694b03a | ||
|
|
0239a2cad4 | ||
|
|
38553b3324 | ||
|
|
ba78c48a75 | ||
|
|
f4996137a3 | ||
|
|
ccd80dfc8f | ||
|
|
ff1b3e7c5f | ||
|
|
2f0497756b | ||
|
|
afe9359d3e | ||
|
|
4b5d629df6 | ||
|
|
dbc0a46b10 | ||
|
|
9a6241af8a | ||
|
|
1b82bd1f33 | ||
|
|
bf9cb76604 | ||
|
|
90cfd82810 | ||
|
|
108dbdae5d | ||
|
|
32a4c4644e | ||
|
|
edc92753cf | ||
|
|
0e567f2f90 | ||
|
|
41e8c69db9 | ||
|
|
b647c0fca0 | ||
|
|
448e454cc8 | ||
|
|
8de239f468 | ||
|
|
cbf0d79c9c | ||
|
|
8ceb89d021 | ||
|
|
8e58dd9e64 | ||
|
|
45abbb7fa1 | ||
|
|
1d983d5fdc | ||
|
|
be54b8ee5b | ||
|
|
944405e4df | ||
|
|
0dd38ca65a | ||
|
|
7ef4307ab7 | ||
|
|
a5ca664a6a | ||
|
|
7487b90d50 | ||
|
|
09554ab39d | ||
|
|
2ae7bc6a64 | ||
|
|
6979bd6971 | ||
|
|
b2bd025896 | ||
|
|
298256197b | ||
|
|
de80527702 | ||
|
|
666a890088 | ||
|
|
b389b573e5 | ||
|
|
eb28298983 | ||
|
|
336b2c2798 | ||
|
|
63d0064d69 | ||
|
|
43eb4e3581 | ||
|
|
7bb311687b | ||
|
|
6eeeeb3a1b | ||
|
|
e3c6b312ef | ||
|
|
acce20c573 | ||
|
|
e4d725d9aa | ||
|
|
0cf89e0b2a | ||
|
|
d1a55c43e1 | ||
|
|
63e3dfc9b8 | ||
|
|
6db376c02e | ||
|
|
a1e797ab53 | ||
|
|
fe64f1fd8a | ||
|
|
9efc512253 | ||
|
|
7a5c4f1f03 | ||
|
|
787644181a | ||
|
|
24e047c12e | ||
|
|
6e5fec576f | ||
|
|
1e7e504650 | ||
|
|
7b60943714 | ||
|
|
7879b6909a | ||
|
|
9898e0da26 | ||
|
|
5841bd4e36 | ||
|
|
81e9865067 | ||
|
|
f9d563b9e6 | ||
|
|
3e3312f009 | ||
|
|
327fbc868e | ||
|
|
6d5cfe4187 | ||
|
|
d3e0da7c5e | ||
|
|
38fbc127e6 | ||
|
|
25ef38aaf2 | ||
|
|
d05d5fd98e | ||
|
|
432d42ade8 | ||
|
|
0057f093db | ||
|
|
7677ed8240 | ||
|
|
0e1fee352f | ||
|
|
1136494fc6 | ||
|
|
9b3e5cb444 | ||
|
|
f13dc16af5 | ||
|
|
b51b78f4e4 | ||
|
|
7ad1a2dac7 | ||
|
|
fd55e455a1 | ||
|
|
e7e25abc0b | ||
|
|
4bc9884a95 | ||
|
|
0e35a3e62b | ||
|
|
1112feff5b | ||
|
|
967dc6cbd6 | ||
|
|
2ce60fbb79 | ||
|
|
35b7c48430 | ||
|
|
db842445f6 | ||
|
|
3a8d438d7c | ||
|
|
386caf5d1e | ||
|
|
f7f0c84407 | ||
|
|
75cd4600a0 | ||
|
|
e6642a2122 | ||
|
|
e7252f5b3f | ||
|
|
4168401aa1 | ||
|
|
3e082b21d5 | ||
|
|
85790c0b2f | ||
|
|
c20d40f8dd | ||
|
|
4fa43ce201 | ||
|
|
f51f835b11 | ||
|
|
54f6851dd9 | ||
|
|
98763271a4 | ||
|
|
063842edc4 | ||
|
|
2453a4a4f1 | ||
|
|
5a8adc5344 | ||
|
|
8b94ac8fca | ||
|
|
c1e12b8746 | ||
|
|
44c1438541 | ||
|
|
c2a857f4d6 | ||
|
|
9d620f8137 | ||
|
|
7c2327b743 | ||
|
|
d91abd5e45 | ||
|
|
8f514bd782 | ||
|
|
ec2941bede | ||
|
|
5b37b68363 | ||
|
|
04f5ca2647 | ||
|
|
bf43fd1274 | ||
|
|
cd7c504c76 | ||
|
|
96ba589d4d | ||
|
|
8803c618b1 | ||
|
|
287addb9fd | ||
|
|
d1a0f1e3ca | ||
|
|
52d077de49 | ||
|
|
b1f35e93dc | ||
|
|
076326dcc3 | ||
|
|
b1b8288d05 | ||
|
|
df62427fee | ||
|
|
61b9762a22 | ||
|
|
06be5f5372 | ||
|
|
348b02e4f8 | ||
|
|
fcd20b10f1 | ||
|
|
82f184c848 | ||
|
|
fd43dace70 | ||
|
|
a475f522ef | ||
|
|
e6cc9b1131 | ||
|
|
347027a8e0 | ||
|
|
f204fbb08e | ||
|
|
606f9c55a8 | ||
|
|
f2a11df616 | ||
|
|
5773da36bd | ||
|
|
86303ed495 | ||
|
|
2b4da2a46c | ||
|
|
f699be7973 | ||
|
|
ed381d6b33 | ||
|
|
1caa99fee3 | ||
|
|
4a042510d8 | ||
|
|
ffbe683e86 | ||
|
|
4dba5a4399 | ||
|
|
8cfdcbdc9e | ||
|
|
59b3fe7c3a | ||
|
|
6e37221b3c | ||
|
|
b54ddeadf4 | ||
|
|
caa88c5b60 | ||
|
|
1b3139c99a | ||
|
|
3d95f0ad65 | ||
|
|
0df45a89be | ||
|
|
b0266cd14b | ||
|
|
9bf40dd60b | ||
|
|
56b44496bf | ||
|
|
3df451677c | ||
|
|
9e021d2875 | ||
|
|
db9ee98762 | ||
|
|
4e0a507ba0 | ||
|
|
7d39aacd72 | ||
|
|
a8ae8a6171 | ||
|
|
9c99333759 | ||
|
|
ec6ffb0f53 | ||
|
|
1544b09c82 | ||
|
|
1d08b3e729 | ||
|
|
8a150568ec | ||
|
|
00b20b2158 | ||
|
|
25e8e1b5fe | ||
|
|
bf7c840ea3 | ||
|
|
78a5838aa1 | ||
|
|
d0d74b1591 | ||
|
|
056107a356 | ||
|
|
93a16f356d | ||
|
|
070083dc9b | ||
|
|
4dcf260059 | ||
|
|
e885d2c221 | ||
|
|
fe61a404d6 | ||
|
|
97ac4bbd4f | ||
|
|
dd29b72295 | ||
|
|
23fa65cee0 | ||
|
|
af646bd313 | ||
|
|
c3c88c50d1 | ||
|
|
16f93ce769 | ||
|
|
3cee66229a | ||
|
|
88c00f2fec | ||
|
|
394b4fd5b8 | ||
|
|
48b34bfbb8 | ||
|
|
4b2d1fe6b0 | ||
|
|
01c75db38a | ||
|
|
adc88d1fb9 | ||
|
|
2908c7499c | ||
|
|
ef4c2bbc98 | ||
|
|
f3c93855bb | ||
|
|
f033230548 | ||
|
|
599aa42cd8 | ||
|
|
95afaf3eac | ||
|
|
17b2245033 | ||
|
|
7b7c49d7ad | ||
|
|
1522d11df0 | ||
|
|
7eecf69178 | ||
|
|
384dfb5f46 | ||
|
|
89bd2a4a07 | ||
|
|
477e3a706b | ||
|
|
9ba8949a2e | ||
|
|
9b7d3af03d | ||
|
|
8a0771e5f4 | ||
|
|
9c6c977314 | ||
|
|
38c5388e00 | ||
|
|
519a76a171 | ||
|
|
eefc98a68e | ||
|
|
d0dc8cf726 | ||
|
|
267961434c | ||
|
|
0bfe98d306 | ||
|
|
bfa644e7a7 | ||
|
|
0ef1558803 | ||
|
|
9dad1af960 | ||
|
|
407f4dbbae | ||
|
|
af240d38e0 | ||
|
|
a3dbec62dc | ||
|
|
b6cc15e9ab | ||
|
|
fe26168a07 | ||
|
|
ebb9dd1aaf | ||
|
|
d4c4441cb6 | ||
|
|
91bfab30e0 | ||
|
|
a32811942e | ||
|
|
e077995332 | ||
|
|
71e17d6c29 | ||
|
|
c9ebc0191d | ||
|
|
2f7f15da77 | ||
|
|
fa3f5ae521 | ||
|
|
db0ebeebee | ||
|
|
dc4913d98d | ||
|
|
70dc2a3009 | ||
|
|
33943dc473 | ||
|
|
21022f30b6 | ||
|
|
d4ae351065 | ||
|
|
2b75241338 | ||
|
|
3de7fc81fb | ||
|
|
34501f5af3 | ||
|
|
696ec6756d | ||
|
|
6e03e6859c | ||
|
|
5ce006170d | ||
|
|
ffd7d7a23a | ||
|
|
697c92ae77 | ||
|
|
e37d81d3fc | ||
|
|
7f21362a2a | ||
|
|
c4da682e84 | ||
|
|
33ee39dcce | ||
|
|
587c2cc8e2 | ||
|
|
1c8899ceae | ||
|
|
088009fe4a | ||
|
|
90ac6f331e | ||
|
|
e80e4afa48 | ||
|
|
b73295d180 | ||
|
|
186a3cb6df | ||
|
|
b6fba56291 | ||
|
|
f52fee8254 | ||
|
|
f1061cfd31 | ||
|
|
9a9358bc78 | ||
|
|
749fd4fac3 | ||
|
|
62fe9888a2 | ||
|
|
08c00b8a42 | ||
|
|
43ecc906c7 | ||
|
|
bb91dc98de | ||
|
|
64b647ea65 | ||
|
|
6ed3a88491 | ||
|
|
bd5ffe8f31 | ||
|
|
d22a52976b | ||
|
|
e055ef36d4 | ||
|
|
5ec6b7b72e | ||
|
|
de27fb2f68 | ||
|
|
2e2e725eb3 | ||
|
|
202618a32a | ||
|
|
462dbce665 | ||
|
|
0944e6255e | ||
|
|
8be821746e | ||
|
|
9c05133ac7 | ||
|
|
29f5eaa35f | ||
|
|
c06fdec287 | ||
|
|
c7d210bfd6 | ||
|
|
683e987b1d | ||
|
|
40c323f53d | ||
|
|
2d2354730d | ||
|
|
a7b81940b3 | ||
|
|
8df87eb620 | ||
|
|
41abda37c1 | ||
|
|
e6d8b268c7 | ||
|
|
f0130c7199 | ||
|
|
de42109771 | ||
|
|
2e98eee7e0 | ||
|
|
f6236bdc66 | ||
|
|
d00249bbd6 | ||
|
|
a49f4ee858 | ||
|
|
998b84ef87 | ||
|
|
373ad3efdd | ||
|
|
a48ae2a9a8 | ||
|
|
a9b956c12d | ||
|
|
476b724471 | ||
|
|
98da144691 | ||
|
|
7320c3fd7e | ||
|
|
c37cdf78e4 | ||
|
|
6a1f716dc8 | ||
|
|
a9d90786ff | ||
|
|
484c606dc1 | ||
|
|
637c182114 | ||
|
|
2377694a6b | ||
|
|
1b3799d4d7 | ||
|
|
81fadde388 | ||
|
|
a61eabd60c | ||
|
|
bb75e68b0a | ||
|
|
e9b9977674 | ||
|
|
825bad47ef | ||
|
|
78acd2f945 | ||
|
|
1183196e0d | ||
|
|
e4947ec071 | ||
|
|
5262f68215 | ||
|
|
4b45cc6f0b | ||
|
|
a3da25ca27 | ||
|
|
eae6e4d804 | ||
|
|
37cd50d435 | ||
|
|
3f65d46e12 | ||
|
|
15fd313757 | ||
|
|
ca870af20e | ||
|
|
c98c54c985 | ||
|
|
4c9689fe19 | ||
|
|
f41c873852 | ||
|
|
eb8a673165 | ||
|
|
9a7b07befc | ||
|
|
2c3f352d0d | ||
|
|
7fbe9c062e | ||
|
|
c1d7683896 | ||
|
|
b493c2ce89 | ||
|
|
82436f30e1 | ||
|
|
f549e0e2d4 | ||
|
|
5494c43290 | ||
|
|
f5d5457100 | ||
|
|
d6cbb58e7e | ||
|
|
dbb0f599fc | ||
|
|
dcc0b82210 | ||
|
|
a92675e125 | ||
|
|
7cbe5bfd2f | ||
|
|
69c4c7a3b8 | ||
|
|
3b32c72d63 | ||
|
|
0102ce8fad | ||
|
|
0b9bb9df2b | ||
|
|
78dd64c73d | ||
|
|
750cc619fb | ||
|
|
6eaa3a27f2 | ||
|
|
17e16498b6 | ||
|
|
3f3358d0b1 | ||
|
|
c006005cc7 | ||
|
|
6cd12bf84d | ||
|
|
a09f5d41f6 | ||
|
|
8aaa49c80d | ||
|
|
4f1db04224 | ||
|
|
dbeee33657 | ||
|
|
cd245f7f59 | ||
|
|
246dd2b0ad | ||
|
|
20fa2c6f3d | ||
|
|
9cb021ffa0 | ||
|
|
2acb8f2a37 | ||
|
|
b044d244d0 | ||
|
|
807b1b5eb0 | ||
|
|
819178b280 | ||
|
|
039898c654 | ||
|
|
854985e5b5 | ||
|
|
6e78384bcf | ||
|
|
47501ab8e1 | ||
|
|
682de71ab7 | ||
|
|
410ea059fc | ||
|
|
b7870d059c | ||
|
|
06865f1561 | ||
|
|
fe0b54cfb4 | ||
|
|
0bf7bb4b39 | ||
|
|
2a830b6b68 | ||
|
|
fc620f8ba8 | ||
|
|
315977e1f2 | ||
|
|
e7658b75ef | ||
|
|
8c3fac977e | ||
|
|
be2ee1a07c | ||
|
|
a4f7207089 | ||
|
|
aead997b13 | ||
|
|
2d421e66dc | ||
|
|
e8370f1348 | ||
|
|
16f6baf216 | ||
|
|
89ab959fb4 | ||
|
|
b13b86b67a | ||
|
|
b9a7efc25b | ||
|
|
3b7f13babd | ||
|
|
6cc31a9422 | ||
|
|
592a01f3e4 | ||
|
|
db718a1781 | ||
|
|
261bf005f6 | ||
|
|
e926ff2a16 | ||
|
|
8794bfd79a | ||
|
|
500643aec7 | ||
|
|
58bb6c4357 | ||
|
|
520142427d | ||
|
|
369d726a96 | ||
|
|
e0beba38af | ||
|
|
ebe3f457c6 | ||
|
|
6289e540b8 | ||
|
|
e0bd82d7ff | ||
|
|
5ec4b89caa | ||
|
|
5fd3e236e2 | ||
|
|
399037b866 | ||
|
|
2d941f6264 | ||
|
|
1a8d93b946 | ||
|
|
50783e65a9 | ||
|
|
606e9bf97c | ||
|
|
47ae75a9d6 | ||
|
|
25587e317a | ||
|
|
b3ba129fc5 | ||
|
|
746b7b5c88 | ||
|
|
db2f6ec78d | ||
|
|
96bcabff8b | ||
|
|
0a1fe857dc | ||
|
|
49aaa55172 | ||
|
|
e03e251541 | ||
|
|
f5380881f4 | ||
|
|
a022778fb6 | ||
|
|
8543a99fba | ||
|
|
997888fe85 | ||
|
|
94a2e13561 | ||
|
|
f7041022d0 | ||
|
|
2d2030ecdf | ||
|
|
a3dec3a47e | ||
|
|
eb348120d9 | ||
|
|
27cb708d40 | ||
|
|
36bbe430d4 | ||
|
|
80952e091d | ||
|
|
760ac5dd8f | ||
|
|
dd76d2eabc | ||
|
|
92966dc57c | ||
|
|
e3d3407de5 | ||
|
|
f3d860e8fa | ||
|
|
1edd7126fd | ||
|
|
a57668bd15 | ||
|
|
a324b58f55 | ||
|
|
214225c08d | ||
|
|
05b5894348 | ||
|
|
c528dba0ea | ||
|
|
105c7d438a | ||
|
|
2b3a302a5f | ||
|
|
1c00e167ca | ||
|
|
861ee5049a | ||
|
|
c1fe588de4 | ||
|
|
8fa2dac261 | ||
|
|
f0ae31f455 | ||
|
|
dc7d64fb88 | ||
|
|
62df244db7 | ||
|
|
84a257faf4 | ||
|
|
34620a448e | ||
|
|
2b4d6f4aa0 | ||
|
|
e54d63576f | ||
|
|
7e505fc68f | ||
|
|
9c323aba91 | ||
|
|
ae9671bff0 | ||
|
|
d256f05787 | ||
|
|
02419f8b07 | ||
|
|
ddeb2a5c14 | ||
|
|
8973b73bfa | ||
|
|
4557bab3c4 | ||
|
|
6e185b580c | ||
|
|
a9ba05bf5e | ||
|
|
4e73880d4a | ||
|
|
0bb148844d | ||
|
|
e53b207148 | ||
|
|
7c9b812a5b | ||
|
|
afc639ab4b | ||
|
|
afebdce1f8 | ||
|
|
2ca4c3042a | ||
|
|
a8226ba4c8 | ||
|
|
e34b2d1392 | ||
|
|
6bee5828a0 | ||
|
|
8a5cc5b17d | ||
|
|
4e563c6130 | ||
|
|
01cf3c67a6 | ||
|
|
36315c5151 | ||
|
|
9f951f261d | ||
|
|
4c8907c629 | ||
|
|
223791cea7 | ||
|
|
de6e96b952 | ||
|
|
9dd6856872 | ||
|
|
ed4753e968 | ||
|
|
1a4635df16 | ||
|
|
1390af20b6 | ||
|
|
1427cf57a8 | ||
|
|
d70243b4c0 | ||
|
|
8f63dd4ba6 | ||
|
|
c7e1c917c3 | ||
|
|
8758c77ac0 | ||
|
|
dba496471e | ||
|
|
125facfbb6 | ||
|
|
16b74ff53c | ||
|
|
9297e98ac3 | ||
|
|
b521d7bee1 | ||
|
|
4e96c5e5ee | ||
|
|
ec819220b7 | ||
|
|
3d3a5f420e | ||
|
|
9c9c9d4387 | ||
|
|
82d09a536d | ||
|
|
6e49adea33 | ||
|
|
f85afdbc70 | ||
|
|
563028a5b3 | ||
|
|
d5c317b88b | ||
|
|
c59ec9da10 | ||
|
|
3a675836da | ||
|
|
7e0fc81246 | ||
|
|
f970f932c7 | ||
|
|
52d2741f52 | ||
|
|
7bc6765cac | ||
|
|
85b2aea6e9 | ||
|
|
c6ba5481d9 | ||
|
|
81f47d5632 | ||
|
|
9b1440ed2c | ||
|
|
2a8dcee028 | ||
|
|
277ba3643c | ||
|
|
e5fbaf60f3 | ||
|
|
0deb854e1b | ||
|
|
8268e3ec1b | ||
|
|
af91da6a28 | ||
|
|
9a15a65ad5 | ||
|
|
0cbe9f81c8 | ||
|
|
42afd2dd54 | ||
|
|
315929f31c | ||
|
|
358aa80280 | ||
|
|
1dd9e11994 | ||
|
|
5a8f02c944 | ||
|
|
f248a5b677 | ||
|
|
e4a49c5529 | ||
|
|
449b44ba50 | ||
|
|
a00eec402e | ||
|
|
717779f742 | ||
|
|
6f843bd24d | ||
|
|
d79fbea433 | ||
|
|
4d22c10ddb | ||
|
|
1ea92a6092 | ||
|
|
66eba84d06 | ||
|
|
92e39b5d1d | ||
|
|
0ddc47f473 | ||
|
|
ddfeca6947 | ||
|
|
6bd2e90cfd | ||
|
|
82505ddb01 | ||
|
|
2790d1d308 | ||
|
|
11e503a022 | ||
|
|
6fe49380ba | ||
|
|
1f2e267e3d | ||
|
|
4cf6783622 | ||
|
|
82d77a7bac | ||
|
|
841a927033 | ||
|
|
5a16561954 | ||
|
|
e2cc51908b | ||
|
|
1390e04435 | ||
|
|
84d961cbab | ||
|
|
87b9d3915c | ||
|
|
c38d17563d | ||
|
|
0c2af85ac0 |
20
.github/workflows/gradle_build.yml
vendored
20
.github/workflows/gradle_build.yml
vendored
@@ -13,27 +13,31 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up JDK 8
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '17'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
|
cache: gradle
|
||||||
|
|
||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
run: chmod +x gradlew
|
run: chmod +x gradlew
|
||||||
|
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: ./gradlew build
|
run: ./gradlew build -Pmod_version="$(git describe --always --tags --first-parent | cut -c2-)"
|
||||||
|
|
||||||
- name: Archive Artifacts
|
- name: Archive Artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Artifacts
|
name: Artifacts
|
||||||
path: dist/
|
path: dist/
|
||||||
|
|
||||||
- name: Archive mapping.txt
|
- name: Archive mapping.txt
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Mappings
|
name: Mappings
|
||||||
path: build/tmp/proguard/mapping.txt
|
path: mapping/
|
||||||
|
|||||||
8
.github/workflows/run_tests.yml
vendored
8
.github/workflows/run_tests.yml
vendored
@@ -11,11 +11,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up JDK 8
|
- name: Set up JDK 17
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
java-version: '17'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
|
|
||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
|
|||||||
12
.gitignore
vendored
12
.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
run/
|
run/
|
||||||
autotest/
|
autotest/
|
||||||
dist/
|
dist/
|
||||||
|
volderyarn/
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
build/
|
build/
|
||||||
@@ -11,6 +12,8 @@ build/
|
|||||||
classes/
|
classes/
|
||||||
*.class
|
*.class
|
||||||
|
|
||||||
|
/out
|
||||||
|
|
||||||
# IntelliJ Files
|
# IntelliJ Files
|
||||||
.idea/
|
.idea/
|
||||||
*.iml
|
*.iml
|
||||||
@@ -18,6 +21,9 @@ classes/
|
|||||||
*.iws
|
*.iws
|
||||||
/logs/
|
/logs/
|
||||||
|
|
||||||
|
tweaker/logs/
|
||||||
|
common/logs/
|
||||||
|
|
||||||
# Eclipse Files
|
# Eclipse Files
|
||||||
.classpath
|
.classpath
|
||||||
.project
|
.project
|
||||||
@@ -29,6 +35,12 @@ baritone_Client.launch
|
|||||||
!/.idea/copyright/profiles_settings.xml
|
!/.idea/copyright/profiles_settings.xml
|
||||||
|
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
|
.architectury-transformer
|
||||||
|
|
||||||
|
|
||||||
|
mapping
|
||||||
|
|
||||||
libs/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
|
libs/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
|
||||||
libs/java-objc-bridge-1.1.jar
|
libs/java-objc-bridge-1.1.jar
|
||||||
|
|
||||||
|
mapping
|
||||||
|
|||||||
14
.gitlab-ci.yml
Normal file
14
.gitlab-ci.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
image: java:8
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- which java
|
||||||
|
- which javac
|
||||||
|
|
||||||
|
build:
|
||||||
|
script:
|
||||||
|
- ./gradlew build
|
||||||
|
- ./gradlew build -Pbaritone.forge_build
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- dist/*
|
||||||
|
expire_in: 1 week
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
FROM debian:stretch
|
FROM ubuntu:focal
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
RUN apt update -y
|
RUN apt update -y
|
||||||
|
|
||||||
RUN apt install \
|
RUN apt install \
|
||||||
openjdk-8-jdk \
|
openjdk-17-jdk \
|
||||||
|
git \
|
||||||
--assume-yes
|
--assume-yes
|
||||||
|
|
||||||
COPY . /code
|
COPY . /code
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -8,12 +8,13 @@
|
|||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.13.2-yellow.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.13.2-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.14.4-yellow.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.14.4-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.15.2-yellow.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.15.2-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.16.5-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.16.5-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.17.1-yellow.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.17.1-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.18.2-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.18.2-yellow.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.19.2-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.19.2-brightgreen.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.19.4-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.19.4-brightgreen.svg" alt="Minecraft"/></a>
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.20.1-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.20.1-brightgreen.svg" alt="Minecraft"/></a>
|
||||||
|
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.21.3-brightgreen.svg" alt="Minecraft"/></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -31,7 +32,8 @@
|
|||||||
<a href="https://github.com/cabaletta/baritone/commit/"><img src="https://img.shields.io/github/commits-since/cabaletta/baritone/v1.0.0.svg" alt="GitHub commits"/></a>
|
<a href="https://github.com/cabaletta/baritone/commit/"><img src="https://img.shields.io/github/commits-since/cabaletta/baritone/v1.0.0.svg" alt="GitHub commits"/></a>
|
||||||
<img src="https://img.shields.io/github/languages/code-size/cabaletta/baritone.svg" alt="Code size"/>
|
<img src="https://img.shields.io/github/languages/code-size/cabaletta/baritone.svg" alt="Code size"/>
|
||||||
<img src="https://img.shields.io/github/repo-size/cabaletta/baritone.svg" alt="GitHub repo size"/>
|
<img src="https://img.shields.io/github/repo-size/cabaletta/baritone.svg" alt="GitHub repo size"/>
|
||||||
<img src="https://tokei.rs/b1/github/cabaletta/baritone?category=code" alt="Lines of Code"/>
|
<img src="https://tokei.rs/b1/github/cabaletta/baritone?category=code&style=flat" alt="Lines of Code"/>
|
||||||
|
<img src="https://img.shields.io/badge/Badges-36-blue.svg" alt="yes"/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -45,8 +47,8 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="http://forthebadge.com/"><img src="https://forthebadge.com/images/badges/built-with-swag.svg" alt="forthebadge"/></a>
|
<a href="http://forthebadge.com/"><img src="https://web.archive.org/web/20230604002050/https://forthebadge.com/images/badges/built-with-swag.svg" alt="forthebadge"/></a>
|
||||||
<a href="http://forthebadge.com/"><img src="https://forthebadge.com/images/badges/mom-made-pizza-rolls.svg" alt="forthebadge"/></a>
|
<a href="http://forthebadge.com/"><img src="https://web.archive.org/web/20230604002050/https://forthebadge.com/images/badges/mom-made-pizza-rolls.svg" alt="forthebadge"/></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
A Minecraft pathfinder bot.
|
A Minecraft pathfinder bot.
|
||||||
@@ -59,16 +61,21 @@ Baritone is the pathfinding system used in [Impact](https://impactclient.net/) s
|
|||||||
|
|
||||||
| Forge | Fabric |
|
| Forge | Fabric |
|
||||||
|---------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
|
|---------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
|
||||||
| [1.12.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.2.17/baritone-api-forge-1.2.17.jar) | |
|
| [1.12.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.2.19/baritone-api-forge-1.2.19.jar) | |
|
||||||
| [1.16.5 Forge](https://github.com/cabaletta/baritone/releases/download/v1.6.4/baritone-api-forge-1.6.4.jar) | [1.16.5 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.6.4/baritone-api-fabric-1.6.4.jar) |
|
| [1.16.5 Forge](https://github.com/cabaletta/baritone/releases/download/v1.6.5/baritone-api-forge-1.6.5.jar) | [1.16.5 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.6.5/baritone-api-fabric-1.6.5.jar) |
|
||||||
| [1.17.1 Forge](https://github.com/cabaletta/baritone/releases/download/v1.7.3/baritone-api-forge-1.7.3.jar) | [1.17.1 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.7.3/baritone-api-fabric-1.7.3.jar) |
|
| [1.17.1 Forge](https://github.com/cabaletta/baritone/releases/download/v1.7.3/baritone-api-forge-1.7.3.jar) | [1.17.1 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.7.3/baritone-api-fabric-1.7.3.jar) |
|
||||||
| [1.18.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.8.4/baritone-api-forge-1.8.4.jar) | [1.18.2 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.8.4/baritone-api-fabric-1.8.4.jar) |
|
| [1.18.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.8.6/baritone-api-forge-1.8.6.jar) | [1.18.2 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.8.6/baritone-api-fabric-1.8.6.jar) |
|
||||||
| [1.19.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.4/baritone-api-forge-1.9.4.jar) | [1.19.2 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.4/baritone-api-fabric-1.9.4.jar) |
|
| [1.19.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.4/baritone-api-forge-1.9.4.jar) | [1.19.2 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.4/baritone-api-fabric-1.9.4.jar) |
|
||||||
| [1.19.3 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.1/baritone-api-forge-1.9.1.jar) | [1.19.3 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.1/baritone-api-fabric-1.9.1.jar) |
|
| [1.19.3 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.1/baritone-api-forge-1.9.1.jar) | [1.19.3 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.1/baritone-api-fabric-1.9.1.jar) |
|
||||||
| [1.19.4 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.3/baritone-api-forge-1.9.3.jar) | [1.19.4 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.3/baritone-api-fabric-1.9.3.jar) |
|
| [1.19.4 Forge](https://github.com/cabaletta/baritone/releases/download/v1.9.3/baritone-api-forge-1.9.3.jar) | [1.19.4 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.9.3/baritone-api-fabric-1.9.3.jar) |
|
||||||
| [1.20.1 Forge](https://github.com/cabaletta/baritone/releases/download/v1.10.1/baritone-api-forge-1.10.1.jar) | [1.20.1 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.10.1/baritone-api-fabric-1.10.1.jar) |
|
| [1.20.1 Forge](https://github.com/cabaletta/baritone/releases/download/v1.10.1/baritone-api-forge-1.10.1.jar) | [1.20.1 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.10.1/baritone-api-fabric-1.10.1.jar) |
|
||||||
|
| [1.20.3 Forge](https://github.com/cabaletta/baritone/releases/download/v1.10.2/baritone-api-forge-1.10.2.jar) | [1.20.3 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.10.2/baritone-api-fabric-1.10.2.jar) |
|
||||||
|
| [1.20.4 Forge](https://github.com/cabaletta/baritone/releases/download/v1.10.2/baritone-api-forge-1.10.2.jar) | [1.20.4 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.10.2/baritone-api-fabric-1.10.2.jar) |
|
||||||
|
| [1.21.3 Forge](https://github.com/cabaletta/baritone/releases/download/v1.11.1/baritone-api-forge-1.11.1.jar) | [1.21.3 Fabric](https://github.com/cabaletta/baritone/releases/download/v1.11.1/baritone-api-fabric-1.11.1.jar) |
|
||||||
|
|
||||||
**How to immediately get started:** Type `#goto 1000 500` in chat to go to x=1000 z=500. Type `#mine diamond_ore` to mine diamond ore. Type `#stop` to stop. For more, read [the usage page](USAGE.md) and/or watch this [tutorial playlist](https://www.youtube.com/playlist?list=PLnwnJ1qsS7CoQl9Si-RTluuzCo_4Oulpa)
|
**Message for 2b2t players looking for 1.19/1.20 Baritone** If you like, please try the beta for Baritone Elytra for 2b2t, find it in #announcements of [the Baritone discord](http://discord.gg/s6fRBAUpmr). It supports 1.19.4 and 1.20.1, Forge or Fabric. If you have to see it to believe it, watch [this YouTube video](https://youtu.be/NnSlQi-68eQ).
|
||||||
|
|
||||||
|
**How to immediately get started:** Type `#goto 1000 500` in chat to go to x=1000 z=500. Type `#mine diamond_ore` to mine diamond ore. Type `#stop` to stop. For more, read [the usage page](USAGE.md) and/or watch this [tutorial playlist](https://www.youtube.com/playlist?list=PLnwnJ1qsS7CoQl9Si-RTluuzCo_4Oulpa). Also try `#elytra` for Elytra flying in the Nether using fireworks.
|
||||||
|
|
||||||
For other versions of Minecraft or more complicated situations or for development, see [Installation & setup](SETUP.md). Also consider just installing [Impact](https://impactclient.net/), which comes with Baritone and is easier to install than wrangling with version JSONs and zips. For 1.16.5, [click here](https://www.youtube.com/watch?v=_4eVJ9Qz2J8) and see description. Once Baritone is installed, look [here](USAGE.md) for instructions on how to use it. There's a [showcase video](https://youtu.be/CZkLXWo4Fg4) made by @Adovin#6313 on Baritone which I recommend.
|
For other versions of Minecraft or more complicated situations or for development, see [Installation & setup](SETUP.md). Also consider just installing [Impact](https://impactclient.net/), which comes with Baritone and is easier to install than wrangling with version JSONs and zips. For 1.16.5, [click here](https://www.youtube.com/watch?v=_4eVJ9Qz2J8) and see description. Once Baritone is installed, look [here](USAGE.md) for instructions on how to use it. There's a [showcase video](https://youtu.be/CZkLXWo4Fg4) made by @Adovin#6313 on Baritone which I recommend.
|
||||||
|
|
||||||
|
|||||||
81
SETUP.md
81
SETUP.md
@@ -1,78 +1,87 @@
|
|||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
The easiest way to install Baritone is to install [Impact](https://impactclient.net/), which comes with Baritone.
|
The easiest way to install Baritone is to install it as Forge/Neoforge/Fabric mod, but if you know how you can also use with a custom `version.json`
|
||||||
|
(Examples: [1.14.4](https://www.dropbox.com/s/rkml3hjokd3qv0m/1.14.4-Baritone.zip?dl=1), [1.15.2](https://www.dropbox.com/s/8rx6f0kts9hvd4f/1.15.2-Baritone.zip?dl=1), [1.16.5](https://www.dropbox.com/s/i6f292o2i7o9acp/1.16.5-Baritone.zip?dl=1)).
|
||||||
You can also use a custom version json for Minecraft, with the [1.14.4](https://www.dropbox.com/s/rkml3hjokd3qv0m/1.14.4-Baritone.zip?dl=1) version or the [1.15.2](https://www.dropbox.com/s/8rx6f0kts9hvd4f/1.15.2-Baritone.zip?dl=1) version or the [1.16.5](https://www.dropbox.com/s/i6f292o2i7o9acp/1.16.5-Baritone.zip?dl=1) version.
|
|
||||||
|
|
||||||
Once Baritone is installed, look [here](USAGE.md) for instructions on how to use it.
|
Once Baritone is installed, look [here](USAGE.md) for instructions on how to use it.
|
||||||
|
|
||||||
## Prebuilt official releases
|
## Prebuilt official releases
|
||||||
These releases are not always completely up to date with latest features, and are only released from `master`. (so if you want `backfill-2` branch for example, you'll have to build it yourself)
|
Releases are made rarely and are not always up to date with the latest features and bug fixes.
|
||||||
|
|
||||||
Link to the releases page: [Releases](https://github.com/cabaletta/baritone/releases)
|
Link to the releases page: [Releases](https://github.com/cabaletta/baritone/releases)
|
||||||
|
|
||||||
v1.2.* is for 1.12.2, v1.3.* is for 1.13.2, v1.4.* is for 1.14.4, v1.5.* is for 1.15.2, v1.6.* is for 1.16.5, v1.7.* is for 1.17.1, v1.8.* is for 1.18.1
|
The mapping between major Minecraft versions and major Baritone versions is as follows
|
||||||
|
| Minecraft version | 1.12 | 1.13 | 1.14 | 1.15 | 1.16 | 1.17 | 1.18 | 1.19 | 1.20 | 1.21 |
|
||||||
|
|-------------------|------|------|------|------|------|------|------|------|-------|-------|
|
||||||
|
| Baritone version | v1.2 | v1.3 | v1.4 | v1.5 | v1.6 | v1.7 | v1.8 | v1.9 | v1.10 | v1.11 |
|
||||||
|
|
||||||
Any official release will be GPG signed by leijurv (44A3EA646EADAC6A). Please verify that the hash of the file you download is in `checksums.txt` and that `checksums_signed.asc` is a valid signature by that public keys of `checksums.txt`.
|
Any official release will be GPG signed by leijurv (44A3EA646EADAC6A). Please verify that the hash of the file you download is in `checksums.txt` and that `checksums_signed.asc` is a valid signature by that public keys of `checksums.txt`.
|
||||||
|
|
||||||
The build is fully deterministic and reproducible, and you can verify Travis did it properly by running `docker build --no-cache -t cabaletta/baritone .` yourself and comparing the shasum. This works identically on Travis, Mac, and Linux (if you have docker on Windows, I'd be grateful if you could let me know if it works there too).
|
The build is fully deterministic and reproducible, and you can verify that by running `docker build --no-cache -t cabaletta/baritone .` yourself and comparing the shasum. This works identically on Travis, Mac, and Linux (if you have docker on Windows, I'd be grateful if you could let me know if it works there too).
|
||||||
|
|
||||||
|
|
||||||
## Artifacts
|
## Artifacts
|
||||||
|
|
||||||
Building Baritone will result in 5 artifacts created in the ``dist`` directory. These are the same as the artifacts created in the [releases](https://github.com/cabaletta/baritone/releases).
|
Building Baritone will create the final artifacts in the ``dist`` directory. These are the same as the artifacts created in the [releases](https://github.com/cabaletta/baritone/releases).
|
||||||
|
|
||||||
**The Forge and Fabric releases can simply be added as a Forge/Fabric mods.**
|
**The Forge, NeoForge and Fabric releases can simply be added as a Forge/Neoforge/Fabric mods.**
|
||||||
|
|
||||||
If another one of your Forge mods has a Baritone integration, you want `baritone-api-forge-VERSION.jar`. Otherwise, you want `baritone-standalone-forge-VERSION.jar`
|
If another one of your other mods has a Baritone integration, you want `baritone-api-*-VERSION.jar`.
|
||||||
|
If you want to report a bug and spare us some effort, you want `baritone-unoptimized-*-VERSION.jar`.
|
||||||
|
Otherwise, you want `baritone-standalone-*-VERSION.jar`
|
||||||
|
|
||||||
|
Here's what the various qualifiers mean
|
||||||
- **API**: Only the non-api packages are obfuscated. This should be used in environments where other mods would like to use Baritone's features.
|
- **API**: Only the non-api packages are obfuscated. This should be used in environments where other mods would like to use Baritone's features.
|
||||||
- **Forge/Fabric API**: Same as API, but packaged for Forge/Fabric. This should be used where another mod has a Baritone integration.
|
- **Standalone**: Everything is obfuscated. Other mods cannot use Baritone, but you get a bit of extra performance.
|
||||||
- **Standalone**: Everything is obfuscated. This should be used in environments where there are no other mods present that would like to use Baritone's features.
|
- **Unoptimized**: Nothing is obfuscated. This shouldn't be used in production, but is really helpful for crash reports.
|
||||||
- **Forge/Fabric Standalone**: Same as Standalone, but packaged for Forge/Fabric. This should be used when Baritone is your only Forge/Fabric mod, or none of your other Forge/Fabric mods integrate with Baritone.
|
|
||||||
- **Unoptimized**: Nothing is obfuscated. This shouldn't be used ever in production.
|
- **No loader**: Loadable as a launchwrapper tweaker against vanilla Minecraft using a custom `version.json`.
|
||||||
- **Forge/Fabric Unoptimized**: Same as Unoptimized, but packaged for Forge/Fabric.
|
- **Forge/Neoforge/Fabric**: Loadable as a standard mod using the respective loader. The fabric build may or may not work on Quilt.
|
||||||
|
|
||||||
|
If you build from source you will also find mapping files in the `dist` directory. These contain the renamings done by ProGuard and are useful if you want to read obfuscated stack traces.
|
||||||
|
|
||||||
## Build it yourself
|
## Build it yourself
|
||||||
- Clone or download Baritone
|
- Clone or download Baritone
|
||||||
|
|
||||||

|

|
||||||
- If you choose to download, make sure you extract the ZIP archive.
|
- If you choose to download, make sure you download the correct branch and extract the ZIP archive.
|
||||||
- Follow one of the instruction sets below, based on your preference
|
- Follow one of the instruction sets below, based on your preference
|
||||||
|
|
||||||
## Command Line
|
## Command Line
|
||||||
On Mac OSX and Linux, use `./gradlew` instead of `gradlew`.
|
On Mac OSX and Linux, use `./gradlew` instead of `gradlew`.
|
||||||
|
|
||||||
If you have errors with a package missing please make sure you have setup your environment, and are using Oracle JDK 8 for 1.12.2-1.16.5, JDK 16+ for 1.17.1, and JDK 17+ for 1.18.1.
|
The recommended Java versions by Minecraft version are
|
||||||
|
| Minecraft version | Java version |
|
||||||
To check which java you are using do
|
|-------------------------------|---------------|
|
||||||
`java -version` in a command prompt or terminal.
|
| 1.12.2 - 1.16.5 | 8 |
|
||||||
If you are using anything above OpenJDK 8 for 1.12.2-1.16.5, it might not work because the Java distributions above JDK 8 using may not have the needed javax classes.
|
| 1.17.1 | 16 |
|
||||||
|
| 1.18.2 - 1.20.4 | 17 |
|
||||||
|
| 1.20.5 - 1.21.4 | 21 |
|
||||||
|
|
||||||
Download java: https://adoptium.net/
|
Download java: https://adoptium.net/
|
||||||
#### macOS guide
|
|
||||||
In order to get JDK 8, Try running the following command:
|
|
||||||
`% /usr/libexec/java_home -V`
|
|
||||||
If it doesn't work try this guide: https://stackoverflow.com/questions/46513639/how-to-downgrade-java-from-9-to-8-on-a-macos-eclipse-is-not-running-with-java-9
|
|
||||||
|
|
||||||
If you see something like
|
To check which java version you are using do `java -version` in a command prompt or terminal.
|
||||||
|
|
||||||
`% 1.8.0_VERSION, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_VERSION.jdk/Contents/Home`
|
|
||||||
|
|
||||||
in the list then you've got JDK 8 installed.
|
|
||||||
In order to get JDK 8 running in the **current terminal window** you will have to run this command:
|
|
||||||
|
|
||||||
`% export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)`
|
|
||||||
|
|
||||||
To add OpenJDK 8 to your PATH add the export line to the end of your `.zshrc / .bashrc` if you want it to apply to each new terminal. If you're using bash change the .bachrc and if you're using zsh change the .zshrc
|
|
||||||
|
|
||||||
### Building Baritone
|
### Building Baritone
|
||||||
|
|
||||||
These tasks depend on the minecraft version, but are (for the most part) standard for building mods.
|
These tasks depend on the minecraft version, but are (for the most part) standard for building mods.
|
||||||
|
|
||||||
for more details, see [the build ci action](/.github/workflows/gradle_build.yml)
|
For more details, see [the build ci action](/.github/workflows/gradle_build.yml) of the branch you want to build.
|
||||||
|
|
||||||
|
For most branches `gradlew build` should build everything, but there are exceptions and this file might be out of date.
|
||||||
|
|
||||||
|
More specifically, on older branches the setup used to be that `gradlew build` builds the tweaker jar
|
||||||
|
and `gradlew build -Pbaritone.forge_build` / `gradlew build -Pbaritone.fabric_build` are needed to build
|
||||||
|
for Forge/Fabric instead. And you might have to run `setupDecompWorkspace` first.
|
||||||
|
|
||||||
## IntelliJ
|
## IntelliJ
|
||||||
- Open the project in IntelliJ as a Gradle project
|
- Open the project in IntelliJ as a Gradle project
|
||||||
- Refresh the Gradle project (or, to be safe, just restart IntelliJ)
|
- Refresh the Gradle project (or, to be safe, just restart IntelliJ)
|
||||||
- depending on the minecraft version, you may need to run `setupDecompWorkspace` or `genIntellijRuns` in order to get everything working
|
- Depending on the minecraft version, you may need to run `setupDecompWorkspace` or `genIntellijRuns` in order to get everything working
|
||||||
|
|
||||||
|
## Github Actions
|
||||||
|
Most branches have a CI workflow at `.github/workflows/gradle_build.yml`. If you fork this repository and enable actions for your fork
|
||||||
|
you can push a dummy commit to trigger it and have GitHub build Baritone for you.
|
||||||
|
|
||||||
|
If the commit you want to build is less than 90 days old, you can also find the corresponding workflow run in
|
||||||
|
[this list](https://github.com/cabaletta/baritone/actions/workflows/gradle_build.yml) and download the artifacts from there.
|
||||||
|
|||||||
248
build.gradle
248
build.gradle
@@ -15,50 +15,110 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
group 'baritone'
|
allprojects {
|
||||||
version '1.2.17'
|
apply plugin: 'java'
|
||||||
|
apply plugin: "xyz.wagyourtail.unimined"
|
||||||
|
apply plugin: "maven-publish"
|
||||||
|
|
||||||
|
archivesBaseName = rootProject.archives_base_name
|
||||||
|
|
||||||
|
def vers = ""
|
||||||
|
try {
|
||||||
|
vers = 'git describe --always --tags --first-parent --dirty'.execute().text.trim()
|
||||||
|
} catch (Exception e) {
|
||||||
|
println "Version detection failed: " + e
|
||||||
|
}
|
||||||
|
if (!vers.startsWith("v")) {
|
||||||
|
println "using version number: " + rootProject.mod_version
|
||||||
|
version = rootProject.mod_version
|
||||||
|
} else {
|
||||||
|
version = vers.substring(1)
|
||||||
|
println "Detected version " + version
|
||||||
|
}
|
||||||
|
group = rootProject.maven_group
|
||||||
|
|
||||||
|
sourceCompatibility = targetCompatibility = JavaVersion.toVersion(project.java_version)
|
||||||
|
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion.set(JavaLanguageVersion.of(sourceCompatibility.majorVersion.toInteger()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buildscript {
|
|
||||||
repositories {
|
repositories {
|
||||||
maven {
|
maven {
|
||||||
name = 'forge'
|
name = 'spongepowered-repo'
|
||||||
url = 'https://files.minecraftforge.net/maven'
|
|
||||||
}
|
|
||||||
maven {
|
|
||||||
name = 'SpongePowered'
|
|
||||||
url = 'https://repo.spongepowered.org/repository/maven-public/'
|
url = 'https://repo.spongepowered.org/repository/maven-public/'
|
||||||
}
|
}
|
||||||
jcenter()
|
maven {
|
||||||
|
name = 'fabric-maven'
|
||||||
|
url = 'https://maven.fabricmc.net/'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'impactdevelopment-repo'
|
||||||
|
url = 'https://impactdevelopment.github.io/maven/'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = "ldtteam"
|
||||||
|
url = "https://maven.parchmentmc.net/"
|
||||||
|
}
|
||||||
|
// for the newer version of launchwrapper
|
||||||
|
maven {
|
||||||
|
name = "multimc-maven"
|
||||||
|
url = "https://files.multimc.org/maven/"
|
||||||
|
metadataSources {
|
||||||
|
artifact()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
name = 'babbaj-repo'
|
||||||
|
url = 'https://babbaj.github.io/maven/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:4.+' // TODO: 5.+. `doHackyStuff` relies on 4.x internals.
|
compileOnly "org.spongepowered:mixin:${project.mixin_version}"
|
||||||
classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
|
compileOnly "org.ow2.asm:asm:${project.asm_version}"
|
||||||
|
|
||||||
|
implementation "dev.babbaj:nether-pathfinder:${project.nether_pathfinder_version}"
|
||||||
|
}
|
||||||
|
|
||||||
|
unimined.minecraft(sourceSets.main, true) {
|
||||||
|
version rootProject.minecraft_version
|
||||||
|
|
||||||
|
mappings {
|
||||||
|
intermediary()
|
||||||
|
mojmap()
|
||||||
|
parchment("2023.10.22")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
it.options.encoding = "UTF-8"
|
||||||
|
|
||||||
|
def targetVersion = project.java_version.toInteger()
|
||||||
|
if (JavaVersion.current().isJava9Compatible()) {
|
||||||
|
it.options.release = targetVersion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import baritone.gradle.task.CreateDistTask
|
unimined.minecraft {
|
||||||
import baritone.gradle.task.ProguardTask
|
runs.off = true
|
||||||
|
defaultRemapJar = false
|
||||||
apply plugin: 'java'
|
|
||||||
apply plugin: 'maven-publish'
|
|
||||||
apply plugin: 'net.minecraftforge.gradle'
|
|
||||||
apply from: 'hacks.gradle'
|
|
||||||
ext.doHackyStuff(Class.forName('net.minecraftforge.gradle.mcp.task.GenerateSRG')) // TODO: fg 5.0 - `ext.doHackyStuff(Class.forName('net.minecraftforge.gradle.mcp.tasks.GenerateSRG'))`
|
|
||||||
apply plugin: 'org.spongepowered.mixin'
|
|
||||||
|
|
||||||
sourceCompatibility = targetCompatibility = '1.8'
|
|
||||||
compileJava {
|
|
||||||
sourceCompatibility = targetCompatibility = '1.8'
|
|
||||||
options.encoding = "UTF-8" // allow emoji in comments :^)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
archivesBaseName = archivesBaseName + "-common"
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
api {
|
api {
|
||||||
compileClasspath += main.compileClasspath
|
compileClasspath += main.compileClasspath
|
||||||
|
runtimeClasspath += main.runtimeClasspath
|
||||||
}
|
}
|
||||||
main {
|
main {
|
||||||
compileClasspath += api.output
|
compileClasspath += api.output
|
||||||
|
runtimeClasspath += api.output
|
||||||
}
|
}
|
||||||
test {
|
test {
|
||||||
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
@@ -68,120 +128,22 @@ sourceSets {
|
|||||||
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
runtimeClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
runtimeClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
}
|
}
|
||||||
|
|
||||||
schematica_api {
|
schematica_api {
|
||||||
compileClasspath += main.compileClasspath
|
compileClasspath += main.compileClasspath
|
||||||
|
runtimeClasspath += main.runtimeClasspath
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
compileClasspath += schematica_api.output
|
compileClasspath += schematica_api.output
|
||||||
}
|
runtimeClasspath += schematica_api.output
|
||||||
}
|
|
||||||
|
|
||||||
minecraft {
|
|
||||||
mappings channel: 'stable', version: '39-1.12'
|
|
||||||
runs {
|
|
||||||
def nativesOutput = extractNatives.output // TODO: fg 5.0 - `def nativesOutput = extractNatives.output.get()`
|
|
||||||
println("[Baritoe] Detected natives: ${nativesOutput}")
|
|
||||||
client {
|
|
||||||
workingDirectory project.file('run')
|
|
||||||
source sourceSets.launch
|
|
||||||
|
|
||||||
main 'net.minecraft.launchwrapper.Launch'
|
|
||||||
|
|
||||||
args '--gameDir', '.'
|
|
||||||
args '--version', '1.12.2'
|
|
||||||
args '--assetsDir', downloadAssets.output
|
|
||||||
args '--assetIndex', '{asset_index}'
|
|
||||||
args '--accessToken', 'INVALID'
|
|
||||||
|
|
||||||
args '--tweakClass', 'baritone.launch.BaritoneTweaker'
|
|
||||||
jvmArgs "-Dorg.lwjgl.librarypath=${nativesOutput}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
mavenCentral()
|
|
||||||
|
|
||||||
maven {
|
|
||||||
name = 'spongepowered-repo'
|
|
||||||
url = 'https://repo.spongepowered.org/repository/maven-public/'
|
|
||||||
}
|
|
||||||
|
|
||||||
maven {
|
|
||||||
name = 'impactdevelopment-repo'
|
|
||||||
url = 'https://impactdevelopment.github.io/maven/'
|
|
||||||
}
|
|
||||||
|
|
||||||
maven {
|
|
||||||
name = 'babbaj-repo'
|
|
||||||
url = 'https://babbaj.github.io/maven/'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix forge gradle 4+ bug with 1.12.2
|
|
||||||
afterEvaluate {
|
|
||||||
configurations.minecraft {
|
|
||||||
exclude group: 'net.minecraftforge', module: 'mergetool'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// lwjgl2 hack for running game on arm64 mac os
|
|
||||||
afterEvaluate {
|
|
||||||
def os = org.gradle.internal.os.OperatingSystem.current()
|
|
||||||
if (os.isMacOsX()) {
|
|
||||||
def arch = System.getProperty("os.arch").toLowerCase()
|
|
||||||
println("Detected Mac OS X running on ${arch}")
|
|
||||||
if (arch == "aarch64") {
|
|
||||||
println("Configurating aarch64 dependencies.")
|
|
||||||
|
|
||||||
configurations.minecraft {
|
|
||||||
exclude group: 'ca.weblite', module: 'java-objc-bridge'
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
// https://github.com/MinecraftMachina/lwjgl/releases/download/2.9.4-20150209-mmachina.2/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
|
|
||||||
minecraft files("libs/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar")
|
|
||||||
// TODO: use prism launcher maven
|
|
||||||
// https://github.com/MinecraftMachina/Java-Objective-C-Bridge/releases/download/1.1.0-mmachina.1/java-objc-bridge-1.1.jar
|
|
||||||
minecraft files("libs/java-objc-bridge-1.1.jar") // TODO: use prism launcher maven
|
|
||||||
minecraft(group: 'net.java.dev.jna', name: 'jna') {
|
|
||||||
version {
|
|
||||||
strictly '5.12.1'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
minecraft group: 'net.minecraft', name: 'joined', version: '1.12.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
implementation(group: 'net.minecraft', name: 'launchwrapper', version: '1.12') {
|
|
||||||
transitive = false
|
|
||||||
}
|
|
||||||
|
|
||||||
def asmVersion = '9.5'
|
|
||||||
implementation group: 'org.ow2.asm', name: 'asm', version: asmVersion
|
|
||||||
implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
|
|
||||||
implementation group: 'org.ow2.asm', name: 'asm-commons', version: asmVersion
|
|
||||||
implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
|
|
||||||
implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
|
|
||||||
|
|
||||||
launchImplementation('com.github.ImpactDevelopment:SimpleTweaker:1.2')
|
|
||||||
launchImplementation('org.spongepowered:mixin:0.7.11-SNAPSHOT') {
|
|
||||||
// Mixin includes a lot of dependencies that are too up-to-date
|
|
||||||
transitive = false
|
|
||||||
}
|
|
||||||
launchAnnotationProcessor 'org.spongepowered:mixin:0.8.4-SNAPSHOT:processor'
|
|
||||||
launchImplementation('dev.babbaj:nether-pathfinder:0.34')
|
|
||||||
implementation 'dev.babbaj:nether-pathfinder:0.34'
|
|
||||||
testImplementation 'junit:junit:4.12'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mixin {
|
jar {
|
||||||
add sourceSets.launch, 'mixins.baritone.refmap.json'
|
from sourceSets.main.output, sourceSets.launch.output, sourceSets.api.output
|
||||||
}
|
}
|
||||||
|
|
||||||
javadoc {
|
javadoc {
|
||||||
@@ -191,33 +153,3 @@ javadoc {
|
|||||||
source = sourceSets.api.allJava
|
source = sourceSets.api.allJava
|
||||||
classpath += sourceSets.api.compileClasspath
|
classpath += sourceSets.api.compileClasspath
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
|
||||||
from sourceSets.launch.output, sourceSets.api.output
|
|
||||||
|
|
||||||
if (!getProject().hasProperty("baritone.forge_build")) {
|
|
||||||
exclude "**/BaritoneForgeModXD.class"
|
|
||||||
exclude "**/mods.toml"
|
|
||||||
}
|
|
||||||
|
|
||||||
preserveFileTimestamps = false
|
|
||||||
reproducibleFileOrder = true
|
|
||||||
|
|
||||||
manifest {
|
|
||||||
attributes(
|
|
||||||
'MixinConfigs': 'mixins.baritone.json',
|
|
||||||
'TweakClass': 'baritone.launch.BaritoneTweaker',
|
|
||||||
'Implementation-Title': 'Baritone',
|
|
||||||
'Implementation-Version': version
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task proguard(type: ProguardTask) {
|
|
||||||
url 'https://downloads.sourceforge.net/project/proguard/proguard/6.0/proguard6.0.3.zip'
|
|
||||||
extract 'proguard6.0.3/lib/proguard.jar'
|
|
||||||
}
|
|
||||||
|
|
||||||
task createDist(type: CreateDistTask, dependsOn: proguard)
|
|
||||||
|
|
||||||
build.finalizedBy(createDist)
|
|
||||||
|
|||||||
@@ -16,10 +16,29 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
maven {
|
||||||
|
name = 'WagYourMaven'
|
||||||
|
url = 'https://maven.wagyourtail.xyz/releases'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'ForgeMaven'
|
||||||
|
url = 'https://maven.minecraftforge.net/'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'FabricMaven'
|
||||||
|
url = 'https://maven.fabricmc.net/'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'NeoForgedMaven'
|
||||||
|
url = 'https://maven.neoforged.net/'
|
||||||
|
}
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
|
implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.0'
|
||||||
implementation group: 'commons-io', name: 'commons-io', version: '2.6'
|
implementation group: 'commons-io', name: 'commons-io', version: '2.7'
|
||||||
|
|
||||||
|
implementation group: 'xyz.wagyourtail.unimined', name: 'xyz.wagyourtail.unimined.gradle.plugin', version: '1.0.5'
|
||||||
}
|
}
|
||||||
@@ -18,8 +18,12 @@
|
|||||||
package baritone.gradle.task;
|
package baritone.gradle.task;
|
||||||
|
|
||||||
import org.gradle.api.DefaultTask;
|
import org.gradle.api.DefaultTask;
|
||||||
|
import org.gradle.api.tasks.Input;
|
||||||
|
import org.gradle.api.tasks.Optional;
|
||||||
|
import org.gradle.api.tasks.TaskAction;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -32,45 +36,67 @@ import java.nio.file.Paths;
|
|||||||
class BaritoneGradleTask extends DefaultTask {
|
class BaritoneGradleTask extends DefaultTask {
|
||||||
|
|
||||||
protected static final String
|
protected static final String
|
||||||
PROGUARD_ZIP = "proguard.zip",
|
PROGUARD_ZIP = "proguard-%s.zip",
|
||||||
PROGUARD_JAR = "proguard.jar",
|
PROGUARD_JAR = "proguard-%s.jar",
|
||||||
PROGUARD_CONFIG_TEMPLATE = "scripts/proguard.pro",
|
PROGUARD_CONFIG_TEMPLATE = "scripts/proguard.pro",
|
||||||
PROGUARD_CONFIG_DEST = "template.pro",
|
PROGUARD_CONFIG_DEST = "template.pro",
|
||||||
PROGUARD_API_CONFIG = "api.pro",
|
PROGUARD_API_CONFIG = "api.pro",
|
||||||
PROGUARD_STANDALONE_CONFIG = "standalone.pro",
|
PROGUARD_STANDALONE_CONFIG = "standalone.pro",
|
||||||
PROGUARD_EXPORT_PATH = "proguard_out.jar",
|
PROGUARD_EXPORT_PATH = "proguard_out.jar",
|
||||||
|
PROGUARD_MAPPING_DIR = "mapping",
|
||||||
|
|
||||||
TEMP_LIBRARY_DIR = "tempLibraries/",
|
ARTIFACT_STANDARD = "%s-%s.jar",
|
||||||
|
ARTIFACT_UNOPTIMIZED = "%s-unoptimized-%s.jar",
|
||||||
ARTIFACT_STANDARD = "%s-%s.jar",
|
ARTIFACT_API = "%s-api-%s.jar",
|
||||||
ARTIFACT_UNOPTIMIZED = "%s-unoptimized-%s.jar",
|
ARTIFACT_STANDALONE = "%s-standalone-%s.jar";
|
||||||
ARTIFACT_API = "%s-api-%s.jar",
|
|
||||||
ARTIFACT_STANDALONE = "%s-standalone-%s.jar",
|
|
||||||
ARTIFACT_FORGE_API = "%s-api-forge-%s.jar",
|
|
||||||
ARTIFACT_FORGE_STANDALONE = "%s-standalone-forge-%s.jar";
|
|
||||||
|
|
||||||
protected String artifactName, artifactVersion;
|
protected String artifactName, artifactVersion;
|
||||||
protected Path artifactPath, artifactUnoptimizedPath, artifactApiPath, artifactStandalonePath, artifactForgeApiPath, artifactForgeStandalonePath, proguardOut;
|
protected Path
|
||||||
|
artifactPath,
|
||||||
|
artifactUnoptimizedPath, artifactApiPath, artifactStandalonePath, // these are different for forge builds
|
||||||
|
proguardOut;
|
||||||
|
|
||||||
protected void verifyArtifacts() throws IllegalStateException {
|
|
||||||
this.artifactName = getProject().getName();
|
@Input
|
||||||
this.artifactVersion = getProject().getVersion().toString();
|
@Optional
|
||||||
|
protected String compType = null;
|
||||||
|
|
||||||
|
public String getCompType() {
|
||||||
|
return compType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCompType(String compType) {
|
||||||
|
this.compType = compType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public BaritoneGradleTask() {
|
||||||
|
this.artifactName = getProject().getRootProject().getProperties().get("archives_base_name").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doFirst() {
|
||||||
|
if (compType != null) {
|
||||||
|
this.artifactVersion = compType + "-" + getProject().getVersion();
|
||||||
|
} else {
|
||||||
|
this.artifactVersion = getProject().getVersion().toString();
|
||||||
|
}
|
||||||
|
|
||||||
this.artifactPath = this.getBuildFile(formatVersion(ARTIFACT_STANDARD));
|
this.artifactPath = this.getBuildFile(formatVersion(ARTIFACT_STANDARD));
|
||||||
|
|
||||||
this.artifactUnoptimizedPath = this.getBuildFile(formatVersion(ARTIFACT_UNOPTIMIZED));
|
this.artifactUnoptimizedPath = this.getBuildFile(formatVersion(ARTIFACT_UNOPTIMIZED));
|
||||||
this.artifactApiPath = this.getBuildFile(formatVersion(ARTIFACT_API));
|
this.artifactApiPath = this.getBuildFile(formatVersion(ARTIFACT_API));
|
||||||
this.artifactStandalonePath = this.getBuildFile(formatVersion(ARTIFACT_STANDALONE));
|
this.artifactStandalonePath = this.getBuildFile(formatVersion(ARTIFACT_STANDALONE));
|
||||||
this.artifactForgeApiPath = this.getBuildFile(formatVersion(ARTIFACT_FORGE_API));
|
|
||||||
this.artifactForgeStandalonePath = this.getBuildFile(formatVersion(ARTIFACT_FORGE_STANDALONE));
|
|
||||||
|
|
||||||
this.proguardOut = this.getTemporaryFile(PROGUARD_EXPORT_PATH);
|
this.proguardOut = this.getTemporaryFile(PROGUARD_EXPORT_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void verifyArtifacts() throws IllegalStateException {
|
||||||
if (!Files.exists(this.artifactPath)) {
|
if (!Files.exists(this.artifactPath)) {
|
||||||
throw new IllegalStateException("Artifact not found! Run build first! " + this.artifactPath);
|
throw new IllegalStateException("Artifact not found! Run build first! Missing file: " + this.artifactPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void write(InputStream stream, Path file) throws Exception {
|
protected void write(InputStream stream, Path file) throws IOException {
|
||||||
if (Files.exists(file)) {
|
if (Files.exists(file)) {
|
||||||
Files.delete(file);
|
Files.delete(file);
|
||||||
}
|
}
|
||||||
@@ -82,7 +108,11 @@ class BaritoneGradleTask extends DefaultTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Path getRelativeFile(String file) {
|
protected Path getRelativeFile(String file) {
|
||||||
return Paths.get(this.getProject().file(file).getAbsolutePath());
|
return Paths.get(new File(getProject().getBuildDir(), file).getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Path getRootRelativeFile(String file) {
|
||||||
|
return Paths.get(new File(getProject().getRootDir(), file).getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Path getTemporaryFile(String file) {
|
protected Path getTemporaryFile(String file) {
|
||||||
@@ -90,6 +120,10 @@ class BaritoneGradleTask extends DefaultTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Path getBuildFile(String file) {
|
protected Path getBuildFile(String file) {
|
||||||
return getRelativeFile("build/libs/" + file);
|
return getRelativeFile("libs/" + file);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String addCompTypeFirst(String string) {
|
||||||
|
return compType == null ? string : compType + "-" + string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,15 @@ package baritone.gradle.task;
|
|||||||
|
|
||||||
import org.gradle.api.tasks.TaskAction;
|
import org.gradle.api.tasks.TaskAction;
|
||||||
|
|
||||||
import javax.xml.bind.DatatypeConverter;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.OpenOption;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
||||||
|
|
||||||
@@ -39,37 +41,40 @@ public class CreateDistTask extends BaritoneGradleTask {
|
|||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
protected void exec() throws Exception {
|
protected void exec() throws Exception {
|
||||||
|
super.doFirst();
|
||||||
super.verifyArtifacts();
|
super.verifyArtifacts();
|
||||||
|
|
||||||
// Define the distribution file paths
|
// Define the distribution file paths
|
||||||
Path api = getRelativeFile("dist/" + formatVersion(ARTIFACT_API));
|
Path api = getRootRelativeFile("dist/" + getFileName(artifactApiPath));
|
||||||
Path standalone = getRelativeFile("dist/" + formatVersion(ARTIFACT_STANDALONE));
|
Path standalone = getRootRelativeFile("dist/" + getFileName(artifactStandalonePath));
|
||||||
Path unoptimized = getRelativeFile("dist/" + formatVersion(ARTIFACT_UNOPTIMIZED));
|
Path unoptimized = getRootRelativeFile("dist/" + getFileName(artifactUnoptimizedPath));
|
||||||
Path forgeApi = getRelativeFile("dist/" + formatVersion(ARTIFACT_FORGE_API));
|
|
||||||
Path forgeStandalone = getRelativeFile("dist/" + formatVersion(ARTIFACT_FORGE_STANDALONE));
|
|
||||||
|
|
||||||
// NIO will not automatically create directories
|
// NIO will not automatically create directories
|
||||||
Path dir = getRelativeFile("dist/");
|
Path dir = getRootRelativeFile("dist/");
|
||||||
if (!Files.exists(dir)) {
|
if (!Files.exists(dir)) {
|
||||||
Files.createDirectory(dir);
|
Files.createDirectory(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy build jars to dist/
|
// Copy build jars to dist/
|
||||||
Files.copy(this.artifactApiPath, api, REPLACE_EXISTING);
|
// TODO: dont copy files that dont exist
|
||||||
Files.copy(this.artifactStandalonePath, standalone, REPLACE_EXISTING);
|
Files.copy(this.artifactApiPath, api, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactUnoptimizedPath, unoptimized, REPLACE_EXISTING);
|
Files.copy(this.artifactStandalonePath, standalone, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactForgeApiPath, forgeApi, REPLACE_EXISTING);
|
Files.copy(this.artifactUnoptimizedPath, unoptimized, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactForgeStandalonePath, forgeStandalone, REPLACE_EXISTING);
|
|
||||||
|
|
||||||
// Calculate all checksums and format them like "shasum"
|
// Calculate all checksums and format them like "shasum"
|
||||||
List<String> shasum = Stream.of(api, forgeApi, standalone, forgeStandalone, unoptimized)
|
List<String> shasum = Files.list(getRootRelativeFile("dist/"))
|
||||||
|
.filter(e -> e.getFileName().toString().endsWith(".jar"))
|
||||||
.map(path -> sha1(path) + " " + path.getFileName().toString())
|
.map(path -> sha1(path) + " " + path.getFileName().toString())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
shasum.forEach(System.out::println);
|
shasum.forEach(System.out::println);
|
||||||
|
|
||||||
// Write the checksums to a file
|
// Write the checksums to a file
|
||||||
Files.write(getRelativeFile("dist/checksums.txt"), shasum);
|
Files.write(getRootRelativeFile("dist/checksums.txt"), shasum);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getFileName(Path p) {
|
||||||
|
return p.getFileName().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static synchronized String sha1(Path path) {
|
private static synchronized String sha1(Path path) {
|
||||||
@@ -77,10 +82,22 @@ public class CreateDistTask extends BaritoneGradleTask {
|
|||||||
if (SHA1_DIGEST == null) {
|
if (SHA1_DIGEST == null) {
|
||||||
SHA1_DIGEST = MessageDigest.getInstance("SHA-1");
|
SHA1_DIGEST = MessageDigest.getInstance("SHA-1");
|
||||||
}
|
}
|
||||||
return DatatypeConverter.printHexBinary(SHA1_DIGEST.digest(Files.readAllBytes(path))).toLowerCase();
|
return bytesToHex(SHA1_DIGEST.digest(Files.readAllBytes(path))).toLowerCase();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// haha no thanks
|
// haha no thanks
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
|
||||||
|
|
||||||
|
public static String bytesToHex(byte[] bytes) {
|
||||||
|
byte[] hexChars = new byte[bytes.length * 2];
|
||||||
|
for (int j = 0; j < bytes.length; j++) {
|
||||||
|
int v = bytes[j] & 0xFF;
|
||||||
|
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
|
||||||
|
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
|
||||||
|
}
|
||||||
|
return new String(hexChars, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,30 +18,28 @@
|
|||||||
package baritone.gradle.task;
|
package baritone.gradle.task;
|
||||||
|
|
||||||
import baritone.gradle.util.Determinizer;
|
import baritone.gradle.util.Determinizer;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.gradle.api.plugins.JavaPluginConvention;
|
||||||
import org.gradle.api.Project;
|
|
||||||
import org.gradle.api.artifacts.Configuration;
|
|
||||||
import org.gradle.api.artifacts.Dependency;
|
|
||||||
import org.gradle.api.tasks.Input;
|
import org.gradle.api.tasks.Input;
|
||||||
|
import org.gradle.api.tasks.SourceSetContainer;
|
||||||
import org.gradle.api.tasks.TaskAction;
|
import org.gradle.api.tasks.TaskAction;
|
||||||
import org.gradle.api.tasks.TaskCollection;
|
import org.gradle.api.tasks.TaskCollection;
|
||||||
import org.gradle.api.tasks.compile.ForkOptions;
|
import org.gradle.api.tasks.compile.ForkOptions;
|
||||||
import org.gradle.api.tasks.compile.JavaCompile;
|
import org.gradle.api.tasks.compile.JavaCompile;
|
||||||
import org.gradle.internal.jvm.Jvm;
|
import org.gradle.internal.jvm.Jvm;
|
||||||
|
import org.gradle.jvm.toolchain.JavaLanguageVersion;
|
||||||
import java.io.File;
|
import org.gradle.jvm.toolchain.JavaLauncher;
|
||||||
import java.lang.reflect.Field;
|
import org.gradle.jvm.toolchain.JavaToolchainService;
|
||||||
import java.lang.reflect.Method;
|
import xyz.wagyourtail.unimined.api.UniminedExtension;
|
||||||
import java.nio.file.Path;
|
import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig;
|
||||||
import java.nio.file.StandardCopyOption;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.util.*;
|
import java.nio.file.Path;
|
||||||
import java.util.regex.Matcher;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.regex.Pattern;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
@@ -51,155 +49,145 @@ import java.util.zip.ZipFile;
|
|||||||
*/
|
*/
|
||||||
public class ProguardTask extends BaritoneGradleTask {
|
public class ProguardTask extends BaritoneGradleTask {
|
||||||
|
|
||||||
private static final Pattern TEMP_LIBRARY_PATTERN = Pattern.compile("-libraryjars 'tempLibraries\\/([a-zA-Z0-9/_\\-\\.]+)\\.jar'");
|
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
private String url;
|
private String proguardVersion;
|
||||||
|
|
||||||
@Input
|
public String getProguardVersion() {
|
||||||
private String extract;
|
return proguardVersion;
|
||||||
|
}
|
||||||
|
|
||||||
private List<String> requiredLibraries;
|
private List<String> requiredLibraries;
|
||||||
|
|
||||||
private File mixin;
|
|
||||||
private File pathfinder;
|
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
protected void exec() throws Exception {
|
protected void exec() throws Exception {
|
||||||
|
super.doFirst();
|
||||||
super.verifyArtifacts();
|
super.verifyArtifacts();
|
||||||
|
|
||||||
// "Haha brady why don't you make separate tasks"
|
// "Haha brady why don't you make separate tasks"
|
||||||
downloadProguard();
|
downloadProguard();
|
||||||
extractProguard();
|
extractProguard();
|
||||||
generateConfigs();
|
generateConfigs();
|
||||||
acquireDependencies();
|
|
||||||
processArtifact();
|
processArtifact();
|
||||||
proguardApi();
|
proguardApi();
|
||||||
proguardStandalone();
|
proguardStandalone();
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniminedExtension ext = getProject().getExtensions().getByType(UniminedExtension.class);
|
||||||
|
SourceSetContainer sourceSets = getProject().getExtensions().getByType(SourceSetContainer.class);
|
||||||
|
|
||||||
|
private File getMcJar() {
|
||||||
|
MinecraftConfig mcc = ext.getMinecrafts().get(sourceSets.getByName("main"));
|
||||||
|
return mcc.getMinecraft(mcc.getMcPatcher().getProdNamespace(), mcc.getMcPatcher().getProdNamespace()).toFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isMcJar(File f) {
|
||||||
|
MinecraftConfig mcc = ext.getMinecrafts().get(sourceSets.getByName("main"));
|
||||||
|
return mcc.isMinecraftJar(f.toPath());
|
||||||
|
}
|
||||||
|
|
||||||
private void processArtifact() throws Exception {
|
private void processArtifact() throws Exception {
|
||||||
if (Files.exists(this.artifactUnoptimizedPath)) {
|
if (Files.exists(this.artifactUnoptimizedPath)) {
|
||||||
Files.delete(this.artifactUnoptimizedPath);
|
Files.delete(this.artifactUnoptimizedPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
Determinizer.determinize(this.artifactPath.toString(), this.artifactUnoptimizedPath.toString(), Arrays.asList(pathfinder), false);
|
Determinizer.determinize(this.artifactPath.toString(), this.artifactUnoptimizedPath.toString(), List.of(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadProguard() throws Exception {
|
private void downloadProguard() throws Exception {
|
||||||
Path proguardZip = getTemporaryFile(PROGUARD_ZIP);
|
Path proguardZip = getTemporaryFile(String.format(PROGUARD_ZIP, proguardVersion));
|
||||||
if (!Files.exists(proguardZip)) {
|
if (!Files.exists(proguardZip)) {
|
||||||
write(new URL(this.url).openStream(), proguardZip);
|
write(new URL(String.format("https://github.com/Guardsquare/proguard/releases/download/v%s/proguard-%s.zip", proguardVersion, proguardVersion)).openStream(), proguardZip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void extractProguard() throws Exception {
|
private void extractProguard() throws Exception {
|
||||||
Path proguardJar = getTemporaryFile(PROGUARD_JAR);
|
Path proguardJar = getTemporaryFile(String.format(PROGUARD_JAR, proguardVersion));
|
||||||
if (!Files.exists(proguardJar)) {
|
if (!Files.exists(proguardJar)) {
|
||||||
ZipFile zipFile = new ZipFile(getTemporaryFile(PROGUARD_ZIP).toFile());
|
ZipFile zipFile = new ZipFile(getTemporaryFile(String.format(PROGUARD_ZIP, proguardVersion)).toFile());
|
||||||
ZipEntry zipJarEntry = zipFile.getEntry(this.extract);
|
ZipEntry zipJarEntry = zipFile.getEntry(String.format("proguard-%s/lib/proguard.jar", proguardVersion));
|
||||||
write(zipFile.getInputStream(zipJarEntry), proguardJar);
|
write(zipFile.getInputStream(zipJarEntry), proguardJar);
|
||||||
zipFile.close();
|
zipFile.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getJavaBinPathForProguard() throws Exception {
|
private JavaLauncher getJavaLauncherForProguard() {
|
||||||
String path;
|
var toolchains = getProject().getExtensions().getByType(JavaToolchainService.class);
|
||||||
try {
|
var toolchain = toolchains.launcherFor((spec) -> {
|
||||||
path = findJavaPathByGradleConfig();
|
spec.getLanguageVersion().set(JavaLanguageVersion.of(getProject().findProperty("java_version").toString()));
|
||||||
if (path != null) return path;
|
}).getOrNull();
|
||||||
} catch (Exception ex) {
|
|
||||||
System.err.println("Unable to find java by javaCompile options");
|
if (toolchain == null) {
|
||||||
ex.printStackTrace();
|
throw new IllegalStateException("Java toolchain not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return toolchain;
|
||||||
path = findJavaByJavaHome();
|
|
||||||
if (path != null) return path;
|
|
||||||
} catch (Exception ex) {
|
|
||||||
System.err.println("Unable to find java by JAVA_HOME");
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
path = findJavaByGradleCurrentRuntime();
|
|
||||||
if (path != null) return path;
|
|
||||||
|
|
||||||
throw new Exception("Unable to find java to determine ProGuard libraryjars. Please specify forkOptions.executable in javaCompile," +
|
|
||||||
" JAVA_HOME environment variable, or make sure to run Gradle with the correct JDK (a v1.8 only)");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String findJavaByGradleCurrentRuntime() {
|
|
||||||
String path = Jvm.current().getJavaExecutable().getAbsolutePath();
|
|
||||||
System.out.println("Using Gradle's runtime Java for ProGuard");
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String findJavaByJavaHome() {
|
|
||||||
final String javaHomeEnv = System.getenv("JAVA_HOME");
|
|
||||||
if (javaHomeEnv != null) {
|
|
||||||
String path = Jvm.forHome(new File(javaHomeEnv)).getJavaExecutable().getAbsolutePath();
|
|
||||||
System.out.println("Detected Java path by JAVA_HOME");
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String findJavaPathByGradleConfig() {
|
|
||||||
final TaskCollection<JavaCompile> javaCompiles = super.getProject().getTasks().withType(JavaCompile.class);
|
|
||||||
|
|
||||||
final JavaCompile compileTask = javaCompiles.iterator().next();
|
|
||||||
final ForkOptions forkOptions = compileTask.getOptions().getForkOptions();
|
|
||||||
|
|
||||||
if (forkOptions != null) {
|
|
||||||
String javacPath = forkOptions.getExecutable();
|
|
||||||
if (javacPath != null) {
|
|
||||||
File javacFile = new File(javacPath);
|
|
||||||
if (javacFile.exists()) {
|
|
||||||
File[] maybeJava = javacFile.getParentFile().listFiles((dir, name) -> name.equals("java"));
|
|
||||||
if (maybeJava != null && maybeJava.length > 0) {
|
|
||||||
String path = maybeJava[0].getAbsolutePath();
|
|
||||||
System.out.println("Detected Java path by forkOptions");
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateConfigs() throws Exception {
|
private void generateConfigs() throws Exception {
|
||||||
Files.copy(getRelativeFile(PROGUARD_CONFIG_TEMPLATE), getTemporaryFile(PROGUARD_CONFIG_DEST), StandardCopyOption.REPLACE_EXISTING);
|
Files.copy(getRootRelativeFile(PROGUARD_CONFIG_TEMPLATE), getTemporaryFile(PROGUARD_CONFIG_DEST), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
|
||||||
// Setup the template that will be used to derive the API and Standalone configs
|
// Setup the template that will be used to derive the API and Standalone configs
|
||||||
List<String> template = Files.readAllLines(getTemporaryFile(PROGUARD_CONFIG_DEST));
|
List<String> template = Files.readAllLines(getTemporaryFile(PROGUARD_CONFIG_DEST));
|
||||||
template.add(0, "-injars '" + this.artifactPath.toString() + "'");
|
template.add(0, "-injars '" + this.artifactPath.toString() + "'");
|
||||||
template.add(1, "-outjars '" + this.getTemporaryFile(PROGUARD_EXPORT_PATH) + "'");
|
template.add(1, "-outjars '" + this.getTemporaryFile(PROGUARD_EXPORT_PATH) + "'");
|
||||||
|
|
||||||
// Acquire the RT jar using "java -verbose". This doesn't work on Java 9+
|
template.add(2, "-libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)");
|
||||||
Process p = new ProcessBuilder(this.getJavaBinPathForProguard(), "-verbose").start();
|
template.add(3, "-libraryjars <java.home>/jmods/java.desktop.jmod(!**.jar;!module-info.class)");
|
||||||
String out = IOUtils.toString(p.getInputStream(), "UTF-8").split("\n")[0].split("Opened ")[1].replace("]", "");
|
template.add(4, "-libraryjars <java.home>/jmods/jdk.unsupported.jmod(!**.jar;!module-info.class)");
|
||||||
template.add(2, "-libraryjars '" + out + "'");
|
|
||||||
|
{
|
||||||
|
final Stream<File> libraries;
|
||||||
|
File mcJar;
|
||||||
|
try {
|
||||||
|
mcJar = getMcJar();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Failed to find Minecraft jar", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Discover all of the libraries that we will need to acquire from gradle
|
||||||
|
final Stream<File> dependencies = acquireDependencies()
|
||||||
|
// remove MCP mapped jar, and nashorn
|
||||||
|
.filter(f -> !f.toString().endsWith("-recomp.jar") && !f.getName().startsWith("nashorn") && !f.getName().startsWith("coremods"));
|
||||||
|
|
||||||
|
libraries = dependencies
|
||||||
|
.map(f -> isMcJar(f) ? mcJar : f);
|
||||||
|
}
|
||||||
|
libraries.forEach(f -> {
|
||||||
|
template.add(2, "-libraryjars '" + f + "'");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Files.createDirectories(this.getRootRelativeFile(PROGUARD_MAPPING_DIR));
|
||||||
|
|
||||||
|
List<String> api = new ArrayList<>(template);
|
||||||
|
api.add(2, "-printmapping " + new File(this.getRootRelativeFile(PROGUARD_MAPPING_DIR).toFile(), "mappings-" + addCompTypeFirst("api.txt")));
|
||||||
|
|
||||||
// API config doesn't require any changes from the changes that we made to the template
|
// API config doesn't require any changes from the changes that we made to the template
|
||||||
Files.write(getTemporaryFile(PROGUARD_API_CONFIG), template);
|
Files.write(getTemporaryFile(compType + PROGUARD_API_CONFIG), api);
|
||||||
|
|
||||||
// For the Standalone config, don't keep the API package
|
// For the Standalone config, don't keep the API package
|
||||||
List<String> standalone = new ArrayList<>(template);
|
List<String> standalone = new ArrayList<>(template);
|
||||||
standalone.removeIf(s -> s.contains("# this is the keep api"));
|
standalone.removeIf(s -> s.contains("# this is the keep api"));
|
||||||
Files.write(getTemporaryFile(PROGUARD_STANDALONE_CONFIG), standalone);
|
standalone.add(2, "-printmapping " + new File(this.getRootRelativeFile(PROGUARD_MAPPING_DIR).toFile(), "mappings-" + addCompTypeFirst("standalone.txt")));
|
||||||
|
Files.write(getTemporaryFile(compType + PROGUARD_STANDALONE_CONFIG), standalone);
|
||||||
|
}
|
||||||
|
|
||||||
// Discover all of the libraries that we will need to acquire from gradle
|
private Stream<File> acquireDependencies() {
|
||||||
this.requiredLibraries = new ArrayList<>();
|
return getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName("main").getCompileClasspath().getFiles()
|
||||||
template.forEach(line -> {
|
.stream()
|
||||||
if (!line.startsWith("#")) {
|
.filter(File::isFile);
|
||||||
Matcher m = TEMP_LIBRARY_PATTERN.matcher(line);
|
}
|
||||||
if (m.find()) {
|
|
||||||
this.requiredLibraries.add(m.group(1));
|
private void proguardApi() throws Exception {
|
||||||
}
|
runProguard(getTemporaryFile(compType + PROGUARD_API_CONFIG));
|
||||||
}
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString(), List.of(), false);
|
||||||
});
|
}
|
||||||
|
|
||||||
|
private void proguardStandalone() throws Exception {
|
||||||
|
runProguard(getTemporaryFile(compType + PROGUARD_STANDALONE_CONFIG));
|
||||||
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString(), List.of(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class Pair<A, B> {
|
private static final class Pair<A, B> {
|
||||||
@@ -221,137 +209,14 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void acquireDependencies() throws Exception {
|
|
||||||
// Create a map of all of the dependencies that we are able to access in this project
|
|
||||||
// Likely a better way to do this, I just pair the dependency with the first valid configuration
|
|
||||||
Map<String, Pair<Configuration, Dependency>> dependencyLookupMap = new HashMap<>();
|
|
||||||
Map<String, File> files = new HashMap<>();
|
|
||||||
getProject().getConfigurations().stream().filter(Configuration::isCanBeResolved).forEach(config -> {
|
|
||||||
for (File file : config.getFiles()) {
|
|
||||||
files.put(file.getName(), file);
|
|
||||||
}
|
|
||||||
config.getAllDependencies().forEach(dependency ->
|
|
||||||
dependencyLookupMap.putIfAbsent(dependency.getName() + "-" + dependency.getVersion(), new Pair<>(config, dependency)));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create the directory if it doesn't already exist
|
|
||||||
Path tempLibraries = getTemporaryFile(TEMP_LIBRARY_DIR);
|
|
||||||
if (!Files.exists(tempLibraries)) {
|
|
||||||
Files.createDirectory(tempLibraries);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate the required libraries to copy them to tempLibraries
|
|
||||||
for (String lib : this.requiredLibraries) {
|
|
||||||
// copy from the forgegradle cache
|
|
||||||
if (lib.equals("minecraft")) {
|
|
||||||
Path cachedJar = getMinecraftJar();
|
|
||||||
Path inTempDir = getTemporaryFile("tempLibraries/minecraft.jar");
|
|
||||||
// TODO: maybe try not to copy every time
|
|
||||||
Files.copy(cachedJar, inTempDir, StandardCopyOption.REPLACE_EXISTING);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find a configuration/dependency pair that matches the desired library
|
|
||||||
Pair<Configuration, Dependency> pair = null;
|
|
||||||
for (Map.Entry<String, Pair<Configuration, Dependency>> entry : dependencyLookupMap.entrySet()) {
|
|
||||||
if (entry.getKey().startsWith(lib)) {
|
|
||||||
pair = entry.getValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Find the library jar file, and copy it to tempLibraries
|
|
||||||
if (pair == null) {
|
|
||||||
File libFile = files.get(lib + ".jar");
|
|
||||||
if (libFile == null) {
|
|
||||||
libFile = files.values().stream().filter(file -> file.getName().startsWith(lib)).findFirst().orElse(null);
|
|
||||||
if (libFile == null) {
|
|
||||||
throw new IllegalStateException(lib);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
copyTempLib(lib, libFile);
|
|
||||||
} else {
|
|
||||||
for (File file : pair.a.files(pair.b)) {
|
|
||||||
if (file.getName().startsWith(lib)) {
|
|
||||||
copyTempLib(lib, file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mixin == null) {
|
|
||||||
throw new IllegalStateException("Unable to find mixin jar");
|
|
||||||
}
|
|
||||||
if (pathfinder == null) {
|
|
||||||
throw new IllegalStateException("Unable to find pathfinder jar");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void copyTempLib(String lib, File libFile) throws IOException {
|
|
||||||
if (lib.contains("mixin")) {
|
|
||||||
mixin = libFile;
|
|
||||||
}
|
|
||||||
if (lib.contains("nether-pathfinder")) {
|
|
||||||
pathfinder = libFile;
|
|
||||||
}
|
|
||||||
Files.copy(libFile.toPath(), getTemporaryFile("tempLibraries/" + lib + ".jar"), StandardCopyOption.REPLACE_EXISTING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// a bunch of epic stuff to get the path to the cached jar
|
|
||||||
private Path getMinecraftJar() throws Exception {
|
|
||||||
return getObfuscatedMinecraftJar(getProject(), false); // always notch jar for now.
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Path getObfuscatedMinecraftJar(final Project project, final boolean srg) throws Exception {
|
|
||||||
final Object extension = Objects.requireNonNull(project.getExtensions().findByName("minecraft"), "Unable to find Minecraft extension.");
|
|
||||||
|
|
||||||
final Class<?> mcpRepoClass = mcpRepoClass(extension.getClass().getClassLoader());
|
|
||||||
final Field mcpRepoInstanceField = mcpRepoClass.getDeclaredField("INSTANCE");
|
|
||||||
mcpRepoInstanceField.setAccessible(true);
|
|
||||||
final Method findMethod = mcpRepoClass.getDeclaredMethod(srg ? "findSrg" : "findRaw", String.class, String.class);
|
|
||||||
findMethod.setAccessible(true);
|
|
||||||
|
|
||||||
final Object mcpRepo = mcpRepoInstanceField.get(null);
|
|
||||||
final String mcpVersion = (String) Objects.requireNonNull(project.getExtensions().getExtraProperties().get("MCP_VERSION"), "Extra property \"MCP_VERSION\" not found");
|
|
||||||
return ((File) findMethod.invoke(mcpRepo, "joined", mcpVersion)).toPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<?> mcpRepoClass(final ClassLoader loader) throws Exception {
|
|
||||||
final Method forName0 = Class.class.getDeclaredMethod("forName0", String.class, boolean.class, ClassLoader.class, Class.class);
|
|
||||||
forName0.setAccessible(true);
|
|
||||||
return (Class<?>) forName0.invoke(null, "net.minecraftforge.gradle.mcp.MCPRepo", true, loader, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void proguardApi() throws Exception {
|
|
||||||
runProguard(getTemporaryFile(PROGUARD_API_CONFIG));
|
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString(), Arrays.asList(pathfinder), false);
|
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeApiPath.toString(), Arrays.asList(pathfinder, mixin), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void proguardStandalone() throws Exception {
|
|
||||||
runProguard(getTemporaryFile(PROGUARD_STANDALONE_CONFIG));
|
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString(), Arrays.asList(pathfinder), false);
|
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeStandalonePath.toString(), Arrays.asList(pathfinder, mixin), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cleanup() {
|
private void cleanup() {
|
||||||
try {
|
try {
|
||||||
Files.delete(this.proguardOut);
|
Files.delete(this.proguardOut);
|
||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUrl(String url) {
|
public void setProguardVersion(String url) {
|
||||||
this.url = url;
|
this.proguardVersion = url;
|
||||||
}
|
|
||||||
|
|
||||||
public String getUrl() {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExtract(String extract) {
|
|
||||||
this.extract = extract;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getExtract() {
|
|
||||||
return extract;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runProguard(Path config) throws Exception {
|
private void runProguard(Path config) throws Exception {
|
||||||
@@ -360,39 +225,15 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
Files.delete(this.proguardOut);
|
Files.delete(this.proguardOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make paths relative to work directory; fixes spaces in path to config, @"" doesn't work
|
|
||||||
Path workingDirectory = getTemporaryFile("");
|
Path workingDirectory = getTemporaryFile("");
|
||||||
Path proguardJar = workingDirectory.relativize(getTemporaryFile(PROGUARD_JAR));
|
|
||||||
config = workingDirectory.relativize(config);
|
|
||||||
|
|
||||||
// Honestly, if you still have spaces in your path at this point, you're SOL.
|
getProject().javaexec(spec -> {
|
||||||
|
spec.workingDir(workingDirectory.toFile());
|
||||||
|
spec.args("@" + workingDirectory.relativize(config));
|
||||||
|
spec.classpath(getTemporaryFile(String.format(PROGUARD_JAR, proguardVersion)));
|
||||||
|
|
||||||
Process p = new ProcessBuilder("java", "-jar", proguardJar.toString(), "@" + config.toString())
|
spec.executable(getJavaLauncherForProguard().getExecutablePath().getAsFile());
|
||||||
.directory(workingDirectory.toFile()) // Set the working directory to the temporary folder]
|
}).assertNormalExitValue().rethrowFailure();
|
||||||
.start();
|
|
||||||
|
|
||||||
// We can't do output inherit process I/O with gradle for some reason and have it work, so we have to do this
|
|
||||||
this.printOutputLog(p.getInputStream(), System.out);
|
|
||||||
this.printOutputLog(p.getErrorStream(), System.err);
|
|
||||||
|
|
||||||
// Halt the current thread until the process is complete, if the exit code isn't 0, throw an exception
|
|
||||||
int exitCode = p.waitFor();
|
|
||||||
if (exitCode != 0) {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
throw new IllegalStateException("Proguard exited with code " + exitCode);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printOutputLog(InputStream stream, PrintStream outerr) {
|
|
||||||
new Thread(() -> {
|
|
||||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
outerr.println(line);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,17 +64,17 @@ public class Determinizer {
|
|||||||
JarEntry clone = new JarEntry(entry.getName());
|
JarEntry clone = new JarEntry(entry.getName());
|
||||||
clone.setTime(42069);
|
clone.setTime(42069);
|
||||||
jos.putNextEntry(clone);
|
jos.putNextEntry(clone);
|
||||||
if (entry.getName().endsWith(".json")) {
|
if (entry.getName().endsWith(".refmap.json")) {
|
||||||
JsonElement json = new JsonParser().parse(new InputStreamReader(jarFile.getInputStream(entry)));
|
JsonElement json = new JsonParser().parse(new InputStreamReader(jarFile.getInputStream(entry)));
|
||||||
jos.write(writeSorted(json).getBytes());
|
jos.write(writeSorted(json).getBytes());
|
||||||
} else if (entry.getName().equals("META-INF/MANIFEST.MF") && doForgeReplacementOfMetaInf) { // only replace for forge jar
|
} else if (entry.getName().equals("META-INF/MANIFEST.MF") && doForgeReplacementOfMetaInf) { // only replace for forge jar
|
||||||
ByteArrayOutputStream cancer = new ByteArrayOutputStream();
|
ByteArrayOutputStream cancer = new ByteArrayOutputStream();
|
||||||
copy(jarFile.getInputStream(entry), cancer);
|
copy(jarFile.getInputStream(entry), cancer);
|
||||||
String manifest = new String(cancer.toByteArray());
|
String manifest = new String(cancer.toByteArray());
|
||||||
if (!manifest.contains("baritone.launch.BaritoneTweaker")) {
|
if (!manifest.contains("baritone.launch.tweaker.BaritoneTweaker")) {
|
||||||
throw new IllegalStateException("unable to replace");
|
throw new IllegalStateException("unable to replace");
|
||||||
}
|
}
|
||||||
manifest = manifest.replace("baritone.launch.BaritoneTweaker", "org.spongepowered.asm.launch.MixinTweaker");
|
manifest = manifest.replace("baritone.launch.tweaker.BaritoneTweaker", "org.spongepowered.asm.launch.MixinTweaker");
|
||||||
jos.write(manifest.getBytes());
|
jos.write(manifest.getBytes());
|
||||||
} else {
|
} else {
|
||||||
copy(jarFile.getInputStream(entry), jos);
|
copy(jarFile.getInputStream(entry), jos);
|
||||||
|
|||||||
103
fabric/build.gradle
Normal file
103
fabric/build.gradle
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Baritone 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import baritone.gradle.task.CreateDistTask
|
||||||
|
import baritone.gradle.task.ProguardTask
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "com.github.johnrengelman.shadow" version "8.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
archivesBaseName = archivesBaseName + "-fabric"
|
||||||
|
|
||||||
|
unimined.minecraft {
|
||||||
|
fabric {
|
||||||
|
loader project.fabric_version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
common
|
||||||
|
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
|
||||||
|
compileClasspath.extendsFrom common
|
||||||
|
runtimeClasspath.extendsFrom common
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// because of multiple sourcesets `common project(":")` doesn't work
|
||||||
|
for (sourceSet in rootProject.sourceSets) {
|
||||||
|
if (sourceSet == rootProject.sourceSets.test) continue
|
||||||
|
if (sourceSet == rootProject.sourceSets.schematica_api) continue
|
||||||
|
common sourceSet.output
|
||||||
|
shadowCommon sourceSet.output
|
||||||
|
}
|
||||||
|
include "dev.babbaj:nether-pathfinder:${project.nether_pathfinder_version}"
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
inputs.property "version", project.version
|
||||||
|
|
||||||
|
filesMatching("fabric.mod.json") {
|
||||||
|
expand "version": project.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
configurations = [project.configurations.shadowCommon]
|
||||||
|
archiveClassifier.set "dev-shadow"
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile.set shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
archiveClassifier.set null
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveClassifier.set "dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
components.java {
|
||||||
|
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
|
||||||
|
skip()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task proguard(type: ProguardTask) {
|
||||||
|
proguardVersion "7.2.1"
|
||||||
|
compType "fabric"
|
||||||
|
}
|
||||||
|
|
||||||
|
task createDist(type: CreateDistTask, dependsOn: proguard) {
|
||||||
|
compType "fabric"
|
||||||
|
}
|
||||||
|
|
||||||
|
build.finalizedBy(createDist)
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
mavenFabric(MavenPublication) {
|
||||||
|
artifactId = rootProject.archives_base_name + "-" + project.name
|
||||||
|
from components.java
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
|
||||||
|
repositories {
|
||||||
|
// Add repositories to publish to here.
|
||||||
|
}
|
||||||
|
}
|
||||||
39
fabric/src/main/resources/fabric.mod.json
Normal file
39
fabric/src/main/resources/fabric.mod.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
{
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"id": "baritone",
|
||||||
|
"version": "${version}",
|
||||||
|
|
||||||
|
"name": "Baritone",
|
||||||
|
"description": "Google Maps for Blockgame",
|
||||||
|
"authors": [
|
||||||
|
"leijurv", "Brady"
|
||||||
|
],
|
||||||
|
"contact": {
|
||||||
|
"homepage": "https://github.com/cabaletta/baritone",
|
||||||
|
"sources": "https://github.com/cabaletta/baritone",
|
||||||
|
"issues": "https://github.com/cabaletta/baritone/issues"
|
||||||
|
},
|
||||||
|
|
||||||
|
"license": "LGPL-3.0",
|
||||||
|
"icon": "assets/baritone/icon.png",
|
||||||
|
|
||||||
|
"environment": "*",
|
||||||
|
"entrypoints": {
|
||||||
|
},
|
||||||
|
"mixins": [
|
||||||
|
"mixins.baritone.json"
|
||||||
|
],
|
||||||
|
|
||||||
|
"depends": {
|
||||||
|
"fabricloader": ">=0.14.22",
|
||||||
|
"minecraft": "1.20.2"
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"modmenu": {
|
||||||
|
"links": {
|
||||||
|
"modmenu.discord": "https://discord.gg/s6fRBAUpmr"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
124
forge/build.gradle
Normal file
124
forge/build.gradle
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Baritone 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import baritone.gradle.task.CreateDistTask
|
||||||
|
import baritone.gradle.task.ProguardTask
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id "com.github.johnrengelman.shadow" version "8.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
archivesBaseName = archivesBaseName + "-forge"
|
||||||
|
|
||||||
|
unimined.minecraft {
|
||||||
|
mappings {
|
||||||
|
devFallbackNamespace "intermediary"
|
||||||
|
}
|
||||||
|
|
||||||
|
forge {
|
||||||
|
loader project.forge_version
|
||||||
|
mixinConfig ["mixins.baritone.json"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//loom {
|
||||||
|
// forge {
|
||||||
|
// mixinConfig 'mixins.baritone.json'
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
common
|
||||||
|
shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
|
||||||
|
compileClasspath.extendsFrom common
|
||||||
|
runtimeClasspath.extendsFrom common
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// because of multiple sourcesets `common project(":")` doesn't work
|
||||||
|
for (sourceSet in rootProject.sourceSets) {
|
||||||
|
if (sourceSet == rootProject.sourceSets.test) continue
|
||||||
|
if (sourceSet == rootProject.sourceSets.schematica_api) continue
|
||||||
|
common sourceSet.output
|
||||||
|
shadowCommon sourceSet.output
|
||||||
|
}
|
||||||
|
shadowCommon "dev.babbaj:nether-pathfinder:${project.nether_pathfinder_version}"
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
inputs.property "version", project.version
|
||||||
|
|
||||||
|
filesMatching("META-INF/mods.toml") {
|
||||||
|
expand "version": project.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
configurations = [project.configurations.shadowCommon]
|
||||||
|
archiveClassifier.set "dev-shadow"
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile.set shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
archiveClassifier.set null
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveClassifier.set "dev"
|
||||||
|
|
||||||
|
manifest {
|
||||||
|
attributes(
|
||||||
|
'MixinConfigs': 'mixins.baritone.json',
|
||||||
|
"MixinConnector": "baritone.launch.BaritoneMixinConnector",
|
||||||
|
|
||||||
|
'Implementation-Title': 'Baritone',
|
||||||
|
'Implementation-Version': version,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
components.java {
|
||||||
|
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
|
||||||
|
skip()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task proguard(type: ProguardTask) {
|
||||||
|
proguardVersion "7.2.1"
|
||||||
|
compType "forge"
|
||||||
|
}
|
||||||
|
|
||||||
|
task createDist(type: CreateDistTask, dependsOn: proguard) {
|
||||||
|
compType "forge"
|
||||||
|
}
|
||||||
|
|
||||||
|
build.finalizedBy(createDist)
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
mavenFabric(MavenPublication) {
|
||||||
|
artifactId = rootProject.archives_base_name + "-" + project.name
|
||||||
|
from components.java
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
|
||||||
|
repositories {
|
||||||
|
// Add repositories to publish to here.
|
||||||
|
}
|
||||||
|
}
|
||||||
18
forge/gradle.properties
Normal file
18
forge/gradle.properties
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# This file is part of Baritone.
|
||||||
|
#
|
||||||
|
# Baritone is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Baritone 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 Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
loom.platform=forge
|
||||||
@@ -15,13 +15,8 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.utils.accessor;
|
package baritone.launch;import net.minecraftforge.fml.common.Mod;
|
||||||
|
|
||||||
/**
|
@Mod("baritoe")
|
||||||
* @author rycbar
|
public class BaritoneForgeModXD {
|
||||||
* @since 26.09.2022
|
|
||||||
*/
|
|
||||||
public interface INBTTagLongArray {
|
|
||||||
|
|
||||||
long[] getLongArray();
|
|
||||||
}
|
}
|
||||||
40
forge/src/main/resources/META-INF/mods.toml
Normal file
40
forge/src/main/resources/META-INF/mods.toml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# This is an example mods.toml file. It contains the data relating to the loading mods.
|
||||||
|
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
|
||||||
|
# The overall format is standard TOML format, v0.5.0.
|
||||||
|
# Note that there are a couple of TOML lists in this file.
|
||||||
|
# Find more information on toml format here: https://github.com/toml-lang/toml
|
||||||
|
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
|
||||||
|
modLoader="javafml" #mandatory
|
||||||
|
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
|
||||||
|
loaderVersion="[48,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
|
||||||
|
license="https://raw.githubusercontent.com/cabaletta/baritone/1.16.2/LICENSE"
|
||||||
|
# A URL to refer people to when problems occur with this mod
|
||||||
|
issueTrackerURL="https://github.com/cabaletta/baritone/issues" #optional
|
||||||
|
# A list of mods - how many allowed here is determined by the individual mod loader
|
||||||
|
[[mods]] #mandatory
|
||||||
|
# The modid of the mod
|
||||||
|
modId="baritoe" #mandatory
|
||||||
|
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
|
||||||
|
version="${version}" #mandatory
|
||||||
|
# A display name for the mod
|
||||||
|
displayName="Baritone" #mandatory
|
||||||
|
# A URL for the "homepage" for this mod, displayed in the mod UI
|
||||||
|
displayURL="https://github.com/cabaletta/baritone" #optional
|
||||||
|
# A file name (in the root of the mod JAR) containing a logo for display
|
||||||
|
#logoFile="examplemod.png" #optional
|
||||||
|
# A text field displayed in the mod UI
|
||||||
|
credits="Hat Gamers" #optional
|
||||||
|
# A text field displayed in the mod UI
|
||||||
|
authors="leijurv, Brady" #optional
|
||||||
|
# The description text for the mod (multi line!) (#mandatory)
|
||||||
|
description='''
|
||||||
|
A Minecraft pathfinder bot.
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[dependencies.baritoe]]
|
||||||
|
modId="minecraft"
|
||||||
|
mandatory=true
|
||||||
|
# This version range declares a minimum of the current minecraft version up to but not including the next major version
|
||||||
|
versionRange="[1.20.2]"
|
||||||
|
ordering="NONE"
|
||||||
|
side="BOTH"
|
||||||
6
forge/src/main/resources/pack.mcmeta
Normal file
6
forge/src/main/resources/pack.mcmeta
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"pack": {
|
||||||
|
"description": "null",
|
||||||
|
"pack_format": 8
|
||||||
|
}
|
||||||
|
}
|
||||||
22
gradle.properties
Normal file
22
gradle.properties
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
org.gradle.jvmargs=-Xmx4G
|
||||||
|
|
||||||
|
available_loaders=fabric,forge,tweaker
|
||||||
|
|
||||||
|
mod_version=1.10.2
|
||||||
|
maven_group=baritone
|
||||||
|
archives_base_name=baritone
|
||||||
|
|
||||||
|
java_version=17
|
||||||
|
|
||||||
|
minecraft_version=1.20.2
|
||||||
|
|
||||||
|
forge_version=48.0.1
|
||||||
|
|
||||||
|
fabric_version=0.14.22
|
||||||
|
|
||||||
|
nether_pathfinder_version=1.4.1
|
||||||
|
|
||||||
|
// These dependencies are used for common and tweaker
|
||||||
|
// while mod loaders usually ship their own version
|
||||||
|
mixin_version=0.8.5
|
||||||
|
asm_version=9.3
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
161
hacks.gradle
161
hacks.gradle
@@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of Baritone.
|
|
||||||
*
|
|
||||||
* Baritone is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Baritone 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 Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ext.doHackyStuff = { final Class<?> clazz ->
|
|
||||||
def withExtension = { final File file, final String extension ->
|
|
||||||
def i = file.getName().lastIndexOf('.')
|
|
||||||
def name = file.getName().substring(0, i)
|
|
||||||
return new File(file.getParent(), "$name.$extension")
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/MinecraftForge/ForgeGradle/blob/6639464b29b0923187eee0a609e546ba9f1b998b/src/patcher/java/net/minecraftforge/gradle/patcher/PatcherPlugin.java#L545
|
|
||||||
// https://github.com/MinecraftForge/ForgeGradle/blob/6639464b29b0923187eee0a609e546ba9f1b998b/src/userdev/java/net/minecraftforge/gradle/userdev/UserDevPlugin.java#L149
|
|
||||||
// create createMcp2Obf task
|
|
||||||
this.tasks.register('createMcpToObf', clazz)
|
|
||||||
.configure { task ->
|
|
||||||
task.setNotch(true)
|
|
||||||
task.setReverse(true)
|
|
||||||
}
|
|
||||||
afterEvaluate {
|
|
||||||
def createMcp2Obf = this.tasks.getByName('createMcpToObf')
|
|
||||||
def createMcp2Srg = this.tasks.getByName('createMcpToSrg')
|
|
||||||
|
|
||||||
// configure createMcp2Obf task
|
|
||||||
if (createMcp2Obf.getSrg() == null) {
|
|
||||||
createMcp2Obf.setSrg(createMcp2Srg.getSrg())
|
|
||||||
createMcp2Obf.setMappings(createMcp2Srg.getMappings())
|
|
||||||
createMcp2Obf.dependsOn(createMcp2Srg)
|
|
||||||
}
|
|
||||||
|
|
||||||
def createSrgCopyTask = { final Task tsrgTask ->
|
|
||||||
def srgCopyTask = this.tasks.register("${tsrgTask.name}Srg", tsrgTask.getClass())
|
|
||||||
tsrgTask.getDependsOn().forEach({ dep ->
|
|
||||||
srgCopyTask.get().dependsOn(dep)
|
|
||||||
})
|
|
||||||
// https://github.com/MinecraftForge/ForgeGradle/blob/6639464b29b0923187eee0a609e546ba9f1b998b/src/mcp/java/net/minecraftforge/gradle/mcp/task/GenerateSRG.java#L39
|
|
||||||
srgCopyTask.configure { task ->
|
|
||||||
task.setSrg(tsrgTask.getSrg())
|
|
||||||
task.setMappings(tsrgTask.getMappings())
|
|
||||||
// https://github.com/MinecraftForge/SrgUtils/blob/bb2ca35bb8d349a122ef512dedd24f54f7cd0bdf/src/main/java/net/minecraftforge/srgutils/IMappingFile.java#L44
|
|
||||||
task.setFormat('SRG')
|
|
||||||
task.setNotch(tsrgTask.getNotch())
|
|
||||||
task.setReverse(tsrgTask.getReverse())
|
|
||||||
task.setOutput(withExtension(tsrgTask.getOutput(), 'srg'))
|
|
||||||
}
|
|
||||||
return srgCopyTask
|
|
||||||
}
|
|
||||||
def createMcp2ObfSrgCopyTask = createSrgCopyTask(createMcp2Obf)
|
|
||||||
createMcp2Obf.dependsOn(createMcp2ObfSrgCopyTask)
|
|
||||||
def createMcp2SrgSrgCopyTask = createSrgCopyTask(createMcp2Srg)
|
|
||||||
createMcp2Srg.dependsOn(createMcp2SrgSrgCopyTask)
|
|
||||||
|
|
||||||
this.sourceSets.forEach({ set ->
|
|
||||||
def compileTask = this.project.tasks[set.compileJavaTaskName]
|
|
||||||
if (!(compileTask instanceof JavaCompile)) {
|
|
||||||
println("[Baritoe] Non-java compile task for ${set} of type ${compileTask}")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
compileTask.dependsOn(createMcp2Obf)
|
|
||||||
compileTask.doFirst {
|
|
||||||
// inject legacy notch srg file
|
|
||||||
def createMcp2ObfSrgCopy = createMcp2ObfSrgCopyTask.get()
|
|
||||||
def reobfNotchSrgFileArgument = "-AreobfNotchSrgFile=${createMcp2ObfSrgCopy.output.canonicalPath}"
|
|
||||||
compileTask.options.compilerArgs += reobfNotchSrgFileArgument
|
|
||||||
println("[Baritoe] Injecting compiler argument: ${reobfNotchSrgFileArgument}")
|
|
||||||
|
|
||||||
// inject legacy notch srg out file
|
|
||||||
def outTSrgFileArgument = '-AoutTsrgFile='
|
|
||||||
def compilerArgsIterator = compileTask.options.compilerArgs.listIterator()
|
|
||||||
while (compilerArgsIterator.hasNext()) {
|
|
||||||
def compilerArg = compilerArgsIterator.next()
|
|
||||||
if (compilerArg.startsWith(outTSrgFileArgument)) {
|
|
||||||
def argumentFileValue = new File(compilerArg.substring(outTSrgFileArgument.length(), compilerArg.length()))
|
|
||||||
def outNotchSrgFile = withExtension(argumentFileValue, 'notch.srg')
|
|
||||||
def outNotchSrgFileArgument = "-AoutNotchSrgFile=${outNotchSrgFile.canonicalPath}"
|
|
||||||
println("[Baritoe] Injecting compiler argument: ${outNotchSrgFileArgument}")
|
|
||||||
compilerArgsIterator.add(outNotchSrgFileArgument)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// register reobf jars
|
|
||||||
def reobfExtension = this.project.getExtensions().getByName('reobf')
|
|
||||||
if (!reobfExtension) {
|
|
||||||
throw new IllegalStateException("Could not find \"reobf\" extension")
|
|
||||||
}
|
|
||||||
def reobfNotchJar = reobfExtension.create(jar.getName())
|
|
||||||
reobfNotchJar.dependsOn(createMcp2Obf)
|
|
||||||
reobfNotchJar.setMappings(createMcp2Obf.getOutput())
|
|
||||||
|
|
||||||
// even more horrible hack :) for outNotchSrgFile injection
|
|
||||||
reobfNotchJar.doFirst {
|
|
||||||
// https://github.com/MinecraftForge/ForgeGradle/blob/6639464b29b0923187eee0a609e546ba9f1b998b/src/userdev/java/net/minecraftforge/gradle/userdev/tasks/RenameJar.java#L96
|
|
||||||
def extraMappings = reobfNotchJar.getExtraMappings()
|
|
||||||
println("[Baritoe] Extra mappings: ${extraMappings}")
|
|
||||||
def copy = new ArrayList<>()
|
|
||||||
extraMappings.forEach { extraMapping ->
|
|
||||||
copy.add(withExtension(extraMapping, 'notch.srg'))
|
|
||||||
}
|
|
||||||
println("[Baritoe] New extra mappings: ${copy}")
|
|
||||||
reobfNotchJar.setExtraMappings(copy)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: In-complete fg 5.0 port. Currently doesn't handle mixin notch srg mapping hack.
|
|
||||||
//ext.doHackyStuff = { final Class<?> clazz ->
|
|
||||||
// afterEvaluate {
|
|
||||||
// def createMcp2Srg = this.tasks.getByName('createMcpToSrg')
|
|
||||||
// def createMcpToObf = this.tasks.register('createMcpToObf', clazz)
|
|
||||||
// createMcpToObf.configure { task ->
|
|
||||||
// task.setNotch(true)
|
|
||||||
// task.setReverse(true)
|
|
||||||
// task.getSrg().set(createMcp2Srg.getSrg().get())
|
|
||||||
// task.getMappings().set(createMcp2Srg.getMappings().get())
|
|
||||||
// task.dependsOn(createMcp2Srg)
|
|
||||||
// }
|
|
||||||
// reobf {
|
|
||||||
// jar {
|
|
||||||
// dependsOn(createMcpToObf)
|
|
||||||
// getMappings().set(createMcpToObf.get().getOutput().get())
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// this.sourceSets.forEach({ set ->
|
|
||||||
// def compileTask = this.project.tasks[set.compileJavaTaskName]
|
|
||||||
// if (!(compileTask instanceof JavaCompile)) {
|
|
||||||
// println("[Baritoe] Non-java compile task for ${set} of type ${compileTask}")
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// compileTask.dependsOn(createMcpToObf)
|
|
||||||
// compileTask.doFirst {
|
|
||||||
// def reobfTSrgFile = '-AreobfTsrgFile='
|
|
||||||
// def compilerArgsIterator = compileTask.options.compilerArgs.listIterator()
|
|
||||||
// while (compilerArgsIterator.hasNext()) {
|
|
||||||
// def compilerArg = compilerArgsIterator.next()
|
|
||||||
// if (compilerArg.startsWith(reobfTSrgFile)) {
|
|
||||||
// compilerArgsIterator.remove()
|
|
||||||
// def toInject = "-AreobfTsrgFile=${createMcpToObf.get().output.get().asFile.canonicalPath}"
|
|
||||||
// compilerArgsIterator.add(toInject)
|
|
||||||
// println("[Baritoe] Injecting compiler argument: ${toInject}")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// println("[Baritoe] Compiler arguments: ${compileTask.options.compilerArgs}")
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
4
jitpack.yml
Normal file
4
jitpack.yml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
before_install:
|
||||||
|
- curl -s "https://get.sdkman.io" | bash
|
||||||
|
- sdk install java 17.0.5-tem
|
||||||
|
- sdk use java 17.0.5-tem
|
||||||
62
scripts/proguard.pro
vendored
62
scripts/proguard.pro
vendored
@@ -15,7 +15,14 @@
|
|||||||
|
|
||||||
# lwjgl is weird
|
# lwjgl is weird
|
||||||
-dontwarn org.lwjgl.**
|
-dontwarn org.lwjgl.**
|
||||||
|
# also lwjgl lol
|
||||||
|
-dontwarn module-info
|
||||||
|
# we dont have forge
|
||||||
|
-dontwarn baritone.launch.BaritoneForgeModXD
|
||||||
|
# progard doesn't like signature polymorphism
|
||||||
|
-dontwarn java.lang.invoke.MethodHandle
|
||||||
|
|
||||||
|
# please do not change the comment below
|
||||||
-keep class baritone.api.** { *; } # this is the keep api
|
-keep class baritone.api.** { *; } # this is the keep api
|
||||||
|
|
||||||
# service provider needs these class names
|
# service provider needs these class names
|
||||||
@@ -47,55 +54,10 @@
|
|||||||
-dontwarn baritone.utils.schematic.schematica.**
|
-dontwarn baritone.utils.schematic.schematica.**
|
||||||
-dontwarn baritone.utils.schematic.litematica.**
|
-dontwarn baritone.utils.schematic.litematica.**
|
||||||
|
|
||||||
# copy all necessary libraries into tempLibraries to build
|
# nether-pathfinder uses JNI to acess its own classes
|
||||||
|
# and some of our builds include it before running proguard
|
||||||
# The correct jar will be copied from the forgegradle cache based on the mapping type being compiled with
|
# conservatively keep all of it, even though only PathSegment.<init> is needed
|
||||||
-libraryjars 'tempLibraries/minecraft.jar'
|
-keep,allowoptimization class dev.babbaj.pathfinder.** { *; }
|
||||||
|
|
||||||
-libraryjars 'tempLibraries/SimpleTweaker-1.2.jar'
|
|
||||||
|
|
||||||
-libraryjars 'tempLibraries/authlib-1.5.25.jar'
|
|
||||||
-libraryjars 'tempLibraries/codecjorbis-20101023.jar'
|
|
||||||
-libraryjars 'tempLibraries/codecwav-20101023.jar'
|
|
||||||
-libraryjars 'tempLibraries/commons-codec-1.10.jar'
|
|
||||||
-libraryjars 'tempLibraries/commons-compress-1.8.1.jar'
|
|
||||||
-libraryjars 'tempLibraries/commons-io-2.5.jar'
|
|
||||||
-libraryjars 'tempLibraries/commons-lang3-3.5.jar'
|
|
||||||
-libraryjars 'tempLibraries/commons-logging-1.1.3.jar'
|
|
||||||
-libraryjars 'tempLibraries/fastutil-7.1.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/gson-2.8.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/guava-21.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/httpclient-4.3.3.jar'
|
|
||||||
-libraryjars 'tempLibraries/httpcore-4.3.2.jar'
|
|
||||||
-libraryjars 'tempLibraries/icu4j-core-mojang-51.2.jar'
|
|
||||||
-libraryjars 'tempLibraries/jinput-2.0.5.jar'
|
|
||||||
-libraryjars 'tempLibraries/jna-4.4.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/jopt-simple-5.0.3.jar'
|
|
||||||
-libraryjars 'tempLibraries/jsr305-3.0.1.jar'
|
|
||||||
-libraryjars 'tempLibraries/jutils-1.0.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/libraryjavasound-20101123.jar'
|
|
||||||
-libraryjars 'tempLibraries/librarylwjglopenal-20100824.jar'
|
|
||||||
-libraryjars 'tempLibraries/log4j-api-2.8.1.jar'
|
|
||||||
-libraryjars 'tempLibraries/log4j-core-2.8.1.jar'
|
|
||||||
|
|
||||||
# startsWith is used to check the library, and mac/linux differ in which version they use
|
|
||||||
# this is FINE
|
|
||||||
-libraryjars 'tempLibraries/lwjgl-.jar'
|
|
||||||
-libraryjars 'tempLibraries/lwjgl_util-.jar'
|
|
||||||
|
|
||||||
-libraryjars 'tempLibraries/netty-all-4.1.9.Final.jar'
|
|
||||||
-libraryjars 'tempLibraries/oshi-core-1.1.jar'
|
|
||||||
-libraryjars 'tempLibraries/patchy-1.3.9.jar'
|
|
||||||
-libraryjars 'tempLibraries/platform-3.4.0.jar'
|
|
||||||
-libraryjars 'tempLibraries/realms-1.10.22.jar'
|
|
||||||
-libraryjars 'tempLibraries/soundsystem-20120107.jar'
|
|
||||||
-libraryjars 'tempLibraries/text2speech-1.10.3.jar'
|
|
||||||
|
|
||||||
-libraryjars 'tempLibraries/mixin-0.7.11-SNAPSHOT.jar'
|
|
||||||
-libraryjars 'tempLibraries/launchwrapper-1.12.jar'
|
|
||||||
|
|
||||||
-libraryjars 'tempLibraries/nether-pathfinder-.jar'
|
|
||||||
|
|
||||||
|
|
||||||
# Keep - Applications. Keep all application classes, along with their 'main'
|
# Keep - Applications. Keep all application classes, along with their 'main'
|
||||||
# methods.
|
# methods.
|
||||||
@@ -385,5 +347,3 @@
|
|||||||
public java.lang.String substring(int);
|
public java.lang.String substring(int);
|
||||||
public java.lang.String substring(int,int);
|
public java.lang.String substring(int,int);
|
||||||
}
|
}
|
||||||
|
|
||||||
-printmapping mapping.txt
|
|
||||||
|
|||||||
@@ -15,5 +15,33 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
maven {
|
||||||
|
name = 'WagYourMaven'
|
||||||
|
url = 'https://maven.wagyourtail.xyz/snapshots'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'ForgeMaven'
|
||||||
|
url = 'https://maven.minecraftforge.net/'
|
||||||
|
}
|
||||||
|
maven {
|
||||||
|
name = 'FabricMaven'
|
||||||
|
url = 'https://maven.fabricmc.net/'
|
||||||
|
}
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal() {
|
||||||
|
content {
|
||||||
|
excludeGroup "org.apache.logging.log4j"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rootProject.name = 'baritone'
|
rootProject.name = 'baritone'
|
||||||
|
|
||||||
|
include("tweaker")
|
||||||
|
for (platform in available_loaders.split(",")) {
|
||||||
|
include(platform)
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ package baritone.api;
|
|||||||
|
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.ServiceLoader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exposes the {@link IBaritoneProvider} instance and the {@link Settings} instance for API usage.
|
* Exposes the {@link IBaritoneProvider} instance and the {@link Settings} instance for API usage.
|
||||||
*
|
*
|
||||||
@@ -37,9 +34,11 @@ public final class BaritoneAPI {
|
|||||||
settings = new Settings();
|
settings = new Settings();
|
||||||
SettingsUtil.readAndApply(settings, SettingsUtil.SETTINGS_DEFAULT_NAME);
|
SettingsUtil.readAndApply(settings, SettingsUtil.SETTINGS_DEFAULT_NAME);
|
||||||
|
|
||||||
ServiceLoader<IBaritoneProvider> baritoneLoader = ServiceLoader.load(IBaritoneProvider.class);
|
try {
|
||||||
Iterator<IBaritoneProvider> instances = baritoneLoader.iterator();
|
provider = (IBaritoneProvider) Class.forName("baritone.BaritoneProvider").newInstance();
|
||||||
provider = instances.next();
|
} catch (ReflectiveOperationException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IBaritoneProvider getProvider() {
|
public static IBaritoneProvider getProvider() {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api;
|
package baritone.api;
|
||||||
|
|
||||||
import baritone.api.behavior.IElytraBehavior;
|
|
||||||
import baritone.api.behavior.ILookBehavior;
|
import baritone.api.behavior.ILookBehavior;
|
||||||
import baritone.api.behavior.IPathingBehavior;
|
import baritone.api.behavior.IPathingBehavior;
|
||||||
import baritone.api.cache.IWorldProvider;
|
import baritone.api.cache.IWorldProvider;
|
||||||
@@ -41,12 +40,6 @@ public interface IBaritone {
|
|||||||
*/
|
*/
|
||||||
IPathingBehavior getPathingBehavior();
|
IPathingBehavior getPathingBehavior();
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The {@link IElytraBehavior} instance
|
|
||||||
* @see IElytraBehavior
|
|
||||||
*/
|
|
||||||
IElytraBehavior getElytraBehavior();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The {@link ILookBehavior} instance
|
* @return The {@link ILookBehavior} instance
|
||||||
* @see ILookBehavior
|
* @see ILookBehavior
|
||||||
@@ -95,6 +88,12 @@ public interface IBaritone {
|
|||||||
*/
|
*/
|
||||||
IGetToBlockProcess getGetToBlockProcess();
|
IGetToBlockProcess getGetToBlockProcess();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The {@link IElytraProcess} instance
|
||||||
|
* @see IElytraProcess
|
||||||
|
*/
|
||||||
|
IElytraProcess getElytraProcess();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The {@link IWorldProvider} instance
|
* @return The {@link IWorldProvider} instance
|
||||||
* @see IWorldProvider
|
* @see IWorldProvider
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ import baritone.api.command.ICommand;
|
|||||||
import baritone.api.command.ICommandSystem;
|
import baritone.api.command.ICommandSystem;
|
||||||
import baritone.api.schematic.ISchematicSystem;
|
import baritone.api.schematic.ISchematicSystem;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -49,17 +49,17 @@ public interface IBaritoneProvider {
|
|||||||
* returned by {@link #getPrimaryBaritone()}.
|
* returned by {@link #getPrimaryBaritone()}.
|
||||||
*
|
*
|
||||||
* @return All active {@link IBaritone} instances.
|
* @return All active {@link IBaritone} instances.
|
||||||
* @see #getBaritoneForPlayer(EntityPlayerSP)
|
* @see #getBaritoneForPlayer(LocalPlayer)
|
||||||
*/
|
*/
|
||||||
List<IBaritone> getAllBaritones();
|
List<IBaritone> getAllBaritones();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the {@link IBaritone} instance for a given {@link EntityPlayerSP}.
|
* Provides the {@link IBaritone} instance for a given {@link LocalPlayer}.
|
||||||
*
|
*
|
||||||
* @param player The player
|
* @param player The player
|
||||||
* @return The {@link IBaritone} instance.
|
* @return The {@link IBaritone} instance.
|
||||||
*/
|
*/
|
||||||
default IBaritone getBaritoneForPlayer(EntityPlayerSP player) {
|
default IBaritone getBaritoneForPlayer(LocalPlayer player) {
|
||||||
for (IBaritone baritone : this.getAllBaritones()) {
|
for (IBaritone baritone : this.getAllBaritones()) {
|
||||||
if (Objects.equals(player, baritone.getPlayerContext().player())) {
|
if (Objects.equals(player, baritone.getPlayerContext().player())) {
|
||||||
return baritone;
|
return baritone;
|
||||||
@@ -89,9 +89,9 @@ public interface IBaritoneProvider {
|
|||||||
* @param connection The connection
|
* @param connection The connection
|
||||||
* @return The {@link IBaritone} instance.
|
* @return The {@link IBaritone} instance.
|
||||||
*/
|
*/
|
||||||
default IBaritone getBaritoneForConnection(NetHandlerPlayClient connection) {
|
default IBaritone getBaritoneForConnection(ClientPacketListener connection) {
|
||||||
for (IBaritone baritone : this.getAllBaritones()) {
|
for (IBaritone baritone : this.getAllBaritones()) {
|
||||||
final EntityPlayerSP player = baritone.getPlayerContext().player();
|
final LocalPlayer player = baritone.getPlayerContext().player();
|
||||||
if (player != null && player.connection == connection) {
|
if (player != null && player.connection == connection) {
|
||||||
return baritone;
|
return baritone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,16 +17,23 @@
|
|||||||
|
|
||||||
package baritone.api;
|
package baritone.api;
|
||||||
|
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.NotificationHelper;
|
import baritone.api.utils.NotificationHelper;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import baritone.api.utils.TypeUtils;
|
import baritone.api.utils.TypeUtils;
|
||||||
import baritone.api.utils.gui.BaritoneToast;
|
import baritone.api.utils.gui.BaritoneToast;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.client.GuiMessageTag;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.core.Vec3i;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.Mirror;
|
||||||
|
import net.minecraft.world.level.block.Rotation;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
@@ -48,6 +55,7 @@ import java.util.function.Consumer;
|
|||||||
* @author leijurv
|
* @author leijurv
|
||||||
*/
|
*/
|
||||||
public final class Settings {
|
public final class Settings {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger("Baritone");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow Baritone to break blocks
|
* Allow Baritone to break blocks
|
||||||
@@ -69,6 +77,16 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> allowPlace = new Setting<>(true);
|
public final Setting<Boolean> allowPlace = new Setting<>(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow Baritone to place blocks in fluid source blocks
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> allowPlaceInFluidsSource = new Setting<>(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow Baritone to place blocks in flowing fluid
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> allowPlaceInFluidsFlow = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow Baritone to move items in your inventory to your hotbar
|
* Allow Baritone to move items in your inventory to your hotbar
|
||||||
*/
|
*/
|
||||||
@@ -167,6 +185,13 @@ public final class Settings {
|
|||||||
* <p>
|
* <p>
|
||||||
* Defaults to false because this fails on constantiam. Please let me know if this is ever disabled. Please.
|
* Defaults to false because this fails on constantiam. Please let me know if this is ever disabled. Please.
|
||||||
*/
|
*/
|
||||||
|
public final Setting<Boolean> allowJumpAtBuildLimit = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just here so mods that use the API don't break. Does nothing.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
@JavaOnly
|
||||||
public final Setting<Boolean> allowJumpAt256 = new Setting<>(false);
|
public final Setting<Boolean> allowJumpAt256 = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -203,10 +228,10 @@ public final class Settings {
|
|||||||
* Blocks that Baritone is allowed to place (as throwaway, for sneak bridging, pillaring, etc.)
|
* Blocks that Baritone is allowed to place (as throwaway, for sneak bridging, pillaring, etc.)
|
||||||
*/
|
*/
|
||||||
public final Setting<List<Item>> acceptableThrowawayItems = new Setting<>(new ArrayList<>(Arrays.asList(
|
public final Setting<List<Item>> acceptableThrowawayItems = new Setting<>(new ArrayList<>(Arrays.asList(
|
||||||
Item.getItemFromBlock(Blocks.DIRT),
|
Blocks.DIRT.asItem(),
|
||||||
Item.getItemFromBlock(Blocks.COBBLESTONE),
|
Blocks.COBBLESTONE.asItem(),
|
||||||
Item.getItemFromBlock(Blocks.NETHERRACK),
|
Blocks.NETHERRACK.asItem(),
|
||||||
Item.getItemFromBlock(Blocks.STONE)
|
Blocks.STONE.asItem()
|
||||||
)));
|
)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -229,11 +254,8 @@ public final class Settings {
|
|||||||
public final Setting<List<Block>> blocksToAvoidBreaking = new Setting<>(new ArrayList<>(Arrays.asList( // TODO can this be a HashSet or ImmutableSet?
|
public final Setting<List<Block>> blocksToAvoidBreaking = new Setting<>(new ArrayList<>(Arrays.asList( // TODO can this be a HashSet or ImmutableSet?
|
||||||
Blocks.CRAFTING_TABLE,
|
Blocks.CRAFTING_TABLE,
|
||||||
Blocks.FURNACE,
|
Blocks.FURNACE,
|
||||||
Blocks.LIT_FURNACE,
|
|
||||||
Blocks.CHEST,
|
Blocks.CHEST,
|
||||||
Blocks.TRAPPED_CHEST,
|
Blocks.TRAPPED_CHEST
|
||||||
Blocks.STANDING_SIGN,
|
|
||||||
Blocks.WALL_SIGN
|
|
||||||
)));
|
)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -373,11 +395,22 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> rightClickSpeed = new Setting<>(4);
|
public final Setting<Integer> rightClickSpeed = new Setting<>(4);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How many degrees to randomize the yaw every tick. Set to 0 to disable
|
||||||
|
*/
|
||||||
|
public final Setting<Double> randomLooking113 = new Setting<>(2d);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Block reach distance
|
* Block reach distance
|
||||||
*/
|
*/
|
||||||
public final Setting<Float> blockReachDistance = new Setting<>(4.5f);
|
public final Setting<Float> blockReachDistance = new Setting<>(4.5f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How many ticks between breaking a block and starting to break the next block. Default in game is 6 ticks.
|
||||||
|
* Values under 1 will be clamped. The delay only applies to non-instant (1-tick) breaks.
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> blockBreakSpeed = new Setting<>(6);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How many degrees to randomize the pitch and yaw every tick. Set to 0 to disable
|
* How many degrees to randomize the pitch and yaw every tick. Set to 0 to disable
|
||||||
*/
|
*/
|
||||||
@@ -737,16 +770,25 @@ public final class Settings {
|
|||||||
public final Setting<Boolean> blockFreeLook = new Setting<>(false);
|
public final Setting<Boolean> blockFreeLook = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically elytra fly without having to force the client-sided rotations. Requires {@link #freeLook}.
|
* Automatically elytra fly without having to force the client-sided rotations.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> elytraFreeLook = new Setting<>(false);
|
public final Setting<Boolean> elytraFreeLook = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forces the client-sided rotations to an average of the last 10 ticks of server-sided rotations.
|
* Forces the client-sided yaw rotation to an average of the last {@link #smoothLookTicks} of server-sided rotations.
|
||||||
* Requires {@link #freeLook}.
|
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> smoothLook = new Setting<>(false);
|
public final Setting<Boolean> smoothLook = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as {@link #smoothLook} but for elytra flying.
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraSmoothLook = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of ticks to average across for {@link #smoothLook};
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> smoothLookTicks = new Setting<>(5);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When true, the player will remain with its existing look direction as often as possible.
|
* When true, the player will remain with its existing look direction as often as possible.
|
||||||
* Although, in some cases this can get it stuck, hence this setting to disable that behavior.
|
* Although, in some cases this can get it stuck, hence this setting to disable that behavior.
|
||||||
@@ -815,6 +857,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> shortBaritonePrefix = new Setting<>(false);
|
public final Setting<Boolean> shortBaritonePrefix = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use a modern message tag instead of a prefix when logging to chat
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> useMessageTag = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Echo commands to chat when they are run
|
* Echo commands to chat when they are run
|
||||||
*/
|
*/
|
||||||
@@ -882,15 +929,23 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> maxCachedWorldScanCount = new Setting<>(10);
|
public final Setting<Integer> maxCachedWorldScanCount = new Setting<>(10);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mine will not scan for or remember more than this many target locations.
|
||||||
|
* Note that the number of locations retrieved from cache is additionaly
|
||||||
|
* limited by {@link #maxCachedWorldScanCount}.
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> mineMaxOreLocationsCount = new Setting<>(64);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the minimum y level whilst mining - set to 0 to turn off.
|
* Sets the minimum y level whilst mining - set to 0 to turn off.
|
||||||
|
* if world has negative y values, subtract the min world height to get the value to put here
|
||||||
*/
|
*/
|
||||||
public final Setting<Integer> minYLevelWhileMining = new Setting<>(0);
|
public final Setting<Integer> minYLevelWhileMining = new Setting<>(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the maximum y level to mine ores at.
|
* Sets the maximum y level to mine ores at.
|
||||||
*/
|
*/
|
||||||
public final Setting<Integer> maxYLevelWhileMining = new Setting<>(255); // 1.17+ defaults to maximum possible world height
|
public final Setting<Integer> maxYLevelWhileMining = new Setting<>(2031);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This will only allow baritone to mine exposed ores, can be used to stop ore obfuscators on servers that use them.
|
* This will only allow baritone to mine exposed ores, can be used to stop ore obfuscators on servers that use them.
|
||||||
@@ -938,6 +993,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> replantNetherWart = new Setting<>(false);
|
public final Setting<Boolean> replantNetherWart = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Farming will scan for at most this many blocks.
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> farmMaxScanSize = new Setting<>(256);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When the cache scan gives less blocks than the maximum threshold (but still above zero), scan the main world too.
|
* When the cache scan gives less blocks than the maximum threshold (but still above zero), scan the main world too.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -1029,6 +1089,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Double> breakCorrectBlockPenaltyMultiplier = new Setting<>(10d);
|
public final Setting<Double> breakCorrectBlockPenaltyMultiplier = new Setting<>(10d);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multiply the cost of placing a block that's incorrect in the builder's schematic by this coefficient
|
||||||
|
*/
|
||||||
|
public final Setting<Double> placeIncorrectBlockPenaltyMultiplier = new Setting<>(2d);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When this setting is true, build a schematic with the highest X coordinate being the origin, instead of the lowest
|
* When this setting is true, build a schematic with the highest X coordinate being the origin, instead of the lowest
|
||||||
*/
|
*/
|
||||||
@@ -1044,6 +1109,28 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> schematicOrientationZ = new Setting<>(false);
|
public final Setting<Boolean> schematicOrientationZ = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rotates the schematic before building it.
|
||||||
|
* Possible values are
|
||||||
|
* <ul>
|
||||||
|
* <li> NONE - No rotation </li>
|
||||||
|
* <li> CLOCKWISE_90 - Rotate 90° clockwise </li>
|
||||||
|
* <li> CLOCKWISE_180 - Rotate 180° clockwise </li>
|
||||||
|
* <li> COUNTERCLOCKWISE_90 - Rotate 270° clockwise </li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public final Setting<Rotation> buildSchematicRotation = new Setting<>(Rotation.NONE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mirrors the schematic before building it.
|
||||||
|
* Possible values are
|
||||||
|
* <ul>
|
||||||
|
* <li> FRONT_BACK - mirror the schematic along its local x axis </li>
|
||||||
|
* <li> LEFT_RIGHT - mirror the schematic along its local z axis </li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public final Setting<Mirror> buildSchematicMirror = new Setting<>(Mirror.NONE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The fallback used by the build command when no extension is specified. This may be useful if schematics of a
|
* The fallback used by the build command when no extension is specified. This may be useful if schematics of a
|
||||||
* particular format are used often, and the user does not wish to have to specify the extension with every usage.
|
* particular format are used often, and the user does not wish to have to specify the extension with every usage.
|
||||||
@@ -1110,7 +1197,7 @@ public final class Settings {
|
|||||||
/**
|
/**
|
||||||
* What Y level to go to for legit strip mining
|
* What Y level to go to for legit strip mining
|
||||||
*/
|
*/
|
||||||
public final Setting<Integer> legitMineYLevel = new Setting<>(11);
|
public final Setting<Integer> legitMineYLevel = new Setting<>(-59);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magically see ores that are separated diagonally from existing ores. Basically like mining around the ores that it finds
|
* Magically see ores that are separated diagonally from existing ores. Basically like mining around the ores that it finds
|
||||||
@@ -1155,6 +1242,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> followRadius = new Setting<>(3);
|
public final Setting<Integer> followRadius = new Setting<>(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum distance to the entity you're following
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> followTargetMaxDistance = new Setting<>(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn this on if your exploration filter is enormous, you don't want it to check if it's done,
|
* Turn this on if your exploration filter is enormous, you don't want it to check if it's done,
|
||||||
* and you are just fine with it just hanging on completion
|
* and you are just fine with it just hanging on completion
|
||||||
@@ -1189,7 +1281,14 @@ public final class Settings {
|
|||||||
* {@link Setting#value};
|
* {@link Setting#value};
|
||||||
*/
|
*/
|
||||||
@JavaOnly
|
@JavaOnly
|
||||||
public final Setting<Consumer<ITextComponent>> logger = new Setting<>(msg -> Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(msg));
|
public final Setting<Consumer<Component>> logger = new Setting<>((msg) -> {
|
||||||
|
try {
|
||||||
|
final GuiMessageTag tag = useMessageTag.value ? Helper.MESSAGE_TAG : null;
|
||||||
|
Minecraft.getInstance().gui.getChat().addMessage(msg, null, tag);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
LOGGER.warn("Failed to log message to chat: " + msg.getString(), t);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function that is called when Baritone will send a desktop notification. This function can be added to
|
* The function that is called when Baritone will send a desktop notification. This function can be added to
|
||||||
@@ -1205,7 +1304,12 @@ public final class Settings {
|
|||||||
* {@link Setting#value};
|
* {@link Setting#value};
|
||||||
*/
|
*/
|
||||||
@JavaOnly
|
@JavaOnly
|
||||||
public final Setting<BiConsumer<ITextComponent, ITextComponent>> toaster = new Setting<>(BaritoneToast::addOrUpdate);
|
public final Setting<BiConsumer<Component, Component>> toaster = new Setting<>(BaritoneToast::addOrUpdate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print out ALL command exceptions as a stack trace to stdout, even simple syntax errors
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> verboseCommandExceptions = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The size of the box that is rendered when the current goal is a GoalYLevel
|
* The size of the box that is rendered when the current goal is a GoalYLevel
|
||||||
@@ -1347,7 +1451,7 @@ public final class Settings {
|
|||||||
/**
|
/**
|
||||||
* The minimum speed that the player can drop to (in blocks/tick) before a firework is automatically deployed.
|
* The minimum speed that the player can drop to (in blocks/tick) before a firework is automatically deployed.
|
||||||
*/
|
*/
|
||||||
public final Setting<Double> elytraFireworkSpeed = new Setting<>(0.6);
|
public final Setting<Double> elytraFireworkSpeed = new Setting<>(1.2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The delay after the player's position is set-back by the server that a firework may be automatically deployed.
|
* The delay after the player's position is set-back by the server that a firework may be automatically deployed.
|
||||||
@@ -1366,23 +1470,23 @@ public final class Settings {
|
|||||||
/**
|
/**
|
||||||
* If enabled, avoids using fireworks when descending along the flight path.
|
* If enabled, avoids using fireworks when descending along the flight path.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> conserveFireworks = new Setting<>(true);
|
public final Setting<Boolean> elytraConserveFireworks = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the raytraces that are performed by the elytra fly calculation.
|
* Renders the raytraces that are performed by the elytra fly calculation.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> renderRaytraces = new Setting<>(false);
|
public final Setting<Boolean> elytraRenderRaytraces = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the raytraces that are used in the hitbox part of the elytra fly calculation.
|
* Renders the raytraces that are used in the hitbox part of the elytra fly calculation.
|
||||||
* Requires {@link #renderRaytraces}.
|
* Requires {@link #elytraRenderRaytraces}.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> renderHitboxRaytraces = new Setting<>(false);
|
public final Setting<Boolean> elytraRenderHitboxRaytraces = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the best elytra flight path that was simulated each tick.
|
* Renders the best elytra flight path that was simulated each tick.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> renderElytraSimulation = new Setting<>(false);
|
public final Setting<Boolean> elytraRenderSimulation = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically path to and jump off of ledges to initiate elytra flight when grounded.
|
* Automatically path to and jump off of ledges to initiate elytra flight when grounded.
|
||||||
@@ -1395,6 +1499,12 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Long> elytraNetherSeed = new Setting<>(146008555100680L);
|
public final Setting<Long> elytraNetherSeed = new Setting<>(146008555100680L);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether nether-pathfinder should generate terrain based on {@link #elytraNetherSeed}.
|
||||||
|
* If false all chunks that haven't been loaded are assumed to be air.
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraPredictTerrain = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically swap the current elytra with a new one when the durability gets too low
|
* Automatically swap the current elytra with a new one when the durability gets too low
|
||||||
*/
|
*/
|
||||||
@@ -1405,6 +1515,16 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> elytraMinimumDurability = new Setting<>(5);
|
public final Setting<Integer> elytraMinimumDurability = new Setting<>(5);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The minimum fireworks before landing early for safety
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> elytraMinFireworksBeforeLanding = new Setting<>(5);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically land when elytra is almost out of durability, or almost out of fireworks
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraAllowEmergencyLand = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Time between culling far away chunks from the nether pathfinder chunk cache
|
* Time between culling far away chunks from the nether pathfinder chunk cache
|
||||||
*/
|
*/
|
||||||
@@ -1415,6 +1535,21 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> elytraCacheCullDistance = new Setting<>(5000);
|
public final Setting<Integer> elytraCacheCullDistance = new Setting<>(5000);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should elytra consider nether brick a valid landing block
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraAllowLandOnNetherFortress = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has the user read and understood the elytra terms and conditions
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraTermsAccepted = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verbose chat logging in elytra mode
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> elytraChatSpam = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map of lowercase setting field names to their respective setting
|
* A map of lowercase setting field names to their respective setting
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,10 +27,4 @@ import baritone.api.event.listener.IGameEventListener;
|
|||||||
* @see IGameEventListener
|
* @see IGameEventListener
|
||||||
* @since 9/23/2018
|
* @since 9/23/2018
|
||||||
*/
|
*/
|
||||||
public interface IBehavior extends AbstractGameEventListener {
|
public interface IBehavior extends AbstractGameEventListener {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called after Baritone's initialization is complete
|
|
||||||
*/
|
|
||||||
default void onLoad() {}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package baritone.api.cache;
|
package baritone.api.cache;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -26,9 +26,9 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
*/
|
*/
|
||||||
public interface IBlockTypeAccess {
|
public interface IBlockTypeAccess {
|
||||||
|
|
||||||
IBlockState getBlock(int x, int y, int z);
|
BlockState getBlock(int x, int y, int z);
|
||||||
|
|
||||||
default IBlockState getBlock(BlockPos pos) {
|
default BlockState getBlock(BlockPos pos) {
|
||||||
return getBlock(pos.getX(), pos.getY(), pos.getZ());
|
return getBlock(pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.cache;
|
package baritone.api.cache;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.chunk.Chunk;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -44,7 +43,7 @@ public interface ICachedWorld {
|
|||||||
*
|
*
|
||||||
* @param chunk The chunk to pack and store
|
* @param chunk The chunk to pack and store
|
||||||
*/
|
*/
|
||||||
void queueForPacking(Chunk chunk);
|
void queueForPacking(LevelChunk chunk);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the block at the specified X and Z coordinates
|
* Returns whether or not the block at the specified X and Z coordinates
|
||||||
|
|||||||
@@ -19,11 +19,10 @@ package baritone.api.cache;
|
|||||||
|
|
||||||
import baritone.api.utils.BlockOptionalMetaLookup;
|
import baritone.api.utils.BlockOptionalMetaLookup;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.ChunkPos;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
|
|||||||
@@ -27,11 +27,10 @@ import baritone.api.command.exception.CommandInvalidTypeException;
|
|||||||
import baritone.api.command.exception.CommandNotEnoughArgumentsException;
|
import baritone.api.command.exception.CommandNotEnoughArgumentsException;
|
||||||
import baritone.api.command.exception.CommandTooManyArgumentsException;
|
import baritone.api.command.exception.CommandTooManyArgumentsException;
|
||||||
import baritone.api.utils.Helper;
|
import baritone.api.utils.Helper;
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
|
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link IArgConsumer} is how {@link ICommand}s read the arguments passed to them. This class has many benefits:
|
* The {@link IArgConsumer} is how {@link ICommand}s read the arguments passed to them. This class has many benefits:
|
||||||
@@ -404,8 +403,8 @@ public interface IArgConsumer {
|
|||||||
/**
|
/**
|
||||||
* Gets an enum value from the enum class with the same name as the next argument's value
|
* Gets an enum value from the enum class with the same name as the next argument's value
|
||||||
* <p>
|
* <p>
|
||||||
* For example if you getEnum as an {@link EnumFacing}, and the next argument's value is "up", this will return
|
* For example if you getEnum as an {@link Direction}, and the next argument's value is "up", this will return
|
||||||
* {@link EnumFacing#UP}
|
* {@link Direction#UP}
|
||||||
*
|
*
|
||||||
* @param enumClass The enum class to search
|
* @param enumClass The enum class to search
|
||||||
* @return An enum constant of that class with the same name as the next argument's value
|
* @return An enum constant of that class with the same name as the next argument's value
|
||||||
@@ -419,8 +418,8 @@ public interface IArgConsumer {
|
|||||||
/**
|
/**
|
||||||
* Gets an enum value from the enum class with the same name as the next argument's value
|
* Gets an enum value from the enum class with the same name as the next argument's value
|
||||||
* <p>
|
* <p>
|
||||||
* For example if you getEnum as an {@link EnumFacing}, and the next argument's value is "up", this will return
|
* For example if you getEnum as an {@link Direction}, and the next argument's value is "up", this will return
|
||||||
* {@link EnumFacing#UP}
|
* {@link Direction#UP}
|
||||||
*
|
*
|
||||||
* @param enumClass The enum class to search
|
* @param enumClass The enum class to search
|
||||||
* @param def The default value
|
* @param def The default value
|
||||||
@@ -436,8 +435,8 @@ public interface IArgConsumer {
|
|||||||
/**
|
/**
|
||||||
* Gets an enum value from the enum class with the same name as the next argument's value
|
* Gets an enum value from the enum class with the same name as the next argument's value
|
||||||
* <p>
|
* <p>
|
||||||
* For example if you getEnum as an {@link EnumFacing}, and the next argument's value is "up", this will return
|
* For example if you getEnum as an {@link Direction}, and the next argument's value is "up", this will return
|
||||||
* {@link EnumFacing#UP}
|
* {@link Direction#UP}
|
||||||
*
|
*
|
||||||
* @param enumClass The enum class to search
|
* @param enumClass The enum class to search
|
||||||
* @return An enum constant of that class with the same name as the next argument's value, or {@code null} if it
|
* @return An enum constant of that class with the same name as the next argument's value, or {@code null} if it
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ package baritone.api.command.argument;
|
|||||||
|
|
||||||
import baritone.api.command.argparser.IArgParser;
|
import baritone.api.command.argparser.IArgParser;
|
||||||
import baritone.api.command.exception.CommandInvalidTypeException;
|
import baritone.api.command.exception.CommandInvalidTypeException;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link ICommandArgument} is an immutable object representing one command argument. It contains data on the index of
|
* A {@link ICommandArgument} is an immutable object representing one command argument. It contains data on the index of
|
||||||
@@ -50,8 +50,8 @@ public interface ICommandArgument {
|
|||||||
/**
|
/**
|
||||||
* Gets an enum value from the enum class with the same name as this argument's value
|
* Gets an enum value from the enum class with the same name as this argument's value
|
||||||
* <p>
|
* <p>
|
||||||
* For example if you getEnum as an {@link EnumFacing}, and this argument's value is "up", it will return {@link
|
* For example if you getEnum as an {@link Direction}, and this argument's value is "up", it will return {@link
|
||||||
* EnumFacing#UP}
|
* Direction#UP}
|
||||||
*
|
*
|
||||||
* @param enumClass The enum class to search
|
* @param enumClass The enum class to search
|
||||||
* @return An enum constant of that class with the same name as this argument's value
|
* @return An enum constant of that class with the same name as this argument's value
|
||||||
|
|||||||
@@ -19,26 +19,20 @@ package baritone.api.command.datatypes;
|
|||||||
|
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public enum BlockById implements IDatatypeFor<Block> {
|
public enum BlockById implements IDatatypeFor<Block> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
/**
|
|
||||||
* Matches (domain:)?name? where domain and name are [a-z0-9_.-]+ and [a-z0-9/_.-]+ respectively.
|
|
||||||
*/
|
|
||||||
private static Pattern PATTERN = Pattern.compile("(?:[a-z0-9_.-]+:)?[a-z0-9/_.-]*");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Block get(IDatatypeContext ctx) throws CommandException {
|
public Block get(IDatatypeContext ctx) throws CommandException {
|
||||||
ResourceLocation id = new ResourceLocation(ctx.getConsumer().getString());
|
ResourceLocation id = new ResourceLocation(ctx.getConsumer().getString());
|
||||||
Block block;
|
Block block;
|
||||||
if ((block = Block.REGISTRY.getObject(id)) == Blocks.AIR) {
|
if ((block = BuiltInRegistries.BLOCK.getOptional(id).orElse(null)) == null) {
|
||||||
throw new IllegalArgumentException("no block found by that id");
|
throw new IllegalArgumentException("no block found by that id");
|
||||||
}
|
}
|
||||||
return block;
|
return block;
|
||||||
@@ -48,13 +42,9 @@ public enum BlockById implements IDatatypeFor<Block> {
|
|||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
String arg = ctx.getConsumer().getString();
|
String arg = ctx.getConsumer().getString();
|
||||||
|
|
||||||
if (!PATTERN.matcher(arg).matches()) {
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(
|
.append(
|
||||||
Block.REGISTRY.getKeys()
|
BuiltInRegistries.BLOCK.keySet()
|
||||||
.stream()
|
.stream()
|
||||||
.map(Object::toString)
|
.map(Object::toString)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,32 +19,20 @@ package baritone.api.command.datatypes;
|
|||||||
|
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
import net.minecraft.entity.EntityList;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.world.entity.EntityType;
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public enum EntityClassById implements IDatatypeFor<Class<? extends Entity>> {
|
public enum EntityClassById implements IDatatypeFor<EntityType> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<? extends Entity> get(IDatatypeContext ctx) throws CommandException {
|
public EntityType get(IDatatypeContext ctx) throws CommandException {
|
||||||
ResourceLocation id = new ResourceLocation(ctx.getConsumer().getString());
|
ResourceLocation id = new ResourceLocation(ctx.getConsumer().getString());
|
||||||
Class<? extends Entity> entity;
|
EntityType entity;
|
||||||
try {
|
if ((entity = BuiltInRegistries.ENTITY_TYPE.getOptional(id).orElse(null)) == null) {
|
||||||
entity = EntityList.REGISTRY.getObject(id);
|
|
||||||
} catch (NoSuchFieldError e) {
|
|
||||||
// Forge removes EntityList.REGISTRY field and provides the getClass method as a replacement
|
|
||||||
// See https://github.com/MinecraftForge/MinecraftForge/blob/1.12.x/patches/minecraft/net/minecraft/entity/EntityList.java.patch
|
|
||||||
try {
|
|
||||||
entity = (Class<? extends Entity>) EntityList.class.getMethod("getClass", ResourceLocation.class).invoke(null, id);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
throw new RuntimeException("EntityList.REGISTRY does not exist and failed to call the Forge-replacement method", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entity == null) {
|
|
||||||
throw new IllegalArgumentException("no entity found by that id");
|
throw new IllegalArgumentException("no entity found by that id");
|
||||||
}
|
}
|
||||||
return entity;
|
return entity;
|
||||||
@@ -53,7 +41,7 @@ public enum EntityClassById implements IDatatypeFor<Class<? extends Entity>> {
|
|||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(EntityList.getEntityNameList().stream().map(Object::toString))
|
.append(BuiltInRegistries.ENTITY_TYPE.stream().map(Object::toString))
|
||||||
.filterPrefixNamespaced(ctx.getConsumer().getString())
|
.filterPrefixNamespaced(ctx.getConsumer().getString())
|
||||||
.sortAlphabetically()
|
.sortAlphabetically()
|
||||||
.stream();
|
.stream();
|
||||||
|
|||||||
@@ -19,24 +19,24 @@ package baritone.api.command.datatypes;
|
|||||||
|
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public enum ForAxis implements IDatatypeFor<EnumFacing.Axis> {
|
public enum ForAxis implements IDatatypeFor<Direction.Axis> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EnumFacing.Axis get(IDatatypeContext ctx) throws CommandException {
|
public Direction.Axis get(IDatatypeContext ctx) throws CommandException {
|
||||||
return EnumFacing.Axis.valueOf(ctx.getConsumer().getString().toUpperCase(Locale.US));
|
return Direction.Axis.valueOf(ctx.getConsumer().getString().toUpperCase(Locale.US));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(Stream.of(EnumFacing.Axis.values())
|
.append(Stream.of(Direction.Axis.values())
|
||||||
.map(EnumFacing.Axis::getName).map(String::toLowerCase))
|
.map(Direction.Axis::getName).map(String::toLowerCase))
|
||||||
.filterPrefix(ctx.getConsumer().getString())
|
.filterPrefix(ctx.getConsumer().getString())
|
||||||
.stream();
|
.stream();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,10 @@ package baritone.api.command.datatypes;
|
|||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import baritone.api.utils.BlockOptionalMeta;
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
import net.minecraft.block.properties.IProperty;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.properties.Property;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -76,7 +77,7 @@ public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
|||||||
properties = parts[1];
|
properties = parts[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
Block block = Block.REGISTRY.getObject(new ResourceLocation(blockId));
|
Block block = BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(blockId)).orElse(null);
|
||||||
if (block == null) {
|
if (block == null) {
|
||||||
// This block doesn't exist so there's no properties to complete.
|
// This block doesn't exist so there's no properties to complete.
|
||||||
return Stream.empty();
|
return Stream.empty();
|
||||||
@@ -98,10 +99,10 @@ public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
|||||||
String prefix = arg.substring(0, arg.length() - lastProperty.length());
|
String prefix = arg.substring(0, arg.length() - lastProperty.length());
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(
|
.append(
|
||||||
block.getBlockState()
|
block.getStateDefinition()
|
||||||
.getProperties()
|
.getProperties()
|
||||||
.stream()
|
.stream()
|
||||||
.map(IProperty::getName)
|
.map(Property::getName)
|
||||||
)
|
)
|
||||||
.filter(prop -> !usedProps.contains(prop))
|
.filter(prop -> !usedProps.contains(prop))
|
||||||
.filterPrefix(lastProperty)
|
.filterPrefix(lastProperty)
|
||||||
@@ -120,7 +121,7 @@ public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
|||||||
// We are completing the value of a property
|
// We are completing the value of a property
|
||||||
String prefix = arg.substring(0, arg.length() - lastValue.length());
|
String prefix = arg.substring(0, arg.length() - lastValue.length());
|
||||||
|
|
||||||
IProperty<?> property = block.getBlockState().getProperty(lastName);
|
Property<?> property = block.getStateDefinition().getProperty(lastName);
|
||||||
if (property == null) {
|
if (property == null) {
|
||||||
// The property does not exist so there's no values to complete
|
// The property does not exist so there's no values to complete
|
||||||
return Stream.empty();
|
return Stream.empty();
|
||||||
@@ -147,7 +148,7 @@ public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// this shouldn't need to be a separate method?
|
// this shouldn't need to be a separate method?
|
||||||
private static <T extends Comparable<T>> Stream<String> getValues(IProperty<T> property) {
|
private static <T extends Comparable<T>> Stream<String> getValues(Property<T> property) {
|
||||||
return property.getAllowedValues().stream().map(property::getName);
|
return property.getPossibleValues().stream().map(property::getName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,24 +19,23 @@ package baritone.api.command.datatypes;
|
|||||||
|
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
public enum ForEnumFacing implements IDatatypeFor<EnumFacing> {
|
public enum ForDirection implements IDatatypeFor<Direction> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EnumFacing get(IDatatypeContext ctx) throws CommandException {
|
public Direction get(IDatatypeContext ctx) throws CommandException {
|
||||||
return EnumFacing.valueOf(ctx.getConsumer().getString().toUpperCase(Locale.US));
|
return Direction.valueOf(ctx.getConsumer().getString().toUpperCase(Locale.US));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(Stream.of(EnumFacing.values())
|
.append(Stream.of(Direction.values())
|
||||||
.map(EnumFacing::getName).map(String::toLowerCase))
|
.map(Direction::getName).map(String::toLowerCase))
|
||||||
.filterPrefix(ctx.getConsumer().getString())
|
.filterPrefix(ctx.getConsumer().getString())
|
||||||
.stream();
|
.stream();
|
||||||
}
|
}
|
||||||
53
src/api/java/baritone/api/command/datatypes/ItemById.java
Normal file
53
src/api/java/baritone/api/command/datatypes/ItemById.java
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Baritone 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package baritone.api.command.datatypes;
|
||||||
|
|
||||||
|
import baritone.api.command.exception.CommandException;
|
||||||
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public enum ItemById implements IDatatypeFor<Item> {
|
||||||
|
INSTANCE;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item get(IDatatypeContext ctx) throws CommandException {
|
||||||
|
ResourceLocation id = new ResourceLocation(ctx.getConsumer().getString());
|
||||||
|
Item item;
|
||||||
|
if ((item = BuiltInRegistries.ITEM.getOptional(id).orElse(null)) == null) {
|
||||||
|
throw new IllegalArgumentException("No item found by that id");
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
|
return new TabCompleteHelper()
|
||||||
|
.append(
|
||||||
|
BuiltInRegistries.BLOCK.keySet()
|
||||||
|
.stream()
|
||||||
|
.map(ResourceLocation::toString)
|
||||||
|
)
|
||||||
|
.filterPrefixNamespaced(ctx.getConsumer().getString())
|
||||||
|
.sortAlphabetically()
|
||||||
|
.stream();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,36 +20,36 @@ package baritone.api.command.datatypes;
|
|||||||
import baritone.api.IBaritone;
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
import baritone.api.command.helpers.TabCompleteHelper;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link IDatatype} used to resolve nearby players, those within
|
* An {@link IDatatype} used to resolve nearby players, those within
|
||||||
* render distance of the target {@link IBaritone} instance.
|
* render distance of the target {@link IBaritone} instance.
|
||||||
*/
|
*/
|
||||||
public enum NearbyPlayer implements IDatatypeFor<EntityPlayer> {
|
public enum NearbyPlayer implements IDatatypeFor<Player> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityPlayer get(IDatatypeContext ctx) throws CommandException {
|
public Player get(IDatatypeContext ctx) throws CommandException {
|
||||||
final String username = ctx.getConsumer().getString();
|
final String username = ctx.getConsumer().getString();
|
||||||
return getPlayers(ctx).stream()
|
return getPlayers(ctx).stream()
|
||||||
.filter(s -> s.getName().equalsIgnoreCase(username))
|
.filter(s -> s.getName().getString().equalsIgnoreCase(username))
|
||||||
.findFirst().orElse(null);
|
.findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
return new TabCompleteHelper()
|
return new TabCompleteHelper()
|
||||||
.append(getPlayers(ctx).stream().map(EntityPlayer::getName))
|
.append(getPlayers(ctx).stream().map(Player::getName).map(Component::getString))
|
||||||
.filterPrefix(ctx.getConsumer().getString())
|
.filterPrefix(ctx.getConsumer().getString())
|
||||||
.sortAlphabetically()
|
.sortAlphabetically()
|
||||||
.stream();
|
.stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<EntityPlayer> getPlayers(IDatatypeContext ctx) {
|
private static List<? extends Player> getPlayers(IDatatypeContext ctx) {
|
||||||
return ctx.getBaritone().getPlayerContext().world().playerEntities;
|
return ctx.getBaritone().getPlayerContext().world().players();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ import java.util.Locale;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static baritone.api.utils.Helper.HELPER;
|
|
||||||
|
|
||||||
public enum RelativeFile implements IDatatypePost<File, File> {
|
public enum RelativeFile implements IDatatypePost<File, File> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@@ -101,7 +99,7 @@ public enum RelativeFile implements IDatatypePost<File, File> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static File gameDir(Minecraft mc) {
|
public static File gameDir(Minecraft mc) {
|
||||||
File gameDir = mc.gameDir.getAbsoluteFile();
|
File gameDir = mc.gameDirectory.getAbsoluteFile();
|
||||||
if (gameDir.getName().equals(".")) {
|
if (gameDir.getName().equals(".")) {
|
||||||
return gameDir.getParentFile();
|
return gameDir.getParentFile();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,8 @@ import baritone.api.command.argument.IArgConsumer;
|
|||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.pathing.goals.GoalBlock;
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
|
||||||
public enum RelativeGoalBlock implements IDatatypePost<GoalBlock, BetterBlockPos> {
|
public enum RelativeGoalBlock implements IDatatypePost<GoalBlock, BetterBlockPos> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
@@ -36,9 +35,9 @@ public enum RelativeGoalBlock implements IDatatypePost<GoalBlock, BetterBlockPos
|
|||||||
|
|
||||||
final IArgConsumer consumer = ctx.getConsumer();
|
final IArgConsumer consumer = ctx.getConsumer();
|
||||||
return new GoalBlock(
|
return new GoalBlock(
|
||||||
MathHelper.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.x)),
|
Mth.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.x)),
|
||||||
MathHelper.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.y)),
|
Mth.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.y)),
|
||||||
MathHelper.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.z))
|
Mth.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.z))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,9 +21,8 @@ import baritone.api.command.argument.IArgConsumer;
|
|||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.pathing.goals.GoalXZ;
|
import baritone.api.pathing.goals.GoalXZ;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
|
||||||
public enum RelativeGoalXZ implements IDatatypePost<GoalXZ, BetterBlockPos> {
|
public enum RelativeGoalXZ implements IDatatypePost<GoalXZ, BetterBlockPos> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
@@ -36,8 +35,8 @@ public enum RelativeGoalXZ implements IDatatypePost<GoalXZ, BetterBlockPos> {
|
|||||||
|
|
||||||
final IArgConsumer consumer = ctx.getConsumer();
|
final IArgConsumer consumer = ctx.getConsumer();
|
||||||
return new GoalXZ(
|
return new GoalXZ(
|
||||||
MathHelper.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.x)),
|
Mth.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.x)),
|
||||||
MathHelper.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.z))
|
Mth.floor(consumer.getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.z))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,9 +21,8 @@ import baritone.api.command.argument.IArgConsumer;
|
|||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.pathing.goals.GoalYLevel;
|
import baritone.api.pathing.goals.GoalYLevel;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
|
||||||
public enum RelativeGoalYLevel implements IDatatypePost<GoalYLevel, BetterBlockPos> {
|
public enum RelativeGoalYLevel implements IDatatypePost<GoalYLevel, BetterBlockPos> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
@@ -35,7 +34,7 @@ public enum RelativeGoalYLevel implements IDatatypePost<GoalYLevel, BetterBlockP
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new GoalYLevel(
|
return new GoalYLevel(
|
||||||
MathHelper.floor(ctx.getConsumer().getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.y))
|
Mth.floor(ctx.getConsumer().getDatatypePost(RelativeCoordinate.INSTANCE, (double) origin.y))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,8 @@ package baritone.api.command.exception;
|
|||||||
|
|
||||||
import baritone.api.command.ICommand;
|
import baritone.api.command.ICommand;
|
||||||
import baritone.api.command.argument.ICommandArgument;
|
import baritone.api.command.argument.ICommandArgument;
|
||||||
import net.minecraft.util.text.TextFormatting;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
|
||||||
import static baritone.api.utils.Helper.HELPER;
|
import static baritone.api.utils.Helper.HELPER;
|
||||||
|
|
||||||
@@ -50,6 +49,6 @@ public interface ICommandException {
|
|||||||
* @param args The arguments the command was called with.
|
* @param args The arguments the command was called with.
|
||||||
*/
|
*/
|
||||||
default void handle(ICommand command, List<ICommandArgument> args) {
|
default void handle(ICommand command, List<ICommandArgument> args) {
|
||||||
HELPER.logDirect(this.getMessage(), TextFormatting.RED);
|
HELPER.logDirect(this.getMessage(), ChatFormatting.RED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,15 +21,16 @@ import baritone.api.command.argument.IArgConsumer;
|
|||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.command.exception.CommandInvalidTypeException;
|
import baritone.api.command.exception.CommandInvalidTypeException;
|
||||||
import baritone.api.utils.Helper;
|
import baritone.api.utils.Helper;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
|
||||||
import net.minecraft.util.text.TextComponentString;
|
|
||||||
import net.minecraft.util.text.TextFormatting;
|
|
||||||
import net.minecraft.util.text.event.ClickEvent;
|
|
||||||
import net.minecraft.util.text.event.HoverEvent;
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.network.chat.ClickEvent;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.network.chat.HoverEvent;
|
||||||
|
import net.minecraft.network.chat.MutableComponent;
|
||||||
|
|
||||||
public class Paginator<E> implements Helper {
|
public class Paginator<E> implements Helper {
|
||||||
|
|
||||||
@@ -63,59 +64,56 @@ public class Paginator<E> implements Helper {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void display(Function<E, ITextComponent> transform, String commandPrefix) {
|
public void display(Function<E, Component> transform, String commandPrefix) {
|
||||||
int offset = (page - 1) * pageSize;
|
int offset = (page - 1) * pageSize;
|
||||||
for (int i = offset; i < offset + pageSize; i++) {
|
for (int i = offset; i < offset + pageSize; i++) {
|
||||||
if (i < entries.size()) {
|
if (i < entries.size()) {
|
||||||
logDirect(transform.apply(entries.get(i)));
|
logDirect(transform.apply(entries.get(i)));
|
||||||
} else {
|
} else {
|
||||||
logDirect("--", TextFormatting.DARK_GRAY);
|
logDirect("--", ChatFormatting.DARK_GRAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
boolean hasPrevPage = commandPrefix != null && validPage(page - 1);
|
boolean hasPrevPage = commandPrefix != null && validPage(page - 1);
|
||||||
boolean hasNextPage = commandPrefix != null && validPage(page + 1);
|
boolean hasNextPage = commandPrefix != null && validPage(page + 1);
|
||||||
ITextComponent prevPageComponent = new TextComponentString("<<");
|
MutableComponent prevPageComponent = Component.literal("<<");
|
||||||
if (hasPrevPage) {
|
if (hasPrevPage) {
|
||||||
prevPageComponent.getStyle()
|
prevPageComponent.setStyle(prevPageComponent.getStyle()
|
||||||
.setClickEvent(new ClickEvent(
|
.withClickEvent(new ClickEvent(
|
||||||
ClickEvent.Action.RUN_COMMAND,
|
ClickEvent.Action.RUN_COMMAND,
|
||||||
String.format("%s %d", commandPrefix, page - 1)
|
String.format("%s %d", commandPrefix, page - 1)
|
||||||
))
|
))
|
||||||
.setHoverEvent(new HoverEvent(
|
.withHoverEvent(new HoverEvent(
|
||||||
HoverEvent.Action.SHOW_TEXT,
|
HoverEvent.Action.SHOW_TEXT,
|
||||||
new TextComponentString("Click to view previous page")
|
Component.literal("Click to view previous page")
|
||||||
));
|
)));
|
||||||
} else {
|
} else {
|
||||||
prevPageComponent.getStyle().setColor(TextFormatting.DARK_GRAY);
|
prevPageComponent.setStyle(prevPageComponent.getStyle().withColor(ChatFormatting.DARK_GRAY));
|
||||||
}
|
}
|
||||||
ITextComponent nextPageComponent = new TextComponentString(">>");
|
MutableComponent nextPageComponent = Component.literal(">>");
|
||||||
if (hasNextPage) {
|
if (hasNextPage) {
|
||||||
nextPageComponent.getStyle()
|
nextPageComponent.setStyle(nextPageComponent.getStyle()
|
||||||
.setClickEvent(new ClickEvent(
|
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("%s %d", commandPrefix, page + 1)))
|
||||||
ClickEvent.Action.RUN_COMMAND,
|
.withHoverEvent(new HoverEvent(
|
||||||
String.format("%s %d", commandPrefix, page + 1)
|
|
||||||
))
|
|
||||||
.setHoverEvent(new HoverEvent(
|
|
||||||
HoverEvent.Action.SHOW_TEXT,
|
HoverEvent.Action.SHOW_TEXT,
|
||||||
new TextComponentString("Click to view next page")
|
Component.literal("Click to view next page")
|
||||||
));
|
)));
|
||||||
} else {
|
} else {
|
||||||
nextPageComponent.getStyle().setColor(TextFormatting.DARK_GRAY);
|
nextPageComponent.setStyle(nextPageComponent.getStyle().withColor(ChatFormatting.DARK_GRAY));
|
||||||
}
|
}
|
||||||
ITextComponent pagerComponent = new TextComponentString("");
|
MutableComponent pagerComponent = Component.literal("");
|
||||||
pagerComponent.getStyle().setColor(TextFormatting.GRAY);
|
pagerComponent.setStyle(pagerComponent.getStyle().withColor(ChatFormatting.GRAY));
|
||||||
pagerComponent.appendSibling(prevPageComponent);
|
pagerComponent.append(prevPageComponent);
|
||||||
pagerComponent.appendText(" | ");
|
pagerComponent.append(" | ");
|
||||||
pagerComponent.appendSibling(nextPageComponent);
|
pagerComponent.append(nextPageComponent);
|
||||||
pagerComponent.appendText(String.format(" %d/%d", page, getMaxPage()));
|
pagerComponent.append(String.format(" %d/%d", page, getMaxPage()));
|
||||||
logDirect(pagerComponent);
|
logDirect(pagerComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void display(Function<E, ITextComponent> transform) {
|
public void display(Function<E, Component> transform) {
|
||||||
display(transform, null);
|
display(transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Runnable pre, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Runnable pre, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
int page = 1;
|
int page = 1;
|
||||||
consumer.requireMax(1);
|
consumer.requireMax(1);
|
||||||
if (consumer.hasAny()) {
|
if (consumer.hasAny()) {
|
||||||
@@ -138,47 +136,47 @@ public class Paginator<E> implements Helper {
|
|||||||
pagi.display(transform, commandPrefix);
|
pagi.display(transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Runnable pre, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Runnable pre, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
paginate(consumer, new Paginator<>(elems), pre, transform, commandPrefix);
|
paginate(consumer, new Paginator<>(elems), pre, transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, T[] elems, Runnable pre, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, T[] elems, Runnable pre, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
paginate(consumer, Arrays.asList(elems), pre, transform, commandPrefix);
|
paginate(consumer, Arrays.asList(elems), pre, transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
paginate(consumer, pagi, null, transform, commandPrefix);
|
paginate(consumer, pagi, null, transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
paginate(consumer, new Paginator<>(elems), null, transform, commandPrefix);
|
paginate(consumer, new Paginator<>(elems), null, transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, T[] elems, Function<T, ITextComponent> transform, String commandPrefix) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, T[] elems, Function<T, Component> transform, String commandPrefix) throws CommandException {
|
||||||
paginate(consumer, Arrays.asList(elems), null, transform, commandPrefix);
|
paginate(consumer, Arrays.asList(elems), null, transform, commandPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Runnable pre, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Runnable pre, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, pagi, pre, transform, null);
|
paginate(consumer, pagi, pre, transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Runnable pre, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Runnable pre, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, new Paginator<>(elems), pre, transform, null);
|
paginate(consumer, new Paginator<>(elems), pre, transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, T[] elems, Runnable pre, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, T[] elems, Runnable pre, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, Arrays.asList(elems), pre, transform, null);
|
paginate(consumer, Arrays.asList(elems), pre, transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, Paginator<T> pagi, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, pagi, null, transform, null);
|
paginate(consumer, pagi, null, transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, List<T> elems, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, new Paginator<>(elems), null, transform, null);
|
paginate(consumer, new Paginator<>(elems), null, transform, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void paginate(IArgConsumer consumer, T[] elems, Function<T, ITextComponent> transform) throws CommandException {
|
public static <T> void paginate(IArgConsumer consumer, T[] elems, Function<T, Component> transform) throws CommandException {
|
||||||
paginate(consumer, Arrays.asList(elems), null, transform, null);
|
paginate(consumer, Arrays.asList(elems), null, transform, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,14 +23,13 @@ import baritone.api.command.argument.IArgConsumer;
|
|||||||
import baritone.api.command.manager.ICommandManager;
|
import baritone.api.command.manager.ICommandManager;
|
||||||
import baritone.api.event.events.TabCompleteEvent;
|
import baritone.api.event.events.TabCompleteEvent;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link TabCompleteHelper} is a <b>single-use</b> object that helps you handle tab completion. It includes helper
|
* The {@link TabCompleteHelper} is a <b>single-use</b> object that helps you handle tab completion. It includes helper
|
||||||
@@ -213,7 +212,12 @@ public class TabCompleteHelper {
|
|||||||
* @return This {@link TabCompleteHelper}
|
* @return This {@link TabCompleteHelper}
|
||||||
*/
|
*/
|
||||||
public TabCompleteHelper filterPrefixNamespaced(String prefix) {
|
public TabCompleteHelper filterPrefixNamespaced(String prefix) {
|
||||||
return filterPrefix(new ResourceLocation(prefix).toString());
|
ResourceLocation loc = ResourceLocation.tryParse(prefix);
|
||||||
|
if (loc == null) {
|
||||||
|
stream = Stream.empty();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return filterPrefix(loc.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,13 +18,11 @@
|
|||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import baritone.api.utils.Pair;
|
import baritone.api.utils.Pair;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -32,9 +30,9 @@ import java.util.Set;
|
|||||||
public final class BlockChangeEvent {
|
public final class BlockChangeEvent {
|
||||||
|
|
||||||
private final ChunkPos chunk;
|
private final ChunkPos chunk;
|
||||||
private final List<Pair<BlockPos, IBlockState>> blocks;
|
private final List<Pair<BlockPos, BlockState>> blocks;
|
||||||
|
|
||||||
public BlockChangeEvent(ChunkPos pos, List<Pair<BlockPos, IBlockState>> blocks) {
|
public BlockChangeEvent(ChunkPos pos, List<Pair<BlockPos, BlockState>> blocks) {
|
||||||
this.chunk = pos;
|
this.chunk = pos;
|
||||||
this.blocks = blocks;
|
this.blocks = blocks;
|
||||||
}
|
}
|
||||||
@@ -43,7 +41,7 @@ public final class BlockChangeEvent {
|
|||||||
return this.chunk;
|
return this.chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pair<BlockPos, IBlockState>> getBlocks() {
|
public List<Pair<BlockPos, BlockState>> getBlocks() {
|
||||||
return this.blocks;
|
return this.blocks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the local player interacts with a block, can be either {@link Type#START_BREAK} or {@link Type#USE}.
|
* Called when the local player interacts with a block, can be either {@link Type#START_BREAK} or {@link Type#USE}.
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import baritone.api.event.events.type.EventState;
|
import baritone.api.event.events.type.EventState;
|
||||||
import net.minecraft.network.NetworkManager;
|
import net.minecraft.network.Connection;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -27,19 +27,19 @@ import net.minecraft.network.Packet;
|
|||||||
*/
|
*/
|
||||||
public final class PacketEvent {
|
public final class PacketEvent {
|
||||||
|
|
||||||
private final NetworkManager networkManager;
|
private final Connection networkManager;
|
||||||
|
|
||||||
private final EventState state;
|
private final EventState state;
|
||||||
|
|
||||||
private final Packet<?> packet;
|
private final Packet<?> packet;
|
||||||
|
|
||||||
public PacketEvent(NetworkManager networkManager, EventState state, Packet<?> packet) {
|
public PacketEvent(Connection networkManager, EventState state, Packet<?> packet) {
|
||||||
this.networkManager = networkManager;
|
this.networkManager = networkManager;
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.packet = packet;
|
this.packet = packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final NetworkManager getNetworkManager() {
|
public final Connection getNetworkManager() {
|
||||||
return this.networkManager;
|
return this.networkManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import org.joml.Matrix4f;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
* @since 8/5/2018
|
* @since 8/5/2018
|
||||||
@@ -28,8 +31,13 @@ public final class RenderEvent {
|
|||||||
*/
|
*/
|
||||||
private final float partialTicks;
|
private final float partialTicks;
|
||||||
|
|
||||||
public RenderEvent(float partialTicks) {
|
private final Matrix4f projectionMatrix;
|
||||||
|
private final PoseStack modelViewStack;
|
||||||
|
|
||||||
|
public RenderEvent(float partialTicks, PoseStack modelViewStack, Matrix4f projectionMatrix) {
|
||||||
this.partialTicks = partialTicks;
|
this.partialTicks = partialTicks;
|
||||||
|
this.modelViewStack = modelViewStack;
|
||||||
|
this.projectionMatrix = projectionMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,4 +46,12 @@ public final class RenderEvent {
|
|||||||
public final float getPartialTicks() {
|
public final float getPartialTicks() {
|
||||||
return this.partialTicks;
|
return this.partialTicks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PoseStack getModelViewStack() {
|
||||||
|
return this.modelViewStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Matrix4f getProjectionMatrix() {
|
||||||
|
return this.projectionMatrix;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,9 @@
|
|||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import baritone.api.utils.Rotation;
|
import baritone.api.utils.Rotation;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -99,14 +100,14 @@ public final class RotationMoveEvent {
|
|||||||
/**
|
/**
|
||||||
* Called when the player's motion is updated.
|
* Called when the player's motion is updated.
|
||||||
*
|
*
|
||||||
* @see Entity#moveRelative(float, float, float, float)
|
* @see Entity#moveRelative(float, Vec3)
|
||||||
*/
|
*/
|
||||||
MOTION_UPDATE,
|
MOTION_UPDATE,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the player jumps.
|
* Called when the player jumps.
|
||||||
*
|
*
|
||||||
* @see EntityLivingBase#jump
|
* @see LivingEntity
|
||||||
*/
|
*/
|
||||||
JUMP
|
JUMP
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import baritone.api.event.events.type.Cancellable;
|
|||||||
/**
|
/**
|
||||||
* @author LoganDark
|
* @author LoganDark
|
||||||
*/
|
*/
|
||||||
public class TabCompleteEvent extends Cancellable {
|
public final class TabCompleteEvent extends Cancellable {
|
||||||
|
|
||||||
public final String prefix;
|
public final String prefix;
|
||||||
public String[] completions;
|
public String[] completions;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import baritone.api.event.events.type.EventState;
|
import baritone.api.event.events.type.EventState;
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -29,14 +29,14 @@ public final class WorldEvent {
|
|||||||
/**
|
/**
|
||||||
* The new world that is being loaded. {@code null} if being unloaded.
|
* The new world that is being loaded. {@code null} if being unloaded.
|
||||||
*/
|
*/
|
||||||
private final WorldClient world;
|
private final ClientLevel world;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The state of the event
|
* The state of the event
|
||||||
*/
|
*/
|
||||||
private final EventState state;
|
private final EventState state;
|
||||||
|
|
||||||
public WorldEvent(WorldClient world, EventState state) {
|
public WorldEvent(ClientLevel world, EventState state) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
@@ -44,7 +44,7 @@ public final class WorldEvent {
|
|||||||
/**
|
/**
|
||||||
* @return The new world that is being loaded. {@code null} if being unloaded.
|
* @return The new world that is being loaded. {@code null} if being unloaded.
|
||||||
*/
|
*/
|
||||||
public final WorldClient getWorld() {
|
public final ClientLevel getWorld() {
|
||||||
return this.world;
|
return this.world;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,13 @@
|
|||||||
package baritone.api.event.listener;
|
package baritone.api.event.listener;
|
||||||
|
|
||||||
import baritone.api.event.events.*;
|
import baritone.api.event.events.*;
|
||||||
import io.netty.util.concurrent.GenericFutureListener;
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.gui.screens.DeathScreen;
|
||||||
import net.minecraft.client.gui.GuiGameOver;
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.client.settings.GameSettings;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -37,7 +36,7 @@ public interface IGameEventListener {
|
|||||||
* Run once per game tick before screen input is handled.
|
* Run once per game tick before screen input is handled.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see Minecraft#runTick()
|
* @see Minecraft#tick()
|
||||||
*/
|
*/
|
||||||
void onTick(TickEvent event);
|
void onTick(TickEvent event);
|
||||||
|
|
||||||
@@ -53,7 +52,7 @@ public interface IGameEventListener {
|
|||||||
* Run once per game tick from before and after the player rotation is sent to the server.
|
* Run once per game tick from before and after the player rotation is sent to the server.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see EntityPlayerSP#onUpdate()
|
* @see LocalPlayer#tick()
|
||||||
*/
|
*/
|
||||||
void onPlayerUpdate(PlayerUpdateEvent event);
|
void onPlayerUpdate(PlayerUpdateEvent event);
|
||||||
|
|
||||||
@@ -61,7 +60,7 @@ public interface IGameEventListener {
|
|||||||
* Runs whenever the client player sends a message to the server.
|
* Runs whenever the client player sends a message to the server.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see EntityPlayerSP#sendChatMessage(String)
|
* @see LocalPlayer#chat(String)
|
||||||
*/
|
*/
|
||||||
void onSendChatMessage(ChatEvent event);
|
void onSendChatMessage(ChatEvent event);
|
||||||
|
|
||||||
@@ -76,7 +75,6 @@ public interface IGameEventListener {
|
|||||||
* Runs before and after whenever a chunk is either loaded, unloaded, or populated.
|
* Runs before and after whenever a chunk is either loaded, unloaded, or populated.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see WorldClient#doPreChunk(int, int, boolean)
|
|
||||||
*/
|
*/
|
||||||
void onChunkEvent(ChunkEvent event);
|
void onChunkEvent(ChunkEvent event);
|
||||||
|
|
||||||
@@ -88,9 +86,7 @@ public interface IGameEventListener {
|
|||||||
void onBlockChange(BlockChangeEvent event);
|
void onBlockChange(BlockChangeEvent event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs once per world render pass. Two passes are made when {@link GameSettings#anaglyph} is on.
|
* Runs once per world render pass.
|
||||||
* <p>
|
|
||||||
* <b>Note:</b> {@link GameSettings#anaglyph} has been removed in Minecraft 1.13
|
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
*/
|
*/
|
||||||
@@ -100,7 +96,7 @@ public interface IGameEventListener {
|
|||||||
* Runs before and after whenever a new world is loaded
|
* Runs before and after whenever a new world is loaded
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see Minecraft#loadWorld(WorldClient, String)
|
* @see Minecraft#setLevel(ClientLevel)
|
||||||
*/
|
*/
|
||||||
void onWorldEvent(WorldEvent event);
|
void onWorldEvent(WorldEvent event);
|
||||||
|
|
||||||
@@ -109,7 +105,6 @@ public interface IGameEventListener {
|
|||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see Packet
|
* @see Packet
|
||||||
* @see GenericFutureListener
|
|
||||||
*/
|
*/
|
||||||
void onSendPacket(PacketEvent event);
|
void onSendPacket(PacketEvent event);
|
||||||
|
|
||||||
@@ -118,7 +113,6 @@ public interface IGameEventListener {
|
|||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see Packet
|
* @see Packet
|
||||||
* @see GenericFutureListener
|
|
||||||
*/
|
*/
|
||||||
void onReceivePacket(PacketEvent event);
|
void onReceivePacket(PacketEvent event);
|
||||||
|
|
||||||
@@ -127,15 +121,15 @@ public interface IGameEventListener {
|
|||||||
* and before and after the player jumps.
|
* and before and after the player jumps.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see Entity#moveRelative(float, float, float, float)
|
* @see Entity#moveRelative(float, Vec3)
|
||||||
*/
|
*/
|
||||||
void onPlayerRotationMove(RotationMoveEvent event);
|
void onPlayerRotationMove(RotationMoveEvent event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called whenever the sprint keybind state is checked in {@link EntityPlayerSP#onLivingUpdate}
|
* Called whenever the sprint keybind state is checked in {@link LocalPlayer#aiStep}
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see EntityPlayerSP#onLivingUpdate()
|
* @see LocalPlayer#aiStep()
|
||||||
*/
|
*/
|
||||||
void onPlayerSprintState(SprintStateEvent event);
|
void onPlayerSprintState(SprintStateEvent event);
|
||||||
|
|
||||||
@@ -147,9 +141,9 @@ public interface IGameEventListener {
|
|||||||
void onBlockInteract(BlockInteractEvent event);
|
void onBlockInteract(BlockInteractEvent event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the local player dies, as indicated by the creation of the {@link GuiGameOver} screen.
|
* Called when the local player dies, as indicated by the creation of the {@link DeathScreen} screen.
|
||||||
*
|
*
|
||||||
* @see GuiGameOver
|
* @see DeathScreen
|
||||||
*/
|
*/
|
||||||
void onPlayerDeath();
|
void onPlayerDeath();
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An abstract Goal for pathing, can be anything from a specific block to just a Y coordinate.
|
* An abstract Goal for pathing, can be anything from a specific block to just a Y coordinate.
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.pathing.goals;
|
|||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A specific BlockPos goal
|
* A specific BlockPos goal
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.pathing.goals;
|
|||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import baritone.api.utils.SettingsUtil;
|
|||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import it.unimi.dsi.fastutil.doubles.DoubleIterator;
|
import it.unimi.dsi.fastutil.doubles.DoubleIterator;
|
||||||
import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
|
import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
public class GoalNear implements Goal, IGoalRenderPos {
|
public class GoalNear implements Goal, IGoalRenderPos {
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.pathing.goals;
|
|||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import it.unimi.dsi.fastutil.doubles.DoubleIterator;
|
import it.unimi.dsi.fastutil.doubles.DoubleIterator;
|
||||||
import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
|
import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -44,7 +44,7 @@ public class GoalRunAway implements Goal {
|
|||||||
|
|
||||||
public GoalRunAway(double distance, Integer maintainY, BlockPos... from) {
|
public GoalRunAway(double distance, Integer maintainY, BlockPos... from) {
|
||||||
if (from.length == 0) {
|
if (from.length == 0) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException("Positions to run away from must not be empty");
|
||||||
}
|
}
|
||||||
this.from = from;
|
this.from = from;
|
||||||
this.distanceSq = (int) (distance * distance);
|
this.distanceSq = (int) (distance * distance);
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ package baritone.api.pathing.goals;
|
|||||||
|
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dig a tunnel in a certain direction, but if you have to deviate from the path, go back to where you started
|
* Dig a tunnel in a certain direction, but if you have to deviate from the path, go back to where you started
|
||||||
@@ -33,12 +33,12 @@ public class GoalStrictDirection implements Goal {
|
|||||||
public final int dx;
|
public final int dx;
|
||||||
public final int dz;
|
public final int dz;
|
||||||
|
|
||||||
public GoalStrictDirection(BlockPos origin, EnumFacing direction) {
|
public GoalStrictDirection(BlockPos origin, Direction direction) {
|
||||||
x = origin.getX();
|
x = origin.getX();
|
||||||
y = origin.getY();
|
y = origin.getY();
|
||||||
z = origin.getZ();
|
z = origin.getZ();
|
||||||
dx = direction.getXOffset();
|
dx = direction.getStepX();
|
||||||
dz = direction.getZOffset();
|
dz = direction.getStepZ();
|
||||||
if (dx == 0 && dz == 0) {
|
if (dx == 0 && dz == 0) {
|
||||||
throw new IllegalArgumentException(direction + "");
|
throw new IllegalArgumentException(direction + "");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.pathing.goals;
|
|||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful if the goal is just to mine a block. This goal will be satisfied if the specified
|
* Useful if the goal is just to mine a block. This goal will be satisfied if the specified
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ package baritone.api.pathing.goals;
|
|||||||
import baritone.api.BaritoneAPI;
|
import baritone.api.BaritoneAPI;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful for long-range goals that don't have a specific Y level.
|
* Useful for long-range goals that don't have a specific Y level.
|
||||||
@@ -115,11 +115,11 @@ public class GoalXZ implements Goal {
|
|||||||
return (diagonal + straight) * BaritoneAPI.getSettings().costHeuristic.value; // big TODO tune
|
return (diagonal + straight) * BaritoneAPI.getSettings().costHeuristic.value; // big TODO tune
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GoalXZ fromDirection(Vec3d origin, float yaw, double distance) {
|
public static GoalXZ fromDirection(Vec3 origin, float yaw, double distance) {
|
||||||
float theta = (float) Math.toRadians(yaw);
|
float theta = (float) Math.toRadians(yaw);
|
||||||
double x = origin.x - MathHelper.sin(theta) * distance;
|
double x = origin.x - Mth.sin(theta) * distance;
|
||||||
double z = origin.z + MathHelper.cos(theta) * distance;
|
double z = origin.z + Mth.cos(theta) * distance;
|
||||||
return new GoalXZ(MathHelper.floor(x), MathHelper.floor(z));
|
return new GoalXZ(Mth.floor(x), Mth.floor(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getX() {
|
public int getX() {
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ public interface ActionCosts {
|
|||||||
|
|
||||||
|
|
||||||
static double[] generateFallNBlocksCost() {
|
static double[] generateFallNBlocksCost() {
|
||||||
double[] costs = new double[257];
|
double[] costs = new double[4097];
|
||||||
for (int i = 0; i < 257; i++) {
|
for (int i = 0; i < 4097; i++) {
|
||||||
costs[i] = distanceToTicks(i);
|
costs[i] = distanceToTicks(i);
|
||||||
}
|
}
|
||||||
return costs;
|
return costs;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.pathing.movement;
|
package baritone.api.pathing.movement;
|
||||||
|
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
|
|||||||
@@ -18,13 +18,13 @@
|
|||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import baritone.api.schematic.ISchematic;
|
import baritone.api.schematic.ISchematic;
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.core.Vec3i;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -53,7 +53,7 @@ public interface IBuilderProcess extends IBaritoneProcess {
|
|||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
default boolean build(String schematicFile, BlockPos origin) {
|
default boolean build(String schematicFile, BlockPos origin) {
|
||||||
File file = new File(new File(Minecraft.getMinecraft().gameDir, "schematics"), schematicFile);
|
File file = new File(new File(Minecraft.getInstance().gameDirectory, "schematics"), schematicFile);
|
||||||
return build(schematicFile, file, origin);
|
return build(schematicFile, file, origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,5 +74,18 @@ public interface IBuilderProcess extends IBaritoneProcess {
|
|||||||
* schematics, for example, to pick a state that the builder process will be happy with, because any variation will
|
* schematics, for example, to pick a state that the builder process will be happy with, because any variation will
|
||||||
* cause it to give up. This is updated every tick, but only while the builder process is active.
|
* cause it to give up. This is updated every tick, but only while the builder process is active.
|
||||||
*/
|
*/
|
||||||
List<IBlockState> getApproxPlaceable();
|
List<BlockState> getApproxPlaceable();
|
||||||
|
/**
|
||||||
|
* Returns the lower bound of the current mining layer if mineInLayers is true.
|
||||||
|
* If mineInLayers is false, this will return an empty optional.
|
||||||
|
* @return The lower bound of the current mining layer
|
||||||
|
*/
|
||||||
|
Optional<Integer> getMinLayer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the upper bound of the current mining layer if mineInLayers is true.
|
||||||
|
* If mineInLayers is false, this will return an empty optional.
|
||||||
|
* @return The upper bound of the current mining layer
|
||||||
|
*/
|
||||||
|
Optional<Integer> getMaxLayer();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,32 +15,28 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.api.behavior;
|
package baritone.api.process;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import baritone.api.pathing.goals.Goal;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
public interface IElytraProcess extends IBaritoneProcess {
|
||||||
|
|
||||||
public interface IElytraBehavior extends IBehavior {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marks the nether pathfinder context to be reset when it is safe to do so. Because this operation is not
|
|
||||||
* immediate, a {@link CompletableFuture} is returned that will complete after the context has been reset.
|
|
||||||
*
|
|
||||||
* @return A {@link CompletableFuture} that is completed when the context is reset
|
|
||||||
*/
|
|
||||||
CompletableFuture<Void> resetContext();
|
|
||||||
|
|
||||||
void repackChunks();
|
void repackChunks();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Where it is currently flying to, null if not active
|
||||||
|
*/
|
||||||
|
BlockPos currentDestination();
|
||||||
|
|
||||||
void pathTo(BlockPos destination);
|
void pathTo(BlockPos destination);
|
||||||
|
|
||||||
void cancel();
|
void pathTo(Goal destination);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@code true} if the current {@link IElytraBehavior} is actively pathing.
|
* Resets the state of the process but will maintain the same destination and will try to keep flying
|
||||||
*/
|
*/
|
||||||
boolean isActive();
|
void resetState();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {@code true} if the native library loaded and elytra is actually usable
|
* @return {@code true} if the native library loaded and elytra is actually usable
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
||||||
public interface IFarmProcess extends IBaritoneProcess {
|
public interface IFarmProcess extends IBaritoneProcess {
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
|
|
||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
@@ -35,6 +36,13 @@ public interface IFollowProcess extends IBaritoneProcess {
|
|||||||
*/
|
*/
|
||||||
void follow(Predicate<Entity> filter);
|
void follow(Predicate<Entity> filter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to pick up any items matching this predicate
|
||||||
|
*
|
||||||
|
* @param filter the predicate
|
||||||
|
*/
|
||||||
|
void pickup(Predicate<ItemStack> filter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The entities that are currently being followed. null if not currently following, empty if nothing matches the predicate
|
* @return The entities that are currently being followed. null if not currently following, empty if nothing matches the predicate
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import baritone.api.utils.BlockOptionalMeta;
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* but it rescans the world every once in a while so it doesn't get fooled by its cache
|
* but it rescans the world every once in a while so it doesn't get fooled by its cache
|
||||||
|
|||||||
@@ -19,9 +19,8 @@ package baritone.api.process;
|
|||||||
|
|
||||||
import baritone.api.utils.BlockOptionalMeta;
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import baritone.api.utils.BlockOptionalMetaLookup;
|
import baritone.api.utils.BlockOptionalMetaLookup;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public class CompositeSchematic extends AbstractSchematic {
|
public class CompositeSchematic extends AbstractSchematic {
|
||||||
|
|
||||||
@@ -47,7 +46,7 @@ public class CompositeSchematic extends AbstractSchematic {
|
|||||||
recalcArr();
|
recalcArr();
|
||||||
}
|
}
|
||||||
|
|
||||||
private CompositeSchematicEntry getSchematic(int x, int y, int z, IBlockState currentState) {
|
private CompositeSchematicEntry getSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
for (CompositeSchematicEntry entry : schematicArr) {
|
for (CompositeSchematicEntry entry : schematicArr) {
|
||||||
if (x >= entry.x && y >= entry.y && z >= entry.z &&
|
if (x >= entry.x && y >= entry.y && z >= entry.z &&
|
||||||
entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState)) {
|
entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState)) {
|
||||||
@@ -58,13 +57,13 @@ public class CompositeSchematic extends AbstractSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
public boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
CompositeSchematicEntry entry = getSchematic(x, y, z, currentState);
|
CompositeSchematicEntry entry = getSchematic(x, y, z, currentState);
|
||||||
return entry != null && entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState);
|
return entry != null && entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState desiredState(int x, int y, int z, IBlockState current, List<IBlockState> approxPlaceable) {
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
CompositeSchematicEntry entry = getSchematic(x, y, z, current);
|
CompositeSchematicEntry entry = getSchematic(x, y, z, current);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
throw new IllegalStateException("couldn't find schematic for this position");
|
throw new IllegalStateException("couldn't find schematic for this position");
|
||||||
|
|||||||
@@ -18,7 +18,8 @@
|
|||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import baritone.api.utils.BlockOptionalMeta;
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -31,8 +32,8 @@ public class FillSchematic extends AbstractSchematic {
|
|||||||
this.bom = bom;
|
this.bom = bom;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FillSchematic(int x, int y, int z, IBlockState state) {
|
public FillSchematic(int x, int y, int z, BlockState state) {
|
||||||
this(x, y, z, new BlockOptionalMeta(state.getBlock(), state.getBlock().getMetaFromState(state)));
|
this(x, y, z, new BlockOptionalMeta(state.getBlock()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockOptionalMeta getBom() {
|
public BlockOptionalMeta getBom() {
|
||||||
@@ -40,11 +41,11 @@ public class FillSchematic extends AbstractSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState desiredState(int x, int y, int z, IBlockState current, List<IBlockState> approxPlaceable) {
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
if (bom.matches(current)) {
|
if (bom.matches(current)) {
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
for (IBlockState placeable : approxPlaceable) {
|
for (BlockState placeable : approxPlaceable) {
|
||||||
if (bom.matches(placeable)) {
|
if (bom.matches(placeable)) {
|
||||||
return placeable;
|
return placeable;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic representation of a schematic. Provides the dimensions and the desired state for a given position relative to
|
* Basic representation of a schematic. Provides the dimensions and the desired state for a given position relative to
|
||||||
@@ -44,11 +43,11 @@ public interface ISchematic {
|
|||||||
* @param currentState The current state of that block in the world, or null
|
* @param currentState The current state of that block in the world, or null
|
||||||
* @return Whether or not the specified position is within the bounds of this schematic
|
* @return Whether or not the specified position is within the bounds of this schematic
|
||||||
*/
|
*/
|
||||||
default boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
default boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
return x >= 0 && x < widthX() && y >= 0 && y < heightY() && z >= 0 && z < lengthZ();
|
return x >= 0 && x < widthX() && y >= 0 && y < heightY() && z >= 0 && z < lengthZ();
|
||||||
}
|
}
|
||||||
|
|
||||||
default int size(EnumFacing.Axis axis) {
|
default int size(Direction.Axis axis) {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case X:
|
case X:
|
||||||
return widthX();
|
return widthX();
|
||||||
@@ -71,7 +70,7 @@ public interface ISchematic {
|
|||||||
* @param approxPlaceable The list of blockstates estimated to be placeable
|
* @param approxPlaceable The list of blockstates estimated to be placeable
|
||||||
* @return The desired block state at the specified position
|
* @return The desired block state at the specified position
|
||||||
*/
|
*/
|
||||||
IBlockState desiredState(int x, int y, int z, IBlockState current, List<IBlockState> approxPlaceable);
|
BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets possible caches to avoid wrong behavior when moving the schematic around
|
* Resets possible caches to avoid wrong behavior when moving the schematic around
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import baritone.api.command.registry.Registry;
|
|||||||
import baritone.api.schematic.format.ISchematicFormat;
|
import baritone.api.schematic.format.ISchematicFormat;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,4 +42,9 @@ public interface ISchematicSystem {
|
|||||||
* @return The corresponding format for the file, {@link Optional#empty()} if no candidates were found.
|
* @return The corresponding format for the file, {@link Optional#empty()} if no candidates were found.
|
||||||
*/
|
*/
|
||||||
Optional<ISchematicFormat> getByFile(File file);
|
Optional<ISchematicFormat> getByFile(File file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A list of file extensions used by supported formats
|
||||||
|
*/
|
||||||
|
List<String> getFileExtensions();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A static schematic is capable of providing the desired state at a given position without
|
* A static schematic is capable of providing the desired state at a given position without
|
||||||
@@ -30,7 +30,7 @@ import net.minecraft.block.state.IBlockState;
|
|||||||
public interface IStaticSchematic extends ISchematic {
|
public interface IStaticSchematic extends ISchematic {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the {@link IBlockState} for a given position in this schematic. It should be guaranteed
|
* Gets the {@link BlockState} for a given position in this schematic. It should be guaranteed
|
||||||
* that the return value of this method will not change given that the parameters are the same.
|
* that the return value of this method will not change given that the parameters are the same.
|
||||||
*
|
*
|
||||||
* @param x The X block position
|
* @param x The X block position
|
||||||
@@ -38,19 +38,19 @@ public interface IStaticSchematic extends ISchematic {
|
|||||||
* @param z The Z block position
|
* @param z The Z block position
|
||||||
* @return The desired state at the specified position.
|
* @return The desired state at the specified position.
|
||||||
*/
|
*/
|
||||||
IBlockState getDirect(int x, int y, int z);
|
BlockState getDirect(int x, int y, int z);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an {@link IBlockState} array of size {@link #heightY()} which contains all
|
* Returns an {@link BlockState} array of size {@link #heightY()} which contains all
|
||||||
* desired block states in the specified vertical column. The index of {@link IBlockState}s
|
* desired block states in the specified vertical column. The index of {@link BlockState}s
|
||||||
* in the array are equivalent to their Y position in the schematic.
|
* in the array are equivalent to their Y position in the schematic.
|
||||||
*
|
*
|
||||||
* @param x The X column position
|
* @param x The X column position
|
||||||
* @param z The Z column position
|
* @param z The Z column position
|
||||||
* @return An {@link IBlockState} array
|
* @return An {@link BlockState} array
|
||||||
*/
|
*/
|
||||||
default IBlockState[] getColumn(int x, int z) {
|
default BlockState[] getColumn(int x, int z) {
|
||||||
IBlockState[] column = new IBlockState[this.heightY()];
|
BlockState[] column = new BlockState[this.heightY()];
|
||||||
for (int i = 0; i < this.heightY(); i++) {
|
for (int i = 0; i < this.heightY(); i++) {
|
||||||
column[i] = getDirect(x, i, z);
|
column[i] = getDirect(x, i, z);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import baritone.api.schematic.mask.Mask;
|
import baritone.api.schematic.mask.Mask;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -31,15 +31,15 @@ public abstract class MaskSchematic extends AbstractSchematic {
|
|||||||
this.schematic = schematic;
|
this.schematic = schematic;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract boolean partOfMask(int x, int y, int z, IBlockState currentState);
|
protected abstract boolean partOfMask(int x, int y, int z, BlockState currentState);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
public boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
return schematic.inSchematic(x, y, z, currentState) && partOfMask(x, y, z, currentState);
|
return schematic.inSchematic(x, y, z, currentState) && partOfMask(x, y, z, currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState desiredState(int x, int y, int z, IBlockState current, List<IBlockState> approxPlaceable) {
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
return schematic.desiredState(x, y, z, current, approxPlaceable);
|
return schematic.desiredState(x, y, z, current, approxPlaceable);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public abstract class MaskSchematic extends AbstractSchematic {
|
|||||||
return new MaskSchematic(schematic) {
|
return new MaskSchematic(schematic) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
protected boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return function.partOfMask(x, y, z, currentState);
|
return function.partOfMask(x, y, z, currentState);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
114
src/api/java/baritone/api/schematic/MirroredSchematic.java
Normal file
114
src/api/java/baritone/api/schematic/MirroredSchematic.java
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Baritone 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.Mirror;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class MirroredSchematic implements ISchematic {
|
||||||
|
|
||||||
|
private final ISchematic schematic;
|
||||||
|
private final Mirror mirror;
|
||||||
|
|
||||||
|
public MirroredSchematic(ISchematic schematic, Mirror mirror) {
|
||||||
|
this.schematic = schematic;
|
||||||
|
this.mirror = mirror;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
|
return schematic.inSchematic(
|
||||||
|
mirrorX(x, widthX(), mirror),
|
||||||
|
y,
|
||||||
|
mirrorZ(z, lengthZ(), mirror),
|
||||||
|
mirror(currentState, mirror)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
|
return mirror(schematic.desiredState(
|
||||||
|
mirrorX(x, widthX(), mirror),
|
||||||
|
y,
|
||||||
|
mirrorZ(z, lengthZ(), mirror),
|
||||||
|
mirror(current, mirror),
|
||||||
|
mirror(approxPlaceable, mirror)
|
||||||
|
), mirror);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
schematic.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int widthX() {
|
||||||
|
return schematic.widthX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int heightY() {
|
||||||
|
return schematic.heightY();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int lengthZ() {
|
||||||
|
return schematic.lengthZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int mirrorX(int x, int sizeX, Mirror mirror) {
|
||||||
|
switch (mirror) {
|
||||||
|
case NONE:
|
||||||
|
case LEFT_RIGHT:
|
||||||
|
return x;
|
||||||
|
case FRONT_BACK:
|
||||||
|
return sizeX - x - 1;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unknown mirror");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int mirrorZ(int z, int sizeZ, Mirror mirror) {
|
||||||
|
switch (mirror) {
|
||||||
|
case NONE:
|
||||||
|
case FRONT_BACK:
|
||||||
|
return z;
|
||||||
|
case LEFT_RIGHT:
|
||||||
|
return sizeZ - z - 1;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unknown mirror");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockState mirror(BlockState state, Mirror mirror) {
|
||||||
|
if (state == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return state.mirror(mirror);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<BlockState> mirror(List<BlockState> states, Mirror mirror) {
|
||||||
|
if (states == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return states.stream()
|
||||||
|
.map(s -> mirror(s, mirror))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import baritone.api.utils.BlockOptionalMetaLookup;
|
import baritone.api.utils.BlockOptionalMetaLookup;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public class ReplaceSchematic extends MaskSchematic {
|
public class ReplaceSchematic extends MaskSchematic {
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ public class ReplaceSchematic extends MaskSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
protected boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
if (cache[x][y][z] == null) {
|
if (cache[x][y][z] == null) {
|
||||||
cache[x][y][z] = filter.has(currentState);
|
cache[x][y][z] = filter.has(currentState);
|
||||||
}
|
}
|
||||||
|
|||||||
136
src/api/java/baritone/api/schematic/RotatedSchematic.java
Normal file
136
src/api/java/baritone/api/schematic/RotatedSchematic.java
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Baritone 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 Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.Rotation;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class RotatedSchematic implements ISchematic {
|
||||||
|
|
||||||
|
private final ISchematic schematic;
|
||||||
|
private final Rotation rotation;
|
||||||
|
private final Rotation inverseRotation;
|
||||||
|
|
||||||
|
public RotatedSchematic(ISchematic schematic, Rotation rotation) {
|
||||||
|
this.schematic = schematic;
|
||||||
|
this.rotation = rotation;
|
||||||
|
// I don't think a 14 line switch would improve readability
|
||||||
|
this.inverseRotation = rotation.getRotated(rotation).getRotated(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
|
return schematic.inSchematic(
|
||||||
|
rotateX(x, z, widthX(), lengthZ(), inverseRotation),
|
||||||
|
y,
|
||||||
|
rotateZ(x, z, widthX(), lengthZ(), inverseRotation),
|
||||||
|
rotate(currentState, inverseRotation)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
|
return rotate(schematic.desiredState(
|
||||||
|
rotateX(x, z, widthX(), lengthZ(), inverseRotation),
|
||||||
|
y,
|
||||||
|
rotateZ(x, z, widthX(), lengthZ(), inverseRotation),
|
||||||
|
rotate(current, inverseRotation),
|
||||||
|
rotate(approxPlaceable, inverseRotation)
|
||||||
|
), rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
schematic.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int widthX() {
|
||||||
|
return flipsCoordinates(rotation) ? schematic.lengthZ() : schematic.widthX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int heightY() {
|
||||||
|
return schematic.heightY();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int lengthZ() {
|
||||||
|
return flipsCoordinates(rotation) ? schematic.widthX() : schematic.lengthZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wether {@code rotation} swaps the x and z components
|
||||||
|
*/
|
||||||
|
private static boolean flipsCoordinates(Rotation rotation) {
|
||||||
|
return rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.COUNTERCLOCKWISE_90;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The x component of x,y after applying the rotation
|
||||||
|
*/
|
||||||
|
private static int rotateX(int x, int z, int sizeX, int sizeZ, Rotation rotation) {
|
||||||
|
switch (rotation) {
|
||||||
|
case NONE:
|
||||||
|
return x;
|
||||||
|
case CLOCKWISE_90:
|
||||||
|
return sizeZ - z - 1;
|
||||||
|
case CLOCKWISE_180:
|
||||||
|
return sizeX - x - 1;
|
||||||
|
case COUNTERCLOCKWISE_90:
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unknown rotation");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The z component of x,y after applying the rotation
|
||||||
|
*/
|
||||||
|
private static int rotateZ(int x, int z, int sizeX, int sizeZ, Rotation rotation) {
|
||||||
|
switch (rotation) {
|
||||||
|
case NONE:
|
||||||
|
return z;
|
||||||
|
case CLOCKWISE_90:
|
||||||
|
return x;
|
||||||
|
case CLOCKWISE_180:
|
||||||
|
return sizeZ - z - 1;
|
||||||
|
case COUNTERCLOCKWISE_90:
|
||||||
|
return sizeX - x - 1;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unknown rotation");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BlockState rotate(BlockState state, Rotation rotation) {
|
||||||
|
if (state == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return state.rotate(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<BlockState> rotate(List<BlockState> states, Rotation rotation) {
|
||||||
|
if (states == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return states.stream()
|
||||||
|
.map(s -> rotate(s, rotation))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public class ShellSchematic extends MaskSchematic {
|
public class ShellSchematic extends MaskSchematic {
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ public class ShellSchematic extends MaskSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
protected boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return x == 0 || y == 0 || z == 0 || x == widthX() - 1 || y == heightY() - 1 || z == lengthZ() - 1;
|
return x == 0 || y == 0 || z == 0 || x == widthX() - 1 || y == heightY() - 1 || z == lengthZ() - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.world.level.block.AirBlock;
|
||||||
import net.minecraft.block.BlockAir;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.block.properties.IProperty;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.world.level.block.state.properties.Property;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -32,7 +32,7 @@ public class SubstituteSchematic extends AbstractSchematic {
|
|||||||
|
|
||||||
private final ISchematic schematic;
|
private final ISchematic schematic;
|
||||||
private final Map<Block, List<Block>> substitutions;
|
private final Map<Block, List<Block>> substitutions;
|
||||||
private final Map<IBlockState, Map<Block, IBlockState>> blockStateCache = new HashMap<>();
|
private final Map<BlockState, Map<Block, BlockState>> blockStateCache = new HashMap<>();
|
||||||
|
|
||||||
public SubstituteSchematic(ISchematic schematic, Map<Block, List<Block>> substitutions) {
|
public SubstituteSchematic(ISchematic schematic, Map<Block, List<Block>> substitutions) {
|
||||||
super(schematic.widthX(), schematic.heightY(), schematic.lengthZ());
|
super(schematic.widthX(), schematic.heightY(), schematic.lengthZ());
|
||||||
@@ -41,51 +41,51 @@ public class SubstituteSchematic extends AbstractSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
public boolean inSchematic(int x, int y, int z, BlockState currentState) {
|
||||||
return schematic.inSchematic(x, y, z, currentState);
|
return schematic.inSchematic(x, y, z, currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState desiredState(int x, int y, int z, IBlockState current, List<IBlockState> approxPlaceable) {
|
public BlockState desiredState(int x, int y, int z, BlockState current, List<BlockState> approxPlaceable) {
|
||||||
IBlockState desired = schematic.desiredState(x, y, z, current, approxPlaceable);
|
BlockState desired = schematic.desiredState(x, y, z, current, approxPlaceable);
|
||||||
Block desiredBlock = desired.getBlock();
|
Block desiredBlock = desired.getBlock();
|
||||||
if (!substitutions.containsKey(desiredBlock)) {
|
if (!substitutions.containsKey(desiredBlock)) {
|
||||||
return desired;
|
return desired;
|
||||||
}
|
}
|
||||||
List<Block> substitutes = substitutions.get(desiredBlock);
|
List<Block> substitutes = substitutions.get(desiredBlock);
|
||||||
if (substitutes.contains(current.getBlock()) && !(current.getBlock() instanceof BlockAir)) {// don't preserve air, it's almost always there and almost never wanted
|
if (substitutes.contains(current.getBlock()) && !(current.getBlock() instanceof AirBlock)) {// don't preserve air, it's almost always there and almost never wanted
|
||||||
return withBlock(desired, current.getBlock());
|
return withBlock(desired, current.getBlock());
|
||||||
}
|
}
|
||||||
for (Block substitute : substitutes) {
|
for (Block substitute : substitutes) {
|
||||||
if (substitute instanceof BlockAir) {
|
if (substitute instanceof AirBlock) {
|
||||||
return current.getBlock() instanceof BlockAir ? current : Blocks.AIR.getDefaultState(); // can always "place" air
|
return current.getBlock() instanceof AirBlock ? current : Blocks.AIR.defaultBlockState(); // can always "place" air
|
||||||
}
|
}
|
||||||
for (IBlockState placeable : approxPlaceable) {
|
for (BlockState placeable : approxPlaceable) {
|
||||||
if (substitute.equals(placeable.getBlock())) {
|
if (substitute.equals(placeable.getBlock())) {
|
||||||
return withBlock(desired, placeable.getBlock());
|
return withBlock(desired, placeable.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return substitutes.get(0).getDefaultState();
|
return substitutes.get(0).defaultBlockState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private IBlockState withBlock(IBlockState state, Block block) {
|
private BlockState withBlock(BlockState state, Block block) {
|
||||||
if (blockStateCache.containsKey(state) && blockStateCache.get(state).containsKey(block)) {
|
if (blockStateCache.containsKey(state) && blockStateCache.get(state).containsKey(block)) {
|
||||||
return blockStateCache.get(state).get(block);
|
return blockStateCache.get(state).get(block);
|
||||||
}
|
}
|
||||||
Collection<IProperty<?>> properties = state.getPropertyKeys();
|
Collection<Property<?>> properties = state.getProperties();
|
||||||
IBlockState newState = block.getDefaultState();
|
BlockState newState = block.defaultBlockState();
|
||||||
for (IProperty<?> property : properties) {
|
for (Property<?> property : properties) {
|
||||||
try {
|
try {
|
||||||
newState = copySingleProp(state, newState, property);
|
newState = copySingleProp(state, newState, property);
|
||||||
} catch (IllegalArgumentException e) { //property does not exist for target block
|
} catch (IllegalArgumentException e) { //property does not exist for target block
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blockStateCache.computeIfAbsent(state, s -> new HashMap<Block, IBlockState>()).put(block, newState);
|
blockStateCache.computeIfAbsent(state, s -> new HashMap<Block, BlockState>()).put(block, newState);
|
||||||
return newState;
|
return newState;
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends Comparable<T>> IBlockState copySingleProp(IBlockState fromState, IBlockState toState, IProperty<T> prop) {
|
private <T extends Comparable<T>> BlockState copySingleProp(BlockState fromState, BlockState toState, Property<T> prop) {
|
||||||
return toState.withProperty(prop, fromState.getValue(prop));
|
return toState.setValue(prop, fromState.getValue(prop));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public class WallsSchematic extends MaskSchematic {
|
public class WallsSchematic extends MaskSchematic {
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ public class WallsSchematic extends MaskSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
protected boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return x == 0 || z == 0 || x == widthX() - 1 || z == lengthZ() - 1;
|
return x == 0 || z == 0 || x == widthX() - 1 || z == lengthZ() - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import baritone.api.schematic.IStaticSchematic;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base of a {@link ISchematic} file format
|
* The base of a {@link ISchematic} file format
|
||||||
@@ -42,4 +43,9 @@ public interface ISchematicFormat {
|
|||||||
* @return Whether or not the specified file matches this schematic format
|
* @return Whether or not the specified file matches this schematic format
|
||||||
*/
|
*/
|
||||||
boolean isFileType(File file);
|
boolean isFileType(File file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A list of file extensions used by this format
|
||||||
|
*/
|
||||||
|
List<String> getFileExtensions();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.schematic.mask;
|
|||||||
import baritone.api.schematic.mask.operator.BinaryOperatorMask;
|
import baritone.api.schematic.mask.operator.BinaryOperatorMask;
|
||||||
import baritone.api.schematic.mask.operator.NotMask;
|
import baritone.api.schematic.mask.operator.NotMask;
|
||||||
import baritone.api.utils.BooleanBinaryOperators;
|
import baritone.api.utils.BooleanBinaryOperators;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -34,7 +34,7 @@ public interface Mask {
|
|||||||
* @param currentState The current state of that block in the world, may be {@code null}
|
* @param currentState The current state of that block in the world, may be {@code null}
|
||||||
* @return Whether the given position is included in this mask
|
* @return Whether the given position is included in this mask
|
||||||
*/
|
*/
|
||||||
boolean partOfMask(int x, int y, int z, IBlockState currentState);
|
boolean partOfMask(int x, int y, int z, BlockState currentState);
|
||||||
|
|
||||||
int widthX();
|
int widthX();
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.schematic.mask;
|
|||||||
import baritone.api.schematic.mask.operator.BinaryOperatorMask;
|
import baritone.api.schematic.mask.operator.BinaryOperatorMask;
|
||||||
import baritone.api.schematic.mask.operator.NotMask;
|
import baritone.api.schematic.mask.operator.NotMask;
|
||||||
import baritone.api.utils.BooleanBinaryOperators;
|
import baritone.api.utils.BooleanBinaryOperators;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A mask that is context-free. In other words, it doesn't require the current block state to determine if a relative
|
* A mask that is context-free. In other words, it doesn't require the current block state to determine if a relative
|
||||||
@@ -42,7 +42,7 @@ public interface StaticMask extends Mask {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements the parent {@link Mask#partOfMask partOfMask function} by calling the static function
|
* Implements the parent {@link Mask#partOfMask partOfMask function} by calling the static function
|
||||||
* provided in this functional interface without needing the {@link IBlockState} argument. This {@code default}
|
* provided in this functional interface without needing the {@link BlockState} argument. This {@code default}
|
||||||
* implementation should <b><u>NOT</u></b> be overriden.
|
* implementation should <b><u>NOT</u></b> be overriden.
|
||||||
*
|
*
|
||||||
* @param x The relative x position of the block
|
* @param x The relative x position of the block
|
||||||
@@ -52,7 +52,7 @@ public interface StaticMask extends Mask {
|
|||||||
* @return Whether the given position is included in this mask
|
* @return Whether the given position is included in this mask
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
default boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
default boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return this.partOfMask(x, y, z);
|
return this.partOfMask(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import baritone.api.schematic.mask.AbstractMask;
|
|||||||
import baritone.api.schematic.mask.Mask;
|
import baritone.api.schematic.mask.Mask;
|
||||||
import baritone.api.schematic.mask.StaticMask;
|
import baritone.api.schematic.mask.StaticMask;
|
||||||
import baritone.api.utils.BooleanBinaryOperator;
|
import baritone.api.utils.BooleanBinaryOperator;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -40,14 +40,14 @@ public final class BinaryOperatorMask extends AbstractMask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
public boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return this.operator.applyAsBoolean(
|
return this.operator.applyAsBoolean(
|
||||||
partOfMask(a, x, y, z, currentState),
|
partOfMask(a, x, y, z, currentState),
|
||||||
partOfMask(b, x, y, z, currentState)
|
partOfMask(b, x, y, z, currentState)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean partOfMask(Mask mask, int x, int y, int z, IBlockState currentState) {
|
private static boolean partOfMask(Mask mask, int x, int y, int z, BlockState currentState) {
|
||||||
return x < mask.widthX() && y < mask.heightY() && z < mask.lengthZ() && mask.partOfMask(x, y, z, currentState);
|
return x < mask.widthX() && y < mask.heightY() && z < mask.lengthZ() && mask.partOfMask(x, y, z, currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package baritone.api.schematic.mask.operator;
|
|||||||
import baritone.api.schematic.mask.AbstractMask;
|
import baritone.api.schematic.mask.AbstractMask;
|
||||||
import baritone.api.schematic.mask.Mask;
|
import baritone.api.schematic.mask.Mask;
|
||||||
import baritone.api.schematic.mask.StaticMask;
|
import baritone.api.schematic.mask.StaticMask;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -35,7 +35,7 @@ public final class NotMask extends AbstractMask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
public boolean partOfMask(int x, int y, int z, BlockState currentState) {
|
||||||
return !this.source.partOfMask(x, y, z, currentState);
|
return !this.source.partOfMask(x, y, z, currentState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ package baritone.api.schematic.mask.shape;
|
|||||||
|
|
||||||
import baritone.api.schematic.mask.AbstractMask;
|
import baritone.api.schematic.mask.AbstractMask;
|
||||||
import baritone.api.schematic.mask.StaticMask;
|
import baritone.api.schematic.mask.StaticMask;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -31,9 +31,9 @@ public final class CylinderMask extends AbstractMask implements StaticMask {
|
|||||||
private final double radiusSqA;
|
private final double radiusSqA;
|
||||||
private final double radiusSqB;
|
private final double radiusSqB;
|
||||||
private final boolean filled;
|
private final boolean filled;
|
||||||
private final EnumFacing.Axis alignment;
|
private final Direction.Axis alignment;
|
||||||
|
|
||||||
public CylinderMask(int widthX, int heightY, int lengthZ, boolean filled, EnumFacing.Axis alignment) {
|
public CylinderMask(int widthX, int heightY, int lengthZ, boolean filled, Direction.Axis alignment) {
|
||||||
super(widthX, heightY, lengthZ);
|
super(widthX, heightY, lengthZ);
|
||||||
this.centerA = this.getA(widthX, heightY, alignment) / 2.0;
|
this.centerA = this.getA(widthX, heightY, alignment) / 2.0;
|
||||||
this.centerB = this.getB(heightY, lengthZ, alignment) / 2.0;
|
this.centerB = this.getB(heightY, lengthZ, alignment) / 2.0;
|
||||||
@@ -59,11 +59,11 @@ public final class CylinderMask extends AbstractMask implements StaticMask {
|
|||||||
return da * da / this.radiusSqA + db * db / this.radiusSqB > 1;
|
return da * da / this.radiusSqA + db * db / this.radiusSqB > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getA(int x, int y, EnumFacing.Axis alignment) {
|
private static int getA(int x, int y, Direction.Axis alignment) {
|
||||||
return alignment == EnumFacing.Axis.X ? y : x;
|
return alignment == Direction.Axis.X ? y : x;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getB(int y, int z, EnumFacing.Axis alignment) {
|
private static int getB(int y, int z, Direction.Axis alignment) {
|
||||||
return alignment == EnumFacing.Axis.Z ? y : z;
|
return alignment == Direction.Axis.Z ? y : z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,9 @@
|
|||||||
package baritone.api.selection;
|
package baritone.api.selection;
|
||||||
|
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.core.Vec3i;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.world.phys.AABB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A selection is an immutable object representing the current selection. The selection is commonly used for certain
|
* A selection is an immutable object representing the current selection. The selection is commonly used for certain
|
||||||
@@ -54,9 +54,9 @@ public interface ISelection {
|
|||||||
Vec3i size();
|
Vec3i size();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return An {@link AxisAlignedBB} encompassing all blocks in this selection.
|
* @return An {@link AABB} encompassing all blocks in this selection.
|
||||||
*/
|
*/
|
||||||
AxisAlignedBB aabb();
|
AABB aabb();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new {@link ISelection} expanded in the specified direction by the specified number of blocks.
|
* Returns a new {@link ISelection} expanded in the specified direction by the specified number of blocks.
|
||||||
@@ -65,7 +65,7 @@ public interface ISelection {
|
|||||||
* @param blocks How many blocks to expand it.
|
* @param blocks How many blocks to expand it.
|
||||||
* @return A new selection, expanded as specified.
|
* @return A new selection, expanded as specified.
|
||||||
*/
|
*/
|
||||||
ISelection expand(EnumFacing direction, int blocks);
|
ISelection expand(Direction direction, int blocks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new {@link ISelection} contracted in the specified direction by the specified number of blocks.
|
* Returns a new {@link ISelection} contracted in the specified direction by the specified number of blocks.
|
||||||
@@ -77,7 +77,7 @@ public interface ISelection {
|
|||||||
* @param blocks How many blocks to contract it.
|
* @param blocks How many blocks to contract it.
|
||||||
* @return A new selection, contracted as specified.
|
* @return A new selection, contracted as specified.
|
||||||
*/
|
*/
|
||||||
ISelection contract(EnumFacing direction, int blocks);
|
ISelection contract(Direction direction, int blocks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new {@link ISelection} shifted in the specified direction by the specified number of blocks. This moves
|
* Returns a new {@link ISelection} shifted in the specified direction by the specified number of blocks. This moves
|
||||||
@@ -87,5 +87,5 @@ public interface ISelection {
|
|||||||
* @param blocks How many blocks to shift it.
|
* @param blocks How many blocks to shift it.
|
||||||
* @return A new selection, shifted as specified.
|
* @return A new selection, shifted as specified.
|
||||||
*/
|
*/
|
||||||
ISelection shift(EnumFacing direction, int blocks);
|
ISelection shift(Direction direction, int blocks);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
package baritone.api.selection;
|
package baritone.api.selection;
|
||||||
|
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.core.Direction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The selection manager handles setting Baritone's selections. You can set the selection here, as well as retrieving
|
* The selection manager handles setting Baritone's selections. You can set the selection here, as well as retrieving
|
||||||
@@ -87,7 +87,7 @@ public interface ISelectionManager {
|
|||||||
* @param blocks How many blocks to expand it.
|
* @param blocks How many blocks to expand it.
|
||||||
* @return The new selection, expanded as specified.
|
* @return The new selection, expanded as specified.
|
||||||
*/
|
*/
|
||||||
ISelection expand(ISelection selection, EnumFacing direction, int blocks);
|
ISelection expand(ISelection selection, Direction direction, int blocks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replaces the specified {@link ISelection} with one contracted in the specified direction by the specified number
|
* Replaces the specified {@link ISelection} with one contracted in the specified direction by the specified number
|
||||||
@@ -101,7 +101,7 @@ public interface ISelectionManager {
|
|||||||
* @param blocks How many blocks to contract it.
|
* @param blocks How many blocks to contract it.
|
||||||
* @return The new selection, contracted as specified.
|
* @return The new selection, contracted as specified.
|
||||||
*/
|
*/
|
||||||
ISelection contract(ISelection selection, EnumFacing direction, int blocks);
|
ISelection contract(ISelection selection, Direction direction, int blocks);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replaces the specified {@link ISelection} with one shifted in the specified direction by the specified number of
|
* Replaces the specified {@link ISelection} with one shifted in the specified direction by the specified number of
|
||||||
@@ -112,5 +112,5 @@ public interface ISelectionManager {
|
|||||||
* @param blocks How many blocks to shift it.
|
* @param blocks How many blocks to shift it.
|
||||||
* @return The new selection, shifted as specified.
|
* @return The new selection, shifted as specified.
|
||||||
*/
|
*/
|
||||||
ISelection shift(ISelection selection, EnumFacing direction, int blocks);
|
ISelection shift(ISelection selection, Direction direction, int blocks);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,11 @@
|
|||||||
|
|
||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import net.minecraft.util.math.Vec3i;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.core.Vec3i;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A better BlockPos that has fewer hash collisions (and slightly more performant offsets)
|
* A better BlockPos that has fewer hash collisions (and slightly more performant offsets)
|
||||||
@@ -58,7 +57,7 @@ public final class BetterBlockPos extends BlockPos {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BetterBlockPos(double x, double y, double z) {
|
public BetterBlockPos(double x, double y, double z) {
|
||||||
this(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z));
|
this(Mth.floor(x), Mth.floor(y), Mth.floor(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BetterBlockPos(BlockPos pos) {
|
public BetterBlockPos(BlockPos pos) {
|
||||||
@@ -125,49 +124,49 @@ public final class BetterBlockPos extends BlockPos {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos up() {
|
public BetterBlockPos above() {
|
||||||
// this is unimaginably faster than blockpos.up
|
// this is unimaginably faster than blockpos.up
|
||||||
// that literally calls
|
// that literally calls
|
||||||
// this.up(1)
|
// this.up(1)
|
||||||
// which calls this.offset(EnumFacing.UP, 1)
|
// which calls this.offset(Direction.UP, 1)
|
||||||
// which does return n == 0 ? this : new BlockPos(this.getX() + facing.getXOffset() * n, this.getY() + facing.getYOffset() * n, this.getZ() + facing.getZOffset() * n);
|
// which does return n == 0 ? this : new BlockPos(this.getX() + facing.getXOffset() * n, this.getY() + facing.getYOffset() * n, this.getZ() + facing.getZOffset() * n);
|
||||||
|
|
||||||
// how many function calls is that? up(), up(int), offset(EnumFacing, int), new BlockPos, getX, getXOffset, getY, getYOffset, getZ, getZOffset
|
// how many function calls is that? up(), up(int), offset(Direction, int), new BlockPos, getX, getXOffset, getY, getYOffset, getZ, getZOffset
|
||||||
// that's ten.
|
// that's ten.
|
||||||
// this is one function call.
|
// this is one function call.
|
||||||
return new BetterBlockPos(x, y + 1, z);
|
return new BetterBlockPos(x, y + 1, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos up(int amt) {
|
public BetterBlockPos above(int amt) {
|
||||||
// see comment in up()
|
// see comment in up()
|
||||||
return amt == 0 ? this : new BetterBlockPos(x, y + amt, z);
|
return amt == 0 ? this : new BetterBlockPos(x, y + amt, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos down() {
|
public BetterBlockPos below() {
|
||||||
// see comment in up()
|
// see comment in up()
|
||||||
return new BetterBlockPos(x, y - 1, z);
|
return new BetterBlockPos(x, y - 1, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos down(int amt) {
|
public BetterBlockPos below(int amt) {
|
||||||
// see comment in up()
|
// see comment in up()
|
||||||
return amt == 0 ? this : new BetterBlockPos(x, y - amt, z);
|
return amt == 0 ? this : new BetterBlockPos(x, y - amt, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos offset(EnumFacing dir) {
|
public BetterBlockPos relative(Direction dir) {
|
||||||
Vec3i vec = dir.getDirectionVec();
|
Vec3i vec = dir.getNormal();
|
||||||
return new BetterBlockPos(x + vec.getX(), y + vec.getY(), z + vec.getZ());
|
return new BetterBlockPos(x + vec.getX(), y + vec.getY(), z + vec.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BetterBlockPos offset(EnumFacing dir, int dist) {
|
public BetterBlockPos relative(Direction dir, int dist) {
|
||||||
if (dist == 0) {
|
if (dist == 0) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
Vec3i vec = dir.getDirectionVec();
|
Vec3i vec = dir.getNormal();
|
||||||
return new BetterBlockPos(x + vec.getX() * dist, y + vec.getY() * dist, z + vec.getZ() * dist);
|
return new BetterBlockPos(x + vec.getX() * dist, y + vec.getY() * dist, z + vec.getZ() * dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,49 +18,72 @@
|
|||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import baritone.api.utils.accessor.IItemStack;
|
import baritone.api.utils.accessor.IItemStack;
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import net.minecraft.block.*;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import net.minecraft.block.properties.IProperty;
|
import io.netty.util.concurrent.ThreadPerTaskExecutor;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.server.level.progress.ChunkProgressListener;
|
||||||
|
import net.minecraft.server.packs.PackType;
|
||||||
|
import net.minecraft.server.packs.VanillaPackResources;
|
||||||
|
import net.minecraft.server.packs.repository.ServerPacksSource;
|
||||||
|
import net.minecraft.server.packs.resources.MultiPackResourceManager;
|
||||||
|
import net.minecraft.server.packs.resources.ReloadableResourceManager;
|
||||||
|
import net.minecraft.util.Unit;
|
||||||
|
import net.minecraft.world.RandomSequences;
|
||||||
|
import net.minecraft.world.flag.FeatureFlagSet;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.level.CustomSpawner;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.state.properties.Property;
|
||||||
|
import net.minecraft.world.level.dimension.LevelStem;
|
||||||
|
import net.minecraft.world.level.storage.LevelStorageSource;
|
||||||
|
import net.minecraft.world.level.storage.ServerLevelData;
|
||||||
|
import net.minecraft.world.level.storage.loot.BuiltInLootTables;
|
||||||
|
import net.minecraft.world.level.storage.loot.LootContext;
|
||||||
|
import net.minecraft.world.level.storage.loot.LootDataManager;
|
||||||
|
import net.minecraft.world.level.storage.loot.LootParams;
|
||||||
|
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
|
||||||
|
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Consumer;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.regex.MatchResult;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public final class BlockOptionalMeta {
|
public final class BlockOptionalMeta {
|
||||||
// id:meta or id[] or id[properties] where id and properties are any text with at least one character and meta is a one or two digit number
|
// id or id[] or id[properties] where id and properties are any text with at least one character
|
||||||
private static final Pattern PATTERN = Pattern.compile("^(?<id>.+?)(?::(?<meta>\\d\\d?)|\\[(?<properties>.+?)?\\])?$");
|
private static final Pattern PATTERN = Pattern.compile("^(?<id>.+?)(?:\\[(?<properties>.+?)?\\])?$");
|
||||||
|
|
||||||
private final Block block;
|
private final Block block;
|
||||||
private final int meta;
|
|
||||||
private final boolean noMeta;
|
|
||||||
private final String propertiesDescription; // exists so toString() can return something more useful than a list of all blockstates
|
private final String propertiesDescription; // exists so toString() can return something more useful than a list of all blockstates
|
||||||
private final Set<IBlockState> blockstates;
|
private final Set<BlockState> blockstates;
|
||||||
private final Set<Integer> stateHashes;
|
private final ImmutableSet<Integer> stateHashes;
|
||||||
private final Set<Integer> stackHashes;
|
private final ImmutableSet<Integer> stackHashes;
|
||||||
private static final Map<Object, Object> normalizations;
|
private static LootDataManager lootTables;
|
||||||
|
private static Map<Block, List<Item>> drops = new HashMap<>();
|
||||||
public BlockOptionalMeta(@Nonnull Block block, @Nullable Integer meta) {
|
|
||||||
this.block = block;
|
|
||||||
this.noMeta = meta == null;
|
|
||||||
this.meta = noMeta ? 0 : meta;
|
|
||||||
this.propertiesDescription = "{}";
|
|
||||||
this.blockstates = getStates(block, meta, Collections.emptyMap());
|
|
||||||
this.stateHashes = getStateHashes(blockstates);
|
|
||||||
this.stackHashes = getStackHashes(blockstates);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BlockOptionalMeta(@Nonnull Block block) {
|
public BlockOptionalMeta(@Nonnull Block block) {
|
||||||
this(block, null);
|
this.block = block;
|
||||||
|
this.propertiesDescription = "{}";
|
||||||
|
this.blockstates = getStates(block, Collections.emptyMap());
|
||||||
|
this.stateHashes = getStateHashes(blockstates);
|
||||||
|
this.stackHashes = getStackHashes(blockstates);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockOptionalMeta(@Nonnull String selector) {
|
public BlockOptionalMeta(@Nonnull String selector) {
|
||||||
@@ -70,188 +93,24 @@ public final class BlockOptionalMeta {
|
|||||||
throw new IllegalArgumentException("invalid block selector");
|
throw new IllegalArgumentException("invalid block selector");
|
||||||
}
|
}
|
||||||
|
|
||||||
noMeta = matcher.group("meta") == null;
|
block = BlockUtils.stringToBlockRequired(matcher.group("id"));
|
||||||
|
|
||||||
ResourceLocation id = new ResourceLocation(matcher.group("id"));
|
|
||||||
|
|
||||||
if (!Block.REGISTRY.containsKey(id)) {
|
|
||||||
throw new IllegalArgumentException("Invalid block ID");
|
|
||||||
}
|
|
||||||
block = Block.REGISTRY.getObject(id);
|
|
||||||
|
|
||||||
String props = matcher.group("properties");
|
String props = matcher.group("properties");
|
||||||
Map<IProperty<?>, ?> properties = props == null || props.equals("") ? Collections.emptyMap() : parseProperties(block, props);
|
Map<Property<?>, ?> properties = props == null || props.equals("") ? Collections.emptyMap() : parseProperties(block, props);
|
||||||
|
|
||||||
propertiesDescription = props == null ? "{}" : "{" + props.replace("=", ":") + "}";
|
propertiesDescription = props == null ? "{}" : "{" + props.replace("=", ":") + "}";
|
||||||
meta = noMeta ? 0 : Integer.parseInt(matcher.group("meta"));
|
blockstates = getStates(block, properties);
|
||||||
blockstates = getStates(block, getMeta(), properties);
|
|
||||||
stateHashes = getStateHashes(blockstates);
|
stateHashes = getStateHashes(blockstates);
|
||||||
stackHashes = getStackHashes(blockstates);
|
stackHashes = getStackHashes(blockstates);
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
private static <C extends Comparable<C>, P extends Property<C>> P castToIProperty(Object value) {
|
||||||
Map<Object, Object> _normalizations = new HashMap<>();
|
|
||||||
Consumer<Enum> put = instance -> _normalizations.put(instance.getClass(), instance);
|
|
||||||
put.accept(EnumFacing.NORTH);
|
|
||||||
put.accept(EnumFacing.Axis.Y);
|
|
||||||
put.accept(BlockLog.EnumAxis.Y);
|
|
||||||
put.accept(BlockStairs.EnumHalf.BOTTOM);
|
|
||||||
put.accept(BlockStairs.EnumShape.STRAIGHT);
|
|
||||||
put.accept(BlockLever.EnumOrientation.DOWN_X);
|
|
||||||
put.accept(BlockDoublePlant.EnumBlockHalf.LOWER);
|
|
||||||
put.accept(BlockSlab.EnumBlockHalf.BOTTOM);
|
|
||||||
put.accept(BlockDoor.EnumDoorHalf.LOWER);
|
|
||||||
put.accept(BlockDoor.EnumHingePosition.LEFT);
|
|
||||||
put.accept(BlockBed.EnumPartType.HEAD);
|
|
||||||
put.accept(BlockRailBase.EnumRailDirection.NORTH_SOUTH);
|
|
||||||
put.accept(BlockTrapDoor.DoorHalf.BOTTOM);
|
|
||||||
_normalizations.put(BlockBanner.ROTATION, 0);
|
|
||||||
_normalizations.put(BlockBed.OCCUPIED, false);
|
|
||||||
_normalizations.put(BlockBrewingStand.HAS_BOTTLE[0], false);
|
|
||||||
_normalizations.put(BlockBrewingStand.HAS_BOTTLE[1], false);
|
|
||||||
_normalizations.put(BlockBrewingStand.HAS_BOTTLE[2], false);
|
|
||||||
_normalizations.put(BlockButton.POWERED, false);
|
|
||||||
// _normalizations.put(BlockCactus.AGE, 0);
|
|
||||||
// _normalizations.put(BlockCauldron.LEVEL, 0);
|
|
||||||
// _normalizations.put(BlockChorusFlower.AGE, 0);
|
|
||||||
_normalizations.put(BlockChorusPlant.NORTH, false);
|
|
||||||
_normalizations.put(BlockChorusPlant.EAST, false);
|
|
||||||
_normalizations.put(BlockChorusPlant.SOUTH, false);
|
|
||||||
_normalizations.put(BlockChorusPlant.WEST, false);
|
|
||||||
_normalizations.put(BlockChorusPlant.UP, false);
|
|
||||||
_normalizations.put(BlockChorusPlant.DOWN, false);
|
|
||||||
// _normalizations.put(BlockCocoa.AGE, 0);
|
|
||||||
// _normalizations.put(BlockCrops.AGE, 0);
|
|
||||||
_normalizations.put(BlockDirt.SNOWY, false);
|
|
||||||
_normalizations.put(BlockDoor.OPEN, false);
|
|
||||||
_normalizations.put(BlockDoor.POWERED, false);
|
|
||||||
// _normalizations.put(BlockFarmland.MOISTURE, 0);
|
|
||||||
_normalizations.put(BlockFence.NORTH, false);
|
|
||||||
_normalizations.put(BlockFence.EAST, false);
|
|
||||||
_normalizations.put(BlockFence.WEST, false);
|
|
||||||
_normalizations.put(BlockFence.SOUTH, false);
|
|
||||||
// _normalizations.put(BlockFenceGate.POWERED, false);
|
|
||||||
// _normalizations.put(BlockFenceGate.IN_WALL, false);
|
|
||||||
_normalizations.put(BlockFire.AGE, 0);
|
|
||||||
_normalizations.put(BlockFire.NORTH, false);
|
|
||||||
_normalizations.put(BlockFire.EAST, false);
|
|
||||||
_normalizations.put(BlockFire.SOUTH, false);
|
|
||||||
_normalizations.put(BlockFire.WEST, false);
|
|
||||||
_normalizations.put(BlockFire.UPPER, false);
|
|
||||||
// _normalizations.put(BlockFrostedIce.AGE, 0);
|
|
||||||
_normalizations.put(BlockGrass.SNOWY, false);
|
|
||||||
// _normalizations.put(BlockHopper.ENABLED, true);
|
|
||||||
// _normalizations.put(BlockLever.POWERED, false);
|
|
||||||
// _normalizations.put(BlockLiquid.LEVEL, 0);
|
|
||||||
// _normalizations.put(BlockMycelium.SNOWY, false);
|
|
||||||
// _normalizations.put(BlockNetherWart.AGE, false);
|
|
||||||
_normalizations.put(BlockLeaves.CHECK_DECAY, false);
|
|
||||||
// _normalizations.put(BlockLeaves.DECAYABLE, false);
|
|
||||||
// _normalizations.put(BlockObserver.POWERED, false);
|
|
||||||
_normalizations.put(BlockPane.NORTH, false);
|
|
||||||
_normalizations.put(BlockPane.EAST, false);
|
|
||||||
_normalizations.put(BlockPane.WEST, false);
|
|
||||||
_normalizations.put(BlockPane.SOUTH, false);
|
|
||||||
// _normalizations.put(BlockPistonBase.EXTENDED, false);
|
|
||||||
// _normalizations.put(BlockPressurePlate.POWERED, false);
|
|
||||||
// _normalizations.put(BlockPressurePlateWeighted.POWER, false);
|
|
||||||
_normalizations.put(BlockQuartz.EnumType.LINES_X, BlockQuartz.EnumType.LINES_Y);
|
|
||||||
_normalizations.put(BlockQuartz.EnumType.LINES_Z, BlockQuartz.EnumType.LINES_Y);
|
|
||||||
// _normalizations.put(BlockRailDetector.POWERED, false);
|
|
||||||
// _normalizations.put(BlockRailPowered.POWERED, false);
|
|
||||||
_normalizations.put(BlockRedstoneWire.NORTH, false);
|
|
||||||
_normalizations.put(BlockRedstoneWire.EAST, false);
|
|
||||||
_normalizations.put(BlockRedstoneWire.SOUTH, false);
|
|
||||||
_normalizations.put(BlockRedstoneWire.WEST, false);
|
|
||||||
// _normalizations.put(BlockReed.AGE, false);
|
|
||||||
_normalizations.put(BlockSapling.STAGE, 0);
|
|
||||||
_normalizations.put(BlockSkull.NODROP, false);
|
|
||||||
_normalizations.put(BlockStandingSign.ROTATION, 0);
|
|
||||||
_normalizations.put(BlockStem.AGE, 0);
|
|
||||||
_normalizations.put(BlockTripWire.NORTH, false);
|
|
||||||
_normalizations.put(BlockTripWire.EAST, false);
|
|
||||||
_normalizations.put(BlockTripWire.WEST, false);
|
|
||||||
_normalizations.put(BlockTripWire.SOUTH, false);
|
|
||||||
_normalizations.put(BlockVine.NORTH, false);
|
|
||||||
_normalizations.put(BlockVine.EAST, false);
|
|
||||||
_normalizations.put(BlockVine.SOUTH, false);
|
|
||||||
_normalizations.put(BlockVine.WEST, false);
|
|
||||||
_normalizations.put(BlockVine.UP, false);
|
|
||||||
_normalizations.put(BlockWall.UP, false);
|
|
||||||
_normalizations.put(BlockWall.NORTH, false);
|
|
||||||
_normalizations.put(BlockWall.EAST, false);
|
|
||||||
_normalizations.put(BlockWall.WEST, false);
|
|
||||||
_normalizations.put(BlockWall.SOUTH, false);
|
|
||||||
normalizations = Collections.unmodifiableMap(_normalizations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <C extends Comparable<C>, P extends IProperty<C>> P castToIProperty(Object value) {
|
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
return (P) value;
|
return (P) value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <C extends Comparable<C>, P extends IProperty<C>> C castToIPropertyValue(P iproperty, Object value) {
|
private static Map<Property<?>, ?> parseProperties(Block block, String raw) {
|
||||||
//noinspection unchecked
|
ImmutableMap.Builder<Property<?>, Object> builder = ImmutableMap.builder();
|
||||||
return (C) value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Normalizes the specified blockstate by setting meta-affecting properties which
|
|
||||||
* are not being targeted by the meta parameter to their default values.
|
|
||||||
* <p>
|
|
||||||
* For example, block variant/color is the primary target for the meta value, so properties
|
|
||||||
* such as rotation/facing direction will be set to default values in order to nullify
|
|
||||||
* the effect that they have on the state's meta value.
|
|
||||||
*
|
|
||||||
* @param state The state to normalize
|
|
||||||
* @return The normalized block state
|
|
||||||
*/
|
|
||||||
public static IBlockState normalize(IBlockState state) {
|
|
||||||
IBlockState newState = state;
|
|
||||||
|
|
||||||
for (IProperty<?> property : state.getProperties().keySet()) {
|
|
||||||
Class<?> valueClass = property.getValueClass();
|
|
||||||
if (normalizations.containsKey(property)) {
|
|
||||||
try {
|
|
||||||
newState = newState.withProperty(
|
|
||||||
castToIProperty(property),
|
|
||||||
castToIPropertyValue(property, normalizations.get(property))
|
|
||||||
);
|
|
||||||
} catch (IllegalArgumentException ignored) {}
|
|
||||||
} else if (normalizations.containsKey(state.getValue(property))) {
|
|
||||||
try {
|
|
||||||
newState = newState.withProperty(
|
|
||||||
castToIProperty(property),
|
|
||||||
castToIPropertyValue(property, normalizations.get(state.getValue(property)))
|
|
||||||
);
|
|
||||||
} catch (IllegalArgumentException ignored) {}
|
|
||||||
} else if (normalizations.containsKey(valueClass)) {
|
|
||||||
try {
|
|
||||||
newState = newState.withProperty(
|
|
||||||
castToIProperty(property),
|
|
||||||
castToIPropertyValue(property, normalizations.get(valueClass))
|
|
||||||
);
|
|
||||||
} catch (IllegalArgumentException ignored) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Evaluate the target meta value for the specified state. The target meta value is
|
|
||||||
* most often that which is influenced by the variant/color property of the block state.
|
|
||||||
*
|
|
||||||
* @param state The state to check
|
|
||||||
* @return The target meta of the state
|
|
||||||
* @see #normalize(IBlockState)
|
|
||||||
*/
|
|
||||||
public static int stateMeta(IBlockState state) {
|
|
||||||
return state.getBlock().getMetaFromState(normalize(state));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<IProperty<?>, ?> parseProperties(Block block, String raw) {
|
|
||||||
ImmutableMap.Builder<IProperty<?>, Object> builder = ImmutableMap.builder();
|
|
||||||
for (String pair : raw.split(",")) {
|
for (String pair : raw.split(",")) {
|
||||||
String[] parts = pair.split("=");
|
String[] parts = pair.split("=");
|
||||||
if (parts.length != 2) {
|
if (parts.length != 2) {
|
||||||
@@ -259,9 +118,9 @@ public final class BlockOptionalMeta {
|
|||||||
}
|
}
|
||||||
String rawKey = parts[0];
|
String rawKey = parts[0];
|
||||||
String rawValue = parts[1];
|
String rawValue = parts[1];
|
||||||
IProperty<?> key = block.getBlockState().getProperty(rawKey);
|
Property<?> key = block.getStateDefinition().getProperty(rawKey);
|
||||||
Comparable<?> value = castToIProperty(key).parseValue(rawValue)
|
Comparable<?> value = castToIProperty(key).getValue(rawValue)
|
||||||
.toJavaUtil().orElseThrow(() -> new IllegalArgumentException(String.format(
|
.orElseThrow(() -> new IllegalArgumentException(String.format(
|
||||||
"\"%s\" is not a valid value for %s on %s",
|
"\"%s\" is not a valid value for %s on %s",
|
||||||
rawValue, key, block
|
rawValue, key, block
|
||||||
)));
|
)));
|
||||||
@@ -270,31 +129,30 @@ public final class BlockOptionalMeta {
|
|||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Set<IBlockState> getStates(@Nonnull Block block, @Nullable Integer meta, @Nonnull Map<IProperty<?>, ?> properties) {
|
private static Set<BlockState> getStates(@Nonnull Block block, @Nonnull Map<Property<?>, ?> properties) {
|
||||||
return block.getBlockState().getValidStates().stream()
|
return block.getStateDefinition().getPossibleStates().stream()
|
||||||
.filter(blockstate -> meta == null || stateMeta(blockstate) == meta)
|
|
||||||
.filter(blockstate -> properties.entrySet().stream().allMatch(entry ->
|
.filter(blockstate -> properties.entrySet().stream().allMatch(entry ->
|
||||||
blockstate.getValue(entry.getKey()) == entry.getValue()
|
blockstate.getValue(entry.getKey()) == entry.getValue()
|
||||||
))
|
))
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ImmutableSet<Integer> getStateHashes(Set<IBlockState> blockstates) {
|
private static ImmutableSet<Integer> getStateHashes(Set<BlockState> blockstates) {
|
||||||
return ImmutableSet.copyOf(
|
return ImmutableSet.copyOf(
|
||||||
blockstates.stream()
|
blockstates.stream()
|
||||||
.map(IBlockState::hashCode)
|
.map(BlockState::hashCode)
|
||||||
.toArray(Integer[]::new)
|
.toArray(Integer[]::new)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ImmutableSet<Integer> getStackHashes(Set<IBlockState> blockstates) {
|
private static ImmutableSet<Integer> getStackHashes(Set<BlockState> blockstates) {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
return ImmutableSet.copyOf(
|
return ImmutableSet.copyOf(
|
||||||
blockstates.stream()
|
blockstates.stream()
|
||||||
.map(state -> new ItemStack(
|
.flatMap(state -> drops(state.getBlock())
|
||||||
state.getBlock().getItemDropped(state, new Random(), 0),
|
.stream()
|
||||||
state.getBlock().damageDropped(state)
|
.map(item -> new ItemStack(item, 1))
|
||||||
))
|
)
|
||||||
.map(stack -> ((IItemStack) (Object) stack).getBaritoneHash())
|
.map(stack -> ((IItemStack) (Object) stack).getBaritoneHash())
|
||||||
.toArray(Integer[]::new)
|
.toArray(Integer[]::new)
|
||||||
);
|
);
|
||||||
@@ -304,16 +162,11 @@ public final class BlockOptionalMeta {
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated // deprecated because getMeta() == null no longer implies that this BOM only cares about the block
|
|
||||||
public Integer getMeta() {
|
|
||||||
return noMeta ? null : meta;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean matches(@Nonnull Block block) {
|
public boolean matches(@Nonnull Block block) {
|
||||||
return block == this.block;
|
return block == this.block;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean matches(@Nonnull IBlockState blockstate) {
|
public boolean matches(@Nonnull BlockState blockstate) {
|
||||||
Block block = blockstate.getBlock();
|
Block block = blockstate.getBlock();
|
||||||
return block == this.block && stateHashes.contains(blockstate.hashCode());
|
return block == this.block && stateHashes.contains(blockstate.hashCode());
|
||||||
}
|
}
|
||||||
@@ -322,28 +175,17 @@ public final class BlockOptionalMeta {
|
|||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
int hash = ((IItemStack) (Object) stack).getBaritoneHash();
|
int hash = ((IItemStack) (Object) stack).getBaritoneHash();
|
||||||
|
|
||||||
if (noMeta) {
|
hash -= stack.getDamageValue();
|
||||||
hash -= stack.getItemDamage();
|
|
||||||
}
|
|
||||||
|
|
||||||
return stackHashes.contains(hash);
|
return stackHashes.contains(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (noMeta) {
|
return String.format("BlockOptionalMeta{block=%s,properties=%s}", block, propertiesDescription);
|
||||||
return String.format("BlockOptionalMeta{block=%s,properties=%s}", block, propertiesDescription);
|
|
||||||
} else {
|
|
||||||
return String.format("BlockOptionalMeta{block=%s,meta=%s}", block, getMeta());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IBlockState blockStateFromStack(ItemStack stack) {
|
public BlockState getAnyBlockState() {
|
||||||
//noinspection deprecation
|
|
||||||
return Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata());
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBlockState getAnyBlockState() {
|
|
||||||
if (blockstates.size() > 0) {
|
if (blockstates.size() > 0) {
|
||||||
return blockstates.iterator().next();
|
return blockstates.iterator().next();
|
||||||
}
|
}
|
||||||
@@ -351,11 +193,107 @@ public final class BlockOptionalMeta {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<IBlockState> getAllBlockStates() {
|
public Set<BlockState> getAllBlockStates() {
|
||||||
return blockstates;
|
return blockstates;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Integer> stackHashes() {
|
public Set<Integer> stackHashes() {
|
||||||
return stackHashes;
|
return stackHashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Method getVanillaServerPack;
|
||||||
|
|
||||||
|
private static VanillaPackResources getVanillaServerPack() {
|
||||||
|
if (getVanillaServerPack == null) {
|
||||||
|
getVanillaServerPack = Arrays.stream(ServerPacksSource.class.getDeclaredMethods()).filter(field -> field.getReturnType() == VanillaPackResources.class).findFirst().orElseThrow();
|
||||||
|
getVanillaServerPack.setAccessible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return (VanillaPackResources) getVanillaServerPack.invoke(null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LootDataManager getManager() {
|
||||||
|
if (lootTables == null) {
|
||||||
|
MultiPackResourceManager resources = new MultiPackResourceManager(PackType.SERVER_DATA, List.of(getVanillaServerPack()));
|
||||||
|
ReloadableResourceManager resourceManager = new ReloadableResourceManager(PackType.SERVER_DATA);
|
||||||
|
lootTables = new LootDataManager();
|
||||||
|
resourceManager.registerReloadListener(lootTables);
|
||||||
|
try {
|
||||||
|
resourceManager.createReload(new ThreadPerTaskExecutor(Thread::new), new ThreadPerTaskExecutor(Thread::new), CompletableFuture.completedFuture(Unit.INSTANCE), resources.listPacks().toList()).done().get();
|
||||||
|
} catch (Exception exception) {
|
||||||
|
throw new RuntimeException(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return lootTables;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized List<Item> drops(Block b) {
|
||||||
|
return drops.computeIfAbsent(b, block -> {
|
||||||
|
ResourceLocation lootTableLocation = block.getLootTable();
|
||||||
|
if (lootTableLocation == BuiltInLootTables.EMPTY) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
} else {
|
||||||
|
List<Item> items = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
|
||||||
|
getManager().getLootTable(lootTableLocation).getRandomItemsRaw(
|
||||||
|
new LootContext.Builder(
|
||||||
|
new LootParams.Builder(ServerLevelStub.fastCreate())
|
||||||
|
.withParameter(LootContextParams.ORIGIN, Vec3.atLowerCornerOf(BlockPos.ZERO))
|
||||||
|
.withParameter(LootContextParams.TOOL, ItemStack.EMPTY)
|
||||||
|
.withOptionalParameter(LootContextParams.BLOCK_ENTITY, null)
|
||||||
|
.withParameter(LootContextParams.BLOCK_STATE, block.defaultBlockState())
|
||||||
|
.create(LootContextParamSets.BLOCK)
|
||||||
|
).withOptionalRandomSeed(1L)
|
||||||
|
.create(null),
|
||||||
|
stack -> items.add(stack.getItem())
|
||||||
|
);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ServerLevelStub extends ServerLevel {
|
||||||
|
private static Minecraft client = Minecraft.getInstance();
|
||||||
|
private static Unsafe unsafe = getUnsafe();
|
||||||
|
|
||||||
|
public ServerLevelStub(MinecraftServer $$0, Executor $$1, LevelStorageSource.LevelStorageAccess $$2, ServerLevelData $$3, ResourceKey<Level> $$4, LevelStem $$5, ChunkProgressListener $$6, boolean $$7, long $$8, List<CustomSpawner> $$9, boolean $$10, @Nullable RandomSequences $$11) {
|
||||||
|
super($$0, $$1, $$2, $$3, $$4, $$5, $$6, $$7, $$8, $$9, $$10, $$11);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeatureFlagSet enabledFeatures() {
|
||||||
|
assert client.level != null;
|
||||||
|
return client.level.enabledFeatures();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ServerLevelStub fastCreate() {
|
||||||
|
try {
|
||||||
|
return (ServerLevelStub) unsafe.allocateInstance(ServerLevelStub.class);
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Unsafe getUnsafe() {
|
||||||
|
try {
|
||||||
|
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
theUnsafe.setAccessible(true);
|
||||||
|
return (Unsafe) theUnsafe.get(null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ package baritone.api.utils;
|
|||||||
|
|
||||||
import baritone.api.utils.accessor.IItemStack;
|
import baritone.api.utils.accessor.IItemStack;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -31,14 +31,14 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
public class BlockOptionalMetaLookup {
|
public class BlockOptionalMetaLookup {
|
||||||
private final ImmutableSet<Block> blockSet;
|
private final ImmutableSet<Block> blockSet;
|
||||||
private final ImmutableSet<IBlockState> blockStateSet;
|
private final ImmutableSet<BlockState> blockStateSet;
|
||||||
private final ImmutableSet<Integer> stackHashes;
|
private final ImmutableSet<Integer> stackHashes;
|
||||||
private final BlockOptionalMeta[] boms;
|
private final BlockOptionalMeta[] boms;
|
||||||
|
|
||||||
public BlockOptionalMetaLookup(BlockOptionalMeta... boms) {
|
public BlockOptionalMetaLookup(BlockOptionalMeta... boms) {
|
||||||
this.boms = boms;
|
this.boms = boms;
|
||||||
Set<Block> blocks = new HashSet<>();
|
Set<Block> blocks = new HashSet<>();
|
||||||
Set<IBlockState> blockStates = new HashSet<>();
|
Set<BlockState> blockStates = new HashSet<>();
|
||||||
Set<Integer> stacks = new HashSet<>();
|
Set<Integer> stacks = new HashSet<>();
|
||||||
for (BlockOptionalMeta bom : boms) {
|
for (BlockOptionalMeta bom : boms) {
|
||||||
blocks.add(bom.getBlock());
|
blocks.add(bom.getBlock());
|
||||||
@@ -73,14 +73,14 @@ public class BlockOptionalMetaLookup {
|
|||||||
return blockSet.contains(block);
|
return blockSet.contains(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean has(IBlockState state) {
|
public boolean has(BlockState state) {
|
||||||
return blockStateSet.contains(state);
|
return blockStateSet.contains(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean has(ItemStack stack) {
|
public boolean has(ItemStack stack) {
|
||||||
int hash = ((IItemStack) (Object) stack).getBaritoneHash();
|
int hash = ((IItemStack) (Object) stack).getBaritoneHash();
|
||||||
return stackHashes.contains(hash)
|
hash -= stack.getDamageValue();
|
||||||
|| stackHashes.contains(hash - stack.getItemDamage());
|
return stackHashes.contains(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<BlockOptionalMeta> blocks() {
|
public List<BlockOptionalMeta> blocks() {
|
||||||
|
|||||||
@@ -17,18 +17,19 @@
|
|||||||
|
|
||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
|
||||||
public class BlockUtils {
|
public class BlockUtils {
|
||||||
|
|
||||||
private static transient Map<String, Block> resourceCache = new HashMap<>();
|
private static transient Map<String, Block> resourceCache = new HashMap<>();
|
||||||
|
|
||||||
public static String blockToString(Block block) {
|
public static String blockToString(Block block) {
|
||||||
ResourceLocation loc = Block.REGISTRY.getNameForObject(block);
|
ResourceLocation loc = BuiltInRegistries.BLOCK.getKey(block);
|
||||||
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
||||||
if (!loc.getNamespace().equals("minecraft")) {
|
if (!loc.getNamespace().equals("minecraft")) {
|
||||||
// Baritone is running on top of forge with mods installed, perhaps?
|
// Baritone is running on top of forge with mods installed, perhaps?
|
||||||
@@ -56,7 +57,7 @@ public class BlockUtils {
|
|||||||
if (resourceCache.containsKey(name)) {
|
if (resourceCache.containsKey(name)) {
|
||||||
return null; // cached as null
|
return null; // cached as null
|
||||||
}
|
}
|
||||||
block = Block.getBlockFromName(name.contains(":") ? name : "minecraft:" + name);
|
block = BuiltInRegistries.BLOCK.getOptional(ResourceLocation.tryParse(name.contains(":") ? name : "minecraft:" + name)).orElse(null);
|
||||||
Map<String, Block> copy = new HashMap<>(resourceCache); // read only copy is safe, wont throw concurrentmodification
|
Map<String, Block> copy = new HashMap<>(resourceCache); // read only copy is safe, wont throw concurrentmodification
|
||||||
copy.put(name, block);
|
copy.put(name, block);
|
||||||
resourceCache = copy;
|
resourceCache = copy;
|
||||||
|
|||||||
@@ -18,10 +18,12 @@
|
|||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
import baritone.api.BaritoneAPI;
|
||||||
|
import baritone.api.Settings;
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.client.GuiMessageTag;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.util.text.TextComponentString;
|
import net.minecraft.network.chat.MutableComponent;
|
||||||
import net.minecraft.util.text.TextFormatting;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
@@ -42,25 +44,30 @@ public interface Helper {
|
|||||||
Helper HELPER = new Helper() {};
|
Helper HELPER = new Helper() {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main game instance returned by {@link Minecraft#getMinecraft()}.
|
* The main game instance returned by {@link Minecraft#getInstance()}.
|
||||||
* Deprecated since {@link IPlayerContext#minecraft()} should be used instead (In the majority of cases).
|
* Deprecated since {@link IPlayerContext#minecraft()} should be used instead (In the majority of cases).
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
Minecraft mc = Minecraft.getMinecraft();
|
Minecraft mc = Minecraft.getInstance();
|
||||||
|
|
||||||
static ITextComponent getPrefix() {
|
/**
|
||||||
|
* The tag to assign to chat messages when {@link Settings#useMessageTag} is {@code true}.
|
||||||
|
*/
|
||||||
|
GuiMessageTag MESSAGE_TAG = new GuiMessageTag(0xFF55FF, null, Component.literal("Baritone message."), "Baritone");
|
||||||
|
|
||||||
|
static Component getPrefix() {
|
||||||
// Inner text component
|
// Inner text component
|
||||||
final Calendar now = Calendar.getInstance();
|
final Calendar now = Calendar.getInstance();
|
||||||
final boolean xd = now.get(Calendar.MONTH) == Calendar.APRIL && now.get(Calendar.DAY_OF_MONTH) <= 3;
|
final boolean xd = now.get(Calendar.MONTH) == Calendar.APRIL && now.get(Calendar.DAY_OF_MONTH) <= 3;
|
||||||
ITextComponent baritone = new TextComponentString(xd ? "Baritoe" : BaritoneAPI.getSettings().shortBaritonePrefix.value ? "B" : "Baritone");
|
MutableComponent baritone = Component.literal(xd ? "Baritoe" : BaritoneAPI.getSettings().shortBaritonePrefix.value ? "B" : "Baritone");
|
||||||
baritone.getStyle().setColor(TextFormatting.LIGHT_PURPLE);
|
baritone.setStyle(baritone.getStyle().withColor(ChatFormatting.LIGHT_PURPLE));
|
||||||
|
|
||||||
// Outer brackets
|
// Outer brackets
|
||||||
ITextComponent prefix = new TextComponentString("");
|
MutableComponent prefix = Component.literal("");
|
||||||
prefix.getStyle().setColor(TextFormatting.DARK_PURPLE);
|
prefix.setStyle(baritone.getStyle().withColor(ChatFormatting.DARK_PURPLE));
|
||||||
prefix.appendText("[");
|
prefix.append("[");
|
||||||
prefix.appendSibling(baritone);
|
prefix.append(baritone);
|
||||||
prefix.appendText("]");
|
prefix.append("]");
|
||||||
|
|
||||||
return prefix;
|
return prefix;
|
||||||
}
|
}
|
||||||
@@ -71,8 +78,8 @@ public interface Helper {
|
|||||||
* @param title The title to display in the popup
|
* @param title The title to display in the popup
|
||||||
* @param message The message to display in the popup
|
* @param message The message to display in the popup
|
||||||
*/
|
*/
|
||||||
default void logToast(ITextComponent title, ITextComponent message) {
|
default void logToast(Component title, Component message) {
|
||||||
Minecraft.getMinecraft().addScheduledTask(() -> BaritoneAPI.getSettings().toaster.value.accept(title, message));
|
Minecraft.getInstance().execute(() -> BaritoneAPI.getSettings().toaster.value.accept(title, message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,7 +89,7 @@ public interface Helper {
|
|||||||
* @param message The message to display in the popup
|
* @param message The message to display in the popup
|
||||||
*/
|
*/
|
||||||
default void logToast(String title, String message) {
|
default void logToast(String title, String message) {
|
||||||
logToast(new TextComponentString(title), new TextComponentString(message));
|
logToast(Component.literal(title), Component.literal(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,7 +98,7 @@ public interface Helper {
|
|||||||
* @param message The message to display in the popup
|
* @param message The message to display in the popup
|
||||||
*/
|
*/
|
||||||
default void logToast(String message) {
|
default void logToast(String message) {
|
||||||
logToast(Helper.getPrefix(), new TextComponentString(message));
|
logToast(Helper.getPrefix(), Component.literal(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -133,7 +140,7 @@ public interface Helper {
|
|||||||
* @param error Whether to log as an error
|
* @param error Whether to log as an error
|
||||||
*/
|
*/
|
||||||
default void logNotificationDirect(String message, boolean error) {
|
default void logNotificationDirect(String message, boolean error) {
|
||||||
Minecraft.getMinecraft().addScheduledTask(() -> BaritoneAPI.getSettings().notifier.value.accept(message, error));
|
Minecraft.getInstance().execute(() -> BaritoneAPI.getSettings().notifier.value.accept(message, error));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -158,19 +165,17 @@ public interface Helper {
|
|||||||
* @param logAsToast Whether to log as a toast notification
|
* @param logAsToast Whether to log as a toast notification
|
||||||
* @param components The components to send
|
* @param components The components to send
|
||||||
*/
|
*/
|
||||||
default void logDirect(boolean logAsToast, ITextComponent... components) {
|
default void logDirect(boolean logAsToast, Component... components) {
|
||||||
ITextComponent component = new TextComponentString("");
|
MutableComponent component = Component.literal("");
|
||||||
if (!logAsToast) {
|
if (!logAsToast && !BaritoneAPI.getSettings().useMessageTag.value) {
|
||||||
// If we are not logging as a Toast
|
component.append(getPrefix());
|
||||||
// Append the prefix to the base component line
|
component.append(Component.literal(" "));
|
||||||
component.appendSibling(getPrefix());
|
|
||||||
component.appendSibling(new TextComponentString(" "));
|
|
||||||
}
|
}
|
||||||
Arrays.asList(components).forEach(component::appendSibling);
|
Arrays.asList(components).forEach(component::append);
|
||||||
if (logAsToast) {
|
if (logAsToast) {
|
||||||
logToast(getPrefix(), component);
|
logToast(getPrefix(), component);
|
||||||
} else {
|
} else {
|
||||||
Minecraft.getMinecraft().addScheduledTask(() -> BaritoneAPI.getSettings().logger.value.accept(component));
|
Minecraft.getInstance().execute(() -> BaritoneAPI.getSettings().logger.value.accept(component));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +184,7 @@ public interface Helper {
|
|||||||
*
|
*
|
||||||
* @param components The components to send
|
* @param components The components to send
|
||||||
*/
|
*/
|
||||||
default void logDirect(ITextComponent... components) {
|
default void logDirect(Component... components) {
|
||||||
logDirect(BaritoneAPI.getSettings().logAsToast.value, components);
|
logDirect(BaritoneAPI.getSettings().logAsToast.value, components);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,10 +196,10 @@ public interface Helper {
|
|||||||
* @param color The color to print that message in
|
* @param color The color to print that message in
|
||||||
* @param logAsToast Whether to log as a toast notification
|
* @param logAsToast Whether to log as a toast notification
|
||||||
*/
|
*/
|
||||||
default void logDirect(String message, TextFormatting color, boolean logAsToast) {
|
default void logDirect(String message, ChatFormatting color, boolean logAsToast) {
|
||||||
Stream.of(message.split("\n")).forEach(line -> {
|
Stream.of(message.split("\n")).forEach(line -> {
|
||||||
ITextComponent component = new TextComponentString(line.replace("\t", " "));
|
MutableComponent component = Component.literal(line.replace("\t", " "));
|
||||||
component.getStyle().setColor(color);
|
component.setStyle(component.getStyle().withColor(color));
|
||||||
logDirect(logAsToast, component);
|
logDirect(logAsToast, component);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -206,7 +211,7 @@ public interface Helper {
|
|||||||
* @param message The message to display in chat
|
* @param message The message to display in chat
|
||||||
* @param color The color to print that message in
|
* @param color The color to print that message in
|
||||||
*/
|
*/
|
||||||
default void logDirect(String message, TextFormatting color) {
|
default void logDirect(String message, ChatFormatting color) {
|
||||||
logDirect(message, color, BaritoneAPI.getSettings().logAsToast.value);
|
logDirect(message, color, BaritoneAPI.getSettings().logAsToast.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +223,7 @@ public interface Helper {
|
|||||||
* @param logAsToast Whether to log as a toast notification
|
* @param logAsToast Whether to log as a toast notification
|
||||||
*/
|
*/
|
||||||
default void logDirect(String message, boolean logAsToast) {
|
default void logDirect(String message, boolean logAsToast) {
|
||||||
logDirect(message, TextFormatting.GRAY, logAsToast);
|
logDirect(message, ChatFormatting.GRAY, logAsToast);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -234,7 +239,7 @@ public interface Helper {
|
|||||||
default void logUnhandledException(final Throwable exception) {
|
default void logUnhandledException(final Throwable exception) {
|
||||||
HELPER.logDirect("An unhandled exception occurred. " +
|
HELPER.logDirect("An unhandled exception occurred. " +
|
||||||
"The error is in your game's log, please report this at https://github.com/cabaletta/baritone/issues",
|
"The error is in your game's log, please report this at https://github.com/cabaletta/baritone/issues",
|
||||||
TextFormatting.RED);
|
ChatFormatting.RED);
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user