Compare commits
507 Commits
pr/elytra/
...
1.19.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a5c4f1f03 | ||
|
|
787644181a | ||
|
|
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 |
16
.github/workflows/gradle_build.yml
vendored
16
.github/workflows/gradle_build.yml
vendored
@@ -14,18 +14,22 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set up JDK 8
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
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 | cut -c2-)"
|
||||||
|
|
||||||
- name: Archive Artifacts
|
- name: Archive Artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
@@ -36,4 +40,4 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: Mappings
|
name: Mappings
|
||||||
path: build/tmp/proguard/mapping.txt
|
path: mapping/
|
||||||
|
|||||||
6
.github/workflows/run_tests.yml
vendored
6
.github/workflows/run_tests.yml
vendored
@@ -12,10 +12,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set up JDK 8
|
- name: Set up JDK 17
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
java-version: '17'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
|
|
||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
@@ -23,4 +23,4 @@ jobs:
|
|||||||
|
|
||||||
- name: Executing tests
|
- name: Executing tests
|
||||||
run: ./gradlew test
|
run: ./gradlew test
|
||||||
|
|
||||||
|
|||||||
10
.gitignore
vendored
10
.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,6 @@ baritone_Client.launch
|
|||||||
!/.idea/copyright/profiles_settings.xml
|
!/.idea/copyright/profiles_settings.xml
|
||||||
|
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
|
.architectury-transformer
|
||||||
|
|
||||||
libs/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar
|
mapping
|
||||||
libs/java-objc-bridge-1.1.jar
|
|
||||||
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,11 @@
|
|||||||
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 \
|
||||||
--assume-yes
|
--assume-yes
|
||||||
|
|
||||||
COPY . /code
|
COPY . /code
|
||||||
|
|||||||
44
README.md
44
README.md
@@ -4,16 +4,13 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="#Baritone"><img src="https://img.shields.io/badge/MC-1.12.2-brightgreen.svg" alt="Minecraft"/></a>
|
<a href="https://github.com/cabaletta/baritone/tree/master"><img src="https://img.shields.io/badge/MC-1.12.2-brightgreen.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="https://github.com/cabaletta/baritone/tree/1.13.2"><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="https://github.com/cabaletta/baritone/tree/1.14.4"><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="https://github.com/cabaletta/baritone/tree/1.15.2"><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="https://github.com/cabaletta/baritone/tree/1.16.5"><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.17.1-yellow.svg" alt="Minecraft"/></a>
|
<a href="https://github.com/cabaletta/baritone/tree/1.17.1"><img src="https://img.shields.io/badge/MC-1.17.1-brightgreen.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="https://github.com/cabaletta/baritone/tree/1.18.2"><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.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.20.1-brightgreen.svg" alt="Minecraft"/></a>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -36,7 +33,7 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://impactclient.net/"><img src="https://img.shields.io/badge/Impact%20integration-v1.2.14%20/%20v1.3.8%20/%20v1.4.6%20/%20v1.5.3%20/%20v1.6.3-brightgreen.svg" alt="Impact integration"/></a>
|
<a href="https://impactclient.net/"><img src="https://img.shields.io/badge/Impact%20integration-v1.2.14%20/%20v1.3.8%20/%20v1.4.6%20/%20v1.5.3%20/%20v1.6.3-brightgreen.svg" alt="Impact integration"/></a>
|
||||||
<a href="https://github.com/lambda-client/lambda"><img src="https://img.shields.io/badge/Lambda%20integration-v1.2.17-brightgreen.svg" alt="Lambda integration"/></a>
|
<a href="https://github.com/kami-blue/client"><img src="https://img.shields.io/badge/KAMI%20Blue%20integration-v1.2.14--master-green" alt="KAMI Blue integration"/></a>
|
||||||
<a href="https://github.com/fr1kin/ForgeHax/"><img src="https://img.shields.io/badge/ForgeHax%20%22integration%22-scuffed-yellow.svg" alt="ForgeHax integration"/></a>
|
<a href="https://github.com/fr1kin/ForgeHax/"><img src="https://img.shields.io/badge/ForgeHax%20%22integration%22-scuffed-yellow.svg" alt="ForgeHax integration"/></a>
|
||||||
<a href="https://aristois.net/"><img src="https://img.shields.io/badge/Aristois%20add--on%20integration-v1.6.3-green.svg" alt="Aristois add-on integration"/></a>
|
<a href="https://aristois.net/"><img src="https://img.shields.io/badge/Aristois%20add--on%20integration-v1.6.3-green.svg" alt="Aristois add-on integration"/></a>
|
||||||
<a href="https://rootnet.dev/"><img src="https://img.shields.io/badge/rootNET%20integration-v1.2.14-green.svg" alt="rootNET integration"/></a>
|
<a href="https://rootnet.dev/"><img src="https://img.shields.io/badge/rootNET%20integration-v1.2.14-green.svg" alt="rootNET integration"/></a>
|
||||||
@@ -51,26 +48,21 @@
|
|||||||
|
|
||||||
A Minecraft pathfinder bot.
|
A Minecraft pathfinder bot.
|
||||||
|
|
||||||
Baritone is the pathfinding system used in [Impact](https://impactclient.net/) since 4.4. [Here's](https://www.youtube.com/watch?v=StquF69-_wI) a (very old!) video I made showing off what it can do.
|
|
||||||
|
|
||||||
[**Baritone Discord Server**](http://discord.gg/s6fRBAUpmr)
|
[**Baritone Discord Server**](http://discord.gg/s6fRBAUpmr)
|
||||||
|
|
||||||
**Quick download links:**
|
Baritone is the pathfinding system used in [Impact](https://impactclient.net/) since 4.4. There's a [showcase video](https://youtu.be/CZkLXWo4Fg4) made by @Adovin#0730 on Baritone which I recommend. [Here's](https://www.youtube.com/watch?v=StquF69-_wI) a (very old!) video I made showing off what it can do.
|
||||||
|
|
||||||
| Forge | Fabric |
|
[Tutorial playlist](https://www.youtube.com/playlist?list=PLnwnJ1qsS7CoQl9Si-RTluuzCo_4Oulpa)
|
||||||
|---------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
|
|
||||||
| [1.12.2 Forge](https://github.com/cabaletta/baritone/releases/download/v1.2.17/baritone-api-forge-1.2.17.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.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.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.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) |
|
|
||||||
|
|
||||||
**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)
|
The easiest way to install Baritone is to install [Impact](https://impactclient.net/), which comes with Baritone. The second easiest way (for 1.12.2 only) is to
|
||||||
|
install the v1.2.* `api-forge` jar from [releases](https://github.com/cabaletta/baritone/releases). **For 1.12.2 Forge, just click
|
||||||
|
[here](https://github.com/cabaletta/baritone/releases/download/v1.2.17/baritone-api-forge-1.2.17.jar)**. Otherwise, see [Installation & setup](SETUP.md). Once Baritone is installed, look [here](USAGE.md) for instructions on how to use it.
|
||||||
|
|
||||||
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 1.16.5, [click here](https://www.youtube.com/watch?v=_4eVJ9Qz2J8) and see description. If you need Forge or Fabric 1.16.5, look [here](https://github.com/cabaletta/baritone/releases/tag/v1.6.3) and get the `api-forge` or `api-fabric` jar. **For 1.16.5 Fabric, just click [here](https://github.com/cabaletta/baritone/releases/download/v1.6.3/baritone-api-fabric-1.6.3.jar)**.
|
||||||
|
|
||||||
|
If you need Forge or Fabric 1.17.1, look [here](https://github.com/cabaletta/baritone/releases/tag/v1.7.2) and get the `api-forge` or `api-fabric` jar. **For 1.17.1 Fabric, just click [here](https://github.com/cabaletta/baritone/releases/download/v1.7.2/baritone-api-fabric-1.7.2.jar)**.
|
||||||
|
|
||||||
|
If you need Forge or Fabric 1.18.2, look [here](https://github.com/cabaletta/baritone/releases/tag/v1.8.3) and get the `api-forge` or `api-fabric` jar. **For 1.18.2 Fabric, just click [here](https://github.com/cabaletta/baritone/releases/download/v1.8.3/baritone-api-fabric-1.8.3.jar)**. **For 1.18.2 Forge, just click [here](https://github.com/cabaletta/baritone/releases/download/v1.8.3/baritone-api-forge-1.8.3.jar)**.
|
||||||
|
|
||||||
This project is an updated version of [MineBot](https://github.com/leijurv/MineBot/),
|
This project is an updated version of [MineBot](https://github.com/leijurv/MineBot/),
|
||||||
the original version of the bot for Minecraft 1.8.9, rebuilt for 1.12.2 onwards. Baritone focuses on reliability and particularly performance (it's over [30x faster](https://github.com/cabaletta/baritone/pull/180#issuecomment-423822928) than MineBot at calculating paths).
|
the original version of the bot for Minecraft 1.8.9, rebuilt for 1.12.2 onwards. Baritone focuses on reliability and particularly performance (it's over [30x faster](https://github.com/cabaletta/baritone/pull/180#issuecomment-423822928) than MineBot at calculating paths).
|
||||||
|
|||||||
67
SETUP.md
67
SETUP.md
@@ -43,13 +43,13 @@ If another one of your Forge mods has a Baritone integration, you want `baritone
|
|||||||
## 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.
|
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.
|
||||||
|
|
||||||
To check which java you are using do
|
To check which java you are using do
|
||||||
`java -version` in a command prompt or terminal.
|
`java -version` in a command prompt or terminal.
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Download java: https://adoptium.net/
|
Open JDK download: https://openjdk.java.net/install/
|
||||||
#### macOS guide
|
#### macOS guide
|
||||||
In order to get JDK 8, Try running the following command:
|
In order to get JDK 8, Try running the following command:
|
||||||
`% /usr/libexec/java_home -V`
|
`% /usr/libexec/java_home -V`
|
||||||
@@ -66,13 +66,68 @@ In order to get JDK 8 running in the **current terminal window** you will have t
|
|||||||
|
|
||||||
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
|
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
|
Setting up the Environment:
|
||||||
|
|
||||||
These tasks depend on the minecraft version, but are (for the most part) standard for building mods.
|
```
|
||||||
|
$ gradlew setupDecompWorkspace
|
||||||
|
$ gradlew --refresh-dependencies
|
||||||
|
```
|
||||||
|
|
||||||
for more details, see [the build ci action](/.github/workflows/gradle_build.yml)
|
Building Baritone:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gradlew build
|
||||||
|
```
|
||||||
|
|
||||||
|
For minecraft 1.15.2+, run the following instead to include the Forge jars:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gradlew build -Pbaritone.forge_build
|
||||||
|
```
|
||||||
|
|
||||||
|
Do this instead for Fabric jars:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gradlew build -Pbaritone.fabric_build
|
||||||
|
```
|
||||||
|
|
||||||
|
Running Baritone:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gradlew runClient
|
||||||
|
```
|
||||||
|
|
||||||
|
For information on how to build baritone, see [Building Baritone](#building-baritone)
|
||||||
|
|
||||||
## IntelliJ
|
## IntelliJ
|
||||||
- Open the project in IntelliJ as a Gradle project
|
- Open the project in IntelliJ as a Gradle project
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Run the Gradle tasks `setupDecompWorkspace` then `genIntellijRuns`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
- 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
|
|
||||||
|

|
||||||
|
|
||||||
|
- Select the "Minecraft Client" launch config
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Click on ``Edit Configurations...`` from the same dropdown and select the "Minecraft Client" config
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- In `Edit Configurations...` you need to select `baritone_launch` for `Use classpath of module:`.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## IntelliJ
|
||||||
|
|
||||||
|
- Navigate to the gradle tasks on the right tab as follows
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Double click on **build** to run it
|
||||||
|
|||||||
234
build.gradle
234
build.gradle
@@ -15,50 +15,89 @@
|
|||||||
* 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 = 'git describe --always --tags --dirty'.execute().text.trim()
|
||||||
|
if (!vers.startsWith("v")) {
|
||||||
|
println "git doesn't appear to be installed!"
|
||||||
|
println "using version number: " + rootProject.mod_version
|
||||||
|
version = rootProject.mod_version
|
||||||
|
} else {
|
||||||
|
version = vers.substring(1)
|
||||||
|
}
|
||||||
|
group = rootProject.maven_group
|
||||||
|
|
||||||
|
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17
|
||||||
|
|
||||||
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()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:4.+' // TODO: 5.+. `doHackyStuff` relies on 4.x internals.
|
minecraft "net.minecraft:minecraft:${rootProject.minecraft_version}"
|
||||||
classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
|
// The following line declares the mojmap mappings, you may use other mappings as well
|
||||||
|
mappings "net.fabricmc:intermediary:${rootProject.minecraft_version}:v2"
|
||||||
|
mappings "net.minecraft:minecraft:${rootProject.minecraft_version}:client-mappings"
|
||||||
|
mappings "org.parchmentmc.data:parchment-1.19.2:2022.11.27@zip"
|
||||||
|
|
||||||
|
implementation "org.spongepowered:mixin:0.8.5"
|
||||||
|
implementation "org.ow2.asm:asm:9.3"
|
||||||
|
// The following line declares the yarn mappings you may select this one as well.
|
||||||
|
// mappings "net.fabricmc:yarn:1.17.1+build.32:v2"
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
it.options.encoding = "UTF-8"
|
||||||
|
|
||||||
|
def targetVersion = 17
|
||||||
|
if (JavaVersion.current().isJava9Compatible()) {
|
||||||
|
it.options.release = targetVersion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import baritone.gradle.task.CreateDistTask
|
minecraft {
|
||||||
import baritone.gradle.task.ProguardTask
|
runs.off = true
|
||||||
|
|
||||||
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 +107,27 @@ 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
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
targetNamespace = "named"
|
||||||
|
fallbackTargetNamespace = "intermediary"
|
||||||
}
|
}
|
||||||
|
|
||||||
javadoc {
|
javadoc {
|
||||||
@@ -190,34 +136,4 @@ javadoc {
|
|||||||
options.encoding "UTF-8" // allow emoji in comments :^)
|
options.encoding "UTF-8" // allow emoji in comments :^)
|
||||||
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,25 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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/'
|
||||||
|
}
|
||||||
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.6'
|
||||||
|
|
||||||
|
implementation group: 'xyz.wagyourtail.unimined', name: 'xyz.wagyourtail.unimined.gradle.plugin', version: '0.3.4'
|
||||||
}
|
}
|
||||||
@@ -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.zip",
|
||||||
PROGUARD_JAR = "proguard.jar",
|
PROGUARD_JAR = "proguard.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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,72 +19,81 @@ package baritone.gradle.task;
|
|||||||
|
|
||||||
import baritone.gradle.util.Determinizer;
|
import baritone.gradle.util.Determinizer;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.plugins.JavaPluginConvention;
|
||||||
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.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 xyz.wagyourtail.unimined.api.Constants;
|
||||||
import java.io.File;
|
import xyz.wagyourtail.unimined.api.minecraft.EnvType;
|
||||||
import java.lang.reflect.Field;
|
import xyz.wagyourtail.unimined.api.minecraft.MinecraftProvider;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.StandardCopyOption;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
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.util.ArrayList;
|
||||||
import java.util.regex.Pattern;
|
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;
|
||||||
|
|
||||||
|
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
* @since 10/11/2018
|
* @since 10/11/2018
|
||||||
*/
|
*/
|
||||||
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 url;
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
private String extract;
|
private String extract;
|
||||||
|
|
||||||
private List<String> requiredLibraries;
|
public String getExtract() {
|
||||||
|
return extract;
|
||||||
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"
|
||||||
|
processArtifact();
|
||||||
downloadProguard();
|
downloadProguard();
|
||||||
extractProguard();
|
extractProguard();
|
||||||
generateConfigs();
|
generateConfigs();
|
||||||
acquireDependencies();
|
|
||||||
processArtifact();
|
|
||||||
proguardApi();
|
proguardApi();
|
||||||
proguardStandalone();
|
proguardStandalone();
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MinecraftProvider<?, ?> provider = this.getProject().getExtensions().getByType(MinecraftProvider.class);
|
||||||
|
|
||||||
|
private File getMcJar() {
|
||||||
|
return provider.getMinecraftWithMapping(EnvType.COMBINED, provider.getMcPatcher().getProdNamespace(), provider.getMcPatcher().getProdFallbackNamespace()).toFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isMcJar(File f) {
|
||||||
|
return this.getProject().getConfigurations().getByName(Constants.MINECRAFT_COMBINED_PROVIDER).getFiles().contains(f);
|
||||||
|
}
|
||||||
|
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadProguard() throws Exception {
|
private void downloadProguard() throws Exception {
|
||||||
@@ -109,7 +118,8 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
try {
|
try {
|
||||||
path = findJavaPathByGradleConfig();
|
path = findJavaPathByGradleConfig();
|
||||||
if (path != null) return path;
|
if (path != null) return path;
|
||||||
} catch (Exception ex) {
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
System.err.println("Unable to find java by javaCompile options");
|
System.err.println("Unable to find java by javaCompile options");
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -117,7 +127,8 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
try {
|
try {
|
||||||
path = findJavaByJavaHome();
|
path = findJavaByJavaHome();
|
||||||
if (path != null) return path;
|
if (path != null) return path;
|
||||||
} catch (Exception ex) {
|
}
|
||||||
|
catch(Exception ex) {
|
||||||
System.err.println("Unable to find java by JAVA_HOME");
|
System.err.println("Unable to find java by JAVA_HOME");
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -125,23 +136,30 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
|
|
||||||
path = findJavaByGradleCurrentRuntime();
|
path = findJavaByGradleCurrentRuntime();
|
||||||
if (path != null) return path;
|
if (path != null) return path;
|
||||||
|
|
||||||
throw new Exception("Unable to find java to determine ProGuard libraryjars. Please specify forkOptions.executable in javaCompile," +
|
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)");
|
" JAVA_HOME environment variable, or make sure to run Gradle with the correct JDK (a v1.8 only)");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String findJavaByGradleCurrentRuntime() {
|
private String findJavaByGradleCurrentRuntime() {
|
||||||
String path = Jvm.current().getJavaExecutable().getAbsolutePath();
|
String path = Jvm.current().getJavaExecutable().getAbsolutePath();
|
||||||
System.out.println("Using Gradle's runtime Java for ProGuard");
|
|
||||||
return path;
|
if (this.validateJavaVersion(path)) {
|
||||||
|
System.out.println("Using Gradle's runtime Java for ProGuard");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String findJavaByJavaHome() {
|
private String findJavaByJavaHome() {
|
||||||
final String javaHomeEnv = System.getenv("JAVA_HOME");
|
final String javaHomeEnv = System.getenv("JAVA_HOME");
|
||||||
if (javaHomeEnv != null) {
|
if (javaHomeEnv != null) {
|
||||||
|
|
||||||
String path = Jvm.forHome(new File(javaHomeEnv)).getJavaExecutable().getAbsolutePath();
|
String path = Jvm.forHome(new File(javaHomeEnv)).getJavaExecutable().getAbsolutePath();
|
||||||
System.out.println("Detected Java path by JAVA_HOME");
|
if (this.validateJavaVersion(path)) {
|
||||||
return path;
|
System.out.println("Detected Java path by JAVA_HOME");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -157,11 +175,19 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
if (javacPath != null) {
|
if (javacPath != null) {
|
||||||
File javacFile = new File(javacPath);
|
File javacFile = new File(javacPath);
|
||||||
if (javacFile.exists()) {
|
if (javacFile.exists()) {
|
||||||
File[] maybeJava = javacFile.getParentFile().listFiles((dir, name) -> name.equals("java"));
|
File[] maybeJava = javacFile.getParentFile().listFiles(new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return name.equals("java");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (maybeJava != null && maybeJava.length > 0) {
|
if (maybeJava != null && maybeJava.length > 0) {
|
||||||
String path = maybeJava[0].getAbsolutePath();
|
String path = maybeJava[0].getAbsolutePath();
|
||||||
System.out.println("Detected Java path by forkOptions");
|
if (this.validateJavaVersion(path)) {
|
||||||
return path;
|
System.out.println("Detected Java path by forkOptions");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,167 +195,84 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean validateJavaVersion(String java) {
|
||||||
|
//TODO: fix for j16
|
||||||
|
// final JavaVersion javaVersion = new DefaultJvmVersionDetector(new DefaultExecActionFactory(new IdentityFileResolver())).getJavaVersion(java);
|
||||||
|
//
|
||||||
|
// if (!javaVersion.getMajorVersion().equals("8")) {
|
||||||
|
// System.out.println("Failed to validate Java version " + javaVersion.toString() + " [" + java + "] for ProGuard libraryjars");
|
||||||
|
// // throw new RuntimeException("Java version incorrect: " + javaVersion.getMajorVersion() + " for " + java);
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// System.out.println("Validated Java version " + javaVersion.toString() + " [" + java + "] for ProGuard libraryjars");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
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), 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
|
|
||||||
this.requiredLibraries = new ArrayList<>();
|
|
||||||
template.forEach(line -> {
|
|
||||||
if (!line.startsWith("#")) {
|
|
||||||
Matcher m = TEMP_LIBRARY_PATTERN.matcher(line);
|
|
||||||
if (m.find()) {
|
|
||||||
this.requiredLibraries.add(m.group(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class Pair<A, B> {
|
private Stream<File> acquireDependencies() {
|
||||||
public final A a;
|
return getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName("main").getCompileClasspath().getFiles()
|
||||||
public final B b;
|
.stream()
|
||||||
|
.filter(File::isFile);
|
||||||
private Pair(final A a, final B b) {
|
|
||||||
this.a = a;
|
|
||||||
this.b = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Pair{" +
|
|
||||||
"a=" + this.a +
|
|
||||||
", " +
|
|
||||||
"b=" + this.b +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
private void proguardApi() throws Exception {
|
||||||
runProguard(getTemporaryFile(PROGUARD_API_CONFIG));
|
runProguard(getTemporaryFile(compType+PROGUARD_API_CONFIG));
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString(), Arrays.asList(pathfinder), false);
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString());
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeApiPath.toString(), Arrays.asList(pathfinder, mixin), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void proguardStandalone() throws Exception {
|
private void proguardStandalone() throws Exception {
|
||||||
runProguard(getTemporaryFile(PROGUARD_STANDALONE_CONFIG));
|
runProguard(getTemporaryFile(compType+PROGUARD_STANDALONE_CONFIG));
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString(), Arrays.asList(pathfinder), false);
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString());
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeStandalonePath.toString(), Arrays.asList(pathfinder, mixin), true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanup() {
|
private void cleanup() {
|
||||||
@@ -342,18 +285,9 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUrl() {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExtract(String extract) {
|
public void setExtract(String extract) {
|
||||||
this.extract = extract;
|
this.extract = extract;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getExtract() {
|
|
||||||
return extract;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void runProguard(Path config) throws Exception {
|
private void runProguard(Path config) throws Exception {
|
||||||
// Delete the existing proguard output file. Proguard probably handles this already, but why not do it ourselves
|
// Delete the existing proguard output file. Proguard probably handles this already, but why not do it ourselves
|
||||||
if (Files.exists(this.proguardOut)) {
|
if (Files.exists(this.proguardOut)) {
|
||||||
@@ -364,7 +298,7 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
Path workingDirectory = getTemporaryFile("");
|
Path workingDirectory = getTemporaryFile("");
|
||||||
Path proguardJar = workingDirectory.relativize(getTemporaryFile(PROGUARD_JAR));
|
Path proguardJar = workingDirectory.relativize(getTemporaryFile(PROGUARD_JAR));
|
||||||
config = workingDirectory.relativize(config);
|
config = workingDirectory.relativize(config);
|
||||||
|
|
||||||
// Honestly, if you still have spaces in your path at this point, you're SOL.
|
// Honestly, if you still have spaces in your path at this point, you're SOL.
|
||||||
|
|
||||||
Process p = new ProcessBuilder("java", "-jar", proguardJar.toString(), "@" + config.toString())
|
Process p = new ProcessBuilder("java", "-jar", proguardJar.toString(), "@" + config.toString())
|
||||||
@@ -378,7 +312,6 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
// Halt the current thread until the process is complete, if the exit code isn't 0, throw an exception
|
// Halt the current thread until the process is complete, if the exit code isn't 0, throw an exception
|
||||||
int exitCode = p.waitFor();
|
int exitCode = p.waitFor();
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
Thread.sleep(1000);
|
|
||||||
throw new IllegalStateException("Proguard exited with code " + exitCode);
|
throw new IllegalStateException("Proguard exited with code " + exitCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,11 +39,10 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
public class Determinizer {
|
public class Determinizer {
|
||||||
|
|
||||||
public static void determinize(String inputPath, String outputPath, List<File> toInclude, boolean doForgeReplacementOfMetaInf) throws IOException {
|
public static void determinize(String inputPath, String outputPath) throws IOException {
|
||||||
System.out.println("Running Determinizer");
|
System.out.println("Running Determinizer");
|
||||||
System.out.println(" Input path: " + inputPath);
|
System.out.println(" Input path: " + inputPath);
|
||||||
System.out.println(" Output path: " + outputPath);
|
System.out.println(" Output path: " + outputPath);
|
||||||
System.out.println(" Shade: " + toInclude);
|
|
||||||
|
|
||||||
try (
|
try (
|
||||||
JarFile jarFile = new JarFile(new File(inputPath));
|
JarFile jarFile = new JarFile(new File(inputPath));
|
||||||
@@ -64,36 +63,15 @@ 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)));
|
JsonObject object = new JsonParser().parse(new InputStreamReader(jarFile.getInputStream(entry))).getAsJsonObject();
|
||||||
jos.write(writeSorted(json).getBytes());
|
jos.write(writeSorted(object).getBytes());
|
||||||
} else if (entry.getName().equals("META-INF/MANIFEST.MF") && doForgeReplacementOfMetaInf) { // only replace for forge jar
|
|
||||||
ByteArrayOutputStream cancer = new ByteArrayOutputStream();
|
|
||||||
copy(jarFile.getInputStream(entry), cancer);
|
|
||||||
String manifest = new String(cancer.toByteArray());
|
|
||||||
if (!manifest.contains("baritone.launch.BaritoneTweaker")) {
|
|
||||||
throw new IllegalStateException("unable to replace");
|
|
||||||
}
|
|
||||||
manifest = manifest.replace("baritone.launch.BaritoneTweaker", "org.spongepowered.asm.launch.MixinTweaker");
|
|
||||||
jos.write(manifest.getBytes());
|
|
||||||
} else {
|
} else {
|
||||||
copy(jarFile.getInputStream(entry), jos);
|
copy(jarFile.getInputStream(entry), jos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (File file : toInclude) {
|
|
||||||
try (JarFile mixin = new JarFile(file)) {
|
|
||||||
for (JarEntry entry : mixin.stream().sorted(Comparator.comparing(JarEntry::getName)).collect(Collectors.toList())) {
|
|
||||||
if (entry.getName().startsWith("META-INF") && !entry.getName().startsWith("META-INF/services")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
jos.putNextEntry(entry);
|
|
||||||
copy(mixin.getInputStream(entry), jos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jos.finish();
|
jos.finish();
|
||||||
}
|
}
|
||||||
System.out.println("Done with determinizer");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void copy(InputStream is, OutputStream os) throws IOException {
|
private static void copy(InputStream is, OutputStream os) throws IOException {
|
||||||
@@ -104,7 +82,7 @@ public class Determinizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String writeSorted(JsonElement in) throws IOException {
|
private static String writeSorted(JsonObject in) throws IOException {
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
JsonWriter jw = new JsonWriter(writer);
|
JsonWriter jw = new JsonWriter(writer);
|
||||||
ORDERED_JSON_WRITER.write(jw, in);
|
ORDERED_JSON_WRITER.write(jw, in);
|
||||||
|
|||||||
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 "7.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
archivesBaseName = archivesBaseName + "-fabric"
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
fabric()
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
fabric "net.fabricmc:fabric-loader:${project.fabric_version}"
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
inputs.property "version", project.version
|
||||||
|
|
||||||
|
filesMatching("fabric.mod.json") {
|
||||||
|
expand "version": project.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
configurations = [project.configurations.shadowCommon]
|
||||||
|
classifier "dev-shadow"
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile.set shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
classifier null
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
classifier "dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
components.java {
|
||||||
|
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
|
||||||
|
skip()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task proguard(type: ProguardTask) {
|
||||||
|
url 'https://github.com/Guardsquare/proguard/releases/download/v7.2.1/proguard-7.2.1.zip'
|
||||||
|
extract 'proguard-7.2.1/lib/proguard.jar'
|
||||||
|
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.
|
||||||
|
}
|
||||||
|
}
|
||||||
31
fabric/src/main/resources/fabric.mod.json
Normal file
31
fabric/src/main/resources/fabric.mod.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
|
||||||
|
"license": "LGPL-3.0",
|
||||||
|
"icon": "assets/baritone/icon.png",
|
||||||
|
|
||||||
|
"environment": "*",
|
||||||
|
"entrypoints": {
|
||||||
|
},
|
||||||
|
"mixins": [
|
||||||
|
"mixins.baritone.json"
|
||||||
|
],
|
||||||
|
|
||||||
|
"depends": {
|
||||||
|
"fabricloader": ">=0.11.0",
|
||||||
|
"minecraft": "1.19.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
122
forge/build.gradle
Normal file
122
forge/build.gradle
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* 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 "7.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
archivesBaseName = archivesBaseName + "-forge"
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
forge {
|
||||||
|
devFallbackNamespace = "intermediary"
|
||||||
|
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 {
|
||||||
|
forge "net.minecraftforge:forge:${rootProject.forge_version}"
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
inputs.property "version", project.version
|
||||||
|
|
||||||
|
filesMatching("META-INF/mods.toml") {
|
||||||
|
expand "version": project.version
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowJar {
|
||||||
|
configurations = [project.configurations.shadowCommon]
|
||||||
|
classifier "dev-shadow"
|
||||||
|
}
|
||||||
|
|
||||||
|
remapJar {
|
||||||
|
inputFile.set shadowJar.archiveFile
|
||||||
|
dependsOn shadowJar
|
||||||
|
classifier null
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
classifier "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) {
|
||||||
|
url 'https://github.com/Guardsquare/proguard/releases/download/v7.2.1/proguard-7.2.1.zip'
|
||||||
|
extract 'proguard-7.2.1/lib/proguard.jar'
|
||||||
|
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="[33,)" #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.19.3]"
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
9
gradle.properties
Normal file
9
gradle.properties
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
org.gradle.jvmargs=-Xmx4G
|
||||||
|
|
||||||
|
mod_version=1.9.1
|
||||||
|
maven_group=baritone
|
||||||
|
archives_base_name=baritone
|
||||||
|
|
||||||
|
minecraft_version=1.19.3
|
||||||
|
forge_version=1.19.3-44.0.1
|
||||||
|
fabric_version=0.14.11
|
||||||
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-7.4.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
2
gradlew
vendored
2
gradlew
vendored
@@ -72,7 +72,7 @@ case "`uname`" in
|
|||||||
Darwin* )
|
Darwin* )
|
||||||
darwin=true
|
darwin=true
|
||||||
;;
|
;;
|
||||||
MSYS* | MINGW* )
|
MINGW* )
|
||||||
msys=true
|
msys=true
|
||||||
;;
|
;;
|
||||||
NONSTOP* )
|
NONSTOP* )
|
||||||
|
|||||||
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
|
||||||
59
scripts/proguard.pro
vendored
59
scripts/proguard.pro
vendored
@@ -15,7 +15,12 @@
|
|||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
|
# 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,56 +52,6 @@
|
|||||||
-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
|
|
||||||
|
|
||||||
# The correct jar will be copied from the forgegradle cache based on the mapping type being compiled with
|
|
||||||
-libraryjars 'tempLibraries/minecraft.jar'
|
|
||||||
|
|
||||||
-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.
|
||||||
-keepclasseswithmembers public class * {
|
-keepclasseswithmembers public class * {
|
||||||
@@ -384,6 +339,4 @@
|
|||||||
public int length();
|
public int length();
|
||||||
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,37 @@
|
|||||||
* 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")
|
||||||
|
if (System.getProperty("Baritone.enabled_platforms") == null) {
|
||||||
|
System.setProperty("Baritone.enabled_platforms", "fabric,forge")
|
||||||
|
// System.setProperty("Baritone.enabled_platforms", "fabric")
|
||||||
|
}
|
||||||
|
for (platform in System.getProperty("Baritone.enabled_platforms").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.
|
||||||
*
|
*
|
||||||
@@ -35,11 +32,13 @@ public final class BaritoneAPI {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
settings = new Settings();
|
settings = new Settings();
|
||||||
SettingsUtil.readAndApply(settings, SettingsUtil.SETTINGS_DEFAULT_NAME);
|
SettingsUtil.readAndApply(settings);
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -21,12 +21,9 @@ import baritone.api.cache.IWorldScanner;
|
|||||||
import baritone.api.command.ICommand;
|
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.entity.EntityPlayerSP;
|
|
||||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the present {@link IBaritone} instances, as well as non-baritone instance related APIs.
|
* Provides the present {@link IBaritone} instances, as well as non-baritone instance related APIs.
|
||||||
@@ -49,18 +46,20 @@ 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}. This will likely be
|
||||||
|
* replaced with or be overloaded in addition to {@code #getBaritoneForUser(IBaritoneUser)} when
|
||||||
|
* {@code bot-system} is merged into {@code master}.
|
||||||
*
|
*
|
||||||
* @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 : getAllBaritones()) {
|
||||||
if (Objects.equals(player, baritone.getPlayerContext().player())) {
|
if (Objects.equals(player, baritone.getPlayerContext().player())) {
|
||||||
return baritone;
|
return baritone;
|
||||||
}
|
}
|
||||||
@@ -68,55 +67,6 @@ public interface IBaritoneProvider {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides the {@link IBaritone} instance for a given {@link Minecraft}.
|
|
||||||
*
|
|
||||||
* @param minecraft The minecraft
|
|
||||||
* @return The {@link IBaritone} instance.
|
|
||||||
*/
|
|
||||||
default IBaritone getBaritoneForMinecraft(Minecraft minecraft) {
|
|
||||||
for (IBaritone baritone : this.getAllBaritones()) {
|
|
||||||
if (Objects.equals(minecraft, baritone.getPlayerContext().minecraft())) {
|
|
||||||
return baritone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides the {@link IBaritone} instance for the player with the specified connection.
|
|
||||||
*
|
|
||||||
* @param connection The connection
|
|
||||||
* @return The {@link IBaritone} instance.
|
|
||||||
*/
|
|
||||||
default IBaritone getBaritoneForConnection(NetHandlerPlayClient connection) {
|
|
||||||
for (IBaritone baritone : this.getAllBaritones()) {
|
|
||||||
final EntityPlayerSP player = baritone.getPlayerContext().player();
|
|
||||||
if (player != null && player.connection == connection) {
|
|
||||||
return baritone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and registers a new {@link IBaritone} instance using the specified {@link Minecraft}. The existing
|
|
||||||
* instance is returned if already registered.
|
|
||||||
*
|
|
||||||
* @param minecraft The minecraft
|
|
||||||
* @return The {@link IBaritone} instance
|
|
||||||
*/
|
|
||||||
IBaritone createBaritone(Minecraft minecraft);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys and removes the specified {@link IBaritone} instance. If the specified instance is the
|
|
||||||
* {@link #getPrimaryBaritone() primary baritone}, this operation has no effect and will return {@code false}.
|
|
||||||
*
|
|
||||||
* @param baritone The baritone instance to remove
|
|
||||||
* @return Whether the baritone instance was removed
|
|
||||||
*/
|
|
||||||
boolean destroyBaritone(IBaritone baritone);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link IWorldScanner} instance. This is not a type returned by
|
* Returns the {@link IWorldScanner} instance. This is not a type returned by
|
||||||
* {@link IBaritone} implementation, because it is not linked with {@link IBaritone}.
|
* {@link IBaritone} implementation, because it is not linked with {@link IBaritone}.
|
||||||
|
|||||||
@@ -21,24 +21,18 @@ 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.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 java.awt.*;
|
import java.awt.*;
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.List;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.List;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -74,16 +68,6 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> allowInventory = new Setting<>(false);
|
public final Setting<Boolean> allowInventory = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
|
||||||
* Wait this many ticks between InventoryBehavior moving inventory items
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> ticksBetweenInventoryMoves = new Setting<>(1);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Come to a halt before doing any inventory moves. Intended for anticheat such as 2b2t
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> inventoryMoveOnlyIfStationary = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disable baritone's auto-tool at runtime, but still assume that another mod will provide auto tool functionality
|
* Disable baritone's auto-tool at runtime, but still assume that another mod will provide auto tool functionality
|
||||||
* <p>
|
* <p>
|
||||||
@@ -203,10 +187,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 +213,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,6 +354,11 @@ 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
|
||||||
*/
|
*/
|
||||||
@@ -623,13 +609,6 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> pruneRegionsFromRAM = new Setting<>(true);
|
public final Setting<Boolean> pruneRegionsFromRAM = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
|
||||||
* The chunk packer queue can never grow to larger than this, if it does, the oldest chunks are discarded
|
|
||||||
* <p>
|
|
||||||
* The newest chunks are kept, so that if you're moving in a straight line quickly then stop, your immediate render distance is still included
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> chunkPackerQueueMaxSize = new Setting<>(2000);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill in blocks behind you
|
* Fill in blocks behind you
|
||||||
*/
|
*/
|
||||||
@@ -731,28 +710,6 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> freeLook = new Setting<>(true);
|
public final Setting<Boolean> freeLook = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
|
||||||
* Break and place blocks without having to force the client-sided rotations. Requires {@link #freeLook}.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> blockFreeLook = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatically elytra fly without having to force the client-sided rotations. Requires {@link #freeLook}.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> elytraFreeLook = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forces the client-sided rotations to an average of the last 10 ticks of server-sided rotations.
|
|
||||||
* Requires {@link #freeLook}.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> smoothLook = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> remainWithExistingLookDirection = new Setting<>(true);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will cause some minor behavioral differences to ensure that Baritone works on anticheats.
|
* Will cause some minor behavioral differences to ensure that Baritone works on anticheats.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -884,14 +841,10 @@ public final class Settings {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> maxYLevelWhileMining = new Setting<>(255); // 1.17+ defaults to maximum possible world height
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
@@ -1110,7 +1063,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
|
||||||
@@ -1188,15 +1141,13 @@ public final class Settings {
|
|||||||
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
||||||
* {@link Setting#value};
|
* {@link Setting#value};
|
||||||
*/
|
*/
|
||||||
@JavaOnly
|
public final Setting<Consumer<Component>> logger = new Setting<>(msg -> Minecraft.getInstance().gui.getChat().addMessage(msg));
|
||||||
public final Setting<Consumer<ITextComponent>> logger = new Setting<>(msg -> Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(msg));
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
||||||
* {@link Setting#value};
|
* {@link Setting#value};
|
||||||
*/
|
*/
|
||||||
@JavaOnly
|
|
||||||
public final Setting<BiConsumer<String, Boolean>> notifier = new Setting<>(NotificationHelper::notify);
|
public final Setting<BiConsumer<String, Boolean>> notifier = new Setting<>(NotificationHelper::notify);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1204,8 +1155,12 @@ public final class Settings {
|
|||||||
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
* via {@link Consumer#andThen(Consumer)} or it can completely be overriden via setting
|
||||||
* {@link Setting#value};
|
* {@link Setting#value};
|
||||||
*/
|
*/
|
||||||
@JavaOnly
|
public final Setting<BiConsumer<Component, Component>> toaster = new Setting<>(BaritoneToast::addOrUpdate);
|
||||||
public final Setting<BiConsumer<ITextComponent, ITextComponent>> 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
|
||||||
@@ -1332,89 +1287,6 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> notificationOnMineFail = new Setting<>(true);
|
public final Setting<Boolean> notificationOnMineFail = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of ticks of elytra movement to simulate while firework boost is not active. Higher values are
|
|
||||||
* computationally more expensive.
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> elytraSimulationTicks = new Setting<>(20);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The maximum allowed deviation in pitch from a direct line-of-sight to the flight target. Higher values are
|
|
||||||
* computationally more expensive.
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> elytraPitchRange = new Setting<>(25);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The delay after the player's position is set-back by the server that a firework may be automatically deployed.
|
|
||||||
* Value is in ticks.
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> elytraFireworkSetbackUseDelay = new Setting<>(15);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum padding value that is added to the player's hitbox when considering which point to fly to on the
|
|
||||||
* path. High values can result in points not being considered which are otherwise safe to fly to. Low values can
|
|
||||||
* result in flight paths which are extremely tight, and there's the possibility of crashing due to getting too low
|
|
||||||
* to the ground.
|
|
||||||
*/
|
|
||||||
public final Setting<Double> elytraMinimumAvoidance = new Setting<>(0.2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If enabled, avoids using fireworks when descending along the flight path.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> conserveFireworks = new Setting<>(true);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the raytraces that are performed by the elytra fly calculation.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> renderRaytraces = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the raytraces that are used in the hitbox part of the elytra fly calculation.
|
|
||||||
* Requires {@link #renderRaytraces}.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> renderHitboxRaytraces = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the best elytra flight path that was simulated each tick.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> renderElytraSimulation = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatically path to and jump off of ledges to initiate elytra flight when grounded.
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> elytraAutoJump = new Setting<>(false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The seed used to generate chunks for long distance elytra path-finding in the nether.
|
|
||||||
* Defaults to 2b2t's nether seed.
|
|
||||||
*/
|
|
||||||
public final Setting<Long> elytraNetherSeed = new Setting<>(146008555100680L);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatically swap the current elytra with a new one when the durability gets too low
|
|
||||||
*/
|
|
||||||
public final Setting<Boolean> elytraAutoSwap = new Setting<>(true);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The minimum durability an elytra can have before being swapped
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> elytraMinimumDurability = new Setting<>(5);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Time between culling far away chunks from the nether pathfinder chunk cache
|
|
||||||
*/
|
|
||||||
public final Setting<Long> elytraTimeBetweenCacheCullSecs = new Setting<>(TimeUnit.MINUTES.toSeconds(3));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maximum distance chunks can be before being culled from the nether pathfinder chunk cache
|
|
||||||
*/
|
|
||||||
public final Setting<Integer> elytraCacheCullDistance = new Setting<>(5000);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map of lowercase setting field names to their respective setting
|
* A map of lowercase setting field names to their respective setting
|
||||||
*/
|
*/
|
||||||
@@ -1432,7 +1304,6 @@ public final class Settings {
|
|||||||
public T value;
|
public T value;
|
||||||
public final T defaultValue;
|
public final T defaultValue;
|
||||||
private String name;
|
private String name;
|
||||||
private boolean javaOnly;
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Setting(T value) {
|
private Setting(T value) {
|
||||||
@@ -1441,7 +1312,6 @@ public final class Settings {
|
|||||||
}
|
}
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.defaultValue = value;
|
this.defaultValue = value;
|
||||||
this.javaOnly = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1478,25 +1348,8 @@ public final class Settings {
|
|||||||
public final Type getType() {
|
public final Type getType() {
|
||||||
return settingTypes.get(this);
|
return settingTypes.get(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This should always be the same as whether the setting can be parsed from or serialized to a string; in other
|
|
||||||
* words, the only way to modify it is by writing to {@link #value} programatically.
|
|
||||||
*
|
|
||||||
* @return {@code true} if the setting can not be set or read by the user
|
|
||||||
*/
|
|
||||||
public boolean isJavaOnly() {
|
|
||||||
return javaOnly;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Marks a {@link Setting} field as being {@link Setting#isJavaOnly() Java-only}
|
|
||||||
*/
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target(ElementType.FIELD)
|
|
||||||
private @interface JavaOnly {}
|
|
||||||
|
|
||||||
// here be dragons
|
// here be dragons
|
||||||
|
|
||||||
Settings() {
|
Settings() {
|
||||||
@@ -1512,7 +1365,6 @@ public final class Settings {
|
|||||||
Setting<?> setting = (Setting<?>) field.get(this);
|
Setting<?> setting = (Setting<?>) field.get(this);
|
||||||
String name = field.getName();
|
String name = field.getName();
|
||||||
setting.name = name;
|
setting.name = name;
|
||||||
setting.javaOnly = field.isAnnotationPresent(JavaOnly.class);
|
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
if (tmpByName.containsKey(name)) {
|
if (tmpByName.containsKey(name)) {
|
||||||
throw new IllegalStateException("Duplicate setting name");
|
throw new IllegalStateException("Duplicate setting name");
|
||||||
|
|||||||
@@ -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() {}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,54 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.behavior;
|
|
||||||
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
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 pathTo(BlockPos destination);
|
|
||||||
|
|
||||||
void cancel();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns {@code true} if the current {@link IElytraBehavior} is actively pathing.
|
|
||||||
*/
|
|
||||||
boolean isActive();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {@code true} if the native library loaded and elytra is actually usable
|
|
||||||
*/
|
|
||||||
boolean isLoaded();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FOR INTERNAL USE ONLY. MAY BE REMOVED AT ANY TIME.
|
|
||||||
*/
|
|
||||||
boolean isSafeToCancel();
|
|
||||||
}
|
|
||||||
@@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api.behavior;
|
package baritone.api.behavior;
|
||||||
|
|
||||||
import baritone.api.Settings;
|
|
||||||
import baritone.api.behavior.look.IAimProcessor;
|
|
||||||
import baritone.api.utils.Rotation;
|
import baritone.api.utils.Rotation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,23 +26,14 @@ import baritone.api.utils.Rotation;
|
|||||||
public interface ILookBehavior extends IBehavior {
|
public interface ILookBehavior extends IBehavior {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the current {@link ILookBehavior} target to target the specified rotations on the next tick. If any sort
|
* Updates the current {@link ILookBehavior} target to target
|
||||||
* of block interaction is required, {@code blockInteract} should be {@code true}. It is not guaranteed that the
|
* the specified rotations on the next tick. If force is {@code true},
|
||||||
* rotations set by the caller will be the exact rotations expressed by the client (This is due to settings like
|
* then freeLook will be overriden and angles will be set regardless.
|
||||||
* {@link Settings#randomLooking}). If the rotations produced by this behavior are required, then the
|
* If any sort of block interaction is required, force should be {@code true},
|
||||||
* {@link #getAimProcessor() aim processor} should be used.
|
* otherwise, it should be {@code false};
|
||||||
*
|
*
|
||||||
* @param rotation The target rotations
|
* @param rotation The target rotations
|
||||||
* @param blockInteract Whether the target rotations are needed for a block interaction
|
* @param force Whether or not to "force" the rotations
|
||||||
*/
|
*/
|
||||||
void updateTarget(Rotation rotation, boolean blockInteract);
|
void updateTarget(Rotation rotation, boolean force);
|
||||||
|
|
||||||
/**
|
|
||||||
* The aim processor instance for this {@link ILookBehavior}, which is responsible for applying additional,
|
|
||||||
* deterministic transformations to the target rotation set by {@link #updateTarget}.
|
|
||||||
*
|
|
||||||
* @return The aim processor
|
|
||||||
* @see IAimProcessor#fork
|
|
||||||
*/
|
|
||||||
IAimProcessor getAimProcessor();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.behavior.look;
|
|
||||||
|
|
||||||
import baritone.api.utils.Rotation;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
*/
|
|
||||||
public interface IAimProcessor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the actual rotation that will be used when the desired rotation is requested. The returned rotation
|
|
||||||
* always reflects what would happen in the upcoming tick. In other words, it is a pure function, and no internal
|
|
||||||
* state changes. If simulation of the rotation states beyond the next tick is required, then a
|
|
||||||
* {@link IAimProcessor#fork fork} should be created.
|
|
||||||
*
|
|
||||||
* @param desired The desired rotation to set
|
|
||||||
* @return The actual rotation
|
|
||||||
*/
|
|
||||||
Rotation peekRotation(Rotation desired);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a copy of this {@link IAimProcessor} which has its own internal state and is manually tickable.
|
|
||||||
*
|
|
||||||
* @return The forked processor
|
|
||||||
* @see ITickableAimProcessor
|
|
||||||
*/
|
|
||||||
ITickableAimProcessor fork();
|
|
||||||
}
|
|
||||||
@@ -1,47 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.behavior.look;
|
|
||||||
|
|
||||||
import baritone.api.utils.Rotation;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
*/
|
|
||||||
public interface ITickableAimProcessor extends IAimProcessor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Advances the internal state of this aim processor by a single tick.
|
|
||||||
*/
|
|
||||||
void tick();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls {@link #tick()} the specified number of times.
|
|
||||||
*
|
|
||||||
* @param ticks The number of calls
|
|
||||||
*/
|
|
||||||
void advance(int ticks);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the actual rotation as provided by {@link #peekRotation(Rotation)}, and then automatically advances the
|
|
||||||
* internal state by one {@link #tick() tick}.
|
|
||||||
*
|
|
||||||
* @param rotation The desired rotation to set
|
|
||||||
* @return The actual rotation
|
|
||||||
*/
|
|
||||||
Rotation nextRotation(Rotation rotation);
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api.cache;
|
package baritone.api.cache;
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
* @since 9/24/2018
|
* @since 9/24/2018
|
||||||
@@ -31,11 +29,4 @@ public interface IWorldProvider {
|
|||||||
* @return The current world data
|
* @return The current world data
|
||||||
*/
|
*/
|
||||||
IWorldData getCurrentWorld();
|
IWorldData getCurrentWorld();
|
||||||
|
|
||||||
default void ifWorldLoaded(Consumer<IWorldData> callback) {
|
|
||||||
final IWorldData currentWorld = this.getCurrentWorld();
|
|
||||||
if (currentWorld != null) {
|
|
||||||
callback.accept(currentWorld);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -46,19 +40,13 @@ public enum BlockById implements IDatatypeFor<Block> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
||||||
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)
|
||||||
)
|
)
|
||||||
.filterPrefixNamespaced(arg)
|
.filterPrefixNamespaced(ctx.getConsumer().getString())
|
||||||
.sortAlphabetically()
|
.sortAlphabetically()
|
||||||
.stream();
|
.stream();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -1,43 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.command.datatypes;
|
|
||||||
|
|
||||||
import baritone.api.command.exception.CommandException;
|
|
||||||
import baritone.api.command.helpers.TabCompleteHelper;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public enum ForAxis implements IDatatypeFor<EnumFacing.Axis> {
|
|
||||||
INSTANCE;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumFacing.Axis get(IDatatypeContext ctx) throws CommandException {
|
|
||||||
return EnumFacing.Axis.valueOf(ctx.getConsumer().getString().toUpperCase(Locale.US));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
|
||||||
return new TabCompleteHelper()
|
|
||||||
.append(Stream.of(EnumFacing.Axis.values())
|
|
||||||
.map(EnumFacing.Axis::getName).map(String::toLowerCase))
|
|
||||||
.filterPrefix(ctx.getConsumer().getString())
|
|
||||||
.stream();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,136 +18,20 @@
|
|||||||
package baritone.api.command.datatypes;
|
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.utils.BlockOptionalMeta;
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.properties.IProperty;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
public enum ForBlockOptionalMeta implements IDatatypeFor<BlockOptionalMeta> {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
/**
|
|
||||||
* Matches (domain:)?name([(property=value)*])? but the input can be truncated at any position.
|
|
||||||
* domain and name are [a-z0-9_.-]+ and [a-z0-9/_.-]+ because that's what mc 1.13+ accepts.
|
|
||||||
* property and value use the same format as domain.
|
|
||||||
*/
|
|
||||||
// Good luck reading this.
|
|
||||||
private static Pattern PATTERN = Pattern.compile("(?:[a-z0-9_.-]+:)?(?:[a-z0-9/_.-]+(?:\\[(?:(?:[a-z0-9_.-]+=[a-z0-9_.-]+,)*(?:[a-z0-9_.-]+(?:=(?:[a-z0-9_.-]+(?:\\])?)?)?)?|\\])?)?)?");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockOptionalMeta get(IDatatypeContext ctx) throws CommandException {
|
public BlockOptionalMeta get(IDatatypeContext ctx) throws CommandException {
|
||||||
return new BlockOptionalMeta(ctx.getConsumer().getString());
|
return new BlockOptionalMeta(ctx.getConsumer().getString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<String> tabComplete(IDatatypeContext ctx) throws CommandException {
|
public Stream<String> tabComplete(IDatatypeContext ctx) {
|
||||||
String arg = ctx.getConsumer().peekString();
|
return ctx.getConsumer().tabCompleteDatatype(BlockById.INSTANCE);
|
||||||
|
|
||||||
if (!PATTERN.matcher(arg).matches()) {
|
|
||||||
// Invalid format; we can't complete this.
|
|
||||||
ctx.getConsumer().getString();
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arg.endsWith("]")) {
|
|
||||||
// We are already done.
|
|
||||||
ctx.getConsumer().getString();
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!arg.contains("[")) {
|
|
||||||
// no properties so we are completing the block id
|
|
||||||
return ctx.getConsumer().tabCompleteDatatype(BlockById.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.getConsumer().getString();
|
|
||||||
|
|
||||||
// destructuring assignment? Please?
|
|
||||||
String blockId, properties;
|
|
||||||
{
|
|
||||||
String[] parts = splitLast(arg, '[');
|
|
||||||
blockId = parts[0];
|
|
||||||
properties = parts[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
Block block = Block.REGISTRY.getObject(new ResourceLocation(blockId));
|
|
||||||
if (block == null) {
|
|
||||||
// This block doesn't exist so there's no properties to complete.
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
String leadingProperties, lastProperty;
|
|
||||||
{
|
|
||||||
String[] parts = splitLast(properties, ',');
|
|
||||||
leadingProperties = parts[0];
|
|
||||||
lastProperty = parts[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lastProperty.contains("=")) {
|
|
||||||
// The last property-value pair doesn't have a value yet so we are completing its name
|
|
||||||
Set<String> usedProps = Stream.of(leadingProperties.split(","))
|
|
||||||
.map(pair -> pair.split("=")[0])
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
|
|
||||||
String prefix = arg.substring(0, arg.length() - lastProperty.length());
|
|
||||||
return new TabCompleteHelper()
|
|
||||||
.append(
|
|
||||||
block.getBlockState()
|
|
||||||
.getProperties()
|
|
||||||
.stream()
|
|
||||||
.map(IProperty::getName)
|
|
||||||
)
|
|
||||||
.filter(prop -> !usedProps.contains(prop))
|
|
||||||
.filterPrefix(lastProperty)
|
|
||||||
.sortAlphabetically()
|
|
||||||
.map(prop -> prefix + prop)
|
|
||||||
.stream();
|
|
||||||
}
|
|
||||||
|
|
||||||
String lastName, lastValue;
|
|
||||||
{
|
|
||||||
String[] parts = splitLast(lastProperty, '=');
|
|
||||||
lastName = parts[0];
|
|
||||||
lastValue = parts[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// We are completing the value of a property
|
|
||||||
String prefix = arg.substring(0, arg.length() - lastValue.length());
|
|
||||||
|
|
||||||
IProperty<?> property = block.getBlockState().getProperty(lastName);
|
|
||||||
if (property == null) {
|
|
||||||
// The property does not exist so there's no values to complete
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
return new TabCompleteHelper()
|
|
||||||
.append(getValues(property))
|
|
||||||
.filterPrefix(lastValue)
|
|
||||||
.sortAlphabetically()
|
|
||||||
.map(val -> prefix + val)
|
|
||||||
.stream();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Always returns exactly two strings.
|
|
||||||
* If the separator is not found the FIRST returned string is empty.
|
|
||||||
*/
|
|
||||||
private static String[] splitLast(String string, char chr) {
|
|
||||||
int idx = string.lastIndexOf(chr);
|
|
||||||
if (idx == -1) {
|
|
||||||
return new String[]{"", string};
|
|
||||||
}
|
|
||||||
return new String[]{string.substring(0, idx), string.substring(idx + 1)};
|
|
||||||
}
|
|
||||||
|
|
||||||
// this shouldn't need to be a separate method?
|
|
||||||
private static <T extends Comparable<T>> Stream<String> getValues(IProperty<T> property) {
|
|
||||||
return property.getAllowedValues().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();
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ package baritone.api.command.datatypes;
|
|||||||
|
|
||||||
import baritone.api.command.argument.IArgConsumer;
|
import baritone.api.command.argument.IArgConsumer;
|
||||||
import baritone.api.command.exception.CommandException;
|
import baritone.api.command.exception.CommandException;
|
||||||
import baritone.api.utils.Helper;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -95,13 +93,8 @@ public enum RelativeFile implements IDatatypePost<File, File> {
|
|||||||
.filter(s -> !s.contains(" "));
|
.filter(s -> !s.contains(" "));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static File gameDir() {
|
public static File gameDir() {
|
||||||
return gameDir(Helper.mc);
|
File gameDir = HELPER.mc.gameDirectory.getAbsoluteFile();
|
||||||
}
|
|
||||||
|
|
||||||
public static File gameDir(Minecraft mc) {
|
|
||||||
File gameDir = mc.gameDir.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,8 +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 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;
|
||||||
|
|
||||||
@@ -36,6 +36,10 @@ public class CommandUnhandledException extends RuntimeException implements IComm
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(ICommand command, List<ICommandArgument> args) {
|
public void handle(ICommand command, List<ICommandArgument> args) {
|
||||||
HELPER.logUnhandledException(this);
|
HELPER.logDirect("An unhandled exception occurred. " +
|
||||||
|
"The error is in your game's log, please report this at https://github.com/cabaletta/baritone/issues",
|
||||||
|
ChatFormatting.RED);
|
||||||
|
|
||||||
|
this.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -253,7 +252,7 @@ public class TabCompleteHelper {
|
|||||||
public TabCompleteHelper addSettings() {
|
public TabCompleteHelper addSettings() {
|
||||||
return append(
|
return append(
|
||||||
BaritoneAPI.getSettings().allSettings.stream()
|
BaritoneAPI.getSettings().allSettings.stream()
|
||||||
.filter(s -> !s.isJavaOnly())
|
.filter(s -> !SettingsUtil.javaOnlySetting(s))
|
||||||
.map(Settings.Setting::getName)
|
.map(Settings.Setting::getName)
|
||||||
.sorted(String.CASE_INSENSITIVE_ORDER)
|
.sorted(String.CASE_INSENSITIVE_ORDER)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,49 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.event.events;
|
|
||||||
|
|
||||||
import baritone.api.utils.Pair;
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.ChunkPos;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
*/
|
|
||||||
public final class BlockChangeEvent {
|
|
||||||
|
|
||||||
private final ChunkPos chunk;
|
|
||||||
private final List<Pair<BlockPos, IBlockState>> blocks;
|
|
||||||
|
|
||||||
public BlockChangeEvent(ChunkPos pos, List<Pair<BlockPos, IBlockState>> blocks) {
|
|
||||||
this.chunk = pos;
|
|
||||||
this.blocks = blocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ChunkPos getChunkPos() {
|
|
||||||
return this.chunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Pair<BlockPos, IBlockState>> getBlocks() {
|
|
||||||
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}.
|
||||||
|
|||||||
@@ -57,38 +57,31 @@ public final class ChunkEvent {
|
|||||||
/**
|
/**
|
||||||
* @return The state of the event
|
* @return The state of the event
|
||||||
*/
|
*/
|
||||||
public EventState getState() {
|
public final EventState getState() {
|
||||||
return this.state;
|
return this.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The type of chunk event that occurred;
|
* @return The type of chunk event that occurred;
|
||||||
*/
|
*/
|
||||||
public Type getType() {
|
public final Type getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The Chunk X position.
|
* @return The Chunk X position.
|
||||||
*/
|
*/
|
||||||
public int getX() {
|
public final int getX() {
|
||||||
return this.x;
|
return this.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The Chunk Z position.
|
* @return The Chunk Z position.
|
||||||
*/
|
*/
|
||||||
public int getZ() {
|
public final int getZ() {
|
||||||
return this.z;
|
return this.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {@code true} if the event was fired after a chunk population
|
|
||||||
*/
|
|
||||||
public boolean isPostPopulate() {
|
|
||||||
return this.state == EventState.POST && this.type.isPopulate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,10 +106,6 @@ public final class ChunkEvent {
|
|||||||
* <p>
|
* <p>
|
||||||
* And it's a partial chunk
|
* And it's a partial chunk
|
||||||
*/
|
*/
|
||||||
POPULATE_PARTIAL;
|
POPULATE_PARTIAL
|
||||||
|
|
||||||
public final boolean isPopulate() {
|
|
||||||
return this == POPULATE_FULL || this == POPULATE_PARTIAL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.event.events;
|
package baritone.api.event.events;
|
||||||
|
|
||||||
import baritone.api.utils.Rotation;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -32,27 +32,14 @@ public final class RotationMoveEvent {
|
|||||||
*/
|
*/
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
|
||||||
private final Rotation original;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The yaw rotation
|
* The yaw rotation
|
||||||
*/
|
*/
|
||||||
private float yaw;
|
private float yaw;
|
||||||
|
|
||||||
/**
|
public RotationMoveEvent(Type type, float yaw) {
|
||||||
* The pitch rotation
|
|
||||||
*/
|
|
||||||
private float pitch;
|
|
||||||
|
|
||||||
public RotationMoveEvent(Type type, float yaw, float pitch) {
|
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.original = new Rotation(yaw, pitch);
|
|
||||||
this.yaw = yaw;
|
this.yaw = yaw;
|
||||||
this.pitch = pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rotation getOriginal() {
|
|
||||||
return this.original;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,37 +47,21 @@ public final class RotationMoveEvent {
|
|||||||
*
|
*
|
||||||
* @param yaw Yaw rotation
|
* @param yaw Yaw rotation
|
||||||
*/
|
*/
|
||||||
public void setYaw(float yaw) {
|
public final void setYaw(float yaw) {
|
||||||
this.yaw = yaw;
|
this.yaw = yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The yaw rotation
|
* @return The yaw rotation
|
||||||
*/
|
*/
|
||||||
public float getYaw() {
|
public final float getYaw() {
|
||||||
return this.yaw;
|
return this.yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the pitch movement rotation
|
|
||||||
*
|
|
||||||
* @param pitch Pitch rotation
|
|
||||||
*/
|
|
||||||
public void setPitch(float pitch) {
|
|
||||||
this.pitch = pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The pitch rotation
|
|
||||||
*/
|
|
||||||
public float getPitch() {
|
|
||||||
return pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The type of the event
|
* @return The type of the event
|
||||||
*/
|
*/
|
||||||
public Type getType() {
|
public final Type getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,14 +70,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,18 +18,9 @@
|
|||||||
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.Minecraft;
|
|
||||||
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
|
|
||||||
/**
|
|
||||||
* Called on and after each game tick of the primary {@link Minecraft} instance and dispatched to all Baritone
|
|
||||||
* instances.
|
|
||||||
* <p>
|
|
||||||
* When {@link #state} is {@link EventState#PRE}, the event is being called just prior to when the current in-game
|
|
||||||
* screen is ticked. When {@link #state} is {@link EventState#POST}, the event is being called at the very end
|
|
||||||
* of the {@link Minecraft#runTick()} method.
|
|
||||||
*/
|
|
||||||
public final class TickEvent {
|
public final class TickEvent {
|
||||||
|
|
||||||
private static int overallTickCount;
|
private static int overallTickCount;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,9 +33,6 @@ public interface AbstractGameEventListener extends IGameEventListener {
|
|||||||
@Override
|
@Override
|
||||||
default void onTick(TickEvent event) {}
|
default void onTick(TickEvent event) {}
|
||||||
|
|
||||||
@Override
|
|
||||||
default void onPostTick(TickEvent event) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default void onPlayerUpdate(PlayerUpdateEvent event) {}
|
default void onPlayerUpdate(PlayerUpdateEvent event) {}
|
||||||
|
|
||||||
@@ -48,9 +45,6 @@ public interface AbstractGameEventListener extends IGameEventListener {
|
|||||||
@Override
|
@Override
|
||||||
default void onChunkEvent(ChunkEvent event) {}
|
default void onChunkEvent(ChunkEvent event) {}
|
||||||
|
|
||||||
@Override
|
|
||||||
default void onBlockChange(BlockChangeEvent event) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default void onRenderPass(RenderEvent event) {}
|
default void onRenderPass(RenderEvent event) {}
|
||||||
|
|
||||||
|
|||||||
@@ -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,23 +36,15 @@ 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);
|
||||||
|
|
||||||
/**
|
|
||||||
* Run once per game tick after the tick is completed
|
|
||||||
*
|
|
||||||
* @param event The event
|
|
||||||
* @see Minecraft#runTick()
|
|
||||||
*/
|
|
||||||
void onPostTick(TickEvent event);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 +52,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,21 +67,11 @@ 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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs after a single or multi block change packet is received and processed.
|
* Runs once per world render pass.
|
||||||
*
|
|
||||||
* @param event The event
|
|
||||||
*/
|
|
||||||
void onBlockChange(BlockChangeEvent event);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs once per world render pass. Two passes are made when {@link GameSettings#anaglyph} is on.
|
|
||||||
* <p>
|
|
||||||
* <b>Note:</b> {@link GameSettings#anaglyph} has been removed in Minecraft 1.13
|
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
*/
|
*/
|
||||||
@@ -100,7 +81,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 +90,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 +98,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 +106,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 +126,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.
|
||||||
|
|||||||
@@ -42,16 +42,6 @@ public class GoalAxis implements Goal {
|
|||||||
return flatAxisDistance * BaritoneAPI.getSettings().costHeuristic.value + GoalYLevel.calculate(BaritoneAPI.getSettings().axisHeight.value, y);
|
return flatAxisDistance * BaritoneAPI.getSettings().costHeuristic.value + GoalYLevel.calculate(BaritoneAPI.getSettings().axisHeight.value, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return o.getClass() == GoalAxis.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return 201385781;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "GoalAxis";
|
return "GoalAxis";
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
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
|
||||||
@@ -67,26 +66,6 @@ public class GoalBlock implements Goal, IGoalRenderPos {
|
|||||||
return calculate(xDiff, yDiff, zDiff);
|
return calculate(xDiff, yDiff, zDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalBlock goal = (GoalBlock) o;
|
|
||||||
return x == goal.x
|
|
||||||
&& y == goal.y
|
|
||||||
&& z == goal.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return (int) BetterBlockPos.longHash(x, y, z) * 905165533;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -67,24 +67,6 @@ public class GoalComposite implements Goal {
|
|||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalComposite goal = (GoalComposite) o;
|
|
||||||
return Arrays.equals(goals, goal.goals);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Arrays.hashCode(goals);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "GoalComposite" + Arrays.toString(goals);
|
return "GoalComposite" + Arrays.toString(goals);
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,26 +60,6 @@ public class GoalGetToBlock implements Goal, IGoalRenderPos {
|
|||||||
return GoalBlock.calculate(xDiff, yDiff < 0 ? yDiff + 1 : yDiff, zDiff);
|
return GoalBlock.calculate(xDiff, yDiff < 0 ? yDiff + 1 : yDiff, zDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalGetToBlock goal = (GoalGetToBlock) o;
|
|
||||||
return x == goal.x
|
|
||||||
&& y == goal.y
|
|
||||||
&& z == goal.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return (int) BetterBlockPos.longHash(x, y, z) * -49639096;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invert any goal.
|
* Invert any goal.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -52,24 +50,6 @@ public class GoalInverted implements Goal {
|
|||||||
return Double.NEGATIVE_INFINITY;
|
return Double.NEGATIVE_INFINITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalInverted goal = (GoalInverted) o;
|
|
||||||
return Objects.equals(origin, goal.origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return origin.hashCode() * 495796690;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("GoalInverted{%s}", origin.toString());
|
return String.format("GoalInverted{%s}", origin.toString());
|
||||||
|
|||||||
@@ -17,12 +17,11 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
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 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 {
|
||||||
|
|
||||||
@@ -87,27 +86,6 @@ public class GoalNear implements Goal, IGoalRenderPos {
|
|||||||
return new BlockPos(x, y, z);
|
return new BlockPos(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalNear goal = (GoalNear) o;
|
|
||||||
return x == goal.x
|
|
||||||
&& y == goal.y
|
|
||||||
&& z == goal.z
|
|
||||||
&& rangeSq == goal.rangeSq;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return (int) BetterBlockPos.longHash(x, y, z) + rangeSq;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -20,10 +20,9 @@ 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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful for automated combat (retreating specifically)
|
* Useful for automated combat (retreating specifically)
|
||||||
@@ -125,29 +124,6 @@ public class GoalRunAway implements Goal {
|
|||||||
return maxInside;
|
return maxInside;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalRunAway goal = (GoalRunAway) o;
|
|
||||||
return distanceSq == goal.distanceSq
|
|
||||||
&& Arrays.equals(from, goal.from)
|
|
||||||
&& Objects.equals(maintainY, goal.maintainY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int hash = Arrays.hashCode(from);
|
|
||||||
hash = hash * 1196803141 + distanceSq;
|
|
||||||
hash = hash * -2053788840 + maintainY;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (maintainY != null) {
|
if (maintainY != null) {
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
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 +32,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 + "");
|
||||||
}
|
}
|
||||||
@@ -70,31 +69,6 @@ public class GoalStrictDirection implements Goal {
|
|||||||
return Double.NEGATIVE_INFINITY;
|
return Double.NEGATIVE_INFINITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalStrictDirection goal = (GoalStrictDirection) o;
|
|
||||||
return x == goal.x
|
|
||||||
&& y == goal.y
|
|
||||||
&& z == goal.z
|
|
||||||
&& dx == goal.dx
|
|
||||||
&& dz == goal.dz;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int hash = (int) BetterBlockPos.longHash(x, y, z);
|
|
||||||
hash = hash * 630627507 + dx;
|
|
||||||
hash = hash * -283028380 + dz;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
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
|
||||||
@@ -73,26 +72,6 @@ public class GoalTwoBlocks implements Goal, IGoalRenderPos {
|
|||||||
return new BlockPos(x, y, z);
|
return new BlockPos(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalTwoBlocks goal = (GoalTwoBlocks) o;
|
|
||||||
return x == goal.x
|
|
||||||
&& y == goal.y
|
|
||||||
&& z == goal.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return (int) BetterBlockPos.longHash(x, y, z) * 516508351;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -64,27 +64,6 @@ public class GoalXZ implements Goal {
|
|||||||
return calculate(xDiff, zDiff);
|
return calculate(xDiff, zDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalXZ goal = (GoalXZ) o;
|
|
||||||
return x == goal.x && z == goal.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int hash = 1791873246;
|
|
||||||
hash = hash * 222601791 + x;
|
|
||||||
hash = hash * -1331679453 + z;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
@@ -115,11 +94,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() {
|
||||||
|
|||||||
@@ -58,24 +58,6 @@ public class GoalYLevel implements Goal, ActionCosts {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GoalYLevel goal = (GoalYLevel) o;
|
|
||||||
return level == goal.level;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return level * 1271009915;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format(
|
return String.format(
|
||||||
|
|||||||
@@ -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,11 +18,10 @@
|
|||||||
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;
|
||||||
|
|
||||||
@@ -51,9 +50,8 @@ public interface IBuilderProcess extends IBaritoneProcess {
|
|||||||
*/
|
*/
|
||||||
boolean build(String name, File schematic, Vec3i origin);
|
boolean build(String name, File schematic, Vec3i origin);
|
||||||
|
|
||||||
@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 +72,5 @@ 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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,11 +38,6 @@ public interface ICustomGoalProcess extends IBaritoneProcess {
|
|||||||
*/
|
*/
|
||||||
Goal getGoal();
|
Goal getGoal();
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The most recent set goal, which doesn't invalidate upon {@link #onLostControl()}
|
|
||||||
*/
|
|
||||||
Goal mostRecentGoal();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the goal and begins the path execution.
|
* Sets the goal and begins the path execution.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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,10 +17,9 @@
|
|||||||
|
|
||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -56,10 +56,5 @@ public enum PathingCommandType {
|
|||||||
/**
|
/**
|
||||||
* Go and ask the next process what to do
|
* Go and ask the next process what to do
|
||||||
*/
|
*/
|
||||||
DEFER,
|
DEFER
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the goal and calculates a path, but pauses instead of immediately starting the path.
|
|
||||||
*/
|
|
||||||
SET_GOAL_AND_PAUSE
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,8 @@
|
|||||||
|
|
||||||
package baritone.api.schematic;
|
package baritone.api.schematic;
|
||||||
|
|
||||||
import baritone.api.schematic.mask.Mask;
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public abstract class MaskSchematic extends AbstractSchematic {
|
public abstract class MaskSchematic extends AbstractSchematic {
|
||||||
|
|
||||||
@@ -31,25 +29,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MaskSchematic create(ISchematic schematic, Mask function) {
|
|
||||||
return new MaskSchematic(schematic) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
|
||||||
return function.partOfMask(x, y, z, currentState);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.schematic.mask;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
*/
|
|
||||||
public abstract class AbstractMask implements Mask {
|
|
||||||
|
|
||||||
private final int widthX;
|
|
||||||
private final int heightY;
|
|
||||||
private final int lengthZ;
|
|
||||||
|
|
||||||
public AbstractMask(int widthX, int heightY, int lengthZ) {
|
|
||||||
this.widthX = widthX;
|
|
||||||
this.heightY = heightY;
|
|
||||||
this.lengthZ = lengthZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int widthX() {
|
|
||||||
return this.widthX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int heightY() {
|
|
||||||
return this.heightY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int lengthZ() {
|
|
||||||
return this.lengthZ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package baritone.api.schematic.mask;
|
|
||||||
|
|
||||||
import baritone.api.schematic.mask.operator.BinaryOperatorMask;
|
|
||||||
import baritone.api.schematic.mask.operator.NotMask;
|
|
||||||
import baritone.api.utils.BooleanBinaryOperators;
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
*/
|
|
||||||
public interface Mask {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param x The relative x position of the block
|
|
||||||
* @param y The relative y position of the block
|
|
||||||
* @param z The relative z position of the block
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
boolean partOfMask(int x, int y, int z, IBlockState currentState);
|
|
||||||
|
|
||||||
int widthX();
|
|
||||||
|
|
||||||
int heightY();
|
|
||||||
|
|
||||||
int lengthZ();
|
|
||||||
|
|
||||||
default Mask not() {
|
|
||||||
return new NotMask(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Mask union(Mask other) {
|
|
||||||
return new BinaryOperatorMask(this, other, BooleanBinaryOperators.OR);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Mask intersection(Mask other) {
|
|
||||||
return new BinaryOperatorMask(this, other, BooleanBinaryOperators.AND);
|
|
||||||
}
|
|
||||||
|
|
||||||
default Mask xor(Mask other) {
|
|
||||||
return new BinaryOperatorMask(this, other, BooleanBinaryOperators.XOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user