Compare commits
197 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 82d09a536d | |||
| 6e49adea33 | |||
| f85afdbc70 | |||
| fcadf68c90 | |||
| 65cd6a92d3 | |||
| a09bb0d538 | |||
| 2bf475d840 | |||
| 76cdaaace6 | |||
| ce59ef559f | |||
| 563028a5b3 | |||
| d5c317b88b | |||
| fc3f183dce | |||
| 6b6eea2d8c | |||
| e54652941b | |||
| 867c01ff86 | |||
| 87a9e67ba8 | |||
| bf076f6246 | |||
| 75b54dfaec | |||
| 71a2219b07 | |||
| ccc3de2d7c | |||
| af11e64cec | |||
| 2c3dc5d6b1 | |||
| 71482cc984 | |||
| 3329db1dae | |||
| 926e2d5620 | |||
| d2de8828e7 | |||
| 9fcae6560e | |||
| 2e8fdd43ee | |||
| 27e39c8083 | |||
| a8f373d568 | |||
| c59ec9da10 | |||
| 71491a7922 | |||
| 3a675836da | |||
| 7e0fc81246 | |||
| f970f932c7 | |||
| 52d2741f52 | |||
| 7bc6765cac | |||
| 85b2aea6e9 | |||
| c6ba5481d9 | |||
| 81f47d5632 | |||
| 9b1440ed2c | |||
| 2a8dcee028 | |||
| 277ba3643c | |||
| 170c2d35c2 | |||
| e5fbaf60f3 | |||
| bc49b2d5ba | |||
| ac1ac50158 | |||
| d4103a924d | |||
| 0deb854e1b | |||
| 8268e3ec1b | |||
| bd64f73842 | |||
| cac653ddd9 | |||
| 04ff365890 | |||
| 54ed6ce5a5 | |||
| 32ac46c8a9 | |||
| 7ab2cd2a45 | |||
| a07fae6cdd | |||
| 3f6af51713 | |||
| 8c4e778506 | |||
| 65902d556e | |||
| af91da6a28 | |||
| aada9731a6 | |||
| 9a15a65ad5 | |||
| 49658078b9 | |||
| bcd097c6cb | |||
| cfec67f1f9 | |||
| 0cbe9f81c8 | |||
| 42afd2dd54 | |||
| aaaf0f8839 | |||
| 315929f31c | |||
| 358aa80280 | |||
| 1dd9e11994 | |||
| 5a8f02c944 | |||
| f248a5b677 | |||
| ee83471bf6 | |||
| 610fe6439f | |||
| e4a49c5529 | |||
| 449b44ba50 | |||
| a00eec402e | |||
| 717779f742 | |||
| bd1dcff385 | |||
| 6f843bd24d | |||
| 226ede7ba2 | |||
| 89fb5cecd5 | |||
| d79fbea433 | |||
| a75317cc2c | |||
| ee6df270ce | |||
| e09541151f | |||
| 74e0552be0 | |||
| 4d22c10ddb | |||
| 1ea92a6092 | |||
| 909ab553eb | |||
| 866408aece | |||
| 2215f170df | |||
| a5601fd89a | |||
| fa8f2632f5 | |||
| 66eba84d06 | |||
| 92e39b5d1d | |||
| 0ddc47f473 | |||
| ddfeca6947 | |||
| 6bd2e90cfd | |||
| 82505ddb01 | |||
| 2790d1d308 | |||
| 52d8d271f1 | |||
| 11e503a022 | |||
| b240e8420a | |||
| 25024b58de | |||
| 6fe49380ba | |||
| 1f2e267e3d | |||
| 4cf6783622 | |||
| 82d77a7bac | |||
| ba31d209c9 | |||
| 7974d9135b | |||
| 841a927033 | |||
| 5a16561954 | |||
| a5a795a22c | |||
| 416b5b66d2 | |||
| 88e41f37b1 | |||
| 7cfa837604 | |||
| 6b7aca3081 | |||
| 580af2ab06 | |||
| d144d30890 | |||
| ecac546c6d | |||
| e2cc51908b | |||
| 1390e04435 | |||
| 84d961cbab | |||
| 87b9d3915c | |||
| c38d17563d | |||
| 0c2af85ac0 | |||
| 76297e8176 | |||
| d90f391b5e | |||
| d80ae57964 | |||
| 74d7483b3c | |||
| b3c580e657 | |||
| 8050b69f2f | |||
| 459720c348 | |||
| a73f5c1359 | |||
| 71cb0f6d36 | |||
| 0d15225b1d | |||
| 826f3788d0 | |||
| 2133ab39b7 | |||
| 558c14a375 | |||
| 882ac41291 | |||
| 66c7a3f513 | |||
| 5904441a7e | |||
| c465228531 | |||
| 81b22019dd | |||
| 3e47d485f9 | |||
| 701bc772a8 | |||
| 3ae05b7348 | |||
| 2e186019f5 | |||
| 4c6f321cff | |||
| c72eb3e195 | |||
| a4237bf1f9 | |||
| e767e34b92 | |||
| 2b672998e1 | |||
| e18dc7c7e7 | |||
| bf12763a10 | |||
| 963641a818 | |||
| 3e94d92fbd | |||
| ce73d34627 | |||
| d8348ad292 | |||
| 299540725e | |||
| 0ef08142fd | |||
| 8694d926c4 | |||
| 4c4bce3561 | |||
| 68e8717b5c | |||
| a822d3ef05 | |||
| 311cf81e8a | |||
| 5fb8a1d3d1 | |||
| 306bd18a40 | |||
| 847181ada4 | |||
| 1c1fbe83ec | |||
| ccd56e0368 | |||
| cef88cde20 | |||
| aa3833915b | |||
| 0c0bbeff27 | |||
| ceda14096c | |||
| d5b393d6bd | |||
| e2cdd6a7f9 | |||
| 261d02e67b | |||
| a6ce4694fc | |||
| 14bc65468a | |||
| 56d109bf0a | |||
| a965859095 | |||
| 863ae447b9 | |||
| 4dd922f1b5 | |||
| f95dc40f4c | |||
| 81786f7a7c | |||
| 1381d8d94c | |||
| 1dca02517e | |||
| b109fc7420 | |||
| c74c01271d | |||
| 702b916948 | |||
| 8ed2431f37 | |||
| c45cbebcce | |||
| 251110c4f8 |
@@ -0,0 +1 @@
|
|||||||
|
<!-- No UwU's or OwO's allowed -->
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!-- No UwU's or OwO's allowed -->
|
||||||
@@ -11,6 +11,8 @@ build/
|
|||||||
classes/
|
classes/
|
||||||
*.class
|
*.class
|
||||||
|
|
||||||
|
/out
|
||||||
|
|
||||||
# IntelliJ Files
|
# IntelliJ Files
|
||||||
.idea/
|
.idea/
|
||||||
*.iml
|
*.iml
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ install:
|
|||||||
|
|
||||||
script:
|
script:
|
||||||
- docker run --rm cabaletta/baritone ./gradlew javadoc
|
- docker run --rm cabaletta/baritone ./gradlew javadoc
|
||||||
- docker run --name baritone cabaletta/baritone /bin/sh -c "set -e; /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 128x128x24 -ac +extension GLX +render; DISPLAY=:99 BARITONE_AUTO_TEST=true ./gradlew runClient"
|
- docker run --name baritone cabaletta/baritone /bin/sh -c "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 128x128x24 -ac +extension GLX +render; DISPLAY=:99 BARITONE_AUTO_TEST=true ./gradlew runAutoTest; cat /code/autotest/success"
|
||||||
- docker cp baritone:/code/dist dist
|
- docker cp baritone:/code/dist dist
|
||||||
- ls dist
|
- ls dist
|
||||||
- cat dist/checksums.txt
|
- cat dist/checksums.txt
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||||
|
level of experience, education, socio-economic status, nationality, personal
|
||||||
|
appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* No Anime
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* Anime
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* ~~Trolling, insulting/derogatory comments, and personal or political attacks~~
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to immediately remove
|
||||||
|
without any sort of dispute any issues or pull requests that do not align
|
||||||
|
with their corresponding templates. Absolutely no leniancy shall be accepted
|
||||||
|
with these terms.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at complaints@leijurv.com. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see
|
||||||
|
https://www.contributor-covenant.org/faq
|
||||||
+4
-5
@@ -1,17 +1,16 @@
|
|||||||
FROM debian:jessie
|
FROM debian:stretch
|
||||||
|
|
||||||
RUN echo 'deb http://deb.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/jessie-backports.list
|
RUN echo 'deb http://deb.debian.org/debian stretch-backports main' > /etc/apt/sources.list.d/stretch-backports.list
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
RUN apt update -y
|
RUN apt update -y
|
||||||
|
|
||||||
RUN apt install --target-release jessie-backports \
|
RUN apt install \
|
||||||
openjdk-8-jdk \
|
openjdk-8-jdk \
|
||||||
ca-certificates-java \
|
|
||||||
--assume-yes
|
--assume-yes
|
||||||
|
|
||||||
RUN apt install -qq --force-yes mesa-utils libgl1-mesa-glx libxcursor1 libxrandr2 libxxf86vm1 x11-xserver-utils xfonts-base xserver-common
|
RUN apt install -qq --assume-yes mesa-utils libgl1-mesa-glx libxcursor1 libxrandr2 libxxf86vm1 x11-xserver-utils xfonts-base xserver-common
|
||||||
|
|
||||||
COPY . /code
|
COPY . /code
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://www.codacy.com/app/leijurv/baritone?utm_source=github.com&utm_medium=referral&utm_content=cabaletta/baritone&utm_campaign=Badge_Grade)
|
[](https://www.codacy.com/app/leijurv/baritone?utm_source=github.com&utm_medium=referral&utm_content=cabaletta/baritone&utm_campaign=Badge_Grade)
|
||||||
[](http://hits.dwyl.com/cabaletta/baritone)
|
[](http://hits.dwyl.com/cabaletta/baritone)
|
||||||
|
[](https://github.com/cabaletta/baritone/blob/master/CODE_OF_CONDUCT.md)
|
||||||
[](https://snyk.io/test/github/cabaletta/baritone?targetFile=build.gradle)
|
[](https://snyk.io/test/github/cabaletta/baritone?targetFile=build.gradle)
|
||||||
[](https://github.com/cabaletta/baritone/issues)
|
[](https://github.com/cabaletta/baritone/issues)
|
||||||
[](https://github.com/cabaletta/baritone/issues/)
|
[](https://github.com/cabaletta/baritone/issues/)
|
||||||
@@ -12,25 +13,25 @@
|
|||||||

|

|
||||||

|

|
||||||

|

|
||||||

|
[](https://minecraft.gamepedia.com/1.13.2)
|
||||||
[](https://minecraft.gamepedia.com/1.12.2)
|
|
||||||
[](https://github.com/cabaletta/baritone/graphs/contributors/)
|
[](https://github.com/cabaletta/baritone/graphs/contributors/)
|
||||||
[](https://github.com/cabaletta/baritone/commit/)
|
[](https://github.com/cabaletta/baritone/commit/)
|
||||||
[](https://github.com/EmotionalLove/Asuna/)
|
[](https://impactdevelopment.github.io/)
|
||||||
[](https://impactdevelopment.github.io/)
|
[](https://wweclient.com/)
|
||||||
[](https://github.com/zeroeightysix/KAMI/)
|
[](https://github.com/zeroeightysix/KAMI/)
|
||||||
[](https://wweclient.com/)
|
|
||||||
[](https://futureclient.net/)
|
[](https://futureclient.net/)
|
||||||
[](https://github.com/fr1kin/ForgeHax)
|
[](https://github.com/fr1kin/ForgeHax)
|
||||||
|
[](http://forthebadge.com)
|
||||||
|
[](http://forthebadge.com)
|
||||||
|
|
||||||
A Minecraft pathfinder bot.
|
A Minecraft pathfinder bot.
|
||||||
|
|
||||||
Baritone is the pathfinding system used in [Impact](https://impactdevelopment.github.io/) since 4.4. There's a [showcase video](https://www.youtube.com/watch?v=yI8hgW_m6dQ) made by @Adovin#3153 on Baritone's integration into Impact. [Here's](https://www.youtube.com/watch?v=StquF69-_wI) a video I made showing off what it can do.
|
Baritone is the pathfinding system used in [Impact](https://impactdevelopment.github.io/) since 4.4. There's a [showcase video](https://www.youtube.com/watch?v=yI8hgW_m6dQ) made by @Adovin#3153 on Baritone's integration into Impact. [Here's](https://www.youtube.com/watch?v=StquF69-_wI) a video I made showing off what it can do.
|
||||||
|
|
||||||
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, rebuilt for 1.12.2. 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. 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).
|
||||||
|
|
||||||
Have committed at least once a day for the last 6 months =D 🦀
|
Have committed at least once a day for the last 8 months =D 🦀
|
||||||
|
|
||||||
1Leijurv3DWTrGAfmmiTphjhXLvQiHg7K2
|
1Leijurv3DWTrGAfmmiTphjhXLvQiHg7K2
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ That's what it's for, sure! (As long as usage is in compliance with the LGPL 3 L
|
|||||||
|
|
||||||
## How is it so fast?
|
## How is it so fast?
|
||||||
|
|
||||||
Magic. (Hours of [Leijurv](https://github.com/leijurv) enduring excruciating pain)
|
Magic. (Hours of [leijurv](https://github.com/leijurv) enduring excruciating pain)
|
||||||
|
|
||||||
## Why is it called Baritone?
|
## Why is it called Baritone?
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
## Prebuilt official releases
|
## Prebuilt official releases
|
||||||
These releases are not always completely up to date with latest features, and are only released from `master`. (so if you want `builder` branch for example, you'll have to build it yourself)
|
These releases are not always completely up to date with latest features, and are only released from `master`. (so if you want `backfill-2` branch for example, you'll have to build it yourself)
|
||||||
|
|
||||||
Link to the releases page: [Releases](https://github.com/cabaletta/baritone/releases)
|
Link to the releases page: [Releases](https://github.com/cabaletta/baritone/releases)
|
||||||
|
|
||||||
@@ -25,9 +25,9 @@ If another one of your Forge mods has a Baritone integration, you want `baritone
|
|||||||
- **Unoptimized**: Nothing is obfuscated. This shouldn't be used ever in production.
|
- **Unoptimized**: Nothing is obfuscated. This shouldn't be used ever in production.
|
||||||
|
|
||||||
## More Info
|
## More Info
|
||||||
To replace out Impact 4.5's Baritone build with a customized one, build Baritone as above then copy `dist/baritone-api-$VERSION$.jar` into `minecraft/libraries/cabaletta/baritone-api/1.2/baritone-api-1.2.jar`, replacing the jar that was previously there. You also need to edit `minecraft/versions/1.12.2-Impact_4.5/1.12.2-Impact_4.5.json`, find the line `"name": "cabaletta:baritone-api:1.2"`, remove the comma from the end, and **entirely remove the next line** (starts with `"url"`).
|
To replace out Impact 4.5's Baritone build with a customized one, build Baritone as above then copy & **rename** `dist/baritone-api-$VERSION$.jar` into `minecraft/libraries/cabaletta/baritone-api/1.2/baritone-api-1.2.jar`, replacing the jar that was previously there. You also need to edit `minecraft/versions/1.12.2-Impact_4.5/1.12.2-Impact_4.5.json`, find the line `"name": "cabaletta:baritone-api:1.2"`, remove the comma from the end, and **entirely remove the NEXT line** (starts with `"url"`). **Restart your launcher** then load as normal.
|
||||||
|
|
||||||
You can verify whether or not it worked by running `.b version` in chat (only valid in Impact). If it says `v1.2.0` then you didn't do it properly, and it's still running the version that came with 4.5.
|
You can verify whether or not it worked by running `.b version` in chat (only valid in Impact). It should print out the version that you downloaded. Note: The version that comes with 4.5 is `v1.2.3`.
|
||||||
|
|
||||||
## Build it yourself
|
## Build it yourself
|
||||||
- Clone or download Baritone
|
- Clone or download Baritone
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ Some common examples:
|
|||||||
- `cancel` or `stop` to stop everything
|
- `cancel` or `stop` to stop everything
|
||||||
- `goto portal` or `goto ender_chest` or `goto block_type` to go to a block. (in Impact, `.goto` is an alias for `.b goto` for the most part)
|
- `goto portal` or `goto ender_chest` or `goto block_type` to go to a block. (in Impact, `.goto` is an alias for `.b goto` for the most part)
|
||||||
- `mine diamond_ore` to mine diamond ore (turn on the setting `legitMine` to only mine ores that it can actually see. It will explore randomly around y=11 until it finds them.)
|
- `mine diamond_ore` to mine diamond ore (turn on the setting `legitMine` to only mine ores that it can actually see. It will explore randomly around y=11 until it finds them.)
|
||||||
|
- `click` to click your destination on the screen. left click to path into it, right click to path on top of it. left click and drag to clear an area.
|
||||||
- `follow playerName` to follow a player. `follow` to follow the entity you're looking at (only works if it hitting range). `followplayers` to follow any players in range (combine with Kill Aura for a fun time).
|
- `follow playerName` to follow a player. `follow` to follow the entity you're looking at (only works if it hitting range). `followplayers` to follow any players in range (combine with Kill Aura for a fun time).
|
||||||
- `save waypointName` to save a waypoint. `goto waypointName` to go to it.
|
- `save waypointName` to save a waypoint. `goto waypointName` to go to it.
|
||||||
- `axis` to go to an axis or diagonal axis at y=120 (`axisHeight` is a configurable setting, defaults to 120).
|
- `axis` to go to an axis or diagonal axis at y=120 (`axisHeight` is a configurable setting, defaults to 120).
|
||||||
@@ -41,6 +42,7 @@ Some common examples:
|
|||||||
- `render` to rerender the world in case `renderCachedChunks` is being glitchy
|
- `render` to rerender the world in case `renderCachedChunks` is being glitchy
|
||||||
- `version` to get the version of Baritone you're running
|
- `version` to get the version of Baritone you're running
|
||||||
- `damn` daniel
|
- `damn` daniel
|
||||||
|
- `build` to build a schematic. `build blah` will load `schematics/blah.schematic` and build it with the origin being your player feet. `build blah x y z` to set the origin. Any of those can be relative to your player (`~ 69 ~-420` would build at x=player x, y=69, z=player z-420).
|
||||||
|
|
||||||
For the rest of the commands, you can take a look at the code [here](https://github.com/cabaletta/baritone/blob/master/src/main/java/baritone/utils/ExampleBaritoneControl.java).
|
For the rest of the commands, you can take a look at the code [here](https://github.com/cabaletta/baritone/blob/master/src/main/java/baritone/utils/ExampleBaritoneControl.java).
|
||||||
|
|
||||||
|
|||||||
+70
-15
@@ -16,33 +16,33 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
group 'baritone'
|
group 'baritone'
|
||||||
version '1.2.2'
|
version '1.3.1'
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
|
jcenter()
|
||||||
maven {
|
maven {
|
||||||
name = 'forge'
|
name = 'forge'
|
||||||
url = 'http://files.minecraftforge.net/maven'
|
url = 'http://files.minecraftforge.net/maven'
|
||||||
}
|
}
|
||||||
maven {
|
maven {
|
||||||
name = 'SpongePowered'
|
name = 'impactdevelopment-repo'
|
||||||
url = 'http://repo.spongepowered.org/maven'
|
url = 'https://impactdevelopment.github.io/maven/'
|
||||||
}
|
}
|
||||||
jcenter()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
|
classpath group: 'com.github.ImpactDevelopment', name: 'ForgeGradle', version: '3.0.115'
|
||||||
classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT'
|
classpath group: 'com.github.ImpactDevelopment', name: 'MixinGradle', version: '0.6.2'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
import baritone.gradle.task.CreateDistTask
|
import baritone.gradle.task.CreateDistTask
|
||||||
import baritone.gradle.task.ProguardTask
|
import baritone.gradle.task.ProguardTask
|
||||||
|
import org.apache.tools.ant.taskdefs.condition.Os
|
||||||
|
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'net.minecraftforge.gradle.tweaker-client'
|
apply plugin: 'net.minecraftforge.gradle'
|
||||||
apply plugin: 'org.spongepowered.mixin'
|
apply plugin: 'org.spongepowered.mixin'
|
||||||
|
|
||||||
sourceCompatibility = targetCompatibility = '1.8'
|
sourceCompatibility = targetCompatibility = '1.8'
|
||||||
@@ -52,19 +52,67 @@ compileJava {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
api {
|
||||||
|
compileClasspath += main.compileClasspath
|
||||||
|
}
|
||||||
|
main {
|
||||||
|
compileClasspath += api.output
|
||||||
|
}
|
||||||
|
test {
|
||||||
|
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
|
runtimeClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
|
}
|
||||||
launch {
|
launch {
|
||||||
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
compileClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
|
runtimeClasspath += main.compileClasspath + main.runtimeClasspath + main.output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
minecraft {
|
task sourceJar(type: Jar, dependsOn: classes) {
|
||||||
version = '1.12.2'
|
classifier = 'sources'
|
||||||
mappings = 'stable_39'
|
from sourceSets.api.allSource
|
||||||
tweakClass = 'baritone.launch.BaritoneTweaker'
|
}
|
||||||
runDir = 'run'
|
|
||||||
|
|
||||||
// The sources jar should use SRG names not MCP to ensure compatibility with all mappings
|
minecraft {
|
||||||
makeObfSourceJar = true
|
mappings channel: 'snapshot', version: '20190307-1.13.1'
|
||||||
|
reobfMappings 'notch'
|
||||||
|
|
||||||
|
runs {
|
||||||
|
client {
|
||||||
|
workingDirectory project.file('run')
|
||||||
|
source sourceSets.launch
|
||||||
|
|
||||||
|
main 'baritone.launch.LaunchTesting'
|
||||||
|
|
||||||
|
environment 'assetIndex', '{asset_index}'
|
||||||
|
environment 'assetDirectory', downloadAssets.output
|
||||||
|
environment 'nativesDirectory', extractNatives.output
|
||||||
|
|
||||||
|
environment 'tweakClass', 'baritone.launch.BaritoneTweaker'
|
||||||
|
|
||||||
|
if (Os.isFamily(Os.FAMILY_MAC)) {
|
||||||
|
jvmArgs "-XstartOnFirstThread"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
autoTest {
|
||||||
|
workingDirectory project.file('autotest')
|
||||||
|
source sourceSets.launch
|
||||||
|
|
||||||
|
main 'baritone.launch.LaunchTesting'
|
||||||
|
|
||||||
|
environment 'assetIndex', '{asset_index}'
|
||||||
|
environment 'assetDirectory', downloadAssets.output
|
||||||
|
environment 'nativesDirectory', extractNatives.output
|
||||||
|
|
||||||
|
environment 'tweakClass', 'baritone.launch.BaritoneTweaker'
|
||||||
|
environment 'BARITONE_AUTO_TEST', 'true'
|
||||||
|
|
||||||
|
if (Os.isFamily(Os.FAMILY_MAC)) {
|
||||||
|
jvmArgs "-XstartOnFirstThread"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
@@ -82,6 +130,12 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
minecraft 'com.github.ImpactDevelopment:Vanilla:1.13.2'
|
||||||
|
|
||||||
|
runtime launchCompile('net.minecraft:launchwrapper:1.12') {
|
||||||
|
exclude module: 'lwjgl'
|
||||||
|
}
|
||||||
|
runtime launchCompile('org.ow2.asm:asm-debug-all:5.2')
|
||||||
runtime launchCompile('com.github.ImpactDevelopment:SimpleTweaker:1.2')
|
runtime launchCompile('com.github.ImpactDevelopment:SimpleTweaker:1.2')
|
||||||
runtime launchCompile('org.spongepowered:mixin:0.7.11-SNAPSHOT') {
|
runtime launchCompile('org.spongepowered:mixin:0.7.11-SNAPSHOT') {
|
||||||
// Mixin includes a lot of dependencies that are too up-to-date
|
// Mixin includes a lot of dependencies that are too up-to-date
|
||||||
@@ -91,6 +145,7 @@ dependencies {
|
|||||||
exclude module: 'commons-io'
|
exclude module: 'commons-io'
|
||||||
exclude module: 'log4j-core'
|
exclude module: 'log4j-core'
|
||||||
}
|
}
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,17 +40,13 @@ class BaritoneGradleTask extends DefaultTask {
|
|||||||
PROGUARD_STANDALONE_CONFIG = "standalone.pro",
|
PROGUARD_STANDALONE_CONFIG = "standalone.pro",
|
||||||
PROGUARD_EXPORT_PATH = "proguard_out.jar",
|
PROGUARD_EXPORT_PATH = "proguard_out.jar",
|
||||||
|
|
||||||
TEMP_LIBRARY_DIR = "tempLibraries/",
|
|
||||||
|
|
||||||
ARTIFACT_STANDARD = "%s-%s.jar",
|
ARTIFACT_STANDARD = "%s-%s.jar",
|
||||||
ARTIFACT_UNOPTIMIZED = "%s-unoptimized-%s.jar",
|
ARTIFACT_UNOPTIMIZED = "%s-unoptimized-%s.jar",
|
||||||
ARTIFACT_API = "%s-api-%s.jar",
|
ARTIFACT_API = "%s-api-%s.jar",
|
||||||
ARTIFACT_STANDALONE = "%s-standalone-%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, proguardOut;
|
||||||
|
|
||||||
protected void verifyArtifacts() throws IllegalStateException {
|
protected void verifyArtifacts() throws IllegalStateException {
|
||||||
this.artifactName = getProject().getName();
|
this.artifactName = getProject().getName();
|
||||||
@@ -60,8 +56,6 @@ class BaritoneGradleTask extends DefaultTask {
|
|||||||
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);
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ public class CreateDistTask extends BaritoneGradleTask {
|
|||||||
Path api = getRelativeFile("dist/" + formatVersion(ARTIFACT_API));
|
Path api = getRelativeFile("dist/" + formatVersion(ARTIFACT_API));
|
||||||
Path standalone = getRelativeFile("dist/" + formatVersion(ARTIFACT_STANDALONE));
|
Path standalone = getRelativeFile("dist/" + formatVersion(ARTIFACT_STANDALONE));
|
||||||
Path unoptimized = getRelativeFile("dist/" + formatVersion(ARTIFACT_UNOPTIMIZED));
|
Path unoptimized = getRelativeFile("dist/" + formatVersion(ARTIFACT_UNOPTIMIZED));
|
||||||
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 = getRelativeFile("dist/");
|
||||||
@@ -58,11 +56,9 @@ public class CreateDistTask extends BaritoneGradleTask {
|
|||||||
Files.copy(this.artifactApiPath, api, REPLACE_EXISTING);
|
Files.copy(this.artifactApiPath, api, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactStandalonePath, standalone, REPLACE_EXISTING);
|
Files.copy(this.artifactStandalonePath, standalone, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactUnoptimizedPath, unoptimized, REPLACE_EXISTING);
|
Files.copy(this.artifactUnoptimizedPath, unoptimized, REPLACE_EXISTING);
|
||||||
Files.copy(this.artifactForgeApiPath, forgeApi, 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 = Stream.of(api, standalone, unoptimized)
|
||||||
.map(path -> sha1(path) + " " + path.getFileName().toString())
|
.map(path -> sha1(path) + " " + path.getFileName().toString())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
|||||||
@@ -18,26 +18,18 @@
|
|||||||
package baritone.gradle.task;
|
package baritone.gradle.task;
|
||||||
|
|
||||||
import baritone.gradle.util.Determinizer;
|
import baritone.gradle.util.Determinizer;
|
||||||
import baritone.gradle.util.MappingType;
|
|
||||||
import baritone.gradle.util.ReobfWrapper;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.gradle.api.NamedDomainObjectContainer;
|
import org.gradle.api.plugins.JavaPluginConvention;
|
||||||
import org.gradle.api.artifacts.Configuration;
|
|
||||||
import org.gradle.api.artifacts.Dependency;
|
|
||||||
import org.gradle.api.internal.plugins.DefaultConvention;
|
|
||||||
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.internal.Pair;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
import java.util.regex.Matcher;
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.stream.Stream;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
@@ -49,18 +41,12 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
private String extract;
|
private String extract;
|
||||||
|
|
||||||
private List<String> requiredLibraries;
|
|
||||||
|
|
||||||
private File mixin;
|
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
protected void exec() throws Exception {
|
protected void exec() throws Exception {
|
||||||
super.verifyArtifacts();
|
super.verifyArtifacts();
|
||||||
@@ -70,7 +56,6 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
downloadProguard();
|
downloadProguard();
|
||||||
extractProguard();
|
extractProguard();
|
||||||
generateConfigs();
|
generateConfigs();
|
||||||
acquireDependencies();
|
|
||||||
proguardApi();
|
proguardApi();
|
||||||
proguardStandalone();
|
proguardStandalone();
|
||||||
cleanup();
|
cleanup();
|
||||||
@@ -81,7 +66,7 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
Files.delete(this.artifactUnoptimizedPath);
|
Files.delete(this.artifactUnoptimizedPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
Determinizer.determinize(this.artifactPath.toString(), this.artifactUnoptimizedPath.toString(), Optional.empty());
|
Determinizer.determinize(this.artifactPath.toString(), this.artifactUnoptimizedPath.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadProguard() throws Exception {
|
private void downloadProguard() throws Exception {
|
||||||
@@ -114,6 +99,19 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
String out = IOUtils.toString(p.getInputStream(), "UTF-8").split("\n")[0].split("Opened ")[1].replace("]", "");
|
String out = IOUtils.toString(p.getInputStream(), "UTF-8").split("\n")[0].split("Opened ")[1].replace("]", "");
|
||||||
template.add(2, "-libraryjars '" + out + "'");
|
template.add(2, "-libraryjars '" + out + "'");
|
||||||
|
|
||||||
|
// Discover all of the libraries that we will need to acquire from gradle
|
||||||
|
acquireDependencies().forEach(f -> {
|
||||||
|
if (f.toString().endsWith("-recomp.jar")) {
|
||||||
|
// remove MCP mapped jar
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (f.toString().endsWith("client-extra.jar")) {
|
||||||
|
// go from the extra to the original downloaded client
|
||||||
|
f = new File(f.getParentFile(), "client.jar");
|
||||||
|
}
|
||||||
|
template.add(2, "-libraryjars '" + f + "'");
|
||||||
|
});
|
||||||
|
|
||||||
// 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(PROGUARD_API_CONFIG), template);
|
||||||
|
|
||||||
@@ -121,165 +119,20 @@ public class ProguardTask extends BaritoneGradleTask {
|
|||||||
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);
|
Files.write(getTemporaryFile(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 void acquireDependencies() throws Exception {
|
private Stream<File> acquireDependencies() {
|
||||||
|
return getProject().getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().findByName("launch").getRuntimeClasspath().getFiles().stream().filter(File::isFile);
|
||||||
// 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<>();
|
|
||||||
getProject().getConfigurations().stream().filter(Configuration::isCanBeResolved).forEach(config ->
|
|
||||||
config.getAllDependencies().forEach(dependency ->
|
|
||||||
dependencyLookupMap.putIfAbsent(dependency.getName() + "-" + dependency.getVersion(), Pair.of(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, 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The pair must be non-null
|
|
||||||
Objects.requireNonNull(pair);
|
|
||||||
|
|
||||||
// Find the library jar file, and copy it to tempLibraries
|
|
||||||
for (File file : pair.getLeft().files(pair.getRight())) {
|
|
||||||
if (file.getName().startsWith(lib)) {
|
|
||||||
if (lib.contains("mixin")) {
|
|
||||||
mixin = file;
|
|
||||||
}
|
|
||||||
Files.copy(file.toPath(), getTemporaryFile("tempLibraries/" + lib + ".jar"), REPLACE_EXISTING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mixin == null) {
|
|
||||||
throw new IllegalStateException("Unable to find mixin jar");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// a bunch of epic stuff to get the path to the cached jar
|
|
||||||
private Path getMinecraftJar() throws Exception {
|
|
||||||
MappingType mappingType;
|
|
||||||
try {
|
|
||||||
mappingType = getMappingType();
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Failed to get mapping type, assuming NOTCH.");
|
|
||||||
mappingType = MappingType.NOTCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
String suffix;
|
|
||||||
switch (mappingType) {
|
|
||||||
case NOTCH:
|
|
||||||
suffix = "";
|
|
||||||
break;
|
|
||||||
case SEARGE:
|
|
||||||
suffix = "-srgBin";
|
|
||||||
break;
|
|
||||||
case CUSTOM:
|
|
||||||
throw new IllegalStateException("Custom mappings not supported!");
|
|
||||||
default:
|
|
||||||
throw new IllegalStateException("Unknown mapping type: " + mappingType);
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultConvention convention = (DefaultConvention) this.getProject().getConvention();
|
|
||||||
Object extension = convention.getAsMap().get("minecraft");
|
|
||||||
Objects.requireNonNull(extension);
|
|
||||||
|
|
||||||
// for some reason cant use Class.forName
|
|
||||||
Class<?> class_baseExtension = extension.getClass().getSuperclass().getSuperclass().getSuperclass(); // <-- cursed
|
|
||||||
Field f_replacer = class_baseExtension.getDeclaredField("replacer");
|
|
||||||
f_replacer.setAccessible(true);
|
|
||||||
Object replacer = f_replacer.get(extension);
|
|
||||||
Class<?> class_replacementProvider = replacer.getClass();
|
|
||||||
Field replacement_replaceMap = class_replacementProvider.getDeclaredField("replaceMap");
|
|
||||||
replacement_replaceMap.setAccessible(true);
|
|
||||||
|
|
||||||
Map<String, Object> replacements = (Map) replacement_replaceMap.get(replacer);
|
|
||||||
String cacheDir = replacements.get("CACHE_DIR").toString() + "/net/minecraft";
|
|
||||||
String mcVersion = replacements.get("MC_VERSION").toString();
|
|
||||||
String mcpInsert = replacements.get("MAPPING_CHANNEL").toString() + "/" + replacements.get("MAPPING_VERSION").toString();
|
|
||||||
String fullJarName = "minecraft-" + mcVersion + suffix + ".jar";
|
|
||||||
|
|
||||||
String baseDir = String.format("%s/minecraft/%s/", cacheDir, mcVersion);
|
|
||||||
|
|
||||||
String jarPath;
|
|
||||||
if (mappingType == MappingType.SEARGE) {
|
|
||||||
jarPath = String.format("%s/%s/%s", baseDir, mcpInsert, fullJarName);
|
|
||||||
} else {
|
|
||||||
jarPath = baseDir + fullJarName;
|
|
||||||
}
|
|
||||||
jarPath = jarPath
|
|
||||||
.replace("/", File.separator)
|
|
||||||
.replace("\\", File.separator); // hecking regex
|
|
||||||
|
|
||||||
return new File(jarPath).toPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
// throws IllegalStateException if mapping type is ambiguous or it fails to find it
|
|
||||||
private MappingType getMappingType() {
|
|
||||||
// if it fails to find this then its probably a forgegradle version problem
|
|
||||||
Set<Object> reobf = (NamedDomainObjectContainer<Object>) this.getProject().getExtensions().getByName("reobf");
|
|
||||||
|
|
||||||
List<MappingType> mappingTypes = getUsedMappingTypes(reobf);
|
|
||||||
long mappingTypesUsed = mappingTypes.size();
|
|
||||||
if (mappingTypesUsed == 0) {
|
|
||||||
throw new IllegalStateException("Failed to find mapping type (no jar task?)");
|
|
||||||
}
|
|
||||||
if (mappingTypesUsed > 1) {
|
|
||||||
throw new IllegalStateException("Ambiguous mapping type (multiple jars with different mapping types?)");
|
|
||||||
}
|
|
||||||
|
|
||||||
return mappingTypes.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<MappingType> getUsedMappingTypes(Set<Object> reobf) {
|
|
||||||
return reobf.stream()
|
|
||||||
.map(ReobfWrapper::new)
|
|
||||||
.map(ReobfWrapper::getMappingType)
|
|
||||||
.distinct()
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void proguardApi() throws Exception {
|
private void proguardApi() throws Exception {
|
||||||
runProguard(getTemporaryFile(PROGUARD_API_CONFIG));
|
runProguard(getTemporaryFile(PROGUARD_API_CONFIG));
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString(), Optional.empty());
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString());
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeApiPath.toString(), Optional.of(mixin));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void proguardStandalone() throws Exception {
|
private void proguardStandalone() throws Exception {
|
||||||
runProguard(getTemporaryFile(PROGUARD_STANDALONE_CONFIG));
|
runProguard(getTemporaryFile(PROGUARD_STANDALONE_CONFIG));
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString(), Optional.empty());
|
Determinizer.determinize(this.proguardOut.toString(), this.artifactStandalonePath.toString());
|
||||||
Determinizer.determinize(this.proguardOut.toString(), this.artifactForgeStandalonePath.toString(), Optional.of(mixin));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanup() {
|
private void cleanup() {
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ import com.google.gson.stream.JsonReader;
|
|||||||
import com.google.gson.stream.JsonWriter;
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
import java.util.jar.JarOutputStream;
|
import java.util.jar.JarOutputStream;
|
||||||
@@ -36,7 +39,7 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
public class Determinizer {
|
public class Determinizer {
|
||||||
|
|
||||||
public static void determinize(String inputPath, String outputPath, Optional<File> toInclude) 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);
|
||||||
@@ -63,30 +66,10 @@ public class Determinizer {
|
|||||||
if (entry.getName().endsWith(".refmap.json")) {
|
if (entry.getName().endsWith(".refmap.json")) {
|
||||||
JsonObject object = new JsonParser().parse(new InputStreamReader(jarFile.getInputStream(entry))).getAsJsonObject();
|
JsonObject object = new JsonParser().parse(new InputStreamReader(jarFile.getInputStream(entry))).getAsJsonObject();
|
||||||
jos.write(writeSorted(object).getBytes());
|
jos.write(writeSorted(object).getBytes());
|
||||||
} else if (entry.getName().equals("META-INF/MANIFEST.MF") && toInclude.isPresent()) { // 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (toInclude.isPresent()) {
|
|
||||||
try (JarFile mixin = new JarFile(toInclude.get())) {
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,63 +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.gradle.util;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All credits go to AsmLibGradle and its contributors.
|
|
||||||
*
|
|
||||||
* @see <a href="https://github.com/pozzed/AsmLibGradle/blob/8f917dbc3939eab7a3d9daf54d9d285fdf34f4b2/src/main/java/net/futureclient/asmlib/forgegradle/ReobfWrapper.java">Original Source</a>
|
|
||||||
*/
|
|
||||||
public class ReobfWrapper {
|
|
||||||
|
|
||||||
private final Object instance;
|
|
||||||
private final Class<?> type;
|
|
||||||
|
|
||||||
public ReobfWrapper(Object instance) {
|
|
||||||
this.instance = instance;
|
|
||||||
Objects.requireNonNull(instance);
|
|
||||||
this.type = instance.getClass();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
try {
|
|
||||||
Field nameField = type.getDeclaredField("name");
|
|
||||||
nameField.setAccessible(true);
|
|
||||||
return (String) nameField.get(this.instance);
|
|
||||||
} catch (ReflectiveOperationException ex) {
|
|
||||||
throw new IllegalStateException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public MappingType getMappingType() {
|
|
||||||
try {
|
|
||||||
Field enumField = type.getDeclaredField("mappingType");
|
|
||||||
enumField.setAccessible(true);
|
|
||||||
Enum<?> aEnum = (Enum<?>) enumField.get(this.instance);
|
|
||||||
MappingType mappingType = MappingType.values()[aEnum.ordinal()];
|
|
||||||
if (!aEnum.name().equals(mappingType.name())) {
|
|
||||||
throw new IllegalStateException("ForgeGradle ReobfMappingType is not equivalent to MappingType (version error?)");
|
|
||||||
}
|
|
||||||
return mappingType;
|
|
||||||
} catch (ReflectiveOperationException ex) {
|
|
||||||
throw new IllegalStateException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Vendored
+2
-50
@@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
# lwjgl is weird
|
# lwjgl is weird
|
||||||
-dontwarn org.lwjgl.**
|
-dontwarn org.lwjgl.**
|
||||||
|
# also lwjgl lol
|
||||||
|
-dontwarn module-info
|
||||||
|
|
||||||
-keep class baritone.api.** { *; } # this is the keep api
|
-keep class baritone.api.** { *; } # this is the keep api
|
||||||
|
|
||||||
@@ -29,56 +31,6 @@
|
|||||||
# need to keep mixin names
|
# need to keep mixin names
|
||||||
-keep class baritone.launch.** { *; }
|
-keep class baritone.launch.** { *; }
|
||||||
|
|
||||||
# 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.1.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.11.jar' # TODO why does only 1.11.jar exist?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 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 * {
|
||||||
|
|||||||
@@ -65,6 +65,12 @@ public interface IBaritone {
|
|||||||
*/
|
*/
|
||||||
IMineProcess getMineProcess();
|
IMineProcess getMineProcess();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The {@link IBuilderProcess} instance
|
||||||
|
* @see IBuilderProcess
|
||||||
|
*/
|
||||||
|
IBuilderProcess getBuilderProcess();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The {@link ICustomGoalProcess} instance
|
* @return The {@link ICustomGoalProcess} instance
|
||||||
* @see ICustomGoalProcess
|
* @see ICustomGoalProcess
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import baritone.api.utils.SettingsUtil;
|
|||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
@@ -58,7 +59,9 @@ public final class Settings {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* It doesn't actually take twenty ticks to place a block, this cost is so high
|
* It doesn't actually take twenty ticks to place a block, this cost is so high
|
||||||
* because we want to generally conserve blocks which might be limited
|
* because we want to generally conserve blocks which might be limited.
|
||||||
|
* <p>
|
||||||
|
* Decrease to make Baritone more often consider paths that would require placing blocks
|
||||||
*/
|
*/
|
||||||
public final Setting<Double> blockPlacementPenalty = new Setting<>(20D);
|
public final Setting<Double> blockPlacementPenalty = new Setting<>(20D);
|
||||||
|
|
||||||
@@ -91,6 +94,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> assumeWalkOnWater = new Setting<>(false);
|
public final Setting<Boolean> assumeWalkOnWater = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If you have Fire Resistance and Jesus then I guess you could turn this on lol
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> assumeWalkOnLava = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assume step functionality; don't jump on an Ascend.
|
* Assume step functionality; don't jump on an Ascend.
|
||||||
*/
|
*/
|
||||||
@@ -108,7 +116,7 @@ public final class Settings {
|
|||||||
/**
|
/**
|
||||||
* If true, parkour is allowed to make jumps when standing on blocks at the maximum height, so player feet is y=256
|
* If true, parkour is allowed to make jumps when standing on blocks at the maximum height, so player feet is y=256
|
||||||
* <p>
|
* <p>
|
||||||
* Defaults to false because this fails on constantiam
|
* Defaults to false because this fails on constantiam. Please let me know if this is ever disabled. Please.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> allowJumpAt256 = new Setting<>(false);
|
public final Setting<Boolean> allowJumpAt256 = new Setting<>(false);
|
||||||
|
|
||||||
@@ -121,13 +129,20 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> allowDiagonalDescend = new Setting<>(false);
|
public final Setting<Boolean> allowDiagonalDescend = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow mining the block directly beneath its feet
|
||||||
|
* <p>
|
||||||
|
* Turn this off to force it to make more staircases and less shafts
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> allowDownward = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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()
|
||||||
)));
|
)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -424,6 +439,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> renderGoal = new Setting<>(true);
|
public final Setting<Boolean> renderGoal = new Setting<>(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render selection boxes
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> renderSelectionBoxes = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ignore depth when rendering the goal
|
* Ignore depth when rendering the goal
|
||||||
*/
|
*/
|
||||||
@@ -485,10 +505,12 @@ public final class Settings {
|
|||||||
public final Setting<Boolean> sprintInWater = new Setting<>(true);
|
public final Setting<Boolean> sprintInWater = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When GetToBlockProcess fails to calculate a path, instead of just giving up, mark the closest instances
|
* When GetToBlockProcess or MineProcess fails to calculate a path, instead of just giving up, mark the closest instance
|
||||||
* of that block as "unreachable" and go towards the next closest
|
* of that block as "unreachable" and go towards the next closest. GetToBlock expands this seaarch to the whole "vein"; MineProcess does not.
|
||||||
|
* This is because MineProcess finds individual impossible blocks (like one block in a vein that has gravel on top then lava, so it can't break)
|
||||||
|
* Whereas GetToBlock should blacklist the whole "vein" if it can't get to any of them.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> blacklistOnGetToBlockFailure = new Setting<>(true);
|
public final Setting<Boolean> blacklistClosestOnFailure = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 😎 Render cached chunks as semitransparent. Doesn't work with OptiFine 😭 Rarely randomly crashes, see <a href="https://github.com/cabaletta/baritone/issues/327">this issue</a>.
|
* 😎 Render cached chunks as semitransparent. Doesn't work with OptiFine 😭 Rarely randomly crashes, see <a href="https://github.com/cabaletta/baritone/issues/327">this issue</a>.
|
||||||
@@ -535,11 +557,31 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> mineGoalUpdateInterval = new Setting<>(5);
|
public final Setting<Integer> mineGoalUpdateInterval = new Setting<>(5);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After finding this many instances of the target block in the cache, it will stop expanding outward the chunk search.
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> maxCachedWorldScanCount = new Setting<>(10);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When GetToBlock doesn't know any locations for the desired block, explore randomly instead of giving up.
|
* When GetToBlock doesn't know any locations for the desired block, explore randomly instead of giving up.
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> exploreForBlocks = new Setting<>(true);
|
public final Setting<Boolean> exploreForBlocks = new Setting<>(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Don't consider the next layer in builder until the current one is done
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> buildInLayers = new Setting<>(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How far to move before repeating the build. -1 for the size of the build in that axis. 0 to disable
|
||||||
|
*/
|
||||||
|
public final Setting<Integer> buildRepeatDistance=new Setting<>(0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* What direction te repeat the build in
|
||||||
|
*/
|
||||||
|
public final Setting<EnumFacing> buildRepeatDirection = new Setting<>(EnumFacing.NORTH);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* While mining, should it also consider dropped items of the correct type as a pathing destination (as well as ore blocks)?
|
* While mining, should it also consider dropped items of the correct type as a pathing destination (as well as ore blocks)?
|
||||||
*/
|
*/
|
||||||
@@ -565,6 +607,11 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> axisHeight = new Setting<>(120);
|
public final Setting<Integer> axisHeight = new Setting<>(120);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnect from the server upon arriving at your goal
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> disconnectOnArrival = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disallow MineBehavior from using X-Ray to see where the ores are. Turn this option on to force it to mine "legit"
|
* Disallow MineBehavior from using X-Ray to see where the ores are. Turn this option on to force it to mine "legit"
|
||||||
* where it will only mine an ore once it can actually see it, so it won't do or know anything that a normal player
|
* where it will only mine an ore once it can actually see it, so it won't do or know anything that a normal player
|
||||||
@@ -620,6 +667,13 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Integer> followRadius = new Setting<>(3);
|
public final Setting<Integer> followRadius = new Setting<>(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* true = exploration uses pythagorean distance to choose closest uncached chunk
|
||||||
|
* <p>
|
||||||
|
* false = exploration uses manhattan / taxicab distance to choose
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> exploreUsePythagorean = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cached chunks (regardless of if they're in RAM or saved to disk) expire and are deleted after this number of seconds
|
* Cached chunks (regardless of if they're in RAM or saved to disk) expire and are deleted after this number of seconds
|
||||||
* -1 to disable
|
* -1 to disable
|
||||||
@@ -647,7 +701,7 @@ 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};
|
||||||
*/
|
*/
|
||||||
public final Setting<Consumer<ITextComponent>> logger = new Setting<>(Minecraft.getMinecraft().ingameGUI.getChatGUI()::printChatMessage);
|
public final Setting<Consumer<ITextComponent>> logger = new Setting<>(Minecraft.getInstance().ingameGUI.getChatGUI()::printChatMessage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The color of the current path
|
* The color of the current path
|
||||||
@@ -716,9 +770,14 @@ public final class Settings {
|
|||||||
this.klass = (Class<T>) value.getClass();
|
this.klass = (Class<T>) value.getClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
/**
|
||||||
public final <K extends T> K get() {
|
* Deprecated! Please use .value directly instead
|
||||||
return (K) value;
|
*
|
||||||
|
* @return the current setting value
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public final T get() {
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getName() {
|
public final String getName() {
|
||||||
@@ -734,6 +793,9 @@ public final class Settings {
|
|||||||
return SettingsUtil.settingToString(this);
|
return SettingsUtil.settingToString(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset this setting to its default value
|
||||||
|
*/
|
||||||
public void reset() {
|
public void reset() {
|
||||||
value = defaultValue;
|
value = defaultValue;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -20,7 +20,7 @@ package baritone.api.cache;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@@ -68,7 +68,7 @@ public interface ICachedWorld {
|
|||||||
* @param maxRegionDistanceSq The maximum region distance, squared
|
* @param maxRegionDistanceSq The maximum region distance, squared
|
||||||
* @return The locations found that match the special block
|
* @return The locations found that match the special block
|
||||||
*/
|
*/
|
||||||
LinkedList<BlockPos> getLocationsOf(String block, int maximum, int centerX, int centerZ, int maxRegionDistanceSq);
|
ArrayList<BlockPos> getLocationsOf(String block, int maximum, int centerX, int centerZ, int maxRegionDistanceSq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reloads all of the cached regions in this world from disk. Anything that is not saved
|
* Reloads all of the cached regions in this world from disk. Anything that is not saved
|
||||||
|
|||||||
@@ -18,12 +18,11 @@
|
|||||||
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.entity.EntityPlayerSP;
|
||||||
import net.minecraft.client.gui.GuiGameOver;
|
import net.minecraft.client.gui.GuiGameOver;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
import net.minecraft.client.multiplayer.WorldClient;
|
||||||
import net.minecraft.client.settings.GameSettings;
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.Packet;
|
||||||
|
|
||||||
@@ -45,7 +44,7 @@ public interface IGameEventListener {
|
|||||||
* Run once per game tick from before and after the player rotation is sent to the server.
|
* Run once per game tick from before and after the player rotation is sent to the server.
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see EntityPlayerSP#onUpdate()
|
* @see EntityPlayerSP#tick()
|
||||||
*/
|
*/
|
||||||
void onPlayerUpdate(PlayerUpdateEvent event);
|
void onPlayerUpdate(PlayerUpdateEvent event);
|
||||||
|
|
||||||
@@ -61,14 +60,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 once per world render pass. Two passes are made when {@link GameSettings#anaglyph} is on.
|
* Runs once per world render pass.
|
||||||
* <p>
|
|
||||||
* <b>Note:</b> {@link GameSettings#anaglyph} has been removed in Minecraft 1.13
|
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
*/
|
*/
|
||||||
@@ -78,7 +74,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#loadWorld(WorldClient, GuiScreen)
|
||||||
*/
|
*/
|
||||||
void onWorldEvent(WorldEvent event);
|
void onWorldEvent(WorldEvent event);
|
||||||
|
|
||||||
@@ -87,7 +83,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);
|
||||||
|
|
||||||
@@ -96,7 +91,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);
|
||||||
|
|
||||||
@@ -110,10 +104,10 @@ public interface IGameEventListener {
|
|||||||
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 EntityPlayerSP#livingTick}
|
||||||
*
|
*
|
||||||
* @param event The event
|
* @param event The event
|
||||||
* @see EntityPlayerSP#onLivingUpdate()
|
* @see EntityPlayerSP#livingTick()
|
||||||
*/
|
*/
|
||||||
void onPlayerSprintState(SprintStateEvent event);
|
void onPlayerSprintState(SprintStateEvent event);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class GoalAxis implements Goal {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInGoal(int x, int y, int z) {
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
return y == BaritoneAPI.getSettings().axisHeight.get() && (x == 0 || z == 0 || Math.abs(x) == Math.abs(z));
|
return y == BaritoneAPI.getSettings().axisHeight.value && (x == 0 || z == 0 || Math.abs(x) == Math.abs(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -39,7 +39,7 @@ public class GoalAxis implements Goal {
|
|||||||
|
|
||||||
double flatAxisDistance = Math.min(x, Math.min(z, diff * SQRT_2_OVER_2));
|
double flatAxisDistance = Math.min(x, Math.min(z, diff * SQRT_2_OVER_2));
|
||||||
|
|
||||||
return flatAxisDistance * BaritoneAPI.getSettings().costHeuristic.get() + GoalYLevel.calculate(BaritoneAPI.getSettings().axisHeight.get(), y);
|
return flatAxisDistance * BaritoneAPI.getSettings().costHeuristic.value + GoalYLevel.calculate(BaritoneAPI.getSettings().axisHeight.value, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -30,17 +30,17 @@ public class GoalBlock implements Goal, IGoalRenderPos {
|
|||||||
/**
|
/**
|
||||||
* The X block position of this goal
|
* The X block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int x;
|
public final int x;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Y block position of this goal
|
* The Y block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int y;
|
public final int y;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Z block position of this goal
|
* The Z block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int z;
|
public final int z;
|
||||||
|
|
||||||
public GoalBlock(BlockPos pos) {
|
public GoalBlock(BlockPos pos) {
|
||||||
this(pos.getX(), pos.getY(), pos.getZ());
|
this(pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
*/
|
*/
|
||||||
public class GoalGetToBlock implements Goal, IGoalRenderPos {
|
public class GoalGetToBlock implements Goal, IGoalRenderPos {
|
||||||
|
|
||||||
private final int x;
|
public final int x;
|
||||||
private final int y;
|
public final int y;
|
||||||
private final int z;
|
public final int z;
|
||||||
|
|
||||||
public GoalGetToBlock(BlockPos pos) {
|
public GoalGetToBlock(BlockPos pos) {
|
||||||
this.x = pos.getX();
|
this.x = pos.getX();
|
||||||
|
|||||||
@@ -61,6 +61,6 @@ public class GoalNear implements Goal, IGoalRenderPos {
|
|||||||
", y=" + y +
|
", y=" + y +
|
||||||
", z=" + z +
|
", z=" + z +
|
||||||
", rangeSq=" + rangeSq +
|
", rangeSq=" + rangeSq +
|
||||||
'}';
|
"}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.pathing.goals;
|
||||||
|
|
||||||
|
import baritone.api.BaritoneAPI;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dig a tunnel in a certain direction, but if you have to deviate from the path, go back to where you started
|
||||||
|
*/
|
||||||
|
public class GoalStrictDirection implements Goal {
|
||||||
|
public final int x;
|
||||||
|
public final int y;
|
||||||
|
public final int z;
|
||||||
|
public final int dx;
|
||||||
|
public final int dz;
|
||||||
|
|
||||||
|
public GoalStrictDirection(BlockPos origin, EnumFacing direction) {
|
||||||
|
x = origin.getX();
|
||||||
|
y = origin.getY();
|
||||||
|
z = origin.getZ();
|
||||||
|
dx = direction.getXOffset();
|
||||||
|
dz = direction.getZOffset();
|
||||||
|
if (dx == 0 && dz == 0) {
|
||||||
|
throw new IllegalArgumentException(direction + "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double heuristic(int x, int y, int z) {
|
||||||
|
int distanceFromStartInDesiredDirection = (x - this.x) * dx + (z - this.z) * dz;
|
||||||
|
|
||||||
|
int distanceFromStartInIncorrectDirection = Math.abs((x - this.x) * dz) + Math.abs((z - this.z) * dx);
|
||||||
|
|
||||||
|
int verticalDistanceFromStart = Math.abs(y - this.y);
|
||||||
|
|
||||||
|
// we want heuristic to decrease as desiredDirection increases
|
||||||
|
double heuristic = -distanceFromStartInDesiredDirection * 100;
|
||||||
|
|
||||||
|
heuristic += distanceFromStartInIncorrectDirection * 1000;
|
||||||
|
heuristic += verticalDistanceFromStart * 1000;
|
||||||
|
return heuristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "GoalStrictDirection{" +
|
||||||
|
"x=" + x +
|
||||||
|
", y=" + y +
|
||||||
|
", z=" + z +
|
||||||
|
", dx=" + dx +
|
||||||
|
", dz=" + dz +
|
||||||
|
"}";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -80,7 +80,7 @@ public class GoalXZ implements Goal {
|
|||||||
diagonal = z;
|
diagonal = z;
|
||||||
}
|
}
|
||||||
diagonal *= SQRT_2;
|
diagonal *= SQRT_2;
|
||||||
return (diagonal + straight) * BaritoneAPI.getSettings().costHeuristic.get(); // 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(Vec3d origin, float yaw, double distance) {
|
||||||
|
|||||||
@@ -45,10 +45,6 @@ public interface IMovement {
|
|||||||
*/
|
*/
|
||||||
boolean safeToCancel();
|
boolean safeToCancel();
|
||||||
|
|
||||||
double recalculateCost();
|
|
||||||
|
|
||||||
double calculateCostWithoutCaching();
|
|
||||||
|
|
||||||
boolean calculatedWhileLoaded();
|
boolean calculatedWhileLoaded();
|
||||||
|
|
||||||
BetterBlockPos getSrc();
|
BetterBlockPos getSrc();
|
||||||
|
|||||||
@@ -35,6 +35,16 @@ import baritone.api.event.events.PathEvent;
|
|||||||
*/
|
*/
|
||||||
public interface IBaritoneProcess {
|
public interface IBaritoneProcess {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default priority. Most normal processes should have this value.
|
||||||
|
* <p>
|
||||||
|
* Some examples of processes that should have different values might include some kind of automated mob avoidance
|
||||||
|
* that would be temporary and would forcefully take control. Same for something that pauses pathing for auto eat, etc.
|
||||||
|
* <p>
|
||||||
|
* The value is -1 beacuse that's what Impact 4.5's beta auto walk returns and I want to tie with it.
|
||||||
|
*/
|
||||||
|
double DEFAULT_PRIORITY = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Would this process like to be in control?
|
* Would this process like to be in control?
|
||||||
*
|
*
|
||||||
@@ -82,12 +92,23 @@ public interface IBaritoneProcess {
|
|||||||
*
|
*
|
||||||
* @return A double representing the priority
|
* @return A double representing the priority
|
||||||
*/
|
*/
|
||||||
double priority();
|
default double priority() {
|
||||||
|
return DEFAULT_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a user-friendly name for this process. Suitable for a HUD.
|
* Returns a user-friendly name for this process. Suitable for a HUD.
|
||||||
*
|
*
|
||||||
* @return A display name that's suitable for a HUD
|
* @return A display name that's suitable for a HUD
|
||||||
*/
|
*/
|
||||||
String displayName();
|
default String displayName() {
|
||||||
|
if (!isActive()) {
|
||||||
|
// i love it when impcat's scuffed HUD calls displayName for inactive processes for 1 tick too long
|
||||||
|
// causing NPEs when the displayname relies on fields that become null when inactive
|
||||||
|
return "INACTIVE";
|
||||||
|
}
|
||||||
|
return displayName0();
|
||||||
|
}
|
||||||
|
|
||||||
|
String displayName0();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* 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.process;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Brady
|
||||||
|
* @since 1/15/2019
|
||||||
|
*/
|
||||||
|
public interface IBuilderProcess extends IBaritoneProcess {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests a build for the specified schematic, labeled as specified, with the specified origin.
|
||||||
|
*
|
||||||
|
* @param name A user-friendly name for the schematic
|
||||||
|
* @param schematic The object representation of the schematic
|
||||||
|
* @param origin The origin position of the schematic being built
|
||||||
|
*/
|
||||||
|
void build(String name, ISchematic schematic, Vec3i origin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests a build for the specified schematic, labeled as specified, with the specified origin.
|
||||||
|
*
|
||||||
|
* @param name A user-friendly name for the schematic
|
||||||
|
* @param schematic The file path of the schematic
|
||||||
|
* @param origin The origin position of the schematic being built
|
||||||
|
* @return Whether or not the schematic was able to load from file
|
||||||
|
*/
|
||||||
|
boolean build(String name, File schematic, Vec3i origin);
|
||||||
|
}
|
||||||
@@ -53,4 +53,9 @@ public class PathingCommand {
|
|||||||
this.goal = goal;
|
this.goal = goal;
|
||||||
this.commandType = commandType;
|
this.commandType = commandType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return commandType + " " + goal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public interface IPlayerContext {
|
|||||||
* @return The position of the highlighted block
|
* @return The position of the highlighted block
|
||||||
*/
|
*/
|
||||||
default Optional<BlockPos> getSelectedBlock() {
|
default Optional<BlockPos> getSelectedBlock() {
|
||||||
if (objectMouseOver() != null && objectMouseOver().typeOfHit == RayTraceResult.Type.BLOCK) {
|
if (objectMouseOver() != null && objectMouseOver().type == RayTraceResult.Type.BLOCK) {
|
||||||
return Optional.of(objectMouseOver().getBlockPos());
|
return Optional.of(objectMouseOver().getBlockPos());
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
@@ -83,8 +83,8 @@ public interface IPlayerContext {
|
|||||||
* @return The entity
|
* @return The entity
|
||||||
*/
|
*/
|
||||||
default Optional<Entity> getSelectedEntity() {
|
default Optional<Entity> getSelectedEntity() {
|
||||||
if (objectMouseOver() != null && objectMouseOver().typeOfHit == RayTraceResult.Type.ENTITY) {
|
if (objectMouseOver() != null && objectMouseOver().type == RayTraceResult.Type.ENTITY) {
|
||||||
return Optional.of(objectMouseOver().entityHit);
|
return Optional.of(objectMouseOver().entity);
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,4 +50,6 @@ public interface IPlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EnumActionResult processRightClickBlock(EntityPlayerSP player, World world, BlockPos pos, EnumFacing direction, Vec3d vec, EnumHand hand);
|
EnumActionResult processRightClickBlock(EntityPlayerSP player, World world, BlockPos pos, EnumFacing direction, Vec3d vec, EnumHand hand);
|
||||||
|
|
||||||
|
EnumActionResult processRightClick(EntityPlayerSP player, World world, EnumHand hand);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* 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.utils;
|
||||||
|
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic representation of a schematic. Provides the dimensions and
|
||||||
|
* the desired statefor a given position relative to the origin.
|
||||||
|
*
|
||||||
|
* @author leijurv
|
||||||
|
*/
|
||||||
|
public interface ISchematic {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the block at this coordinate matter to the schematic?
|
||||||
|
* <p>
|
||||||
|
* Normally just a check for if the coordinate is in the cube.
|
||||||
|
* <p>
|
||||||
|
* However, in the case of something like a map art, anything that's below the level of the map art doesn't matter,
|
||||||
|
* so this function should return false in that case. (i.e. it doesn't really have to be air below the art blocks)
|
||||||
|
*
|
||||||
|
* @param x The x position of the block, relative to the origin
|
||||||
|
* @param y The y position of the block, relative to the origin
|
||||||
|
* @param z The z position of the block, relative to the origin
|
||||||
|
* @return Whether or not the specified position is within the bounds of this schematic
|
||||||
|
*/
|
||||||
|
default boolean inSchematic(int x, int y, int z) {
|
||||||
|
return x >= 0 && x < widthX() && y >= 0 && y < heightY() && z >= 0 && z < lengthZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
default int size(EnumFacing.Axis axis) {
|
||||||
|
switch (axis) {
|
||||||
|
case X:
|
||||||
|
return widthX();
|
||||||
|
case Y:
|
||||||
|
return heightY();
|
||||||
|
case Z:
|
||||||
|
return lengthZ();
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException(axis + "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the desired block state at a given (X, Y, Z) position relative to the origin (0, 0, 0).
|
||||||
|
*
|
||||||
|
* @param x The x position of the block, relative to the origin
|
||||||
|
* @param y The y position of the block, relative to the origin
|
||||||
|
* @param z The z position of the block, relative to the origin
|
||||||
|
* @return The desired block state at the specified position
|
||||||
|
*/
|
||||||
|
IBlockState desiredState(int x, int y, int z);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The width (X axis length) of this schematic
|
||||||
|
*/
|
||||||
|
int widthX();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The height (Y axis length) of this schematic
|
||||||
|
*/
|
||||||
|
int heightY();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The length (Z axis length) of this schematic
|
||||||
|
*/
|
||||||
|
int lengthZ();
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.util.math.RayTraceFluidMode;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
@@ -40,13 +41,13 @@ public final class RayTraceUtils {
|
|||||||
* @return The calculated raytrace result
|
* @return The calculated raytrace result
|
||||||
*/
|
*/
|
||||||
public static RayTraceResult rayTraceTowards(Entity entity, Rotation rotation, double blockReachDistance) {
|
public static RayTraceResult rayTraceTowards(Entity entity, Rotation rotation, double blockReachDistance) {
|
||||||
Vec3d start = entity.getPositionEyes(1.0F);
|
Vec3d start = entity.getEyePosition(1.0F);
|
||||||
Vec3d direction = RotationUtils.calcVec3dFromRotation(rotation);
|
Vec3d direction = RotationUtils.calcVec3dFromRotation(rotation);
|
||||||
Vec3d end = start.add(
|
Vec3d end = start.add(
|
||||||
direction.x * blockReachDistance,
|
direction.x * blockReachDistance,
|
||||||
direction.y * blockReachDistance,
|
direction.y * blockReachDistance,
|
||||||
direction.z * blockReachDistance
|
direction.z * blockReachDistance
|
||||||
);
|
);
|
||||||
return entity.world.rayTraceBlocks(start, end, false, false, true);
|
return entity.world.rayTraceBlocks(start, end, RayTraceFluidMode.NEVER, false, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ public class Rotation {
|
|||||||
public Rotation(float yaw, float pitch) {
|
public Rotation(float yaw, float pitch) {
|
||||||
this.yaw = yaw;
|
this.yaw = yaw;
|
||||||
this.pitch = pitch;
|
this.pitch = pitch;
|
||||||
|
if (Float.isInfinite(yaw) || Float.isNaN(yaw) || Float.isInfinite(pitch) || Float.isNaN(pitch)) {
|
||||||
|
throw new IllegalStateException(yaw + " " + pitch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -23,7 +23,13 @@ import net.minecraft.block.BlockFire;
|
|||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.util.math.*;
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -174,11 +180,14 @@ public final class RotationUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
IBlockState state = entity.world.getBlockState(pos);
|
IBlockState state = entity.world.getBlockState(pos);
|
||||||
AxisAlignedBB aabb = state.getBoundingBox(entity.world, pos);
|
VoxelShape shape = state.getShape(entity.world, pos);
|
||||||
|
if (shape.isEmpty()) {
|
||||||
|
shape = VoxelShapes.fullCube();
|
||||||
|
}
|
||||||
for (Vec3d sideOffset : BLOCK_SIDE_MULTIPLIERS) {
|
for (Vec3d sideOffset : BLOCK_SIDE_MULTIPLIERS) {
|
||||||
double xDiff = aabb.minX * sideOffset.x + aabb.maxX * (1 - sideOffset.x);
|
double xDiff = shape.getStart(EnumFacing.Axis.X) * sideOffset.x + shape.getEnd(EnumFacing.Axis.X) * (1 - sideOffset.x);
|
||||||
double yDiff = aabb.minY * sideOffset.y + aabb.maxY * (1 - sideOffset.y);
|
double yDiff = shape.getStart(EnumFacing.Axis.Y) * sideOffset.y + shape.getEnd(EnumFacing.Axis.Y) * (1 - sideOffset.y);
|
||||||
double zDiff = aabb.minZ * sideOffset.z + aabb.maxZ * (1 - sideOffset.z);
|
double zDiff = shape.getStart(EnumFacing.Axis.Z) * sideOffset.z + shape.getEnd(EnumFacing.Axis.Z) * (1 - sideOffset.z);
|
||||||
possibleRotation = reachableOffset(entity, pos, new Vec3d(pos).add(xDiff, yDiff, zDiff), blockReachDistance);
|
possibleRotation = reachableOffset(entity, pos, new Vec3d(pos).add(xDiff, yDiff, zDiff), blockReachDistance);
|
||||||
if (possibleRotation.isPresent()) {
|
if (possibleRotation.isPresent()) {
|
||||||
return possibleRotation;
|
return possibleRotation;
|
||||||
@@ -199,10 +208,10 @@ public final class RotationUtils {
|
|||||||
* @return The optional rotation
|
* @return The optional rotation
|
||||||
*/
|
*/
|
||||||
public static Optional<Rotation> reachableOffset(Entity entity, BlockPos pos, Vec3d offsetPos, double blockReachDistance) {
|
public static Optional<Rotation> reachableOffset(Entity entity, BlockPos pos, Vec3d offsetPos, double blockReachDistance) {
|
||||||
Rotation rotation = calcRotationFromVec3d(entity.getPositionEyes(1.0F), offsetPos, new Rotation(entity.rotationYaw, entity.rotationPitch));
|
Rotation rotation = calcRotationFromVec3d(entity.getEyePosition(1.0F), offsetPos, new Rotation(entity.rotationYaw, entity.rotationPitch));
|
||||||
RayTraceResult result = RayTraceUtils.rayTraceTowards(entity, rotation, blockReachDistance);
|
RayTraceResult result = RayTraceUtils.rayTraceTowards(entity, rotation, blockReachDistance);
|
||||||
//System.out.println(result);
|
//System.out.println(result);
|
||||||
if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK) {
|
if (result != null && result.type == RayTraceResult.Type.BLOCK) {
|
||||||
if (result.getBlockPos().equals(pos)) {
|
if (result.getBlockPos().equals(pos)) {
|
||||||
return Optional.of(rotation);
|
return Optional.of(rotation);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,11 @@
|
|||||||
package baritone.api.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import baritone.api.Settings;
|
import baritone.api.Settings;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.registry.IRegistry;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@@ -36,11 +39,9 @@ import java.util.regex.Pattern;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static net.minecraft.client.Minecraft.getMinecraft;
|
|
||||||
|
|
||||||
public class SettingsUtil {
|
public class SettingsUtil {
|
||||||
|
|
||||||
private static final Path SETTINGS_PATH = getMinecraft().gameDir.toPath().resolve("baritone").resolve("settings.txt");
|
private static final Path SETTINGS_PATH = Minecraft.getInstance().gameDir.toPath().resolve("baritone").resolve("settings.txt");
|
||||||
private static final Pattern SETTING_PATTERN = Pattern.compile("^(?<setting>[^ ]+) +(?<value>[^ ]+)"); // 2 words separated by spaces
|
private static final Pattern SETTING_PATTERN = Pattern.compile("^(?<setting>[^ ]+) +(?<value>[^ ]+)"); // 2 words separated by spaces
|
||||||
|
|
||||||
private static final Map<Class<?>, SettingsIO> map;
|
private static final Map<Class<?>, SettingsIO> map;
|
||||||
@@ -99,7 +100,7 @@ public class SettingsUtil {
|
|||||||
public static List<Settings.Setting> modifiedSettings(Settings settings) {
|
public static List<Settings.Setting> modifiedSettings(Settings settings) {
|
||||||
List<Settings.Setting> modified = new ArrayList<>();
|
List<Settings.Setting> modified = new ArrayList<>();
|
||||||
for (Settings.Setting setting : settings.allSettings) {
|
for (Settings.Setting setting : settings.allSettings) {
|
||||||
if (setting.get() == null) {
|
if (setting.value == null) {
|
||||||
System.out.println("NULL SETTING?" + setting.getName());
|
System.out.println("NULL SETTING?" + setting.getName());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -122,7 +123,7 @@ public class SettingsUtil {
|
|||||||
if (io == null) {
|
if (io == null) {
|
||||||
throw new IllegalStateException("Missing " + setting.getValueClass() + " " + setting.getName());
|
throw new IllegalStateException("Missing " + setting.getValueClass() + " " + setting.getName());
|
||||||
}
|
}
|
||||||
return setting.getName() + " " + io.toString.apply(setting.get());
|
return setting.getName() + " " + io.toString.apply(setting.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void parseAndApply(Settings settings, String settingName, String settingValue) throws IllegalStateException, NumberFormatException {
|
public static void parseAndApply(Settings settings, String settingName, String settingValue) throws IllegalStateException, NumberFormatException {
|
||||||
@@ -146,8 +147,9 @@ public class SettingsUtil {
|
|||||||
FLOAT(Float.class, Float::parseFloat),
|
FLOAT(Float.class, Float::parseFloat),
|
||||||
LONG(Long.class, Long::parseLong),
|
LONG(Long.class, Long::parseLong),
|
||||||
|
|
||||||
ITEM_LIST(ArrayList.class, str -> Stream.of(str.split(",")).map(Item::getByNameOrId).collect(Collectors.toCollection(ArrayList::new)), list -> ((ArrayList<Item>) list).stream().map(Item.REGISTRY::getNameForObject).map(ResourceLocation::toString).collect(Collectors.joining(","))),
|
ITEM_LIST(ArrayList.class, str -> Stream.of(str.split(",")).map(ResourceLocation::new).map(IRegistry.ITEM::get).collect(Collectors.toCollection(ArrayList::new)), list -> ((ArrayList<Item>) list).stream().map(IRegistry.ITEM::getKey).map(ResourceLocation::toString).collect(Collectors.joining(","))),
|
||||||
COLOR(Color.class, str -> new Color(Integer.parseInt(str.split(",")[0]), Integer.parseInt(str.split(",")[1]), Integer.parseInt(str.split(",")[2])), color -> color.getRed() + "," + color.getGreen() + "," + color.getBlue());
|
COLOR(Color.class, str -> new Color(Integer.parseInt(str.split(",")[0]), Integer.parseInt(str.split(",")[1]), Integer.parseInt(str.split(",")[2])), color -> color.getRed() + "," + color.getGreen() + "," + color.getBlue()),
|
||||||
|
ENUMFACING(EnumFacing.class, EnumFacing::byName);
|
||||||
|
|
||||||
|
|
||||||
Class<?> klass;
|
Class<?> klass;
|
||||||
|
|||||||
@@ -20,9 +20,10 @@ package baritone.api.utils;
|
|||||||
import net.minecraft.block.BlockFire;
|
import net.minecraft.block.BlockFire;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,10 +44,16 @@ public final class VecUtils {
|
|||||||
*/
|
*/
|
||||||
public static Vec3d calculateBlockCenter(World world, BlockPos pos) {
|
public static Vec3d calculateBlockCenter(World world, BlockPos pos) {
|
||||||
IBlockState b = world.getBlockState(pos);
|
IBlockState b = world.getBlockState(pos);
|
||||||
AxisAlignedBB bbox = b.getBoundingBox(world, pos);
|
VoxelShape shape = b.getCollisionShape(world, pos);
|
||||||
double xDiff = (bbox.minX + bbox.maxX) / 2;
|
if (shape.isEmpty()) {
|
||||||
double yDiff = (bbox.minY + bbox.maxY) / 2;
|
return getBlockPosCenter(pos);
|
||||||
double zDiff = (bbox.minZ + bbox.maxZ) / 2;
|
}
|
||||||
|
double xDiff = (shape.getStart(EnumFacing.Axis.X) + shape.getEnd(EnumFacing.Axis.X)) / 2;
|
||||||
|
double yDiff = (shape.getStart(EnumFacing.Axis.Y) + shape.getEnd(EnumFacing.Axis.Y)) / 2;
|
||||||
|
double zDiff = (shape.getStart(EnumFacing.Axis.Z) + shape.getEnd(EnumFacing.Axis.Z)) / 2;
|
||||||
|
if (Double.isNaN(xDiff) || Double.isNaN(yDiff) || Double.isNaN(zDiff)) {
|
||||||
|
throw new IllegalStateException(b + " " + pos + " " + shape);
|
||||||
|
}
|
||||||
if (b.getBlock() instanceof BlockFire) {//look at bottom of fire when putting it out
|
if (b.getBlock() instanceof BlockFire) {//look at bottom of fire when putting it out
|
||||||
yDiff = 0;
|
yDiff = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,15 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api.utils.input;
|
package baritone.api.utils.input;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.settings.GameSettings;
|
|
||||||
import net.minecraft.client.settings.KeyBinding;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link Enum} representing the inputs that control the player's
|
* An {@link Enum} representing the inputs that control the player's
|
||||||
* behavior. This includes moving, interacting with blocks, jumping,
|
* behavior. This includes moving, interacting with blocks, jumping,
|
||||||
@@ -36,84 +27,45 @@ public enum Input {
|
|||||||
/**
|
/**
|
||||||
* The move forward input
|
* The move forward input
|
||||||
*/
|
*/
|
||||||
MOVE_FORWARD(s -> s.keyBindForward),
|
MOVE_FORWARD,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The move back input
|
* The move back input
|
||||||
*/
|
*/
|
||||||
MOVE_BACK(s -> s.keyBindBack),
|
MOVE_BACK,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The move left input
|
* The move left input
|
||||||
*/
|
*/
|
||||||
MOVE_LEFT(s -> s.keyBindLeft),
|
MOVE_LEFT,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The move right input
|
* The move right input
|
||||||
*/
|
*/
|
||||||
MOVE_RIGHT(s -> s.keyBindRight),
|
MOVE_RIGHT,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attack input
|
* The attack input
|
||||||
*/
|
*/
|
||||||
CLICK_LEFT(s -> s.keyBindAttack),
|
CLICK_LEFT,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The use item input
|
* The use item input
|
||||||
*/
|
*/
|
||||||
CLICK_RIGHT(s -> s.keyBindUseItem),
|
CLICK_RIGHT,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The jump input
|
* The jump input
|
||||||
*/
|
*/
|
||||||
JUMP(s -> s.keyBindJump),
|
JUMP,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sneak input
|
* The sneak input
|
||||||
*/
|
*/
|
||||||
SNEAK(s -> s.keyBindSneak),
|
SNEAK,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sprint input
|
* The sprint input
|
||||||
*/
|
*/
|
||||||
SPRINT(s -> s.keyBindSprint);
|
SPRINT
|
||||||
|
|
||||||
/**
|
|
||||||
* Map of {@link KeyBinding} to {@link Input}. Values should be queried through {@link #getInputForBind(KeyBinding)}
|
|
||||||
*/
|
|
||||||
private static final Map<KeyBinding, Input> bindToInputMap = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The actual game {@link KeyBinding} being forced.
|
|
||||||
*/
|
|
||||||
private final KeyBinding keyBinding;
|
|
||||||
|
|
||||||
Input(Function<GameSettings, KeyBinding> keyBindingMapper) {
|
|
||||||
/*
|
|
||||||
|
|
||||||
Here, a Function is used because referring to a static field in this enum for the game instance,
|
|
||||||
as it was before, wouldn't be possible in an Enum constructor unless the static field was in an
|
|
||||||
interface that this class implemented. (Helper acted as this interface) I didn't feel like making
|
|
||||||
an interface with a game instance field just to not have to do this.
|
|
||||||
|
|
||||||
*/
|
|
||||||
this.keyBinding = keyBindingMapper.apply(Minecraft.getMinecraft().gameSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The actual game {@link KeyBinding} being forced.
|
|
||||||
*/
|
|
||||||
public final KeyBinding getKeyBinding() {
|
|
||||||
return this.keyBinding;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the {@link Input} constant that is associated with the specified {@link KeyBinding}.
|
|
||||||
*
|
|
||||||
* @param binding The {@link KeyBinding} to find the associated {@link Input} for
|
|
||||||
* @return The {@link Input} associated with the specified {@link KeyBinding}
|
|
||||||
*/
|
|
||||||
public static Input getInputForBind(KeyBinding binding) {
|
|
||||||
return bindToInputMap.computeIfAbsent(binding, b -> Arrays.stream(values()).filter(input -> input.keyBinding == b).findFirst().orElse(null));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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.launch;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.mojang.authlib.Agent;
|
||||||
|
import com.mojang.authlib.exceptions.AuthenticationException;
|
||||||
|
import com.mojang.authlib.properties.PropertyMap;
|
||||||
|
import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
|
||||||
|
import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
|
||||||
|
import net.minecraft.launchwrapper.Launch;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Based on GradleStart from ForgeGradle 2.3
|
||||||
|
*
|
||||||
|
* @author Brady
|
||||||
|
* @since 3/11/2019
|
||||||
|
*/
|
||||||
|
public class LaunchTesting {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Map<String, String> arguments = new HashMap<>();
|
||||||
|
|
||||||
|
hackNatives();
|
||||||
|
arguments.put("version", "BaritownedDeveloperEnvironment");
|
||||||
|
arguments.put("assetIndex", System.getenv("assetIndex"));
|
||||||
|
arguments.put("assetsDir", System.getenv().getOrDefault("assetDirectory", "assets"));
|
||||||
|
arguments.put("accessToken", "FML");
|
||||||
|
arguments.put("userProperties", "{}");
|
||||||
|
arguments.put("tweakClass", System.getenv("tweakClass"));
|
||||||
|
String password = System.getenv("password");
|
||||||
|
if (password != null && !password.isEmpty()) {
|
||||||
|
attemptLogin(arguments, System.getenv("username"), System.getenv("password"));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> argsArray = new ArrayList<>();
|
||||||
|
arguments.forEach((k, v) -> {
|
||||||
|
argsArray.add("--" + k);
|
||||||
|
argsArray.add(v);
|
||||||
|
});
|
||||||
|
|
||||||
|
Launch.main(argsArray.toArray(new String[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void hackNatives() {
|
||||||
|
String paths = System.getProperty("java.library.path");
|
||||||
|
String nativesDir = System.getenv().get("nativesDirectory");
|
||||||
|
|
||||||
|
if (Strings.isNullOrEmpty(paths))
|
||||||
|
paths = nativesDir;
|
||||||
|
else
|
||||||
|
paths += File.pathSeparator + nativesDir;
|
||||||
|
|
||||||
|
System.setProperty("java.library.path", paths);
|
||||||
|
|
||||||
|
// hack the classloader now.
|
||||||
|
try {
|
||||||
|
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
|
||||||
|
sysPathsField.setAccessible(true);
|
||||||
|
sysPathsField.set(null, null);
|
||||||
|
} catch (Throwable ignored) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void attemptLogin(Map<String, String> argMap, String username, String password) {
|
||||||
|
YggdrasilUserAuthentication auth = (YggdrasilUserAuthentication) (new YggdrasilAuthenticationService(Proxy.NO_PROXY, "1")).createUserAuthentication(Agent.MINECRAFT);
|
||||||
|
auth.setUsername(username);
|
||||||
|
auth.setPassword(password);
|
||||||
|
|
||||||
|
try {
|
||||||
|
auth.logIn();
|
||||||
|
} catch (AuthenticationException var4) {
|
||||||
|
throw new RuntimeException(var4);
|
||||||
|
}
|
||||||
|
|
||||||
|
argMap.put("accessToken", auth.getAuthenticatedToken());
|
||||||
|
argMap.put("uuid", auth.getSelectedProfile().getId().toString().replace("-", ""));
|
||||||
|
argMap.put("username", auth.getSelectedProfile().getName());
|
||||||
|
argMap.put("userType", auth.getUserType().getName());
|
||||||
|
argMap.put("userProperties", (new GsonBuilder()).registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(auth.getUserProperties()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,6 +29,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
import static org.lwjgl.opengl.GL11.*;
|
||||||
|
import static org.lwjgl.opengl.GL14.*;
|
||||||
|
|
||||||
@Mixin(ChunkRenderContainer.class)
|
@Mixin(ChunkRenderContainer.class)
|
||||||
public class MixinChunkRenderContainer {
|
public class MixinChunkRenderContainer {
|
||||||
@@ -41,11 +42,11 @@ public class MixinChunkRenderContainer {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private BlockPos getPosition(RenderChunk renderChunkIn) {
|
private BlockPos getPosition(RenderChunk renderChunkIn) {
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null && Minecraft.getMinecraft().world.getChunk(renderChunkIn.getPosition()).isEmpty()) {
|
if (Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null && Minecraft.getInstance().world.getChunk(renderChunkIn.getPosition()).isEmpty()) {
|
||||||
GlStateManager.enableAlpha();
|
GlStateManager.enableAlphaTest();
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GL14.glBlendColor(0, 0, 0, Baritone.settings().cachedChunksOpacity.get());
|
GL14.glBlendColor(0, 0, 0, Baritone.settings().cachedChunksOpacity.value);
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
|
GlStateManager.blendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
|
||||||
}
|
}
|
||||||
return renderChunkIn.getPosition();
|
return renderChunkIn.getPosition();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public abstract class MixinChunkRenderWorker {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private boolean isChunkExisting(ChunkRenderWorker worker, BlockPos pos, World world) {
|
private boolean isChunkExisting(ChunkRenderWorker worker, BlockPos pos, World world) {
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null) {
|
if (Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null) {
|
||||||
Baritone baritone = (Baritone) BaritoneAPI.getProvider().getPrimaryBaritone();
|
Baritone baritone = (Baritone) BaritoneAPI.getProvider().getPrimaryBaritone();
|
||||||
IPlayerContext ctx = baritone.getPlayerContext();
|
IPlayerContext ctx = baritone.getPlayerContext();
|
||||||
if (ctx.player() != null && ctx.world() != null && baritone.bsi != null) {
|
if (ctx.player() != null && ctx.world() != null && baritone.bsi != null) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import baritone.api.event.events.RotationMoveEvent;
|
|||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -44,9 +45,8 @@ public abstract class MixinEntityLivingBase extends Entity {
|
|||||||
*/
|
*/
|
||||||
private RotationMoveEvent jumpRotationEvent;
|
private RotationMoveEvent jumpRotationEvent;
|
||||||
|
|
||||||
public MixinEntityLivingBase(World worldIn, RotationMoveEvent jumpRotationEvent) {
|
public MixinEntityLivingBase(EntityType<?> entityTypeIn, World worldIn) {
|
||||||
super(worldIn);
|
super(entityTypeIn, worldIn);
|
||||||
this.jumpRotationEvent = jumpRotationEvent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
|
|||||||
@@ -58,10 +58,10 @@ public class MixinEntityPlayerSP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "onUpdate",
|
method = "tick",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/client/entity/EntityPlayerSP.isRiding()Z",
|
target = "net/minecraft/client/entity/EntityPlayerSP.isPassenger()Z",
|
||||||
shift = At.Shift.BY,
|
shift = At.Shift.BY,
|
||||||
by = -3
|
by = -3
|
||||||
)
|
)
|
||||||
@@ -74,7 +74,7 @@ public class MixinEntityPlayerSP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "onUpdate",
|
method = "tick",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/client/entity/EntityPlayerSP.onUpdateWalkingPlayer()V",
|
target = "net/minecraft/client/entity/EntityPlayerSP.onUpdateWalkingPlayer()V",
|
||||||
@@ -90,7 +90,7 @@ public class MixinEntityPlayerSP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(
|
@Redirect(
|
||||||
method = "onLivingUpdate",
|
method = "livingTick",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "FIELD",
|
value = "FIELD",
|
||||||
target = "net/minecraft/entity/player/PlayerCapabilities.allowFlying:Z"
|
target = "net/minecraft/entity/player/PlayerCapabilities.allowFlying:Z"
|
||||||
@@ -105,7 +105,7 @@ public class MixinEntityPlayerSP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(
|
@Redirect(
|
||||||
method = "onLivingUpdate",
|
method = "livingTick",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/client/settings/KeyBinding.isKeyDown()Z"
|
target = "net/minecraft/client/settings/KeyBinding.isKeyDown()Z"
|
||||||
|
|||||||
+5
-5
@@ -20,24 +20,24 @@ package baritone.launch.mixins;
|
|||||||
import baritone.api.BaritoneAPI;
|
import baritone.api.BaritoneAPI;
|
||||||
import baritone.api.IBaritone;
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.event.events.RenderEvent;
|
import baritone.api.event.events.RenderEvent;
|
||||||
import net.minecraft.client.renderer.EntityRenderer;
|
import net.minecraft.client.renderer.GameRenderer;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(EntityRenderer.class)
|
@Mixin(GameRenderer.class)
|
||||||
public class MixinEntityRenderer {
|
public class MixinGameRenderer {
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "renderWorldPass",
|
method = "updateCameraAndRender(FJ)V",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE_STRING",
|
value = "INVOKE_STRING",
|
||||||
target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V",
|
target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V",
|
||||||
args = {"ldc=hand"}
|
args = {"ldc=hand"}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
private void renderWorldPass(int pass, float partialTicks, long finishTimeNano, CallbackInfo ci) {
|
private void renderWorldPass(float partialTicks, long finishTimeNano, CallbackInfo ci) {
|
||||||
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
||||||
ibaritone.getGameEventHandler().onRenderPass(new RenderEvent(partialTicks));
|
ibaritone.getGameEventHandler().onRenderPass(new RenderEvent(partialTicks));
|
||||||
}
|
}
|
||||||
@@ -97,10 +97,10 @@ public class MixinMinecraft {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V",
|
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/gui/GuiScreen;)V",
|
||||||
at = @At("HEAD")
|
at = @At("HEAD")
|
||||||
)
|
)
|
||||||
private void preLoadWorld(WorldClient world, String loadingMessage, CallbackInfo ci) {
|
private void preLoadWorld(WorldClient world, GuiScreen loadingScreen, CallbackInfo ci) {
|
||||||
// If we're unloading the world but one doesn't exist, ignore it
|
// If we're unloading the world but one doesn't exist, ignore it
|
||||||
if (this.world == null && world == null) {
|
if (this.world == null && world == null) {
|
||||||
return;
|
return;
|
||||||
@@ -117,10 +117,10 @@ public class MixinMinecraft {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V",
|
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/gui/GuiScreen;)V",
|
||||||
at = @At("RETURN")
|
at = @At("RETURN")
|
||||||
)
|
)
|
||||||
private void postLoadWorld(WorldClient world, String loadingMessage, CallbackInfo ci) {
|
private void postLoadWorld(WorldClient world, GuiScreen loadingScreen, CallbackInfo ci) {
|
||||||
// still fire event for both null, as that means we've just finished exiting a world
|
// still fire event for both null, as that means we've just finished exiting a world
|
||||||
|
|
||||||
// mc.world changing is only the primary baritone
|
// mc.world changing is only the primary baritone
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import baritone.api.event.events.type.EventState;
|
|||||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||||
import net.minecraft.network.play.server.SPacketChunkData;
|
import net.minecraft.network.play.server.SPacketChunkData;
|
||||||
import net.minecraft.network.play.server.SPacketCombatEvent;
|
import net.minecraft.network.play.server.SPacketCombatEvent;
|
||||||
|
import net.minecraft.network.play.server.SPacketUnloadChunk;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
@@ -40,7 +41,7 @@ public class MixinNetHandlerPlayClient {
|
|||||||
method = "handleChunkData",
|
method = "handleChunkData",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/world/chunk/Chunk.read(Lnet/minecraft/network/PacketBuffer;IZ)V"
|
target = "net/minecraft/client/multiplayer/ChunkProviderClient.func_212474_a(IILnet/minecraft/network/PacketBuffer;IZ)Lnet/minecraft/world/chunk/Chunk;"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
private void preRead(SPacketChunkData packetIn, CallbackInfo ci) {
|
private void preRead(SPacketChunkData packetIn, CallbackInfo ci) {
|
||||||
@@ -77,6 +78,34 @@ public class MixinNetHandlerPlayClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "processChunkUnload",
|
||||||
|
at = @At("HEAD")
|
||||||
|
)
|
||||||
|
private void preChunkUnload(SPacketUnloadChunk packet, CallbackInfo ci) {
|
||||||
|
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
||||||
|
if (ibaritone.getPlayerContext().player().connection == (NetHandlerPlayClient) (Object) this) {
|
||||||
|
ibaritone.getGameEventHandler().onChunkEvent(
|
||||||
|
new ChunkEvent(EventState.PRE, ChunkEvent.Type.UNLOAD, packet.getX(), packet.getZ())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "processChunkUnload",
|
||||||
|
at = @At("RETURN")
|
||||||
|
)
|
||||||
|
private void postChunkUnload(SPacketUnloadChunk packet, CallbackInfo ci) {
|
||||||
|
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
||||||
|
if (ibaritone.getPlayerContext().player().connection == (NetHandlerPlayClient) (Object) this) {
|
||||||
|
ibaritone.getGameEventHandler().onChunkEvent(
|
||||||
|
new ChunkEvent(EventState.POST, ChunkEvent.Type.UNLOAD, packet.getX(), packet.getZ())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "handleCombatEvent",
|
method = "handleCombatEvent",
|
||||||
at = @At(
|
at = @At(
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class MixinNetworkManager {
|
|||||||
method = "dispatchPacket",
|
method = "dispatchPacket",
|
||||||
at = @At("HEAD")
|
at = @At("HEAD")
|
||||||
)
|
)
|
||||||
private void preDispatchPacket(Packet<?> inPacket, final GenericFutureListener<? extends Future<? super Void>>[] futureListeners, CallbackInfo ci) {
|
private void preDispatchPacket(Packet<?> inPacket, final GenericFutureListener<? extends Future<? super Void>> futureListeners, CallbackInfo ci) {
|
||||||
if (this.direction != EnumPacketDirection.CLIENTBOUND) {
|
if (this.direction != EnumPacketDirection.CLIENTBOUND) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ public class MixinNetworkManager {
|
|||||||
method = "dispatchPacket",
|
method = "dispatchPacket",
|
||||||
at = @At("RETURN")
|
at = @At("RETURN")
|
||||||
)
|
)
|
||||||
private void postDispatchPacket(Packet<?> inPacket, final GenericFutureListener<? extends Future<? super Void>>[] futureListeners, CallbackInfo ci) {
|
private void postDispatchPacket(Packet<?> inPacket, final GenericFutureListener<? extends Future<? super Void>> futureListeners, CallbackInfo ci) {
|
||||||
if (this.direction != EnumPacketDirection.CLIENTBOUND) {
|
if (this.direction != EnumPacketDirection.CLIENTBOUND) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -85,7 +85,7 @@ public class MixinNetworkManager {
|
|||||||
method = "channelRead0",
|
method = "channelRead0",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/network/Packet.processPacket(Lnet/minecraft/network/INetHandler;)V"
|
target = "net/minecraft/network/NetworkManager.processPacket(Lnet/minecraft/network/Packet;Lnet/minecraft/network/INetHandler;)V"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
private void preProcessPacket(ChannelHandlerContext context, Packet<?> packet, CallbackInfo ci) {
|
private void preProcessPacket(ChannelHandlerContext context, Packet<?> packet, CallbackInfo ci) {
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ import baritone.api.utils.IPlayerContext;
|
|||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.chunk.RenderChunk;
|
import net.minecraft.client.renderer.chunk.RenderChunk;
|
||||||
|
import net.minecraft.client.renderer.chunk.RenderChunkCache;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.ChunkCache;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -40,43 +40,11 @@ public class MixinRenderChunk {
|
|||||||
method = "rebuildChunk",
|
method = "rebuildChunk",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "net/minecraft/world/ChunkCache.isEmpty()Z"
|
target = "net/minecraft/client/renderer/chunk/RenderChunkCache.getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/state/IBlockState;"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
private boolean isEmpty(ChunkCache chunkCache) {
|
private IBlockState getBlockState(RenderChunkCache chunkCache, BlockPos pos) {
|
||||||
if (!chunkCache.isEmpty()) {
|
if (Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null) {
|
|
||||||
Baritone baritone = (Baritone) BaritoneAPI.getProvider().getPrimaryBaritone();
|
|
||||||
IPlayerContext ctx = baritone.getPlayerContext();
|
|
||||||
if (ctx.player() != null && ctx.world() != null && baritone.bsi != null) {
|
|
||||||
BlockPos position = ((RenderChunk) (Object) this).getPosition();
|
|
||||||
// RenderChunk extends from -1,-1,-1 to +16,+16,+16
|
|
||||||
// then the constructor of ChunkCache extends it one more (presumably to get things like the connected status of fences? idk)
|
|
||||||
// so if ANY of the adjacent chunks are loaded, we are unempty
|
|
||||||
for (int dx = -1; dx <= 1; dx++) {
|
|
||||||
for (int dz = -1; dz <= 1; dz++) {
|
|
||||||
if (baritone.bsi.isLoaded(16 * dx + position.getX(), 16 * dz + position.getZ())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(
|
|
||||||
method = "rebuildChunk",
|
|
||||||
at = @At(
|
|
||||||
value = "INVOKE",
|
|
||||||
target = "net/minecraft/world/ChunkCache.getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/state/IBlockState;"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
private IBlockState getBlockState(ChunkCache chunkCache, BlockPos pos) {
|
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null) {
|
|
||||||
Baritone baritone = (Baritone) BaritoneAPI.getProvider().getPrimaryBaritone();
|
Baritone baritone = (Baritone) BaritoneAPI.getProvider().getPrimaryBaritone();
|
||||||
IPlayerContext ctx = baritone.getPlayerContext();
|
IPlayerContext ctx = baritone.getPlayerContext();
|
||||||
if (ctx.player() != null && ctx.world() != null && baritone.bsi != null) {
|
if (ctx.player() != null && ctx.world() != null && baritone.bsi != null) {
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* 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.launch.mixins;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.chunk.RenderChunkCache;
|
||||||
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
||||||
|
@Mixin(RenderChunkCache.class)
|
||||||
|
public class MixinRenderChunkCache {
|
||||||
|
|
||||||
|
@Redirect(
|
||||||
|
method = "generateCache",
|
||||||
|
at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "net/minecraft/world/chunk/Chunk.isEmptyBetween(II)Z"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
private static boolean isEmpty(Chunk chunk, int yStart, int yEnd) {
|
||||||
|
if (!chunk.isEmptyBetween(yStart, yEnd)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (chunk.isEmpty() && Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -38,9 +38,9 @@ public class MixinRenderList {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private void popMatrix() {
|
private void popMatrix() {
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null) {
|
if (Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null) {
|
||||||
// reset the blend func to normal (not dependent on constant alpha)
|
// reset the blend func to normal (not dependent on constant alpha)
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
}
|
}
|
||||||
GlStateManager.popMatrix();
|
GlStateManager.popMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ public class MixinVboRenderList {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
private void popMatrix() {
|
private void popMatrix() {
|
||||||
if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().getIntegratedServer() == null) {
|
if (Baritone.settings().renderCachedChunks.value && Minecraft.getInstance().getIntegratedServer() == null) {
|
||||||
// reset the blend func to normal (not dependent on constant alpha)
|
// reset the blend func to normal (not dependent on constant alpha)
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
}
|
}
|
||||||
GlStateManager.popMatrix();
|
GlStateManager.popMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,75 +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.launch.mixins;
|
|
||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
|
||||||
import baritone.api.IBaritone;
|
|
||||||
import baritone.api.event.events.ChunkEvent;
|
|
||||||
import baritone.api.event.events.type.EventState;
|
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Brady
|
|
||||||
* @since 8/2/2018
|
|
||||||
*/
|
|
||||||
@Mixin(WorldClient.class)
|
|
||||||
public class MixinWorldClient {
|
|
||||||
|
|
||||||
@Inject(
|
|
||||||
method = "doPreChunk",
|
|
||||||
at = @At("HEAD")
|
|
||||||
)
|
|
||||||
private void preDoPreChunk(int chunkX, int chunkZ, boolean loadChunk, CallbackInfo ci) {
|
|
||||||
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
|
||||||
if (ibaritone.getPlayerContext().world() == (WorldClient) (Object) this) {
|
|
||||||
ibaritone.getGameEventHandler().onChunkEvent(
|
|
||||||
new ChunkEvent(
|
|
||||||
EventState.PRE,
|
|
||||||
loadChunk ? ChunkEvent.Type.LOAD : ChunkEvent.Type.UNLOAD,
|
|
||||||
chunkX,
|
|
||||||
chunkZ
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(
|
|
||||||
method = "doPreChunk",
|
|
||||||
at = @At("RETURN")
|
|
||||||
)
|
|
||||||
private void postDoPreChunk(int chunkX, int chunkZ, boolean loadChunk, CallbackInfo ci) {
|
|
||||||
for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
|
|
||||||
if (ibaritone.getPlayerContext().world() == (WorldClient) (Object) this) {
|
|
||||||
ibaritone.getGameEventHandler().onChunkEvent(
|
|
||||||
new ChunkEvent(
|
|
||||||
EventState.POST,
|
|
||||||
loadChunk ? ChunkEvent.Type.LOAD : ChunkEvent.Type.UNLOAD,
|
|
||||||
chunkX,
|
|
||||||
chunkZ
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -16,13 +16,13 @@
|
|||||||
"MixinChunkRenderWorker",
|
"MixinChunkRenderWorker",
|
||||||
"MixinEntityLivingBase",
|
"MixinEntityLivingBase",
|
||||||
"MixinEntityPlayerSP",
|
"MixinEntityPlayerSP",
|
||||||
"MixinEntityRenderer",
|
"MixinGameRenderer",
|
||||||
"MixinMinecraft",
|
"MixinMinecraft",
|
||||||
"MixinNetHandlerPlayClient",
|
"MixinNetHandlerPlayClient",
|
||||||
"MixinNetworkManager",
|
"MixinNetworkManager",
|
||||||
"MixinRenderChunk",
|
"MixinRenderChunk",
|
||||||
|
"MixinRenderChunkCache",
|
||||||
"MixinRenderList",
|
"MixinRenderList",
|
||||||
"MixinVboRenderList",
|
"MixinVboRenderList"
|
||||||
"MixinWorldClient"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -25,10 +25,7 @@ import baritone.api.utils.IPlayerContext;
|
|||||||
import baritone.behavior.*;
|
import baritone.behavior.*;
|
||||||
import baritone.cache.WorldProvider;
|
import baritone.cache.WorldProvider;
|
||||||
import baritone.event.GameEventHandler;
|
import baritone.event.GameEventHandler;
|
||||||
import baritone.process.CustomGoalProcess;
|
import baritone.process.*;
|
||||||
import baritone.process.FollowProcess;
|
|
||||||
import baritone.process.GetToBlockProcess;
|
|
||||||
import baritone.process.MineProcess;
|
|
||||||
import baritone.utils.*;
|
import baritone.utils.*;
|
||||||
import baritone.utils.player.PrimaryPlayerContext;
|
import baritone.utils.player.PrimaryPlayerContext;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -55,7 +52,7 @@ public class Baritone implements IBaritone {
|
|||||||
static {
|
static {
|
||||||
threadPool = new ThreadPoolExecutor(4, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
|
threadPool = new ThreadPoolExecutor(4, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
|
||||||
|
|
||||||
dir = new File(Minecraft.getMinecraft().gameDir, "baritone");
|
dir = new File(Minecraft.getInstance().gameDir, "baritone");
|
||||||
if (!Files.exists(dir.toPath())) {
|
if (!Files.exists(dir.toPath())) {
|
||||||
try {
|
try {
|
||||||
Files.createDirectories(dir.toPath());
|
Files.createDirectories(dir.toPath());
|
||||||
@@ -74,12 +71,15 @@ public class Baritone implements IBaritone {
|
|||||||
private PathingBehavior pathingBehavior;
|
private PathingBehavior pathingBehavior;
|
||||||
private LookBehavior lookBehavior;
|
private LookBehavior lookBehavior;
|
||||||
private MemoryBehavior memoryBehavior;
|
private MemoryBehavior memoryBehavior;
|
||||||
|
private InventoryBehavior inventoryBehavior;
|
||||||
private InputOverrideHandler inputOverrideHandler;
|
private InputOverrideHandler inputOverrideHandler;
|
||||||
|
|
||||||
private FollowProcess followProcess;
|
private FollowProcess followProcess;
|
||||||
private MineProcess mineProcess;
|
private MineProcess mineProcess;
|
||||||
private GetToBlockProcess getToBlockProcess;
|
private GetToBlockProcess getToBlockProcess;
|
||||||
private CustomGoalProcess customGoalProcess;
|
private CustomGoalProcess customGoalProcess;
|
||||||
|
private BuilderProcess builderProcess;
|
||||||
|
private ExploreProcess exploreProcess;
|
||||||
|
|
||||||
private PathingControlManager pathingControlManager;
|
private PathingControlManager pathingControlManager;
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ public class Baritone implements IBaritone {
|
|||||||
pathingBehavior = new PathingBehavior(this);
|
pathingBehavior = new PathingBehavior(this);
|
||||||
lookBehavior = new LookBehavior(this);
|
lookBehavior = new LookBehavior(this);
|
||||||
memoryBehavior = new MemoryBehavior(this);
|
memoryBehavior = new MemoryBehavior(this);
|
||||||
new InventoryBehavior(this);
|
inventoryBehavior = new InventoryBehavior(this);
|
||||||
inputOverrideHandler = new InputOverrideHandler(this);
|
inputOverrideHandler = new InputOverrideHandler(this);
|
||||||
new ExampleBaritoneControl(this);
|
new ExampleBaritoneControl(this);
|
||||||
}
|
}
|
||||||
@@ -118,6 +118,8 @@ public class Baritone implements IBaritone {
|
|||||||
mineProcess = new MineProcess(this);
|
mineProcess = new MineProcess(this);
|
||||||
customGoalProcess = new CustomGoalProcess(this); // very high iq
|
customGoalProcess = new CustomGoalProcess(this); // very high iq
|
||||||
getToBlockProcess = new GetToBlockProcess(this);
|
getToBlockProcess = new GetToBlockProcess(this);
|
||||||
|
builderProcess = new BuilderProcess(this);
|
||||||
|
exploreProcess = new ExploreProcess(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.worldProvider = new WorldProvider();
|
this.worldProvider = new WorldProvider();
|
||||||
@@ -172,11 +174,24 @@ public class Baritone implements IBaritone {
|
|||||||
return this.followProcess;
|
return this.followProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BuilderProcess getBuilderProcess() {
|
||||||
|
return this.builderProcess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryBehavior getInventoryBehavior() {
|
||||||
|
return this.inventoryBehavior;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LookBehavior getLookBehavior() {
|
public LookBehavior getLookBehavior() {
|
||||||
return this.lookBehavior;
|
return this.lookBehavior;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ExploreProcess getExploreProcess() {
|
||||||
|
return this.exploreProcess;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MineProcess getMineProcess() {
|
public MineProcess getMineProcess() {
|
||||||
return this.mineProcess;
|
return this.mineProcess;
|
||||||
|
|||||||
@@ -21,13 +21,18 @@ import baritone.Baritone;
|
|||||||
import baritone.api.event.events.TickEvent;
|
import baritone.api.event.events.TickEvent;
|
||||||
import baritone.utils.ToolSet;
|
import baritone.utils.ToolSet;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.inventory.ClickType;
|
import net.minecraft.inventory.ClickType;
|
||||||
import net.minecraft.item.ItemPickaxe;
|
import net.minecraft.item.*;
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.item.ItemTool;
|
|
||||||
import net.minecraft.util.NonNullList;
|
import net.minecraft.util.NonNullList;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.OptionalInt;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class InventoryBehavior extends Behavior {
|
public class InventoryBehavior extends Behavior {
|
||||||
public InventoryBehavior(Baritone baritone) {
|
public InventoryBehavior(Baritone baritone) {
|
||||||
super(baritone);
|
super(baritone);
|
||||||
@@ -35,7 +40,7 @@ public class InventoryBehavior extends Behavior {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTick(TickEvent event) {
|
public void onTick(TickEvent event) {
|
||||||
if (!Baritone.settings().allowInventory.get()) {
|
if (!Baritone.settings().allowInventory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (event.getType() == TickEvent.Type.OUT) {
|
if (event.getType() == TickEvent.Type.OUT) {
|
||||||
@@ -54,6 +59,34 @@ public class InventoryBehavior extends Behavior {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void attemptToPutOnHotbar(int inMainInvy, Predicate<Integer> disallowedHotbar) {
|
||||||
|
OptionalInt destination = getTempHotbarSlot(disallowedHotbar);
|
||||||
|
if (destination.isPresent()) {
|
||||||
|
swapWithHotBar(inMainInvy, destination.getAsInt());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public OptionalInt getTempHotbarSlot(Predicate<Integer> disallowedHotbar) {
|
||||||
|
// we're using 0 and 8 for pickaxe and throwaway
|
||||||
|
ArrayList<Integer> candidates = new ArrayList<>();
|
||||||
|
for (int i = 1; i < 8; i++) {
|
||||||
|
if (ctx.player().inventory.mainInventory.get(i).isEmpty() && !disallowedHotbar.test(i)) {
|
||||||
|
candidates.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (candidates.isEmpty()) {
|
||||||
|
for (int i = 1; i < 8; i++) {
|
||||||
|
if (!disallowedHotbar.test(i)) {
|
||||||
|
candidates.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (candidates.isEmpty()) {
|
||||||
|
return OptionalInt.empty();
|
||||||
|
}
|
||||||
|
return OptionalInt.of(candidates.get(new Random().nextInt(candidates.size())));
|
||||||
|
}
|
||||||
|
|
||||||
private void swapWithHotBar(int inInventory, int inHotbar) {
|
private void swapWithHotBar(int inInventory, int inHotbar) {
|
||||||
ctx.playerController().windowClick(ctx.player().inventoryContainer.windowId, inInventory < 9 ? inInventory + 36 : inInventory, inHotbar, ClickType.SWAP, ctx.player());
|
ctx.playerController().windowClick(ctx.player().inventoryContainer.windowId, inInventory < 9 ? inInventory + 36 : inInventory, inHotbar, ClickType.SWAP, ctx.player());
|
||||||
}
|
}
|
||||||
@@ -61,7 +94,7 @@ public class InventoryBehavior extends Behavior {
|
|||||||
private int firstValidThrowaway() { // TODO offhand idk
|
private int firstValidThrowaway() { // TODO offhand idk
|
||||||
NonNullList<ItemStack> invy = ctx.player().inventory.mainInventory;
|
NonNullList<ItemStack> invy = ctx.player().inventory.mainInventory;
|
||||||
for (int i = 0; i < invy.size(); i++) {
|
for (int i = 0; i < invy.size(); i++) {
|
||||||
if (Baritone.settings().acceptableThrowawayItems.get().contains(invy.get(i).getItem())) {
|
if (Baritone.settings().acceptableThrowawayItems.value.contains(invy.get(i).getItem())) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,4 +120,62 @@ public class InventoryBehavior extends Behavior {
|
|||||||
}
|
}
|
||||||
return bestInd;
|
return bestInd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasGenericThrowaway() {
|
||||||
|
for (Item item : Baritone.settings().acceptableThrowawayItems.value) {
|
||||||
|
if (throwaway(false, item::equals)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean selectThrowawayForLocation(int x, int y, int z) {
|
||||||
|
IBlockState maybe = baritone.getBuilderProcess().placeAt(x, y, z);
|
||||||
|
if (maybe != null && throwaway(true, item -> item instanceof ItemBlock && ((ItemBlock) item).getBlock().equals(maybe.getBlock()))) {
|
||||||
|
return true; // gotem
|
||||||
|
}
|
||||||
|
for (Item item : Baritone.settings().acceptableThrowawayItems.value) {
|
||||||
|
if (throwaway(true, item::equals)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean throwaway(boolean select, Predicate<? super Item> desired) {
|
||||||
|
EntityPlayerSP p = ctx.player();
|
||||||
|
NonNullList<ItemStack> inv = p.inventory.mainInventory;
|
||||||
|
for (byte i = 0; i < 9; i++) {
|
||||||
|
ItemStack item = inv.get(i);
|
||||||
|
// this usage of settings() is okay because it's only called once during pathing
|
||||||
|
// (while creating the CalculationContext at the very beginning)
|
||||||
|
// and then it's called during execution
|
||||||
|
// since this function is never called during cost calculation, we don't need to migrate
|
||||||
|
// acceptableThrowawayItems to the CalculationContext
|
||||||
|
if (desired.test(item.getItem())) {
|
||||||
|
if (select) {
|
||||||
|
p.inventory.currentItem = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (desired.test(p.inventory.offHandInventory.get(0).getItem())) {
|
||||||
|
// main hand takes precedence over off hand
|
||||||
|
// that means that if we have block A selected in main hand and block B in off hand, right clicking places block B
|
||||||
|
// we've already checked above ^ and the main hand can't possible have an acceptablethrowawayitem
|
||||||
|
// so we need to select in the main hand something that doesn't right click
|
||||||
|
// so not a shovel, not a hoe, not a block, etc
|
||||||
|
for (byte i = 0; i < 9; i++) {
|
||||||
|
ItemStack item = inv.get(i);
|
||||||
|
if (item.isEmpty() || item.getItem() instanceof ItemPickaxe) {
|
||||||
|
if (select) {
|
||||||
|
p.inventory.currentItem = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,9 +28,6 @@ public final class LookBehavior extends Behavior implements ILookBehavior {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Target's values are as follows:
|
* Target's values are as follows:
|
||||||
* <p>
|
|
||||||
* getFirst() -> yaw
|
|
||||||
* getSecond() -> pitch
|
|
||||||
*/
|
*/
|
||||||
private Rotation target;
|
private Rotation target;
|
||||||
|
|
||||||
@@ -53,7 +50,7 @@ public final class LookBehavior extends Behavior implements ILookBehavior {
|
|||||||
@Override
|
@Override
|
||||||
public void updateTarget(Rotation target, boolean force) {
|
public void updateTarget(Rotation target, boolean force) {
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.force = force || !Baritone.settings().freeLook.get();
|
this.force = force || !Baritone.settings().freeLook.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -63,7 +60,7 @@ public final class LookBehavior extends Behavior implements ILookBehavior {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Whether or not we're going to silently set our angles
|
// Whether or not we're going to silently set our angles
|
||||||
boolean silent = Baritone.settings().antiCheatCompatibility.get() && !this.force;
|
boolean silent = Baritone.settings().antiCheatCompatibility.value && !this.force;
|
||||||
|
|
||||||
switch (event.getState()) {
|
switch (event.getState()) {
|
||||||
case PRE: {
|
case PRE: {
|
||||||
@@ -72,7 +69,7 @@ public final class LookBehavior extends Behavior implements ILookBehavior {
|
|||||||
float oldPitch = ctx.player().rotationPitch;
|
float oldPitch = ctx.player().rotationPitch;
|
||||||
float desiredPitch = this.target.getPitch();
|
float desiredPitch = this.target.getPitch();
|
||||||
ctx.player().rotationPitch = desiredPitch;
|
ctx.player().rotationPitch = desiredPitch;
|
||||||
if (desiredPitch == oldPitch) {
|
if (desiredPitch == oldPitch && !Baritone.settings().freeLook.value) {
|
||||||
nudgeToLevel();
|
nudgeToLevel();
|
||||||
}
|
}
|
||||||
this.target = null;
|
this.target = null;
|
||||||
@@ -109,7 +106,7 @@ public final class LookBehavior extends Behavior implements ILookBehavior {
|
|||||||
|
|
||||||
// If we have antiCheatCompatibility on, we're going to use the target value later in onPlayerUpdate()
|
// If we have antiCheatCompatibility on, we're going to use the target value later in onPlayerUpdate()
|
||||||
// Also the type has to be MOTION_UPDATE because that is called after JUMP
|
// Also the type has to be MOTION_UPDATE because that is called after JUMP
|
||||||
if (!Baritone.settings().antiCheatCompatibility.get() && event.getType() == RotationMoveEvent.Type.MOTION_UPDATE && !this.force) {
|
if (!Baritone.settings().antiCheatCompatibility.value && event.getType() == RotationMoveEvent.Type.MOTION_UPDATE && !this.force) {
|
||||||
this.target = null;
|
this.target = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import baritone.api.event.events.TickEvent;
|
|||||||
import baritone.api.event.events.type.EventState;
|
import baritone.api.event.events.type.EventState;
|
||||||
import baritone.cache.ContainerMemory;
|
import baritone.cache.ContainerMemory;
|
||||||
import baritone.cache.Waypoint;
|
import baritone.cache.Waypoint;
|
||||||
import baritone.pathing.movement.CalculationContext;
|
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockBed;
|
import net.minecraft.block.BlockBed;
|
||||||
@@ -65,7 +64,7 @@ public final class MemoryBehavior extends Behavior {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void onTick(TickEvent event) {
|
public synchronized void onTick(TickEvent event) {
|
||||||
if (!Baritone.settings().containerMemory.get()) {
|
if (!Baritone.settings().containerMemory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (event.getType() == TickEvent.Type.OUT) {
|
if (event.getType() == TickEvent.Type.OUT) {
|
||||||
@@ -83,7 +82,7 @@ public final class MemoryBehavior extends Behavior {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void onSendPacket(PacketEvent event) {
|
public synchronized void onSendPacket(PacketEvent event) {
|
||||||
if (!Baritone.settings().containerMemory.get()) {
|
if (!Baritone.settings().containerMemory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Packet p = event.getPacket();
|
Packet p = event.getPacket();
|
||||||
@@ -122,7 +121,7 @@ public final class MemoryBehavior extends Behavior {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void onReceivePacket(PacketEvent event) {
|
public synchronized void onReceivePacket(PacketEvent event) {
|
||||||
if (!Baritone.settings().containerMemory.get()) {
|
if (!Baritone.settings().containerMemory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Packet p = event.getPacket();
|
Packet p = event.getPacket();
|
||||||
@@ -171,7 +170,7 @@ public final class MemoryBehavior extends Behavior {
|
|||||||
|
|
||||||
|
|
||||||
private void updateInventory() {
|
private void updateInventory() {
|
||||||
if (!Baritone.settings().containerMemory.get()) {
|
if (!Baritone.settings().containerMemory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int windowId = ctx.player().openContainer.windowId;
|
int windowId = ctx.player().openContainer.windowId;
|
||||||
@@ -196,7 +195,7 @@ public final class MemoryBehavior extends Behavior {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private BlockPos neighboringConnectedBlock(BlockPos in) {
|
private BlockPos neighboringConnectedBlock(BlockPos in) {
|
||||||
BlockStateInterface bsi = new CalculationContext(baritone).bsi;
|
BlockStateInterface bsi = baritone.bsi;
|
||||||
Block block = bsi.get0(in).getBlock();
|
Block block = bsi.get0(in).getBlock();
|
||||||
if (block != Blocks.TRAPPED_CHEST && block != Blocks.CHEST) {
|
if (block != Blocks.TRAPPED_CHEST && block != Blocks.CHEST) {
|
||||||
return null; // other things that have contents, but can be placed adjacent without combining
|
return null; // other things that have contents, but can be placed adjacent without combining
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import baritone.api.event.events.*;
|
|||||||
import baritone.api.pathing.calc.IPath;
|
import baritone.api.pathing.calc.IPath;
|
||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.pathing.goals.GoalXZ;
|
import baritone.api.pathing.goals.GoalXZ;
|
||||||
|
import baritone.api.process.PathingCommand;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.PathCalculationResult;
|
import baritone.api.utils.PathCalculationResult;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
@@ -33,6 +34,7 @@ import baritone.pathing.movement.MovementHelper;
|
|||||||
import baritone.pathing.path.PathExecutor;
|
import baritone.pathing.path.PathExecutor;
|
||||||
import baritone.utils.Helper;
|
import baritone.utils.Helper;
|
||||||
import baritone.utils.PathRenderer;
|
import baritone.utils.PathRenderer;
|
||||||
|
import baritone.utils.PathingCommandContext;
|
||||||
import baritone.utils.pathing.Favoring;
|
import baritone.utils.pathing.Favoring;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
@@ -48,9 +50,11 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
private PathExecutor next;
|
private PathExecutor next;
|
||||||
|
|
||||||
private Goal goal;
|
private Goal goal;
|
||||||
|
private CalculationContext context;
|
||||||
|
|
||||||
private boolean safeToCancel;
|
private boolean safeToCancel;
|
||||||
private boolean pauseRequestedLastTick;
|
private boolean pauseRequestedLastTick;
|
||||||
|
private boolean unpausedLastTick;
|
||||||
private boolean cancelRequested;
|
private boolean cancelRequested;
|
||||||
private boolean calcFailedLastTick;
|
private boolean calcFailedLastTick;
|
||||||
|
|
||||||
@@ -106,10 +110,14 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
private void tickPath() {
|
private void tickPath() {
|
||||||
if (pauseRequestedLastTick && safeToCancel) {
|
if (pauseRequestedLastTick && safeToCancel) {
|
||||||
pauseRequestedLastTick = false;
|
pauseRequestedLastTick = false;
|
||||||
baritone.getInputOverrideHandler().clearAllKeys();
|
if (unpausedLastTick) {
|
||||||
baritone.getInputOverrideHandler().getBlockBreakHelper().stopBreakingBlock();
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
|
baritone.getInputOverrideHandler().getBlockBreakHelper().stopBreakingBlock();
|
||||||
|
}
|
||||||
|
unpausedLastTick = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
unpausedLastTick = true;
|
||||||
if (cancelRequested) {
|
if (cancelRequested) {
|
||||||
cancelRequested = false;
|
cancelRequested = false;
|
||||||
baritone.getInputOverrideHandler().clearAllKeys();
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
@@ -141,6 +149,9 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
logDebug("All done. At " + goal);
|
logDebug("All done. At " + goal);
|
||||||
queuePathEvent(PathEvent.AT_GOAL);
|
queuePathEvent(PathEvent.AT_GOAL);
|
||||||
next = null;
|
next = null;
|
||||||
|
if (Baritone.settings().disconnectOnArrival.value) {
|
||||||
|
ctx.world().sendQuittingDisconnectingPacket();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (next != null && !next.getPath().positions().contains(ctx.playerFeet()) && !next.getPath().positions().contains(expectedSegmentStart)) { // can contain either one
|
if (next != null && !next.getPath().positions().contains(ctx.playerFeet()) && !next.getPath().positions().contains(expectedSegmentStart)) { // can contain either one
|
||||||
@@ -170,7 +181,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
}
|
}
|
||||||
// we aren't calculating
|
// we aren't calculating
|
||||||
queuePathEvent(PathEvent.CALC_STARTED);
|
queuePathEvent(PathEvent.CALC_STARTED);
|
||||||
findPathInNewThread(expectedSegmentStart, true);
|
findPathInNewThread(expectedSegmentStart, true, context);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -201,13 +212,13 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
// and this path doesn't get us all the way there
|
// and this path doesn't get us all the way there
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ticksRemainingInSegment(false).get() < Baritone.settings().planningTickLookahead.get()) {
|
if (ticksRemainingInSegment(false).get() < Baritone.settings().planningTickLookahead.value) {
|
||||||
// and this path has 7.5 seconds or less left
|
// and this path has 7.5 seconds or less left
|
||||||
// don't include the current movement so a very long last movement (e.g. descend) doesn't trip it up
|
// don't include the current movement so a very long last movement (e.g. descend) doesn't trip it up
|
||||||
// if we actually included current, it wouldn't start planning ahead until the last movement was done, if the last movement took more than 7.5 seconds on its own
|
// if we actually included current, it wouldn't start planning ahead until the last movement was done, if the last movement took more than 7.5 seconds on its own
|
||||||
logDebug("Path almost over. Planning ahead...");
|
logDebug("Path almost over. Planning ahead...");
|
||||||
queuePathEvent(PathEvent.NEXT_SEGMENT_CALC_STARTED);
|
queuePathEvent(PathEvent.NEXT_SEGMENT_CALC_STARTED);
|
||||||
findPathInNewThread(current.getPath().getDest(), false);
|
findPathInNewThread(current.getPath().getDest(), false, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -234,9 +245,32 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
this.goal = goal;
|
this.goal = goal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean secretInternalSetGoalAndPath(Goal goal) {
|
public boolean secretInternalSetGoalAndPath(PathingCommand command) {
|
||||||
secretInternalSetGoal(goal);
|
secretInternalSetGoal(command.goal);
|
||||||
return secretInternalPath();
|
if (command instanceof PathingCommandContext) {
|
||||||
|
context = ((PathingCommandContext) command).desiredCalcContext;
|
||||||
|
} else {
|
||||||
|
context = new CalculationContext(baritone, true);
|
||||||
|
}
|
||||||
|
if (goal == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (goal.isInGoal(ctx.playerFeet()) || goal.isInGoal(expectedSegmentStart)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
synchronized (pathPlanLock) {
|
||||||
|
if (current != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
synchronized (pathCalcLock) {
|
||||||
|
if (inProgress != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
queuePathEvent(PathEvent.CALC_STARTED);
|
||||||
|
findPathInNewThread(expectedSegmentStart, true, context);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -291,6 +325,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
|
|
||||||
public void softCancelIfSafe() {
|
public void softCancelIfSafe() {
|
||||||
synchronized (pathPlanLock) {
|
synchronized (pathPlanLock) {
|
||||||
|
getInProgress().ifPresent(AbstractNodeCostSearch::cancel); // only cancel ours
|
||||||
if (!isSafeToCancel()) {
|
if (!isSafeToCancel()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -298,7 +333,6 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
next = null;
|
next = null;
|
||||||
}
|
}
|
||||||
cancelRequested = true;
|
cancelRequested = true;
|
||||||
getInProgress().ifPresent(AbstractNodeCostSearch::cancel); // only cancel ours
|
|
||||||
// do everything BUT clear keys
|
// do everything BUT clear keys
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,11 +340,11 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
public void secretInternalSegmentCancel() {
|
public void secretInternalSegmentCancel() {
|
||||||
queuePathEvent(PathEvent.CANCELED);
|
queuePathEvent(PathEvent.CANCELED);
|
||||||
synchronized (pathPlanLock) {
|
synchronized (pathPlanLock) {
|
||||||
|
getInProgress().ifPresent(AbstractNodeCostSearch::cancel);
|
||||||
if (current != null) {
|
if (current != null) {
|
||||||
current = null;
|
current = null;
|
||||||
next = null;
|
next = null;
|
||||||
baritone.getInputOverrideHandler().clearAllKeys();
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
getInProgress().ifPresent(AbstractNodeCostSearch::cancel);
|
|
||||||
baritone.getInputOverrideHandler().getBlockBreakHelper().stopBreakingBlock();
|
baritone.getInputOverrideHandler().getBlockBreakHelper().stopBreakingBlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,39 +358,16 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Start calculating a path if we aren't already
|
|
||||||
*
|
|
||||||
* @return true if this call started path calculation, false if it was already calculating or executing a path
|
|
||||||
*/
|
|
||||||
public boolean secretInternalPath() {
|
|
||||||
if (goal == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (goal.isInGoal(ctx.playerFeet())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
synchronized (pathPlanLock) {
|
|
||||||
if (current != null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
synchronized (pathCalcLock) {
|
|
||||||
if (inProgress != null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
queuePathEvent(PathEvent.CALC_STARTED);
|
|
||||||
findPathInNewThread(expectedSegmentStart, true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void secretCursedFunctionDoNotCall(IPath path) {
|
public void secretCursedFunctionDoNotCall(IPath path) {
|
||||||
synchronized (pathPlanLock) {
|
synchronized (pathPlanLock) {
|
||||||
current = new PathExecutor(this, path);
|
current = new PathExecutor(this, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CalculationContext secretInternalGetCalculationContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See issue #209
|
* See issue #209
|
||||||
*
|
*
|
||||||
@@ -408,7 +419,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
* @param start
|
* @param start
|
||||||
* @param talkAboutIt
|
* @param talkAboutIt
|
||||||
*/
|
*/
|
||||||
private void findPathInNewThread(final BlockPos start, final boolean talkAboutIt) {
|
private void findPathInNewThread(final BlockPos start, final boolean talkAboutIt, CalculationContext context) {
|
||||||
// this must be called with synchronization on pathCalcLock!
|
// this must be called with synchronization on pathCalcLock!
|
||||||
// actually, we can check this, muahaha
|
// actually, we can check this, muahaha
|
||||||
if (!Thread.holdsLock(pathCalcLock)) {
|
if (!Thread.holdsLock(pathCalcLock)) {
|
||||||
@@ -418,6 +429,9 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
if (inProgress != null) {
|
if (inProgress != null) {
|
||||||
throw new IllegalStateException("Already doing it"); // should have been checked by caller
|
throw new IllegalStateException("Already doing it"); // should have been checked by caller
|
||||||
}
|
}
|
||||||
|
if (!context.safeForThreadedUse) {
|
||||||
|
throw new IllegalStateException("Improper context thread safety level");
|
||||||
|
}
|
||||||
Goal goal = this.goal;
|
Goal goal = this.goal;
|
||||||
if (goal == null) {
|
if (goal == null) {
|
||||||
logDebug("no goal"); // TODO should this be an exception too? definitely should be checked by caller
|
logDebug("no goal"); // TODO should this be an exception too? definitely should be checked by caller
|
||||||
@@ -426,13 +440,12 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
long primaryTimeout;
|
long primaryTimeout;
|
||||||
long failureTimeout;
|
long failureTimeout;
|
||||||
if (current == null) {
|
if (current == null) {
|
||||||
primaryTimeout = Baritone.settings().primaryTimeoutMS.get();
|
primaryTimeout = Baritone.settings().primaryTimeoutMS.value;
|
||||||
failureTimeout = Baritone.settings().failureTimeoutMS.get();
|
failureTimeout = Baritone.settings().failureTimeoutMS.value;
|
||||||
} else {
|
} else {
|
||||||
primaryTimeout = Baritone.settings().planAheadPrimaryTimeoutMS.get();
|
primaryTimeout = Baritone.settings().planAheadPrimaryTimeoutMS.value;
|
||||||
failureTimeout = Baritone.settings().planAheadFailureTimeoutMS.get();
|
failureTimeout = Baritone.settings().planAheadFailureTimeoutMS.value;
|
||||||
}
|
}
|
||||||
CalculationContext context = new CalculationContext(baritone, true); // not safe to create on the other thread, it looks up a lot of stuff in minecraft
|
|
||||||
AbstractNodeCostSearch pathfinder = createPathfinder(start, goal, current == null ? null : current.getPath(), context);
|
AbstractNodeCostSearch pathfinder = createPathfinder(start, goal, current == null ? null : current.getPath(), context);
|
||||||
if (!Objects.equals(pathfinder.getGoal(), goal)) { // will return the exact same object if simplification didn't happen
|
if (!Objects.equals(pathfinder.getGoal(), goal)) { // will return the exact same object if simplification didn't happen
|
||||||
logDebug("Simplifying " + goal.getClass() + " to GoalXZ due to distance");
|
logDebug("Simplifying " + goal.getClass() + " to GoalXZ due to distance");
|
||||||
@@ -494,13 +507,13 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
|
|
||||||
public static AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context) {
|
public static AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context) {
|
||||||
Goal transformed = goal;
|
Goal transformed = goal;
|
||||||
if (Baritone.settings().simplifyUnloadedYCoord.get() && goal instanceof IGoalRenderPos) {
|
if (Baritone.settings().simplifyUnloadedYCoord.value && goal instanceof IGoalRenderPos) {
|
||||||
BlockPos pos = ((IGoalRenderPos) goal).getGoalPos();
|
BlockPos pos = ((IGoalRenderPos) goal).getGoalPos();
|
||||||
if (!context.bsi.worldContainsLoadedChunk(pos.getX(), pos.getZ())) {
|
if (!context.bsi.worldContainsLoadedChunk(pos.getX(), pos.getZ())) {
|
||||||
transformed = new GoalXZ(pos.getX(), pos.getZ());
|
transformed = new GoalXZ(pos.getX(), pos.getZ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Favoring favoring = new Favoring(context.getBaritone().getPlayerContext(), previous);
|
Favoring favoring = new Favoring(context.getBaritone().getPlayerContext(), previous, context);
|
||||||
return new AStarPathFinder(start.getX(), start.getY(), start.getZ(), transformed, favoring, context);
|
return new AStarPathFinder(start.getX(), start.getY(), start.getZ(), transformed, favoring, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+77
-15
@@ -18,6 +18,7 @@
|
|||||||
package baritone.cache;
|
package baritone.cache;
|
||||||
|
|
||||||
import baritone.utils.pathing.PathingBlockType;
|
import baritone.utils.pathing.PathingBlockType;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
@@ -52,9 +53,10 @@ public final class CachedChunk {
|
|||||||
temp.add(Blocks.TRAPPED_CHEST);
|
temp.add(Blocks.TRAPPED_CHEST);
|
||||||
temp.add(Blocks.END_PORTAL);
|
temp.add(Blocks.END_PORTAL);
|
||||||
temp.add(Blocks.END_PORTAL_FRAME);
|
temp.add(Blocks.END_PORTAL_FRAME);
|
||||||
temp.add(Blocks.MOB_SPAWNER);
|
temp.add(Blocks.SPAWNER);
|
||||||
temp.add(Blocks.BARRIER);
|
temp.add(Blocks.BARRIER);
|
||||||
temp.add(Blocks.OBSERVER);
|
temp.add(Blocks.OBSERVER);
|
||||||
|
|
||||||
temp.add(Blocks.WHITE_SHULKER_BOX);
|
temp.add(Blocks.WHITE_SHULKER_BOX);
|
||||||
temp.add(Blocks.ORANGE_SHULKER_BOX);
|
temp.add(Blocks.ORANGE_SHULKER_BOX);
|
||||||
temp.add(Blocks.MAGENTA_SHULKER_BOX);
|
temp.add(Blocks.MAGENTA_SHULKER_BOX);
|
||||||
@@ -63,7 +65,7 @@ public final class CachedChunk {
|
|||||||
temp.add(Blocks.LIME_SHULKER_BOX);
|
temp.add(Blocks.LIME_SHULKER_BOX);
|
||||||
temp.add(Blocks.PINK_SHULKER_BOX);
|
temp.add(Blocks.PINK_SHULKER_BOX);
|
||||||
temp.add(Blocks.GRAY_SHULKER_BOX);
|
temp.add(Blocks.GRAY_SHULKER_BOX);
|
||||||
temp.add(Blocks.SILVER_SHULKER_BOX);
|
temp.add(Blocks.LIGHT_GRAY_SHULKER_BOX);
|
||||||
temp.add(Blocks.CYAN_SHULKER_BOX);
|
temp.add(Blocks.CYAN_SHULKER_BOX);
|
||||||
temp.add(Blocks.PURPLE_SHULKER_BOX);
|
temp.add(Blocks.PURPLE_SHULKER_BOX);
|
||||||
temp.add(Blocks.BLUE_SHULKER_BOX);
|
temp.add(Blocks.BLUE_SHULKER_BOX);
|
||||||
@@ -71,22 +73,57 @@ public final class CachedChunk {
|
|||||||
temp.add(Blocks.GREEN_SHULKER_BOX);
|
temp.add(Blocks.GREEN_SHULKER_BOX);
|
||||||
temp.add(Blocks.RED_SHULKER_BOX);
|
temp.add(Blocks.RED_SHULKER_BOX);
|
||||||
temp.add(Blocks.BLACK_SHULKER_BOX);
|
temp.add(Blocks.BLACK_SHULKER_BOX);
|
||||||
temp.add(Blocks.PORTAL);
|
|
||||||
|
temp.add(Blocks.NETHER_PORTAL);
|
||||||
temp.add(Blocks.HOPPER);
|
temp.add(Blocks.HOPPER);
|
||||||
temp.add(Blocks.BEACON);
|
temp.add(Blocks.BEACON);
|
||||||
temp.add(Blocks.BREWING_STAND);
|
temp.add(Blocks.BREWING_STAND);
|
||||||
temp.add(Blocks.SKULL);
|
|
||||||
|
// TODO: Maybe add a predicate for blocks to keep track of?
|
||||||
|
// This should really not need to happen
|
||||||
|
temp.add(Blocks.CREEPER_HEAD);
|
||||||
|
temp.add(Blocks.CREEPER_WALL_HEAD);
|
||||||
|
temp.add(Blocks.DRAGON_HEAD);
|
||||||
|
temp.add(Blocks.DRAGON_WALL_HEAD);
|
||||||
|
temp.add(Blocks.PLAYER_HEAD);
|
||||||
|
temp.add(Blocks.PLAYER_WALL_HEAD);
|
||||||
|
temp.add(Blocks.ZOMBIE_HEAD);
|
||||||
|
temp.add(Blocks.ZOMBIE_WALL_HEAD);
|
||||||
|
temp.add(Blocks.SKELETON_SKULL);
|
||||||
|
temp.add(Blocks.SKELETON_WALL_SKULL);
|
||||||
|
temp.add(Blocks.WITHER_SKELETON_SKULL);
|
||||||
|
temp.add(Blocks.WITHER_SKELETON_WALL_SKULL);
|
||||||
|
|
||||||
temp.add(Blocks.ENCHANTING_TABLE);
|
temp.add(Blocks.ENCHANTING_TABLE);
|
||||||
temp.add(Blocks.ANVIL);
|
temp.add(Blocks.ANVIL);
|
||||||
temp.add(Blocks.LIT_FURNACE);
|
|
||||||
temp.add(Blocks.BED);
|
temp.add(Blocks.WHITE_BED);
|
||||||
|
temp.add(Blocks.ORANGE_BED);
|
||||||
|
temp.add(Blocks.MAGENTA_BED);
|
||||||
|
temp.add(Blocks.LIGHT_BLUE_BED);
|
||||||
|
temp.add(Blocks.YELLOW_BED);
|
||||||
|
temp.add(Blocks.LIME_BED);
|
||||||
|
temp.add(Blocks.PINK_BED);
|
||||||
|
temp.add(Blocks.GRAY_BED);
|
||||||
|
temp.add(Blocks.LIGHT_GRAY_BED);
|
||||||
|
temp.add(Blocks.CYAN_BED);
|
||||||
|
temp.add(Blocks.PURPLE_BED);
|
||||||
|
temp.add(Blocks.BLUE_BED);
|
||||||
|
temp.add(Blocks.BROWN_BED);
|
||||||
|
temp.add(Blocks.GREEN_BED);
|
||||||
|
temp.add(Blocks.RED_BED);
|
||||||
|
temp.add(Blocks.BLACK_BED);
|
||||||
|
|
||||||
temp.add(Blocks.DRAGON_EGG);
|
temp.add(Blocks.DRAGON_EGG);
|
||||||
temp.add(Blocks.JUKEBOX);
|
temp.add(Blocks.JUKEBOX);
|
||||||
temp.add(Blocks.END_GATEWAY);
|
temp.add(Blocks.END_GATEWAY);
|
||||||
temp.add(Blocks.WEB);
|
temp.add(Blocks.COBWEB);
|
||||||
temp.add(Blocks.NETHER_WART);
|
temp.add(Blocks.NETHER_WART);
|
||||||
temp.add(Blocks.LADDER);
|
temp.add(Blocks.LADDER);
|
||||||
|
temp.add(Blocks.VINE);
|
||||||
BLOCKS_TO_KEEP_TRACK_OF = Collections.unmodifiableSet(temp);
|
BLOCKS_TO_KEEP_TRACK_OF = Collections.unmodifiableSet(temp);
|
||||||
|
|
||||||
|
// TODO: Lit Furnaces
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,6 +155,8 @@ public final class CachedChunk {
|
|||||||
*/
|
*/
|
||||||
private final BitSet data;
|
private final BitSet data;
|
||||||
|
|
||||||
|
private final Int2ObjectOpenHashMap<String> special;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The block names of each surface level block for generating an overview
|
* The block names of each surface level block for generating an overview
|
||||||
*/
|
*/
|
||||||
@@ -139,28 +178,51 @@ public final class CachedChunk {
|
|||||||
this.heightMap = new int[256];
|
this.heightMap = new int[256];
|
||||||
this.specialBlockLocations = specialBlockLocations;
|
this.specialBlockLocations = specialBlockLocations;
|
||||||
this.cacheTimestamp = cacheTimestamp;
|
this.cacheTimestamp = cacheTimestamp;
|
||||||
|
if (specialBlockLocations.isEmpty()) {
|
||||||
|
this.special = null;
|
||||||
|
} else {
|
||||||
|
this.special = new Int2ObjectOpenHashMap<>();
|
||||||
|
setSpecial();
|
||||||
|
}
|
||||||
calculateHeightMap();
|
calculateHeightMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final void setSpecial() {
|
||||||
|
for (Map.Entry<String, List<BlockPos>> entry : specialBlockLocations.entrySet()) {
|
||||||
|
for (BlockPos pos : entry.getValue()) {
|
||||||
|
special.put(getPositionIndex(pos.getX(), pos.getY(), pos.getZ()), entry.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final IBlockState getBlock(int x, int y, int z, int dimension) {
|
public final IBlockState getBlock(int x, int y, int z, int dimension) {
|
||||||
|
int index = getPositionIndex(x, y, z);
|
||||||
|
PathingBlockType type = getType(index);
|
||||||
int internalPos = z << 4 | x;
|
int internalPos = z << 4 | x;
|
||||||
if (heightMap[internalPos] == y) {
|
if (heightMap[internalPos] == y && type != PathingBlockType.AVOID) {
|
||||||
|
// if the top block in a column is water, we cache it as AVOID but we don't want to just return default state water (which is not flowing) beacuse then it would try to path through it
|
||||||
|
|
||||||
// we have this exact block, it's a surface block
|
// we have this exact block, it's a surface block
|
||||||
/*System.out.println("Saying that " + x + "," + y + "," + z + " is " + state);
|
/*System.out.println("Saying that " + x + "," + y + "," + z + " is " + state);
|
||||||
if (!Minecraft.getMinecraft().world.getBlockState(new BlockPos(x + this.x * 16, y, z + this.z * 16)).getBlock().equals(state.getBlock())) {
|
if (!Minecraft.getInstance().world.getBlockState(new BlockPos(x + this.x * 16, y, z + this.z * 16)).getBlock().equals(state.getBlock())) {
|
||||||
throw new IllegalStateException("failed " + Minecraft.getMinecraft().world.getBlockState(new BlockPos(x + this.x * 16, y, z + this.z * 16)).getBlock() + " " + state.getBlock() + " " + (x + this.x * 16) + " " + y + " " + (z + this.z * 16));
|
throw new IllegalStateException("failed " + Minecraft.getInstance().world.getBlockState(new BlockPos(x + this.x * 16, y, z + this.z * 16)).getBlock() + " " + state.getBlock() + " " + (x + this.x * 16) + " " + y + " " + (z + this.z * 16));
|
||||||
}*/
|
}*/
|
||||||
return overview[internalPos];
|
return overview[internalPos];
|
||||||
}
|
}
|
||||||
PathingBlockType type = getType(x, y, z);
|
if (special != null) {
|
||||||
|
String str = special.get(index);
|
||||||
|
if (str != null) {
|
||||||
|
return ChunkPacker.stringToBlockRequired(str).getDefaultState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (type == PathingBlockType.SOLID && y == 127 && dimension == -1) {
|
if (type == PathingBlockType.SOLID && y == 127 && dimension == -1) {
|
||||||
return Blocks.BEDROCK.getDefaultState();
|
return Blocks.BEDROCK.getDefaultState();
|
||||||
}
|
}
|
||||||
return ChunkPacker.pathingTypeToBlock(type, dimension);
|
return ChunkPacker.pathingTypeToBlock(type, dimension);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PathingBlockType getType(int x, int y, int z) {
|
private PathingBlockType getType(int index) {
|
||||||
int index = getPositionIndex(x, y, z);
|
|
||||||
return PathingBlockType.fromBits(data.get(index), data.get(index + 1));
|
return PathingBlockType.fromBits(data.get(index), data.get(index + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,11 +250,11 @@ public final class CachedChunk {
|
|||||||
return specialBlockLocations;
|
return specialBlockLocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final LinkedList<BlockPos> getAbsoluteBlocks(String blockType) {
|
public final ArrayList<BlockPos> getAbsoluteBlocks(String blockType) {
|
||||||
if (specialBlockLocations.get(blockType) == null) {
|
if (specialBlockLocations.get(blockType) == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
LinkedList<BlockPos> res = new LinkedList<>();
|
ArrayList<BlockPos> res = new ArrayList<>();
|
||||||
for (BlockPos pos : specialBlockLocations.get(blockType)) {
|
for (BlockPos pos : specialBlockLocations.get(blockType)) {
|
||||||
res.add(new BlockPos(pos.getX() + x * 16, pos.getY(), pos.getZ() + z * 16));
|
res.add(new BlockPos(pos.getX() + x * 16, pos.getY(), pos.getZ() + z * 16));
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-10
@@ -87,19 +87,16 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
return chunks[x >> 4][z >> 4] != null;
|
return chunks[x >> 4][z >> 4] != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final LinkedList<BlockPos> getLocationsOf(String block) {
|
public final ArrayList<BlockPos> getLocationsOf(String block) {
|
||||||
LinkedList<BlockPos> res = new LinkedList<>();
|
ArrayList<BlockPos> res = new ArrayList<>();
|
||||||
for (int chunkX = 0; chunkX < 32; chunkX++) {
|
for (int chunkX = 0; chunkX < 32; chunkX++) {
|
||||||
for (int chunkZ = 0; chunkZ < 32; chunkZ++) {
|
for (int chunkZ = 0; chunkZ < 32; chunkZ++) {
|
||||||
if (chunks[chunkX][chunkZ] == null) {
|
if (chunks[chunkX][chunkZ] == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
List<BlockPos> locs = chunks[chunkX][chunkZ].getAbsoluteBlocks(block);
|
ArrayList<BlockPos> locs = chunks[chunkX][chunkZ].getAbsoluteBlocks(block);
|
||||||
if (locs == null) {
|
if (locs != null) {
|
||||||
continue;
|
res.addAll(locs);
|
||||||
}
|
|
||||||
for (BlockPos pos : locs) {
|
|
||||||
res.add(pos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -243,7 +240,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
for (int z = 0; z < 32; z++) {
|
for (int z = 0; z < 32; z++) {
|
||||||
if (present[x][z]) {
|
if (present[x][z]) {
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
overview[x][z][i] = ChunkPacker.stringToBlock(in.readUTF()).getDefaultState();
|
overview[x][z][i] = ChunkPacker.stringToBlockRequired(in.readUTF()).getDefaultState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -258,6 +255,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
int numSpecialBlockTypes = in.readShort() & 0xffff;
|
int numSpecialBlockTypes = in.readShort() & 0xffff;
|
||||||
for (int i = 0; i < numSpecialBlockTypes; i++) {
|
for (int i = 0; i < numSpecialBlockTypes; i++) {
|
||||||
String blockName = in.readUTF();
|
String blockName = in.readUTF();
|
||||||
|
ChunkPacker.stringToBlockRequired(blockName);
|
||||||
List<BlockPos> locs = new ArrayList<>();
|
List<BlockPos> locs = new ArrayList<>();
|
||||||
location[x][z].put(blockName, locs);
|
location[x][z].put(blockName, locs);
|
||||||
int numLocations = in.readShort() & 0xffff;
|
int numLocations = in.readShort() & 0xffff;
|
||||||
@@ -306,7 +304,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public synchronized final void removeExpired() {
|
public synchronized final void removeExpired() {
|
||||||
long expiry = Baritone.settings().cachedChunksExpirySeconds.get();
|
long expiry = Baritone.settings().cachedChunksExpirySeconds.value;
|
||||||
if (expiry < 0) {
|
if (expiry < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-8
@@ -32,7 +32,6 @@ import java.io.IOException;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
@@ -71,8 +70,6 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
this.directory = directory.toString();
|
this.directory = directory.toString();
|
||||||
this.dimension = dimension;
|
this.dimension = dimension;
|
||||||
System.out.println("Cached world directory: " + directory);
|
System.out.println("Cached world directory: " + directory);
|
||||||
// Insert an invalid region element
|
|
||||||
cachedRegions.put(0, null);
|
|
||||||
Baritone.getExecutor().execute(new PackerThread());
|
Baritone.getExecutor().execute(new PackerThread());
|
||||||
Baritone.getExecutor().execute(() -> {
|
Baritone.getExecutor().execute(() -> {
|
||||||
try {
|
try {
|
||||||
@@ -108,9 +105,13 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
return region.isCached(blockX & 511, blockZ & 511);
|
return region.isCached(blockX & 511, blockZ & 511);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final boolean regionLoaded(int blockX, int blockZ) {
|
||||||
|
return getRegion(blockX >> 9, blockZ >> 9) != null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final LinkedList<BlockPos> getLocationsOf(String block, int maximum, int centerX, int centerZ, int maxRegionDistanceSq) {
|
public final ArrayList<BlockPos> getLocationsOf(String block, int maximum, int centerX, int centerZ, int maxRegionDistanceSq) {
|
||||||
LinkedList<BlockPos> res = new LinkedList<>();
|
ArrayList<BlockPos> res = new ArrayList<>();
|
||||||
int centerRegionX = centerX >> 9;
|
int centerRegionX = centerX >> 9;
|
||||||
int centerRegionZ = centerZ >> 9;
|
int centerRegionZ = centerZ >> 9;
|
||||||
|
|
||||||
@@ -127,7 +128,7 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
CachedRegion region = getOrCreateRegion(regionX, regionZ);
|
CachedRegion region = getOrCreateRegion(regionX, regionZ);
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
// TODO: 100% verify if this or addAll is faster.
|
// TODO: 100% verify if this or addAll is faster.
|
||||||
region.getLocationsOf(block).forEach(res::add);
|
res.addAll(region.getLocationsOf(block));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,7 +147,7 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void save() {
|
public final void save() {
|
||||||
if (!Baritone.settings().chunkCaching.get()) {
|
if (!Baritone.settings().chunkCaching.value) {
|
||||||
System.out.println("Not saving to disk; chunk caching is disabled.");
|
System.out.println("Not saving to disk; chunk caching is disabled.");
|
||||||
allRegions().forEach(region -> {
|
allRegions().forEach(region -> {
|
||||||
if (region != null) {
|
if (region != null) {
|
||||||
@@ -171,7 +172,7 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
* Delete regions that are too far from the player
|
* Delete regions that are too far from the player
|
||||||
*/
|
*/
|
||||||
private synchronized void prune() {
|
private synchronized void prune() {
|
||||||
if (!Baritone.settings().pruneRegionsFromRAM.get()) {
|
if (!Baritone.settings().pruneRegionsFromRAM.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BlockPos pruneCenter = guessPosition();
|
BlockPos pruneCenter = guessPosition();
|
||||||
|
|||||||
+33
-14
@@ -24,9 +24,11 @@ import net.minecraft.block.state.IBlockState;
|
|||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.util.registry.IRegistry;
|
||||||
import net.minecraft.world.chunk.BlockStateContainer;
|
import net.minecraft.world.chunk.BlockStateContainer;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
|
import net.minecraft.world.chunk.ChunkSection;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -46,9 +48,9 @@ public final class ChunkPacker {
|
|||||||
Map<String, List<BlockPos>> specialBlocks = new HashMap<>();
|
Map<String, List<BlockPos>> specialBlocks = new HashMap<>();
|
||||||
BitSet bitSet = new BitSet(CachedChunk.SIZE);
|
BitSet bitSet = new BitSet(CachedChunk.SIZE);
|
||||||
try {
|
try {
|
||||||
ExtendedBlockStorage[] chunkInternalStorageArray = chunk.getBlockStorageArray();
|
ChunkSection[] chunkInternalStorageArray = chunk.getSections();
|
||||||
for (int y0 = 0; y0 < 16; y0++) {
|
for (int y0 = 0; y0 < 16; y0++) {
|
||||||
ExtendedBlockStorage extendedblockstorage = chunkInternalStorageArray[y0];
|
ChunkSection extendedblockstorage = chunkInternalStorageArray[y0];
|
||||||
if (extendedblockstorage == null) {
|
if (extendedblockstorage == null) {
|
||||||
// any 16x16x16 area that's all air will have null storage
|
// any 16x16x16 area that's all air will have null storage
|
||||||
// for example, in an ocean biome, with air from y=64 to y=256
|
// for example, in an ocean biome, with air from y=64 to y=256
|
||||||
@@ -60,7 +62,7 @@ public final class ChunkPacker {
|
|||||||
// since a bitset is initialized to all zero, and air is saved as zeros
|
// since a bitset is initialized to all zero, and air is saved as zeros
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
BlockStateContainer bsc = extendedblockstorage.getData();
|
BlockStateContainer<IBlockState> bsc = extendedblockstorage.getData();
|
||||||
int yReal = y0 << 4;
|
int yReal = y0 << 4;
|
||||||
// the mapping of BlockStateContainer.getIndex from xyz to index is y << 8 | z << 4 | x;
|
// the mapping of BlockStateContainer.getIndex from xyz to index is y << 8 | z << 4 | x;
|
||||||
// for better cache locality, iterate in that order
|
// for better cache locality, iterate in that order
|
||||||
@@ -90,7 +92,8 @@ public final class ChunkPacker {
|
|||||||
IBlockState[] blocks = new IBlockState[256];
|
IBlockState[] blocks = new IBlockState[256];
|
||||||
|
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
https://www.ibm.com/developerworks/library/j-perry-writing-good-java-code/index.html
|
https:
|
||||||
|
//www.ibm.com/developerworks/library/j-perry-writing-good-java-code/index.html
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
for (int y = 255; y >= 0; y--) {
|
for (int y = 255; y >= 0; y--) {
|
||||||
int index = CachedChunk.getPositionIndex(x, y, z);
|
int index = CachedChunk.getPositionIndex(x, y, z);
|
||||||
@@ -106,7 +109,7 @@ public final class ChunkPacker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String blockToString(Block block) {
|
public static String blockToString(Block block) {
|
||||||
ResourceLocation loc = Block.REGISTRY.getNameForObject(block);
|
ResourceLocation loc = IRegistry.BLOCK.getKey(block);
|
||||||
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
||||||
if (!loc.getNamespace().equals("minecraft")) {
|
if (!loc.getNamespace().equals("minecraft")) {
|
||||||
// Baritone is running on top of forge with mods installed, perhaps?
|
// Baritone is running on top of forge with mods installed, perhaps?
|
||||||
@@ -115,32 +118,48 @@ public final class ChunkPacker {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Block stringToBlock(String name) {
|
public static Block stringToBlockRequired(String name) {
|
||||||
return resourceCache.computeIfAbsent(name, n -> Block.getBlockFromName(n.contains(":") ? n : "minecraft:" + n));
|
if (name.equals("lit_redstone_ore")) {
|
||||||
|
return stringToBlockRequired("redstone_ore");
|
||||||
|
}
|
||||||
|
Block block = stringToBlockNullable(name);
|
||||||
|
Objects.requireNonNull(block);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Block stringToBlockNullable(String name) {
|
||||||
|
return resourceCache.computeIfAbsent(name, n -> IRegistry.BLOCK.get(new ResourceLocation(n.contains(":") ? n : "minecraft:" + n)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PathingBlockType getPathingBlockType(IBlockState state, Chunk chunk, int x, int y, int z) {
|
private static PathingBlockType getPathingBlockType(IBlockState state, Chunk chunk, int x, int y, int z) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (block == Blocks.WATER || block == Blocks.FLOWING_WATER) {
|
if (MovementHelper.isWater(state)) {
|
||||||
// only water source blocks are plausibly usable, flowing water should be avoid
|
// only water source blocks are plausibly usable, flowing water should be avoid
|
||||||
// FLOWING_WATER is a waterfall, it doesn't really matter and caching it as AVOID just makes it look wrong
|
// FLOWING_WATER is a waterfall, it doesn't really matter and caching it as AVOID just makes it look wrong
|
||||||
if (!MovementHelper.possiblyFlowing(state)) {
|
if (MovementHelper.possiblyFlowing(state)) {
|
||||||
return PathingBlockType.WATER;
|
return PathingBlockType.AVOID;
|
||||||
}
|
}
|
||||||
if (BlockLiquid.getSlopeAngle(chunk.getWorld(), new BlockPos(x + chunk.x << 4, y, z + chunk.z << 4), state.getMaterial(), state) != -1000.0F) {
|
if (x == 0 || x == 15 || z == 0 || z == 15) {
|
||||||
|
Vec3d flow = state.getFluidState().getFlow(chunk.getWorld(), new BlockPos(x + chunk.x << 4, y, z + chunk.z << 4));
|
||||||
|
if (flow.x != 0.0 || flow.z != 0.0) {
|
||||||
|
return PathingBlockType.WATER;
|
||||||
|
}
|
||||||
|
return PathingBlockType.AVOID;
|
||||||
|
}
|
||||||
|
if (MovementHelper.possiblyFlowing(chunk.getBlockState(x + 1, y, z)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x - 1, y, z)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z + 1)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z - 1))) {
|
||||||
return PathingBlockType.AVOID;
|
return PathingBlockType.AVOID;
|
||||||
}
|
}
|
||||||
return PathingBlockType.WATER;
|
return PathingBlockType.WATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MovementHelper.avoidWalkingInto(block) || MovementHelper.isBottomSlab(state)) {
|
if (MovementHelper.avoidWalkingInto(state) || MovementHelper.isBottomSlab(state)) {
|
||||||
return PathingBlockType.AVOID;
|
return PathingBlockType.AVOID;
|
||||||
}
|
}
|
||||||
// We used to do an AABB check here
|
// We used to do an AABB check here
|
||||||
// however, this failed in the nether when you were near a nether fortress
|
// however, this failed in the nether when you were near a nether fortress
|
||||||
// because fences check their adjacent blocks in the world for their fence connection status to determine AABB shape
|
// because fences check their adjacent blocks in the world for their fence connection status to determine AABB shape
|
||||||
// this caused a nullpointerexception when we saved chunks on unload, because they were unable to check their neighbors
|
// this caused a nullpointerexception when we saved chunks on unload, because they were unable to check their neighbors
|
||||||
if (block == Blocks.AIR || block instanceof BlockTallGrass || block instanceof BlockDoublePlant || block instanceof BlockFlower) {
|
if (block instanceof BlockAir || block instanceof BlockTallGrass || block instanceof BlockDoublePlant || block instanceof BlockFlower) {
|
||||||
return PathingBlockType.AIR;
|
return PathingBlockType.AIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -70,7 +70,7 @@ public class ContainerMemory implements IContainerMemory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void save() throws IOException {
|
public synchronized void save() throws IOException {
|
||||||
if (!Baritone.settings().containerMemory.get()) {
|
if (!Baritone.settings().containerMemory.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ByteBuf buf = Unpooled.buffer(0, Integer.MAX_VALUE);
|
ByteBuf buf = Unpooled.buffer(0, Integer.MAX_VALUE);
|
||||||
|
|||||||
+4
-3
@@ -24,6 +24,7 @@ import baritone.utils.accessor.IAnvilChunkLoader;
|
|||||||
import baritone.utils.accessor.IChunkProviderServer;
|
import baritone.utils.accessor.IChunkProviderServer;
|
||||||
import net.minecraft.server.integrated.IntegratedServer;
|
import net.minecraft.server.integrated.IntegratedServer;
|
||||||
import net.minecraft.world.WorldServer;
|
import net.minecraft.world.WorldServer;
|
||||||
|
import net.minecraft.world.dimension.DimensionType;
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -55,7 +56,7 @@ public class WorldProvider implements IWorldProvider, Helper {
|
|||||||
*
|
*
|
||||||
* @param dimension The ID of the world's dimension
|
* @param dimension The ID of the world's dimension
|
||||||
*/
|
*/
|
||||||
public final void initWorld(int dimension) {
|
public final void initWorld(DimensionType dimension) {
|
||||||
File directory;
|
File directory;
|
||||||
File readme;
|
File readme;
|
||||||
|
|
||||||
@@ -92,7 +93,7 @@ public class WorldProvider implements IWorldProvider, Helper {
|
|||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
|
|
||||||
// We will actually store the world data in a subfolder: "DIM<id>"
|
// We will actually store the world data in a subfolder: "DIM<id>"
|
||||||
Path dir = new File(directory, "DIM" + dimension).toPath();
|
Path dir = new File(directory, "DIM" + dimension.getId()).toPath();
|
||||||
if (!Files.exists(dir)) {
|
if (!Files.exists(dir)) {
|
||||||
try {
|
try {
|
||||||
Files.createDirectories(dir);
|
Files.createDirectories(dir);
|
||||||
@@ -101,7 +102,7 @@ public class WorldProvider implements IWorldProvider, Helper {
|
|||||||
|
|
||||||
System.out.println("Baritone world data dir: " + dir);
|
System.out.println("Baritone world data dir: " + dir);
|
||||||
synchronized (worldCache) {
|
synchronized (worldCache) {
|
||||||
this.currentWorld = worldCache.computeIfAbsent(dir, d -> new WorldData(d, dimension));
|
this.currentWorld = worldCache.computeIfAbsent(dir, d -> new WorldData(d, dimension.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+33
-17
@@ -26,17 +26,17 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.world.chunk.BlockStateContainer;
|
import net.minecraft.world.chunk.BlockStateContainer;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
|
import net.minecraft.world.chunk.ChunkSection;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
import java.util.stream.IntStream;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public enum WorldScanner implements IWorldScanner {
|
public enum WorldScanner implements IWorldScanner {
|
||||||
|
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
|
private static final int[] DEFAULT_COORDINATE_ITERATION_ORDER = IntStream.range(0, 16).toArray();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BlockPos> scanChunkRadius(IPlayerContext ctx, List<Block> blocks, int max, int yLevelThreshold, int maxSearchRadius) {
|
public List<BlockPos> scanChunkRadius(IPlayerContext ctx, List<Block> blocks, int max, int yLevelThreshold, int maxSearchRadius) {
|
||||||
if (blocks.contains(null)) {
|
if (blocks.contains(null)) {
|
||||||
@@ -53,6 +53,9 @@ public enum WorldScanner implements IWorldScanner {
|
|||||||
int playerChunkZ = ctx.playerFeet().getZ() >> 4;
|
int playerChunkZ = ctx.playerFeet().getZ() >> 4;
|
||||||
int playerY = ctx.playerFeet().getY();
|
int playerY = ctx.playerFeet().getY();
|
||||||
|
|
||||||
|
int playerYBlockStateContainerIndex = playerY >> 4;
|
||||||
|
int[] coordinateIterationOrder = IntStream.range(0, 16).boxed().sorted(Comparator.comparingInt(y -> Math.abs(y - playerYBlockStateContainerIndex))).mapToInt(x -> x).toArray();
|
||||||
|
|
||||||
int searchRadiusSq = 0;
|
int searchRadiusSq = 0;
|
||||||
boolean foundWithinY = false;
|
boolean foundWithinY = false;
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -67,12 +70,14 @@ public enum WorldScanner implements IWorldScanner {
|
|||||||
foundChunks = true;
|
foundChunks = true;
|
||||||
int chunkX = xoff + playerChunkX;
|
int chunkX = xoff + playerChunkX;
|
||||||
int chunkZ = zoff + playerChunkZ;
|
int chunkZ = zoff + playerChunkZ;
|
||||||
Chunk chunk = chunkProvider.getLoadedChunk(chunkX, chunkZ);
|
Chunk chunk = chunkProvider.getChunk(chunkX, chunkZ, false, false);
|
||||||
if (chunk == null) {
|
if (chunk == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
allUnloaded = false;
|
allUnloaded = false;
|
||||||
scanChunkInto(chunkX << 4, chunkZ << 4, chunk, blocks, res, max, yLevelThreshold, playerY);
|
if (scanChunkInto(chunkX << 4, chunkZ << 4, chunk, blocks, res, max, yLevelThreshold, playerY, coordinateIterationOrder)) {
|
||||||
|
foundWithinY = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((allUnloaded && foundChunks)
|
if ((allUnloaded && foundChunks)
|
||||||
@@ -92,7 +97,7 @@ public enum WorldScanner implements IWorldScanner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChunkProviderClient chunkProvider = (ChunkProviderClient) ctx.world().getChunkProvider();
|
ChunkProviderClient chunkProvider = (ChunkProviderClient) ctx.world().getChunkProvider();
|
||||||
Chunk chunk = chunkProvider.getLoadedChunk(pos.x, pos.z);
|
Chunk chunk = chunkProvider.getChunk(pos.x, pos.z, false, false);
|
||||||
int playerY = ctx.playerFeet().getY();
|
int playerY = ctx.playerFeet().getY();
|
||||||
|
|
||||||
if (chunk == null || chunk.isEmpty()) {
|
if (chunk == null || chunk.isEmpty()) {
|
||||||
@@ -100,19 +105,21 @@ public enum WorldScanner implements IWorldScanner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<BlockPos> res = new ArrayList<>();
|
ArrayList<BlockPos> res = new ArrayList<>();
|
||||||
scanChunkInto(pos.x << 4, pos.z << 4, chunk, blocks, res, max, yLevelThreshold, playerY);
|
scanChunkInto(pos.x << 4, pos.z << 4, chunk, blocks, res, max, yLevelThreshold, playerY, DEFAULT_COORDINATE_ITERATION_ORDER);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scanChunkInto(int chunkX, int chunkZ, Chunk chunk, List<Block> search, Collection<BlockPos> result, int max, int yLevelThreshold, int playerY) {
|
private boolean scanChunkInto(int chunkX, int chunkZ, Chunk chunk, List<Block> search, Collection<BlockPos> result, int max, int yLevelThreshold, int playerY, int[] coordinateIterationOrder) {
|
||||||
ExtendedBlockStorage[] chunkInternalStorageArray = chunk.getBlockStorageArray();
|
ChunkSection[] chunkInternalStorageArray = chunk.getSections();
|
||||||
for (int y0 = 0; y0 < 16; y0++) {
|
boolean foundWithinY = false;
|
||||||
ExtendedBlockStorage extendedblockstorage = chunkInternalStorageArray[y0];
|
for (int yIndex = 0; yIndex < 16; yIndex++) {
|
||||||
|
int y0 = coordinateIterationOrder[yIndex];
|
||||||
|
ChunkSection extendedblockstorage = chunkInternalStorageArray[y0];
|
||||||
if (extendedblockstorage == null) {
|
if (extendedblockstorage == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int yReal = y0 << 4;
|
int yReal = y0 << 4;
|
||||||
BlockStateContainer bsc = extendedblockstorage.getData();
|
BlockStateContainer<IBlockState> bsc = extendedblockstorage.getData();
|
||||||
// the mapping of BlockStateContainer.getIndex from xyz to index is y << 8 | z << 4 | x;
|
// the mapping of BlockStateContainer.getIndex from xyz to index is y << 8 | z << 4 | x;
|
||||||
// for better cache locality, iterate in that order
|
// for better cache locality, iterate in that order
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
@@ -121,14 +128,23 @@ public enum WorldScanner implements IWorldScanner {
|
|||||||
IBlockState state = bsc.get(x, y, z);
|
IBlockState state = bsc.get(x, y, z);
|
||||||
if (search.contains(state.getBlock())) {
|
if (search.contains(state.getBlock())) {
|
||||||
int yy = yReal | y;
|
int yy = yReal | y;
|
||||||
result.add(new BlockPos(chunkX | x, yy, chunkZ | z));
|
if (result.size() >= max) {
|
||||||
if (result.size() >= max && Math.abs(yy - playerY) < yLevelThreshold) {
|
if (Math.abs(yy - playerY) < yLevelThreshold) {
|
||||||
return;
|
foundWithinY = true;
|
||||||
|
} else {
|
||||||
|
if (foundWithinY) {
|
||||||
|
// have found within Y in this chunk, so don't need to consider outside Y
|
||||||
|
// TODO continue iteration to one more sorted Y coordinate block
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
result.add(new BlockPos(chunkX | x, yy, chunkZ | z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return foundWithinY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public final class GameEventHandler implements IEventBus, Helper {
|
|||||||
// to make sure the chunk being unloaded is already loaded.
|
// to make sure the chunk being unloaded is already loaded.
|
||||||
boolean isPreUnload = state == EventState.PRE
|
boolean isPreUnload = state == EventState.PRE
|
||||||
&& type == ChunkEvent.Type.UNLOAD
|
&& type == ChunkEvent.Type.UNLOAD
|
||||||
&& world.getChunkProvider().isChunkGeneratedAt(event.getX(), event.getZ());
|
&& world.getChunkProvider().getChunk(event.getX(), event.getZ(), false, false) != null;
|
||||||
|
|
||||||
if (isPostPopulate || isPreUnload) {
|
if (isPostPopulate || isPreUnload) {
|
||||||
baritone.getWorldProvider().ifWorldLoaded(worldData -> {
|
baritone.getWorldProvider().ifWorldLoaded(worldData -> {
|
||||||
@@ -109,7 +109,7 @@ public final class GameEventHandler implements IEventBus, Helper {
|
|||||||
if (event.getState() == EventState.POST) {
|
if (event.getState() == EventState.POST) {
|
||||||
cache.closeWorld();
|
cache.closeWorld();
|
||||||
if (event.getWorld() != null) {
|
if (event.getWorld() != null) {
|
||||||
cache.initWorld(event.getWorld().provider.getDimensionType().getId());
|
cache.initWorld(event.getWorld().getDimension().getType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,20 +62,20 @@ public final class AStarPathFinder extends AbstractNodeCostSearch {
|
|||||||
MutableMoveResult res = new MutableMoveResult();
|
MutableMoveResult res = new MutableMoveResult();
|
||||||
BetterWorldBorder worldBorder = new BetterWorldBorder(calcContext.world.getWorldBorder());
|
BetterWorldBorder worldBorder = new BetterWorldBorder(calcContext.world.getWorldBorder());
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
boolean slowPath = Baritone.settings().slowPath.get();
|
boolean slowPath = Baritone.settings().slowPath.value;
|
||||||
if (slowPath) {
|
if (slowPath) {
|
||||||
logDebug("slowPath is on, path timeout will be " + Baritone.settings().slowPathTimeoutMS.<Long>get() + "ms instead of " + primaryTimeout + "ms");
|
logDebug("slowPath is on, path timeout will be " + Baritone.settings().slowPathTimeoutMS.value + "ms instead of " + primaryTimeout + "ms");
|
||||||
}
|
}
|
||||||
long primaryTimeoutTime = startTime + (slowPath ? Baritone.settings().slowPathTimeoutMS.<Long>get() : primaryTimeout);
|
long primaryTimeoutTime = startTime + (slowPath ? Baritone.settings().slowPathTimeoutMS.value : primaryTimeout);
|
||||||
long failureTimeoutTime = startTime + (slowPath ? Baritone.settings().slowPathTimeoutMS.<Long>get() : failureTimeout);
|
long failureTimeoutTime = startTime + (slowPath ? Baritone.settings().slowPathTimeoutMS.value : failureTimeout);
|
||||||
boolean failing = true;
|
boolean failing = true;
|
||||||
int numNodes = 0;
|
int numNodes = 0;
|
||||||
int numMovementsConsidered = 0;
|
int numMovementsConsidered = 0;
|
||||||
int numEmptyChunk = 0;
|
int numEmptyChunk = 0;
|
||||||
boolean isFavoring = !favoring.isEmpty();
|
boolean isFavoring = !favoring.isEmpty();
|
||||||
int timeCheckInterval = 1 << 6;
|
int timeCheckInterval = 1 << 6;
|
||||||
int pathingMaxChunkBorderFetch = Baritone.settings().pathingMaxChunkBorderFetch.get(); // grab all settings beforehand so that changing settings during pathing doesn't cause a crash or unpredictable behavior
|
int pathingMaxChunkBorderFetch = Baritone.settings().pathingMaxChunkBorderFetch.value; // grab all settings beforehand so that changing settings during pathing doesn't cause a crash or unpredictable behavior
|
||||||
double minimumImprovement = Baritone.settings().minimumImprovementRepropagation.get() ? MIN_IMPROVEMENT : 0;
|
double minimumImprovement = Baritone.settings().minimumImprovementRepropagation.value ? MIN_IMPROVEMENT : 0;
|
||||||
while (!openSet.isEmpty() && numEmptyChunk < pathingMaxChunkBorderFetch && !cancelRequested) {
|
while (!openSet.isEmpty() && numEmptyChunk < pathingMaxChunkBorderFetch && !cancelRequested) {
|
||||||
if ((numNodes & (timeCheckInterval - 1)) == 0) { // only call this once every 64 nodes (about half a millisecond)
|
if ((numNodes & (timeCheckInterval - 1)) == 0) { // only call this once every 64 nodes (about half a millisecond)
|
||||||
long now = System.currentTimeMillis(); // since nanoTime is slow on windows (takes many microseconds)
|
long now = System.currentTimeMillis(); // since nanoTime is slow on windows (takes many microseconds)
|
||||||
@@ -85,7 +85,7 @@ public final class AStarPathFinder extends AbstractNodeCostSearch {
|
|||||||
}
|
}
|
||||||
if (slowPath) {
|
if (slowPath) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(Baritone.settings().slowPathTimeDelayMS.<Long>get());
|
Thread.sleep(Baritone.settings().slowPathTimeDelayMS.value);
|
||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
|||||||
this.startZ = startZ;
|
this.startZ = startZ;
|
||||||
this.goal = goal;
|
this.goal = goal;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.map = new Long2ObjectOpenHashMap<>(Baritone.settings().pathingMapDefaultSize.value, Baritone.settings().pathingMapLoadFactor.get());
|
this.map = new Long2ObjectOpenHashMap<>(Baritone.settings().pathingMapDefaultSize.value, Baritone.settings().pathingMapLoadFactor.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancel() {
|
public void cancel() {
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import static baritone.api.pathing.movement.ActionCosts.COST_INF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
* @since 8/7/2018
|
* @since 8/7/2018
|
||||||
@@ -42,6 +44,7 @@ public class CalculationContext {
|
|||||||
|
|
||||||
private static final ItemStack STACK_BUCKET_WATER = new ItemStack(Items.WATER_BUCKET);
|
private static final ItemStack STACK_BUCKET_WATER = new ItemStack(Items.WATER_BUCKET);
|
||||||
|
|
||||||
|
public final boolean safeForThreadedUse;
|
||||||
public final IBaritone baritone;
|
public final IBaritone baritone;
|
||||||
public final World world;
|
public final World world;
|
||||||
public final WorldData worldData;
|
public final WorldData worldData;
|
||||||
@@ -50,18 +53,20 @@ public class CalculationContext {
|
|||||||
public final boolean hasWaterBucket;
|
public final boolean hasWaterBucket;
|
||||||
public final boolean hasThrowaway;
|
public final boolean hasThrowaway;
|
||||||
public final boolean canSprint;
|
public final boolean canSprint;
|
||||||
public final double placeBlockCost;
|
protected final double placeBlockCost; // protected because you should call the function instead
|
||||||
public final boolean allowBreak;
|
public final boolean allowBreak;
|
||||||
public final boolean allowParkour;
|
public final boolean allowParkour;
|
||||||
public final boolean allowParkourPlace;
|
public final boolean allowParkourPlace;
|
||||||
public final boolean allowJumpAt256;
|
public final boolean allowJumpAt256;
|
||||||
public final boolean assumeWalkOnWater;
|
public final boolean assumeWalkOnWater;
|
||||||
public final boolean allowDiagonalDescend;
|
public final boolean allowDiagonalDescend;
|
||||||
|
public final boolean allowDownward;
|
||||||
public final int maxFallHeightNoWater;
|
public final int maxFallHeightNoWater;
|
||||||
public final int maxFallHeightBucket;
|
public final int maxFallHeightBucket;
|
||||||
public final double waterWalkSpeed;
|
public final double waterWalkSpeed;
|
||||||
public final double breakBlockAdditionalCost;
|
public final double breakBlockAdditionalCost;
|
||||||
public final double jumpPenalty;
|
public double backtrackCostFavoringCoefficient;
|
||||||
|
public double jumpPenalty;
|
||||||
public final double walkOnWaterOnePenalty;
|
public final double walkOnWaterOnePenalty;
|
||||||
public final BetterWorldBorder worldBorder;
|
public final BetterWorldBorder worldBorder;
|
||||||
|
|
||||||
@@ -70,33 +75,36 @@ public class CalculationContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) {
|
public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) {
|
||||||
|
this.safeForThreadedUse = forUseOnAnotherThread;
|
||||||
this.baritone = baritone;
|
this.baritone = baritone;
|
||||||
EntityPlayerSP player = baritone.getPlayerContext().player();
|
EntityPlayerSP player = baritone.getPlayerContext().player();
|
||||||
this.world = baritone.getPlayerContext().world();
|
this.world = baritone.getPlayerContext().world();
|
||||||
this.worldData = (WorldData) baritone.getWorldProvider().getCurrentWorld();
|
this.worldData = (WorldData) baritone.getWorldProvider().getCurrentWorld();
|
||||||
this.bsi = new BlockStateInterface(world, worldData, forUseOnAnotherThread); // TODO TODO TODO
|
this.bsi = new BlockStateInterface(world, worldData, forUseOnAnotherThread);
|
||||||
this.toolSet = new ToolSet(player);
|
this.toolSet = new ToolSet(player);
|
||||||
this.hasThrowaway = Baritone.settings().allowPlace.get() && MovementHelper.throwaway(baritone.getPlayerContext(), false);
|
this.hasThrowaway = Baritone.settings().allowPlace.value && ((Baritone) baritone).getInventoryBehavior().hasGenericThrowaway();
|
||||||
this.hasWaterBucket = Baritone.settings().allowWaterBucketFall.get() && InventoryPlayer.isHotbar(player.inventory.getSlotFor(STACK_BUCKET_WATER)) && !world.provider.isNether();
|
this.hasWaterBucket = Baritone.settings().allowWaterBucketFall.value && InventoryPlayer.isHotbar(player.inventory.getSlotFor(STACK_BUCKET_WATER)) && !world.getDimension().isNether();
|
||||||
this.canSprint = Baritone.settings().allowSprint.get() && player.getFoodStats().getFoodLevel() > 6;
|
this.canSprint = Baritone.settings().allowSprint.value && player.getFoodStats().getFoodLevel() > 6;
|
||||||
this.placeBlockCost = Baritone.settings().blockPlacementPenalty.get();
|
this.placeBlockCost = Baritone.settings().blockPlacementPenalty.value;
|
||||||
this.allowBreak = Baritone.settings().allowBreak.get();
|
this.allowBreak = Baritone.settings().allowBreak.value;
|
||||||
this.allowParkour = Baritone.settings().allowParkour.get();
|
this.allowParkour = Baritone.settings().allowParkour.value;
|
||||||
this.allowParkourPlace = Baritone.settings().allowParkourPlace.get();
|
this.allowParkourPlace = Baritone.settings().allowParkourPlace.value;
|
||||||
this.allowJumpAt256 = Baritone.settings().allowJumpAt256.get();
|
this.allowJumpAt256 = Baritone.settings().allowJumpAt256.value;
|
||||||
this.assumeWalkOnWater = Baritone.settings().assumeWalkOnWater.get();
|
this.assumeWalkOnWater = Baritone.settings().assumeWalkOnWater.value;
|
||||||
this.allowDiagonalDescend = Baritone.settings().allowDiagonalDescend.get();
|
this.allowDiagonalDescend = Baritone.settings().allowDiagonalDescend.value;
|
||||||
this.maxFallHeightNoWater = Baritone.settings().maxFallHeightNoWater.get();
|
this.allowDownward = Baritone.settings().allowDownward.value;
|
||||||
this.maxFallHeightBucket = Baritone.settings().maxFallHeightBucket.get();
|
this.maxFallHeightNoWater = Baritone.settings().maxFallHeightNoWater.value;
|
||||||
|
this.maxFallHeightBucket = Baritone.settings().maxFallHeightBucket.value;
|
||||||
int depth = EnchantmentHelper.getDepthStriderModifier(player);
|
int depth = EnchantmentHelper.getDepthStriderModifier(player);
|
||||||
if (depth > 3) {
|
if (depth > 3) {
|
||||||
depth = 3;
|
depth = 3;
|
||||||
}
|
}
|
||||||
float mult = depth / 3.0F;
|
float mult = depth / 3.0F;
|
||||||
this.waterWalkSpeed = ActionCosts.WALK_ONE_IN_WATER_COST * (1 - mult) + ActionCosts.WALK_ONE_BLOCK_COST * mult;
|
this.waterWalkSpeed = ActionCosts.WALK_ONE_IN_WATER_COST * (1 - mult) + ActionCosts.WALK_ONE_BLOCK_COST * mult;
|
||||||
this.breakBlockAdditionalCost = Baritone.settings().blockBreakAdditionalPenalty.get();
|
this.breakBlockAdditionalCost = Baritone.settings().blockBreakAdditionalPenalty.value;
|
||||||
this.jumpPenalty = Baritone.settings().jumpPenalty.get();
|
this.backtrackCostFavoringCoefficient = Baritone.settings().backtrackCostFavoringCoefficient.value;
|
||||||
this.walkOnWaterOnePenalty = Baritone.settings().walkOnWaterOnePenalty.get();
|
this.jumpPenalty = Baritone.settings().jumpPenalty.value;
|
||||||
|
this.walkOnWaterOnePenalty = Baritone.settings().walkOnWaterOnePenalty.value;
|
||||||
// why cache these things here, why not let the movements just get directly from settings?
|
// why cache these things here, why not let the movements just get directly from settings?
|
||||||
// because if some movements are calculated one way and others are calculated another way,
|
// because if some movements are calculated one way and others are calculated another way,
|
||||||
// then you get a wildly inconsistent path that isn't optimal for either scenario.
|
// then you get a wildly inconsistent path that isn't optimal for either scenario.
|
||||||
@@ -123,21 +131,32 @@ public class CalculationContext {
|
|||||||
return get(x, y, z).getBlock();
|
return get(x, y, z).getBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canPlaceThrowawayAt(int x, int y, int z) {
|
public double costOfPlacingAt(int x, int y, int z) {
|
||||||
if (!hasThrowaway) { // only true if allowPlace is true, see constructor
|
if (!hasThrowaway) { // only true if allowPlace is true, see constructor
|
||||||
return false;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (isPossiblyProtected(x, y, z)) {
|
if (isPossiblyProtected(x, y, z)) {
|
||||||
return false;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
return worldBorder.canPlaceAt(x, z); // TODO perhaps MovementHelper.canPlaceAgainst could also use this?
|
if (!worldBorder.canPlaceAt(x, z)) {
|
||||||
|
// TODO perhaps MovementHelper.canPlaceAgainst could also use this?
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
return placeBlockCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canBreakAt(int x, int y, int z) {
|
public double breakCostMultiplierAt(int x, int y, int z) {
|
||||||
if (!allowBreak) {
|
if (!allowBreak) {
|
||||||
return false;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
return !isPossiblyProtected(x, y, z);
|
if (isPossiblyProtected(x, y, z)) {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double placeBucketCost() {
|
||||||
|
return placeBlockCost; // shrug
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPossiblyProtected(int x, int y, int z) {
|
public boolean isPossiblyProtected(int x, int y, int z) {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import baritone.api.pathing.movement.MovementStatus;
|
|||||||
import baritone.api.utils.*;
|
import baritone.api.utils.*;
|
||||||
import baritone.api.utils.input.Input;
|
import baritone.api.utils.input.Input;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.BlockLiquid;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
@@ -34,7 +33,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
public abstract class Movement implements IMovement, MovementHelper {
|
public abstract class Movement implements IMovement, MovementHelper {
|
||||||
|
|
||||||
protected static final EnumFacing[] HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP = {EnumFacing.NORTH, EnumFacing.SOUTH, EnumFacing.EAST, EnumFacing.WEST, EnumFacing.DOWN};
|
public static final EnumFacing[] HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP = {EnumFacing.NORTH, EnumFacing.SOUTH, EnumFacing.EAST, EnumFacing.WEST, EnumFacing.DOWN};
|
||||||
|
|
||||||
protected final IBaritone baritone;
|
protected final IBaritone baritone;
|
||||||
protected final IPlayerContext ctx;
|
protected final IPlayerContext ctx;
|
||||||
@@ -76,31 +75,28 @@ public abstract class Movement implements IMovement, MovementHelper {
|
|||||||
this(baritone, src, dest, toBreak, null);
|
this(baritone, src, dest, toBreak, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public double getCost() throws NullPointerException {
|
||||||
public double getCost() {
|
return cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCost(CalculationContext context) {
|
||||||
if (cost == null) {
|
if (cost == null) {
|
||||||
cost = calculateCost(new CalculationContext(baritone));
|
cost = calculateCost(context);
|
||||||
}
|
}
|
||||||
return cost;
|
return cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract double calculateCost(CalculationContext context);
|
public abstract double calculateCost(CalculationContext context);
|
||||||
|
|
||||||
@Override
|
public double recalculateCost(CalculationContext context) {
|
||||||
public double recalculateCost() {
|
|
||||||
cost = null;
|
cost = null;
|
||||||
return getCost();
|
return getCost(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void override(double cost) {
|
public void override(double cost) {
|
||||||
this.cost = cost;
|
this.cost = cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double calculateCostWithoutCaching() {
|
|
||||||
return calculateCost(new CalculationContext(baritone));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the execution of the latest Movement
|
* Handles the execution of the latest Movement
|
||||||
* State, and offers a Status to the calling class.
|
* State, and offers a Status to the calling class.
|
||||||
@@ -109,7 +105,7 @@ public abstract class Movement implements IMovement, MovementHelper {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public MovementStatus update() {
|
public MovementStatus update() {
|
||||||
ctx.player().capabilities.isFlying = false;
|
ctx.player().abilities.isFlying = false;
|
||||||
currentState = updateState(currentState);
|
currentState = updateState(currentState);
|
||||||
if (MovementHelper.isLiquid(ctx, ctx.playerFeet())) {
|
if (MovementHelper.isLiquid(ctx, ctx.playerFeet())) {
|
||||||
currentState.setInput(Input.JUMP, true);
|
currentState.setInput(Input.JUMP, true);
|
||||||
@@ -143,7 +139,7 @@ public abstract class Movement implements IMovement, MovementHelper {
|
|||||||
}
|
}
|
||||||
boolean somethingInTheWay = false;
|
boolean somethingInTheWay = false;
|
||||||
for (BetterBlockPos blockPos : positionsToBreak) {
|
for (BetterBlockPos blockPos : positionsToBreak) {
|
||||||
if (!MovementHelper.canWalkThrough(ctx, blockPos) && !(BlockStateInterface.getBlock(ctx, blockPos) instanceof BlockLiquid)) { // can't break liquid, so don't try
|
if (!MovementHelper.canWalkThrough(ctx, blockPos)) { // can't break air, so don't try
|
||||||
somethingInTheWay = true;
|
somethingInTheWay = true;
|
||||||
Optional<Rotation> reachable = RotationUtils.reachable(ctx.player(), blockPos, ctx.playerController().getBlockReachDistance());
|
Optional<Rotation> reachable = RotationUtils.reachable(ctx.player(), blockPos, ctx.playerController().getBlockReachDistance());
|
||||||
if (reachable.isPresent()) {
|
if (reachable.isPresent()) {
|
||||||
@@ -159,7 +155,7 @@ public abstract class Movement implements IMovement, MovementHelper {
|
|||||||
//i'm doing it anyway
|
//i'm doing it anyway
|
||||||
//i dont care if theres snow in the way!!!!!!!
|
//i dont care if theres snow in the way!!!!!!!
|
||||||
//you dont own me!!!!
|
//you dont own me!!!!
|
||||||
state.setTarget(new MovementState.MovementTarget(RotationUtils.calcRotationFromVec3d(ctx.player().getPositionEyes(1.0F),
|
state.setTarget(new MovementState.MovementTarget(RotationUtils.calcRotationFromVec3d(ctx.player().getEyePosition(1.0F),
|
||||||
VecUtils.getBlockPosCenter(blockPos), ctx.playerRotations()), true)
|
VecUtils.getBlockPosCenter(blockPos), ctx.playerRotations()), true)
|
||||||
);
|
);
|
||||||
// don't check selectedblock on this one, this is a fallback when we can't see any face directly, it's intended to be breaking the "incorrect" block
|
// don't check selectedblock on this one, this is a fallback when we can't see any face directly, it's intended to be breaking the "incorrect" block
|
||||||
|
|||||||
@@ -28,14 +28,17 @@ import baritone.utils.BlockStateInterface;
|
|||||||
import baritone.utils.Helper;
|
import baritone.utils.Helper;
|
||||||
import baritone.utils.ToolSet;
|
import baritone.utils.ToolSet;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.properties.PropertyBool;
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.fluid.FlowingFluid;
|
||||||
|
import net.minecraft.fluid.Fluid;
|
||||||
|
import net.minecraft.fluid.IFluidState;
|
||||||
|
import net.minecraft.fluid.WaterFluid;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.item.ItemPickaxe;
|
import net.minecraft.init.Fluids;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.pathfinding.PathType;
|
||||||
|
import net.minecraft.state.BooleanProperty;
|
||||||
|
import net.minecraft.state.properties.SlabType;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.NonNullList;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
@@ -56,11 +59,11 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
return b == Blocks.ICE // ice becomes water, and water can mess up the path
|
return b == Blocks.ICE // ice becomes water, and water can mess up the path
|
||||||
|| b instanceof BlockSilverfish // obvious reasons
|
|| b instanceof BlockSilverfish // obvious reasons
|
||||||
// call context.get directly with x,y,z. no need to make 5 new BlockPos for no reason
|
// call context.get directly with x,y,z. no need to make 5 new BlockPos for no reason
|
||||||
|| bsi.get0(x, y + 1, z).getBlock() instanceof BlockLiquid//don't break anything touching liquid on any side
|
|| !bsi.get0(x, y + 1, z).getFluidState().isEmpty()//don't break anything touching liquid on any side
|
||||||
|| bsi.get0(x + 1, y, z).getBlock() instanceof BlockLiquid
|
|| !bsi.get0(x + 1, y, z).getFluidState().isEmpty()
|
||||||
|| bsi.get0(x - 1, y, z).getBlock() instanceof BlockLiquid
|
|| !bsi.get0(x - 1, y, z).getFluidState().isEmpty()
|
||||||
|| bsi.get0(x, y, z + 1).getBlock() instanceof BlockLiquid
|
|| !bsi.get0(x, y, z + 1).getFluidState().isEmpty()
|
||||||
|| bsi.get0(x, y, z - 1).getBlock() instanceof BlockLiquid;
|
|| !bsi.get0(x, y, z - 1).getFluidState().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean canWalkThrough(IPlayerContext ctx, BetterBlockPos pos) {
|
static boolean canWalkThrough(IPlayerContext ctx, BetterBlockPos pos) {
|
||||||
@@ -73,10 +76,10 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
|
|
||||||
static boolean canWalkThrough(BlockStateInterface bsi, int x, int y, int z, IBlockState state) {
|
static boolean canWalkThrough(BlockStateInterface bsi, int x, int y, int z, IBlockState state) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (block == Blocks.AIR) { // early return for most common case
|
if (block instanceof BlockAir) { // early return for most common case
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (block == Blocks.FIRE || block == Blocks.TRIPWIRE || block == Blocks.WEB || block == Blocks.END_PORTAL || block == Blocks.COCOA || block instanceof BlockSkull) {
|
if (block == Blocks.FIRE || block == Blocks.TRIPWIRE || block == Blocks.COBWEB || block == Blocks.END_PORTAL || block == Blocks.COCOA || block instanceof BlockSkull || block == Blocks.BUBBLE_COLUMN || block instanceof BlockShulkerBox || block instanceof BlockSlab || block instanceof BlockTrapDoor) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (block instanceof BlockDoor || block instanceof BlockFenceGate) {
|
if (block instanceof BlockDoor || block instanceof BlockFenceGate) {
|
||||||
@@ -85,9 +88,10 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
// be opened by just interacting.
|
// be opened by just interacting.
|
||||||
return block != Blocks.IRON_DOOR;
|
return block != Blocks.IRON_DOOR;
|
||||||
}
|
}
|
||||||
boolean snow = block instanceof BlockSnow;
|
if (block instanceof BlockCarpet) {
|
||||||
boolean trapdoor = block instanceof BlockTrapDoor;
|
return canWalkOn(bsi, x, y - 1, z);
|
||||||
if (snow || trapdoor) {
|
}
|
||||||
|
if (block instanceof BlockSnowLayer) {
|
||||||
// we've already checked doors and fence gates
|
// we've already checked doors and fence gates
|
||||||
// so the only remaining dynamic isPassables are snow and trapdoor
|
// so the only remaining dynamic isPassables are snow and trapdoor
|
||||||
// if they're cached as a top block, we don't know their metadata
|
// if they're cached as a top block, we don't know their metadata
|
||||||
@@ -95,37 +99,32 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
if (!bsi.worldContainsLoadedChunk(x, z)) {
|
if (!bsi.worldContainsLoadedChunk(x, z)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (snow) {
|
// the check in BlockSnow.isPassable is layers < 5
|
||||||
// the check in BlockSnow.isPassable is layers < 5
|
// while actually, we want < 3 because 3 or greater makes it impassable in a 2 high ceiling
|
||||||
// while actually, we want < 3 because 3 or greater makes it impassable in a 2 high ceiling
|
if (state.get(BlockSnowLayer.LAYERS) >= 3) {
|
||||||
if (state.getValue(BlockSnow.LAYERS) >= 3) {
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// ok, it's low enough we could walk through it, but is it supported?
|
|
||||||
return canWalkOn(bsi, x, y - 1, z);
|
|
||||||
}
|
}
|
||||||
if (trapdoor) {
|
// ok, it's low enough we could walk through it, but is it supported?
|
||||||
return !state.getValue(BlockTrapDoor.OPEN); // see BlockTrapDoor.isPassable
|
return canWalkOn(bsi, x, y - 1, z);
|
||||||
}
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
}
|
||||||
if (isFlowing(x, y, z, state, bsi)) {
|
if (isFlowing(x, y, z, state, bsi)) {
|
||||||
return false; // Don't walk through flowing liquids
|
return false; // Don't walk through flowing liquids
|
||||||
}
|
}
|
||||||
if (block instanceof BlockLiquid) {
|
IFluidState fluidState = state.getFluidState();
|
||||||
if (Baritone.settings().assumeWalkOnWater.get()) {
|
if (fluidState.getFluid() instanceof WaterFluid) {
|
||||||
|
if (Baritone.settings().assumeWalkOnWater.value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
IBlockState up = bsi.get0(x, y + 1, z);
|
IBlockState up = bsi.get0(x, y + 1, z);
|
||||||
if (up.getBlock() instanceof BlockLiquid || up.getBlock() instanceof BlockLilyPad) {
|
if (!up.getFluidState().isEmpty() || up.getBlock() instanceof BlockLilyPad) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return block == Blocks.WATER || block == Blocks.FLOWING_WATER;
|
return true;
|
||||||
}
|
}
|
||||||
// every block that overrides isPassable with anything more complicated than a "return true;" or "return false;"
|
// every block that overrides isPassable with anything more complicated than a "return true;" or "return false;"
|
||||||
// has already been accounted for above
|
// has already been accounted for above
|
||||||
// therefore it's safe to not construct a blockpos from our x, y, z ints and instead just pass null
|
// therefore it's safe to not construct a blockpos from our x, y, z ints and instead just pass null
|
||||||
return block.isPassable(null, null);
|
return state.allowsMovement(null, null, PathType.LAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -144,27 +143,28 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
|
|
||||||
static boolean fullyPassable(IBlockState state) {
|
static boolean fullyPassable(IBlockState state) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (block == Blocks.AIR) { // early return for most common case
|
if (block instanceof BlockAir) { // early return for most common case
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// exceptions - blocks that are isPassable true, but we can't actually jump through
|
// exceptions - blocks that are isPassable true, but we can't actually jump through
|
||||||
if (block == Blocks.FIRE
|
if (block == Blocks.FIRE
|
||||||
|| block == Blocks.TRIPWIRE
|
|| block == Blocks.TRIPWIRE
|
||||||
|| block == Blocks.WEB
|
|| block == Blocks.COBWEB
|
||||||
|| block == Blocks.VINE
|
|| block == Blocks.VINE
|
||||||
|| block == Blocks.LADDER
|
|| block == Blocks.LADDER
|
||||||
|| block == Blocks.COCOA
|
|| block == Blocks.COCOA
|
||||||
|| block instanceof BlockDoor
|
|| block instanceof BlockDoor
|
||||||
|| block instanceof BlockFenceGate
|
|| block instanceof BlockFenceGate
|
||||||
|| block instanceof BlockSnow
|
|| block instanceof BlockSnow
|
||||||
|| block instanceof BlockLiquid
|
|| !state.getFluidState().isEmpty()
|
||||||
|| block instanceof BlockTrapDoor
|
|| block instanceof BlockTrapDoor
|
||||||
|| block instanceof BlockEndPortal
|
|| block instanceof BlockEndPortal
|
||||||
|| block instanceof BlockSkull) {
|
|| block instanceof BlockSkull
|
||||||
|
|| block instanceof BlockShulkerBox) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// door, fence gate, liquid, trapdoor have been accounted for, nothing else uses the world or pos parameters
|
// door, fence gate, liquid, trapdoor have been accounted for, nothing else uses the world or pos parameters
|
||||||
return block.isPassable(null, null);
|
return state.allowsMovement(null, null, PathType.LAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isReplacable(int x, int y, int z, IBlockState state, BlockStateInterface bsi) {
|
static boolean isReplacable(int x, int y, int z, IBlockState state, BlockStateInterface bsi) {
|
||||||
@@ -179,20 +179,19 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (block == Blocks.AIR || isWater(block)) {
|
if (block instanceof BlockAir) {
|
||||||
// early return for common cases hehe
|
// early return for common cases hehe
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (block instanceof BlockSnow) {
|
if (block instanceof BlockSnowLayer) {
|
||||||
// as before, default to true (mostly because it would otherwise make long distance pathing through snowy biomes impossible)
|
// as before, default to true (mostly because it would otherwise make long distance pathing through snowy biomes impossible)
|
||||||
if (!bsi.worldContainsLoadedChunk(x, z)) {
|
if (!bsi.worldContainsLoadedChunk(x, z)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return state.getValue(BlockSnow.LAYERS) == 1;
|
return state.get(BlockSnowLayer.LAYERS) == 1;
|
||||||
}
|
}
|
||||||
if (block instanceof BlockDoublePlant) {
|
if (block == Blocks.LARGE_FERN || block == Blocks.TALL_GRASS) {
|
||||||
BlockDoublePlant.EnumPlantType kek = state.getValue(BlockDoublePlant.VARIANT);
|
return true;
|
||||||
return kek == BlockDoublePlant.EnumPlantType.FERN || kek == BlockDoublePlant.EnumPlantType.GRASS;
|
|
||||||
}
|
}
|
||||||
return state.getMaterial().isReplaceable();
|
return state.getMaterial().isReplaceable();
|
||||||
}
|
}
|
||||||
@@ -220,16 +219,16 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.getValue(BlockFenceGate.OPEN);
|
return state.get(BlockFenceGate.OPEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isHorizontalBlockPassable(BlockPos blockPos, IBlockState blockState, BlockPos playerPos, PropertyBool propertyOpen) {
|
static boolean isHorizontalBlockPassable(BlockPos blockPos, IBlockState blockState, BlockPos playerPos, BooleanProperty propertyOpen) {
|
||||||
if (playerPos.equals(blockPos)) {
|
if (playerPos.equals(blockPos)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
EnumFacing.Axis facing = blockState.getValue(BlockHorizontal.FACING).getAxis();
|
EnumFacing.Axis facing = blockState.get(BlockHorizontal.HORIZONTAL_FACING).getAxis();
|
||||||
boolean open = blockState.getValue(propertyOpen);
|
boolean open = blockState.get(propertyOpen);
|
||||||
|
|
||||||
EnumFacing.Axis playerFacing;
|
EnumFacing.Axis playerFacing;
|
||||||
if (playerPos.north().equals(blockPos) || playerPos.south().equals(blockPos)) {
|
if (playerPos.north().equals(blockPos) || playerPos.south().equals(blockPos)) {
|
||||||
@@ -243,14 +242,15 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
return (facing == playerFacing) == open;
|
return (facing == playerFacing) == open;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean avoidWalkingInto(Block block) {
|
static boolean avoidWalkingInto(IBlockState state) {
|
||||||
return block instanceof BlockLiquid
|
Block block = state.getBlock();
|
||||||
|| block instanceof BlockDynamicLiquid
|
return !state.getFluidState().isEmpty()
|
||||||
|| block == Blocks.MAGMA
|
|| block == Blocks.MAGMA_BLOCK
|
||||||
|| block == Blocks.CACTUS
|
|| block == Blocks.CACTUS
|
||||||
|| block == Blocks.FIRE
|
|| block == Blocks.FIRE
|
||||||
|| block == Blocks.END_PORTAL
|
|| block == Blocks.END_PORTAL
|
||||||
|| block == Blocks.WEB;
|
|| block == Blocks.COBWEB
|
||||||
|
|| block == Blocks.BUBBLE_COLUMN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -267,7 +267,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
*/
|
*/
|
||||||
static boolean canWalkOn(BlockStateInterface bsi, int x, int y, int z, IBlockState state) {
|
static boolean canWalkOn(BlockStateInterface bsi, int x, int y, int z, IBlockState state) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (block == Blocks.AIR || block == Blocks.MAGMA) {
|
if (block instanceof BlockAir || block == Blocks.MAGMA_BLOCK || block == Blocks.BUBBLE_COLUMN) {
|
||||||
// early return for most common case (air)
|
// early return for most common case (air)
|
||||||
// plus magma, which is a normal cube but it hurts you
|
// plus magma, which is a normal cube but it hurts you
|
||||||
return false;
|
return false;
|
||||||
@@ -275,7 +275,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
if (state.isBlockNormalCube()) {
|
if (state.isBlockNormalCube()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (block == Blocks.LADDER || (block == Blocks.VINE && Baritone.settings().allowVines.get())) { // TODO reconsider this
|
if (block == Blocks.LADDER || (block == Blocks.VINE && Baritone.settings().allowVines.value)) { // TODO reconsider this
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (block == Blocks.FARMLAND || block == Blocks.GRASS_PATH) {
|
if (block == Blocks.FARMLAND || block == Blocks.GRASS_PATH) {
|
||||||
@@ -284,30 +284,31 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
if (block == Blocks.ENDER_CHEST || block == Blocks.CHEST) {
|
if (block == Blocks.ENDER_CHEST || block == Blocks.CHEST) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (isWater(block)) {
|
if (isWater(state)) {
|
||||||
// since this is called literally millions of times per second, the benefit of not allocating millions of useless "pos.up()"
|
// since this is called literally millions of times per second, the benefit of not allocating millions of useless "pos.up()"
|
||||||
// BlockPos s that we'd just garbage collect immediately is actually noticeable. I don't even think its a decrease in readability
|
// BlockPos s that we'd just garbage collect immediately is actually noticeable. I don't even think its a decrease in readability
|
||||||
Block up = bsi.get0(x, y + 1, z).getBlock();
|
IBlockState upState = bsi.get0(x, y + 1, z);
|
||||||
if (up == Blocks.WATERLILY || up == Blocks.CARPET) {
|
Block up = upState.getBlock();
|
||||||
|
if (up == Blocks.LILY_PAD || up instanceof BlockCarpet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (isFlowing(x, y, z, state, bsi) || block == Blocks.FLOWING_WATER) {
|
if (isFlowing(x, y, z, state, bsi) || upState.getFluidState().getFluid() == Fluids.FLOWING_WATER) {
|
||||||
// the only scenario in which we can walk on flowing water is if it's under still water with jesus off
|
// the only scenario in which we can walk on flowing water is if it's under still water with jesus off
|
||||||
return isWater(up) && !Baritone.settings().assumeWalkOnWater.get();
|
return isWater(upState) && !Baritone.settings().assumeWalkOnWater.value;
|
||||||
}
|
}
|
||||||
// if assumeWalkOnWater is on, we can only walk on water if there isn't water above it
|
// if assumeWalkOnWater is on, we can only walk on water if there isn't water above it
|
||||||
// if assumeWalkOnWater is off, we can only walk on water if there is water above it
|
// if assumeWalkOnWater is off, we can only walk on water if there is water above it
|
||||||
return isWater(up) ^ Baritone.settings().assumeWalkOnWater.get();
|
return isWater(upState) ^ Baritone.settings().assumeWalkOnWater.value;
|
||||||
}
|
}
|
||||||
if (block == Blocks.GLASS || block == Blocks.STAINED_GLASS) {
|
if (Baritone.settings().assumeWalkOnLava.value && isLava(state) && !isFlowing(x, y, z, state, bsi)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (block == Blocks.GLASS || block instanceof BlockStainedGlass) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (block instanceof BlockSlab) {
|
if (block instanceof BlockSlab) {
|
||||||
if (!Baritone.settings().allowWalkOnBottomSlab.get()) {
|
if (!Baritone.settings().allowWalkOnBottomSlab.value) {
|
||||||
if (((BlockSlab) block).isDouble()) {
|
return state.isTopSolid();
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return state.getValue(BlockSlab.HALF) != BlockSlab.EnumBlockHalf.BOTTOM;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -327,20 +328,22 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean canPlaceAgainst(BlockStateInterface bsi, int x, int y, int z) {
|
static boolean canPlaceAgainst(BlockStateInterface bsi, int x, int y, int z) {
|
||||||
return canPlaceAgainst(bsi.get0(x, y, z));
|
return canPlaceAgainst(bsi, x, y, z, bsi.get0(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean canPlaceAgainst(BlockStateInterface bsi, BlockPos pos) {
|
static boolean canPlaceAgainst(BlockStateInterface bsi, BlockPos pos) {
|
||||||
return canPlaceAgainst(bsi.get0(pos.getX(), pos.getY(), pos.getZ()));
|
return canPlaceAgainst(bsi, pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean canPlaceAgainst(IPlayerContext ctx, BlockPos pos) {
|
static boolean canPlaceAgainst(IPlayerContext ctx, BlockPos pos) {
|
||||||
return canPlaceAgainst(new BlockStateInterface(ctx), pos);
|
return canPlaceAgainst(new BlockStateInterface(ctx), pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean canPlaceAgainst(IBlockState state) {
|
static boolean canPlaceAgainst(BlockStateInterface bsi, int x, int y, int z, IBlockState state) {
|
||||||
// TODO isBlockNormalCube isn't the best check for whether or not we can place a block against it. e.g. glass isn't normalCube but we can place against it
|
// can we look at the center of a side face of this block and likely be able to place?
|
||||||
return state.isBlockNormalCube();
|
// (thats how this check is used)
|
||||||
|
// therefore dont include weird things that we technically could place against (like carpet) but practically can't
|
||||||
|
return state.isBlockNormalCube() || state.isFullCube() || state.getBlock() == Blocks.GLASS || state.getBlock() instanceof BlockStainedGlass;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double getMiningDurationTicks(CalculationContext context, int x, int y, int z, boolean includeFalling) {
|
static double getMiningDurationTicks(CalculationContext context, int x, int y, int z, boolean includeFalling) {
|
||||||
@@ -350,13 +353,14 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
static double getMiningDurationTicks(CalculationContext context, int x, int y, int z, IBlockState state, boolean includeFalling) {
|
static double getMiningDurationTicks(CalculationContext context, int x, int y, int z, IBlockState state, boolean includeFalling) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (!canWalkThrough(context.bsi, x, y, z, state)) {
|
if (!canWalkThrough(context.bsi, x, y, z, state)) {
|
||||||
if (!context.canBreakAt(x, y, z)) {
|
double mult = context.breakCostMultiplierAt(x, y, z);
|
||||||
|
if (mult >= COST_INF) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (avoidBreaking(context.bsi, x, y, z, state)) {
|
if (avoidBreaking(context.bsi, x, y, z, state)) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (block instanceof BlockLiquid) {
|
if (!state.getFluidState().isEmpty()) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
double m = Blocks.CRAFTING_TABLE.equals(block) ? 10 : 1; // TODO see if this is still necessary. it's from MineBot when we wanted to penalize breaking its crafting table
|
double m = Blocks.CRAFTING_TABLE.equals(block) ? 10 : 1; // TODO see if this is still necessary. it's from MineBot when we wanted to penalize breaking its crafting table
|
||||||
@@ -367,6 +371,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
|
|
||||||
double result = m / strVsBlock;
|
double result = m / strVsBlock;
|
||||||
result += context.breakBlockAdditionalCost;
|
result += context.breakBlockAdditionalCost;
|
||||||
|
result *= mult;
|
||||||
if (includeFalling) {
|
if (includeFalling) {
|
||||||
IBlockState above = context.get(x, y + 1, z);
|
IBlockState above = context.get(x, y + 1, z);
|
||||||
if (above.getBlock() instanceof BlockFalling) {
|
if (above.getBlock() instanceof BlockFalling) {
|
||||||
@@ -380,8 +385,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
|
|
||||||
static boolean isBottomSlab(IBlockState state) {
|
static boolean isBottomSlab(IBlockState state) {
|
||||||
return state.getBlock() instanceof BlockSlab
|
return state.getBlock() instanceof BlockSlab
|
||||||
&& !((BlockSlab) state.getBlock()).isDouble()
|
&& state.get(BlockSlab.TYPE) == SlabType.BOTTOM;
|
||||||
&& state.getValue(BlockSlab.HALF) == BlockSlab.EnumBlockHalf.BOTTOM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -405,42 +409,6 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
ctx.player().inventory.currentItem = ts.getBestSlot(b.getBlock());
|
ctx.player().inventory.currentItem = ts.getBestSlot(b.getBlock());
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean throwaway(IPlayerContext ctx, boolean select) {
|
|
||||||
EntityPlayerSP p = ctx.player();
|
|
||||||
NonNullList<ItemStack> inv = p.inventory.mainInventory;
|
|
||||||
for (byte i = 0; i < 9; i++) {
|
|
||||||
ItemStack item = inv.get(i);
|
|
||||||
// this usage of settings() is okay because it's only called once during pathing
|
|
||||||
// (while creating the CalculationContext at the very beginning)
|
|
||||||
// and then it's called during execution
|
|
||||||
// since this function is never called during cost calculation, we don't need to migrate
|
|
||||||
// acceptableThrowawayItems to the CalculationContext
|
|
||||||
if (Baritone.settings().acceptableThrowawayItems.get().contains(item.getItem())) {
|
|
||||||
if (select) {
|
|
||||||
p.inventory.currentItem = i;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Baritone.settings().acceptableThrowawayItems.get().contains(p.inventory.offHandInventory.get(0).getItem())) {
|
|
||||||
// main hand takes precedence over off hand
|
|
||||||
// that means that if we have block A selected in main hand and block B in off hand, right clicking places block B
|
|
||||||
// we've already checked above ^ and the main hand can't possible have an acceptablethrowawayitem
|
|
||||||
// so we need to select in the main hand something that doesn't right click
|
|
||||||
// so not a shovel, not a hoe, not a block, etc
|
|
||||||
for (byte i = 0; i < 9; i++) {
|
|
||||||
ItemStack item = inv.get(i);
|
|
||||||
if (item.isEmpty() || item.getItem() instanceof ItemPickaxe) {
|
|
||||||
if (select) {
|
|
||||||
p.inventory.currentItem = i;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void moveTowards(IPlayerContext ctx, MovementState state, BlockPos pos) {
|
static void moveTowards(IPlayerContext ctx, MovementState state, BlockPos pos) {
|
||||||
state.setTarget(new MovementTarget(
|
state.setTarget(new MovementTarget(
|
||||||
new Rotation(RotationUtils.calcRotationFromVec3d(ctx.playerHead(),
|
new Rotation(RotationUtils.calcRotationFromVec3d(ctx.playerHead(),
|
||||||
@@ -454,11 +422,12 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
* Returns whether or not the specified block is
|
* Returns whether or not the specified block is
|
||||||
* water, regardless of whether or not it is flowing.
|
* water, regardless of whether or not it is flowing.
|
||||||
*
|
*
|
||||||
* @param b The block
|
* @param state The block state
|
||||||
* @return Whether or not the block is water
|
* @return Whether or not the block is water
|
||||||
*/
|
*/
|
||||||
static boolean isWater(Block b) {
|
static boolean isWater(IBlockState state) {
|
||||||
return b == Blocks.FLOWING_WATER || b == Blocks.WATER;
|
Fluid f = state.getFluidState().getFluid();
|
||||||
|
return f == Fluids.WATER || f == Fluids.FLOWING_WATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -470,11 +439,12 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
* @return Whether or not the block is water
|
* @return Whether or not the block is water
|
||||||
*/
|
*/
|
||||||
static boolean isWater(IPlayerContext ctx, BlockPos bp) {
|
static boolean isWater(IPlayerContext ctx, BlockPos bp) {
|
||||||
return isWater(BlockStateInterface.getBlock(ctx, bp));
|
return isWater(BlockStateInterface.get(ctx, bp));
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isLava(Block b) {
|
static boolean isLava(IBlockState state) {
|
||||||
return b == Blocks.FLOWING_LAVA || b == Blocks.LAVA;
|
Fluid f = state.getFluidState().getFluid();
|
||||||
|
return f == Fluids.LAVA || f == Fluids.FLOWING_LAVA;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -485,20 +455,25 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
* @return Whether or not the block is a liquid
|
* @return Whether or not the block is a liquid
|
||||||
*/
|
*/
|
||||||
static boolean isLiquid(IPlayerContext ctx, BlockPos p) {
|
static boolean isLiquid(IPlayerContext ctx, BlockPos p) {
|
||||||
return BlockStateInterface.getBlock(ctx, p) instanceof BlockLiquid;
|
return isLiquid(BlockStateInterface.get(ctx, p));
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isLiquid(IBlockState blockState) {
|
||||||
|
return !blockState.getFluidState().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean possiblyFlowing(IBlockState state) {
|
static boolean possiblyFlowing(IBlockState state) {
|
||||||
// Will be IFluidState in 1.13
|
IFluidState fluidState = state.getFluidState();
|
||||||
return state.getBlock() instanceof BlockLiquid
|
return fluidState.getFluid() instanceof FlowingFluid
|
||||||
&& state.getValue(BlockLiquid.LEVEL) != 0;
|
&& fluidState.getFluid().getLevel(fluidState) != 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isFlowing(int x, int y, int z, IBlockState state, BlockStateInterface bsi) {
|
static boolean isFlowing(int x, int y, int z, IBlockState state, BlockStateInterface bsi) {
|
||||||
if (!(state.getBlock() instanceof BlockLiquid)) {
|
IFluidState fluidState = state.getFluidState();
|
||||||
|
if (!(fluidState.getFluid() instanceof FlowingFluid)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (state.getValue(BlockLiquid.LEVEL) != 0) {
|
if (fluidState.getFluid().getLevel(fluidState) != 8) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return possiblyFlowing(bsi.get0(x + 1, y, z))
|
return possiblyFlowing(bsi.get0(x + 1, y, z))
|
||||||
@@ -519,8 +494,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
BlockPos against1 = placeAt.offset(HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i]);
|
BlockPos against1 = placeAt.offset(HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i]);
|
||||||
if (MovementHelper.canPlaceAgainst(ctx, against1)) {
|
if (MovementHelper.canPlaceAgainst(ctx, against1)) {
|
||||||
//if (!((Baritone) baritone).getInventoryBehavior().selectThrowawayForLocation(placeAt.getX(), placeAt.getY(), placeAt.getZ())) { // get ready to place a throwaway block
|
if (!((Baritone) baritone).getInventoryBehavior().selectThrowawayForLocation(placeAt.getX(), placeAt.getY(), placeAt.getZ())) { // get ready to place a throwaway block
|
||||||
if (!throwaway(ctx, true)) {
|
|
||||||
Helper.HELPER.logDebug("bb pls get me some blocks. dirt or cobble");
|
Helper.HELPER.logDebug("bb pls get me some blocks. dirt or cobble");
|
||||||
state.setStatus(MovementStatus.UNREACHABLE);
|
state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
return PlaceResult.NO_OPTION;
|
return PlaceResult.NO_OPTION;
|
||||||
@@ -530,7 +504,7 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
double faceZ = (placeAt.getZ() + against1.getZ() + 1.0D) * 0.5D;
|
double faceZ = (placeAt.getZ() + against1.getZ() + 1.0D) * 0.5D;
|
||||||
Rotation place = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), new Vec3d(faceX, faceY, faceZ), ctx.playerRotations());
|
Rotation place = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), new Vec3d(faceX, faceY, faceZ), ctx.playerRotations());
|
||||||
RayTraceResult res = RayTraceUtils.rayTraceTowards(ctx.player(), place, ctx.playerController().getBlockReachDistance());
|
RayTraceResult res = RayTraceUtils.rayTraceTowards(ctx.player(), place, ctx.playerController().getBlockReachDistance());
|
||||||
if (res != null && res.typeOfHit == RayTraceResult.Type.BLOCK && res.getBlockPos().equals(against1) && res.getBlockPos().offset(res.sideHit).equals(placeAt)) {
|
if (res != null && res.type == RayTraceResult.Type.BLOCK && res.getBlockPos().equals(against1) && res.getBlockPos().offset(res.sideHit).equals(placeAt)) {
|
||||||
state.setTarget(new MovementState.MovementTarget(place, true));
|
state.setTarget(new MovementState.MovementTarget(place, true));
|
||||||
found = true;
|
found = true;
|
||||||
|
|
||||||
|
|||||||
@@ -53,14 +53,16 @@ public class MovementAscend extends Movement {
|
|||||||
|
|
||||||
public static double cost(CalculationContext context, int x, int y, int z, int destX, int destZ) {
|
public static double cost(CalculationContext context, int x, int y, int z, int destX, int destZ) {
|
||||||
IBlockState toPlace = context.get(destX, y, destZ);
|
IBlockState toPlace = context.get(destX, y, destZ);
|
||||||
boolean hasToPlace = false;
|
double additionalPlacementCost = 0;
|
||||||
if (!MovementHelper.canWalkOn(context.bsi, destX, y, destZ, toPlace)) {
|
if (!MovementHelper.canWalkOn(context.bsi, destX, y, destZ, toPlace)) {
|
||||||
if (!context.canPlaceThrowawayAt(destX, y, destZ)) {
|
additionalPlacementCost = context.costOfPlacingAt(destX, y, destZ);
|
||||||
|
if (additionalPlacementCost >= COST_INF) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (!MovementHelper.isReplacable(destX, y, destZ, toPlace, context.bsi)) {
|
if (!MovementHelper.isReplacable(destX, y, destZ, toPlace, context.bsi)) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
|
boolean foundPlaceOption = false;
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
int againstX = destX + HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i].getXOffset();
|
int againstX = destX + HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i].getXOffset();
|
||||||
int againstY = y + HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i].getYOffset();
|
int againstY = y + HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP[i].getYOffset();
|
||||||
@@ -69,11 +71,11 @@ public class MovementAscend extends Movement {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (MovementHelper.canPlaceAgainst(context.bsi, againstX, againstY, againstZ)) {
|
if (MovementHelper.canPlaceAgainst(context.bsi, againstX, againstY, againstZ)) {
|
||||||
hasToPlace = true;
|
foundPlaceOption = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!hasToPlace) { // didn't find a valid place =(
|
if (!foundPlaceOption) { // didn't find a valid place =(
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,10 +126,7 @@ public class MovementAscend extends Movement {
|
|||||||
walk += context.jumpPenalty;
|
walk += context.jumpPenalty;
|
||||||
}
|
}
|
||||||
|
|
||||||
double totalCost = walk;
|
double totalCost = walk + additionalPlacementCost;
|
||||||
if (hasToPlace) {
|
|
||||||
totalCost += context.placeBlockCost;
|
|
||||||
}
|
|
||||||
// start with srcUp2 since we already have its state
|
// start with srcUp2 since we already have its state
|
||||||
// includeFalling isn't needed because of the falling check above -- if srcUp3 is falling we will have already exited with COST_INF if we'd actually have to break it
|
// includeFalling isn't needed because of the falling check above -- if srcUp3 is falling we will have already exited with COST_INF if we'd actually have to break it
|
||||||
totalCost += MovementHelper.getMiningDurationTicks(context, x, y + 2, z, srcUp2, false);
|
totalCost += MovementHelper.getMiningDurationTicks(context, x, y + 2, z, srcUp2, false);
|
||||||
@@ -155,6 +154,10 @@ public class MovementAscend extends Movement {
|
|||||||
return state.setStatus(MovementStatus.SUCCESS);
|
return state.setStatus(MovementStatus.SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx.playerFeet().y < src.y) {
|
||||||
|
return state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
|
}
|
||||||
|
|
||||||
IBlockState jumpingOnto = BlockStateInterface.get(ctx, positionToPlace);
|
IBlockState jumpingOnto = BlockStateInterface.get(ctx, positionToPlace);
|
||||||
if (!MovementHelper.canWalkOn(ctx, positionToPlace, jumpingOnto)) {
|
if (!MovementHelper.canWalkOn(ctx, positionToPlace, jumpingOnto)) {
|
||||||
ticksWithoutPlacement++;
|
ticksWithoutPlacement++;
|
||||||
@@ -176,7 +179,7 @@ public class MovementAscend extends Movement {
|
|||||||
return state; // don't jump while walking from a non double slab into a bottom slab
|
return state; // don't jump while walking from a non double slab into a bottom slab
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Baritone.settings().assumeStep.get() || ctx.playerFeet().equals(src.up())) {
|
if (Baritone.settings().assumeStep.value || ctx.playerFeet().equals(src.up())) {
|
||||||
// no need to hit space if we're already jumping
|
// no need to hit space if we're already jumping
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -195,8 +198,6 @@ public class MovementAscend extends Movement {
|
|||||||
return state.setInput(Input.JUMP, true);
|
return state.setInput(Input.JUMP, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// System.out.println(flatDistToNext + " " + sideDist);
|
|
||||||
if (flatDistToNext > 1.2 || sideDist > 0.2) {
|
if (flatDistToNext > 1.2 || sideDist > 0.2) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -218,4 +219,10 @@ public class MovementAscend extends Movement {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean safeToCancel(MovementState state) {
|
||||||
|
// if we had to place, don't allow pause
|
||||||
|
return state.getStatus() != MovementStatus.RUNNING || ticksWithoutPlacement == 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ public class MovementDescend extends Movement {
|
|||||||
// and potentially replace the water we're going to fall into
|
// and potentially replace the water we're going to fall into
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!MovementHelper.canWalkThrough(context.bsi, destX, y - 2, destZ, below) && below.getBlock() != Blocks.WATER) {
|
if (!MovementHelper.canWalkThrough(context.bsi, destX, y - 2, destZ, below)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
double costSoFar = 0;
|
double costSoFar = 0;
|
||||||
@@ -137,9 +137,10 @@ public class MovementDescend extends Movement {
|
|||||||
IBlockState ontoBlock = context.get(destX, newY, destZ);
|
IBlockState ontoBlock = context.get(destX, newY, destZ);
|
||||||
int unprotectedFallHeight = fallHeight - (y - effectiveStartHeight); // equal to fallHeight - y + effectiveFallHeight, which is equal to -newY + effectiveFallHeight, which is equal to effectiveFallHeight - newY
|
int unprotectedFallHeight = fallHeight - (y - effectiveStartHeight); // equal to fallHeight - y + effectiveFallHeight, which is equal to -newY + effectiveFallHeight, which is equal to effectiveFallHeight - newY
|
||||||
double tentativeCost = WALK_OFF_BLOCK_COST + FALL_N_BLOCKS_COST[unprotectedFallHeight] + frontBreak + costSoFar;
|
double tentativeCost = WALK_OFF_BLOCK_COST + FALL_N_BLOCKS_COST[unprotectedFallHeight] + frontBreak + costSoFar;
|
||||||
if ((ontoBlock.getBlock() == Blocks.WATER || ontoBlock.getBlock() == Blocks.FLOWING_WATER) && context.getBlock(destX, newY + 1, destZ) != Blocks.WATERLILY) {
|
if (MovementHelper.isWater(ontoBlock)) {
|
||||||
// lilypads are canWalkThrough, but we can't end a fall that should be broken by water if it's covered by a lilypad
|
if (!MovementHelper.canWalkThrough(context.bsi, destX, newY, destZ, ontoBlock)) {
|
||||||
// however, don't return impossible in the lilypad scenario, because we could still jump right on it (water that's below a lilypad is canWalkOn so it works)
|
return false;
|
||||||
|
}
|
||||||
if (context.assumeWalkOnWater) {
|
if (context.assumeWalkOnWater) {
|
||||||
return false; // TODO fix
|
return false; // TODO fix
|
||||||
}
|
}
|
||||||
@@ -186,7 +187,7 @@ public class MovementDescend extends Movement {
|
|||||||
res.x = destX;
|
res.x = destX;
|
||||||
res.y = newY + 1;// this is the block we're falling onto, so dest is +1
|
res.y = newY + 1;// this is the block we're falling onto, so dest is +1
|
||||||
res.z = destZ;
|
res.z = destZ;
|
||||||
res.cost = tentativeCost + context.placeBlockCost;
|
res.cost = tentativeCost + context.placeBucketCost();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -202,7 +203,8 @@ public class MovementDescend extends Movement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BlockPos playerFeet = ctx.playerFeet();
|
BlockPos playerFeet = ctx.playerFeet();
|
||||||
if (playerFeet.equals(dest) && (MovementHelper.isLiquid(ctx, dest) || ctx.player().posY - playerFeet.getY() < 0.094)) { // lilypads
|
BlockPos fakeDest = new BlockPos(dest.getX() * 2 - src.getX(), dest.getY(), dest.getZ() * 2 - src.getZ());
|
||||||
|
if ((playerFeet.equals(dest) || playerFeet.equals(fakeDest)) && (MovementHelper.isLiquid(ctx, dest) || ctx.player().posY - dest.getY() < 0.5)) { // lilypads
|
||||||
// Wait until we're actually on the ground before saying we're done because sometimes we continue to fall if the next action starts immediately
|
// Wait until we're actually on the ground before saying we're done because sometimes we continue to fall if the next action starts immediately
|
||||||
return state.setStatus(MovementStatus.SUCCESS);
|
return state.setStatus(MovementStatus.SUCCESS);
|
||||||
/* else {
|
/* else {
|
||||||
@@ -214,7 +216,7 @@ public class MovementDescend extends Movement {
|
|||||||
double destZ = (src.getZ() + 0.5) * 0.17 + (dest.getZ() + 0.5) * 0.83;
|
double destZ = (src.getZ() + 0.5) * 0.17 + (dest.getZ() + 0.5) * 0.83;
|
||||||
EntityPlayerSP player = ctx.player();
|
EntityPlayerSP player = ctx.player();
|
||||||
state.setTarget(new MovementState.MovementTarget(
|
state.setTarget(new MovementState.MovementTarget(
|
||||||
new Rotation(RotationUtils.calcRotationFromVec3d(player.getPositionEyes(1.0F),
|
new Rotation(RotationUtils.calcRotationFromVec3d(player.getEyePosition(1.0F),
|
||||||
new Vec3d(destX, dest.getY(), destZ),
|
new Vec3d(destX, dest.getY(), destZ),
|
||||||
new Rotation(player.rotationYaw, player.rotationPitch)).getYaw(), player.rotationPitch),
|
new Rotation(player.rotationYaw, player.rotationPitch)).getYaw(), player.rotationPitch),
|
||||||
false
|
false
|
||||||
@@ -228,12 +230,8 @@ public class MovementDescend extends Movement {
|
|||||||
double z = ctx.player().posZ - (src.getZ() + 0.5);
|
double z = ctx.player().posZ - (src.getZ() + 0.5);
|
||||||
double fromStart = Math.sqrt(x * x + z * z);
|
double fromStart = Math.sqrt(x * x + z * z);
|
||||||
if (!playerFeet.equals(dest) || ab > 0.25) {
|
if (!playerFeet.equals(dest) || ab > 0.25) {
|
||||||
BlockPos fakeDest = new BlockPos(dest.getX() * 2 - src.getX(), dest.getY(), dest.getZ() * 2 - src.getZ());
|
if (numTicks++ < 20 && fromStart < 1.25) {
|
||||||
if (numTicks++ < 20) {
|
|
||||||
MovementHelper.moveTowards(ctx, state, fakeDest);
|
MovementHelper.moveTowards(ctx, state, fakeDest);
|
||||||
if (fromStart > 1.25) {
|
|
||||||
state.getTarget().rotation = new Rotation(state.getTarget().rotation.getYaw() + 180F, state.getTarget().rotation.getPitch());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
MovementHelper.moveTowards(ctx, state, dest);
|
MovementHelper.moveTowards(ctx, state, dest);
|
||||||
}
|
}
|
||||||
@@ -250,7 +248,7 @@ public class MovementDescend extends Movement {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (int y = 0; y <= 2; y++) { // we could hit any of the three blocks
|
for (int y = 0; y <= 2; y++) { // we could hit any of the three blocks
|
||||||
if (MovementHelper.avoidWalkingInto(BlockStateInterface.getBlock(ctx, into.up(y)))) {
|
if (MovementHelper.avoidWalkingInto(BlockStateInterface.get(ctx, into.up(y)))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,12 +91,12 @@ public class MovementDiagonal extends Movement {
|
|||||||
if (fromDown == Blocks.SOUL_SAND) {
|
if (fromDown == Blocks.SOUL_SAND) {
|
||||||
multiplier += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2;
|
multiplier += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2;
|
||||||
}
|
}
|
||||||
Block cuttingOver1 = context.get(x, y - 1, destZ).getBlock();
|
IBlockState cuttingOver1 = context.get(x, y - 1, destZ);
|
||||||
if (cuttingOver1 == Blocks.MAGMA || MovementHelper.isLava(cuttingOver1)) {
|
if (cuttingOver1.getBlock() == Blocks.MAGMA_BLOCK || MovementHelper.isLava(cuttingOver1)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Block cuttingOver2 = context.get(destX, y - 1, z).getBlock();
|
IBlockState cuttingOver2 = context.get(destX, y - 1, z);
|
||||||
if (cuttingOver2 == Blocks.MAGMA || MovementHelper.isLava(cuttingOver2)) {
|
if (cuttingOver2.getBlock() == Blocks.MAGMA_BLOCK || MovementHelper.isLava(cuttingOver2)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IBlockState pb0 = context.get(x, y, destZ);
|
IBlockState pb0 = context.get(x, y, destZ);
|
||||||
@@ -115,7 +115,7 @@ public class MovementDiagonal extends Movement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IBlockState pb3 = context.get(destX, y + 1, z);
|
IBlockState pb3 = context.get(destX, y + 1, z);
|
||||||
if (optionA == 0 && ((MovementHelper.avoidWalkingInto(pb2.getBlock()) && pb2.getBlock() != Blocks.WATER) || MovementHelper.avoidWalkingInto(pb3.getBlock()))) {
|
if (optionA == 0 && ((MovementHelper.avoidWalkingInto(pb2) && pb2.getBlock() != Blocks.WATER) || MovementHelper.avoidWalkingInto(pb3))) {
|
||||||
// at this point we're done calculating optionA, so we can check if it's actually possible to edge around in that direction
|
// at this point we're done calculating optionA, so we can check if it's actually possible to edge around in that direction
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -124,13 +124,14 @@ public class MovementDiagonal extends Movement {
|
|||||||
// and finally, if the cost is nonzero for both ways to approach this diagonal, it's not possible
|
// and finally, if the cost is nonzero for both ways to approach this diagonal, it's not possible
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (optionB == 0 && ((MovementHelper.avoidWalkingInto(pb0.getBlock()) && pb0.getBlock() != Blocks.WATER) || MovementHelper.avoidWalkingInto(pb1.getBlock()))) {
|
if (optionB == 0 && ((MovementHelper.avoidWalkingInto(pb0) && pb0.getBlock() != Blocks.WATER) || MovementHelper.avoidWalkingInto(pb1))) {
|
||||||
// and now that option B is fully calculated, see if we can edge around that way
|
// and now that option B is fully calculated, see if we can edge around that way
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean water = false;
|
boolean water = false;
|
||||||
Block startIn = context.getBlock(x, y, z);
|
IBlockState startState = context.get(x, y, z);
|
||||||
if (MovementHelper.isWater(startIn) || MovementHelper.isWater(destInto.getBlock())) {
|
Block startIn = startState.getBlock();
|
||||||
|
if (MovementHelper.isWater(startState) || MovementHelper.isWater(destInto)) {
|
||||||
// Ignore previous multiplier
|
// Ignore previous multiplier
|
||||||
// Whatever we were walking on (possibly soul sand) doesn't matter as we're actually floating on water
|
// Whatever we were walking on (possibly soul sand) doesn't matter as we're actually floating on water
|
||||||
// Not even touching the blocks below
|
// Not even touching the blocks below
|
||||||
@@ -182,7 +183,7 @@ public class MovementDiagonal extends Movement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean sprint() {
|
public boolean sprint() {
|
||||||
if (MovementHelper.isLiquid(ctx, ctx.playerFeet()) && !Baritone.settings().sprintInWater.get()) {
|
if (MovementHelper.isLiquid(ctx, ctx.playerFeet()) && !Baritone.settings().sprintInWater.value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ public class MovementDownward extends Movement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static double cost(CalculationContext context, int x, int y, int z) {
|
public static double cost(CalculationContext context, int x, int y, int z) {
|
||||||
|
if (!context.allowDownward) {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
if (!MovementHelper.canWalkOn(context.bsi, x, y - 2, z)) {
|
if (!MovementHelper.canWalkOn(context.bsi, x, y - 2, z)) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import net.minecraft.block.Block;
|
|||||||
import net.minecraft.block.BlockLadder;
|
import net.minecraft.block.BlockLadder;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraft.fluid.WaterFluid;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.init.Items;
|
import net.minecraft.init.Items;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -80,10 +81,11 @@ public class MovementFall extends Movement {
|
|||||||
BlockPos playerFeet = ctx.playerFeet();
|
BlockPos playerFeet = ctx.playerFeet();
|
||||||
Rotation toDest = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.getBlockPosCenter(dest), ctx.playerRotations());
|
Rotation toDest = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.getBlockPosCenter(dest), ctx.playerRotations());
|
||||||
Rotation targetRotation = null;
|
Rotation targetRotation = null;
|
||||||
Block destBlock = ctx.world().getBlockState(dest).getBlock();
|
IBlockState destState = ctx.world().getBlockState(dest);
|
||||||
boolean isWater = destBlock == Blocks.WATER || destBlock == Blocks.FLOWING_WATER;
|
Block destBlock = destState.getBlock();
|
||||||
|
boolean isWater = destState.getFluidState().getFluid() instanceof WaterFluid;
|
||||||
if (!isWater && willPlaceBucket() && !playerFeet.equals(dest)) {
|
if (!isWater && willPlaceBucket() && !playerFeet.equals(dest)) {
|
||||||
if (!InventoryPlayer.isHotbar(ctx.player().inventory.getSlotFor(STACK_BUCKET_WATER)) || ctx.world().provider.isNether()) {
|
if (!InventoryPlayer.isHotbar(ctx.player().inventory.getSlotFor(STACK_BUCKET_WATER)) || ctx.world().getDimension().isNether()) {
|
||||||
return state.setStatus(MovementStatus.UNREACHABLE);
|
return state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +95,7 @@ public class MovementFall extends Movement {
|
|||||||
targetRotation = new Rotation(toDest.getYaw(), 90.0F);
|
targetRotation = new Rotation(toDest.getYaw(), 90.0F);
|
||||||
|
|
||||||
RayTraceResult trace = ctx.objectMouseOver();
|
RayTraceResult trace = ctx.objectMouseOver();
|
||||||
if (trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK && (trace.getBlockPos().equals(dest) || trace.getBlockPos().equals(dest.down()))) {
|
if (trace != null && trace.type == RayTraceResult.Type.BLOCK && (trace.getBlockPos().equals(dest) || trace.getBlockPos().equals(dest.down()))) {
|
||||||
state.setInput(Input.CLICK_RIGHT, true);
|
state.setInput(Input.CLICK_RIGHT, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,7 +152,7 @@ public class MovementFall extends Movement {
|
|||||||
for (int i = 0; i < 15; i++) {
|
for (int i = 0; i < 15; i++) {
|
||||||
IBlockState state = ctx.world().getBlockState(ctx.playerFeet().down(i));
|
IBlockState state = ctx.world().getBlockState(ctx.playerFeet().down(i));
|
||||||
if (state.getBlock() == Blocks.LADDER) {
|
if (state.getBlock() == Blocks.LADDER) {
|
||||||
return state.getValue(BlockLadder.FACING);
|
return state.get(BlockLadder.FACING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -28,10 +28,11 @@ import baritone.pathing.movement.MovementState;
|
|||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import baritone.utils.pathing.MutableMoveResult;
|
import baritone.utils.pathing.MutableMoveResult;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockLiquid;
|
|
||||||
import net.minecraft.block.BlockStairs;
|
import net.minecraft.block.BlockStairs;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.fluid.WaterFluid;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.init.Fluids;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
public class MovementParkour extends Movement {
|
public class MovementParkour extends Movement {
|
||||||
@@ -73,7 +74,7 @@ public class MovementParkour extends Movement {
|
|||||||
// second most common case -- we could just traverse not parkour
|
// second most common case -- we could just traverse not parkour
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (MovementHelper.avoidWalkingInto(adj.getBlock()) && adj.getBlock() != Blocks.WATER && adj.getBlock() != Blocks.FLOWING_WATER) { // magma sucks
|
if (MovementHelper.avoidWalkingInto(adj) && !(adj.getFluidState().getFluid() instanceof WaterFluid)) { // magma sucks
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!MovementHelper.fullyPassable(context, x + xDiff, y + 1, z + zDiff)) {
|
if (!MovementHelper.fullyPassable(context, x + xDiff, y + 1, z + zDiff)) {
|
||||||
@@ -86,7 +87,7 @@ public class MovementParkour extends Movement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IBlockState standingOn = context.get(x, y - 1, z);
|
IBlockState standingOn = context.get(x, y - 1, z);
|
||||||
if (standingOn.getBlock() == Blocks.VINE || standingOn.getBlock() == Blocks.LADDER || standingOn.getBlock() instanceof BlockStairs || MovementHelper.isBottomSlab(standingOn) || standingOn.getBlock() instanceof BlockLiquid) {
|
if (standingOn.getBlock() == Blocks.VINE || standingOn.getBlock() == Blocks.LADDER || standingOn.getBlock() instanceof BlockStairs || MovementHelper.isBottomSlab(standingOn) || standingOn.getFluidState().getFluid() != Fluids.EMPTY) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int maxJump;
|
int maxJump;
|
||||||
@@ -120,9 +121,11 @@ public class MovementParkour extends Movement {
|
|||||||
if (!context.allowParkourPlace) {
|
if (!context.allowParkourPlace) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// time 2 pop off with that dank skynet parkour place
|
||||||
int destX = x + 4 * xDiff;
|
int destX = x + 4 * xDiff;
|
||||||
int destZ = z + 4 * zDiff;
|
int destZ = z + 4 * zDiff;
|
||||||
if (!context.canPlaceThrowawayAt(destX, y - 1, destZ)) {
|
double placeCost = context.costOfPlacingAt(destX, y - 1, destZ);
|
||||||
|
if (placeCost >= COST_INF) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IBlockState toReplace = context.get(destX, y - 1, destZ);
|
IBlockState toReplace = context.get(destX, y - 1, destZ);
|
||||||
@@ -140,7 +143,7 @@ public class MovementParkour extends Movement {
|
|||||||
res.x = destX;
|
res.x = destX;
|
||||||
res.y = y;
|
res.y = y;
|
||||||
res.z = destZ;
|
res.z = destZ;
|
||||||
res.cost = costFromJumpDistance(4) + context.placeBlockCost + context.jumpPenalty;
|
res.cost = costFromJumpDistance(4) + placeCost + context.jumpPenalty;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package baritone.pathing.movement.movements;
|
package baritone.pathing.movement.movements;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
import baritone.api.IBaritone;
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.pathing.movement.MovementStatus;
|
import baritone.api.pathing.movement.MovementStatus;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
@@ -36,6 +37,7 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class MovementPillar extends Movement {
|
public class MovementPillar extends Movement {
|
||||||
|
|
||||||
@@ -49,14 +51,15 @@ public class MovementPillar extends Movement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static double cost(CalculationContext context, int x, int y, int z) {
|
public static double cost(CalculationContext context, int x, int y, int z) {
|
||||||
Block from = context.get(x, y, z).getBlock();
|
IBlockState fromState = context.get(x, y, z);
|
||||||
|
Block from = fromState.getBlock();
|
||||||
boolean ladder = from == Blocks.LADDER || from == Blocks.VINE;
|
boolean ladder = from == Blocks.LADDER || from == Blocks.VINE;
|
||||||
IBlockState fromDown = context.get(x, y - 1, z);
|
IBlockState fromDown = context.get(x, y - 1, z);
|
||||||
if (!ladder) {
|
if (!ladder) {
|
||||||
if (fromDown.getBlock() == Blocks.LADDER || fromDown.getBlock() == Blocks.VINE) {
|
if (fromDown.getBlock() == Blocks.LADDER || fromDown.getBlock() == Blocks.VINE) {
|
||||||
return COST_INF; // can't pillar from a ladder or vine onto something that isn't also climbable
|
return COST_INF; // can't pillar from a ladder or vine onto something that isn't also climbable
|
||||||
}
|
}
|
||||||
if (fromDown.getBlock() instanceof BlockSlab && !((BlockSlab) fromDown.getBlock()).isDouble() && fromDown.getValue(BlockSlab.HALF) == BlockSlab.EnumBlockHalf.BOTTOM) {
|
if (fromDown.getBlock() instanceof BlockSlab && !fromDown.isTopSolid()) {
|
||||||
return COST_INF; // can't pillar up from a bottom slab onto a non ladder
|
return COST_INF; // can't pillar up from a bottom slab onto a non ladder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,17 +71,25 @@ public class MovementPillar extends Movement {
|
|||||||
if (toBreakBlock instanceof BlockFenceGate) { // see issue #172
|
if (toBreakBlock instanceof BlockFenceGate) { // see issue #172
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
Block srcUp = null;
|
IBlockState srcUp = null;
|
||||||
if (MovementHelper.isWater(toBreakBlock) && MovementHelper.isWater(from)) { // TODO should this also be allowed if toBreakBlock is air?
|
if (MovementHelper.isWater(toBreak) && MovementHelper.isWater(fromState)) { // TODO should this also be allowed if toBreakBlock is air?
|
||||||
srcUp = context.get(x, y + 1, z).getBlock();
|
srcUp = context.get(x, y + 1, z);
|
||||||
if (MovementHelper.isWater(srcUp)) {
|
if (MovementHelper.isWater(srcUp)) {
|
||||||
return LADDER_UP_ONE_COST; // allow ascending pillars of water, but only if we're already in one
|
return LADDER_UP_ONE_COST; // allow ascending pillars of water, but only if we're already in one
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ladder && !context.canPlaceThrowawayAt(x, y, z)) { // we need to place a block where we started to jump on it
|
double placeCost = 0;
|
||||||
return COST_INF;
|
if (!ladder) {
|
||||||
|
// we need to place a block where we started to jump on it
|
||||||
|
placeCost = context.costOfPlacingAt(x, y, z);
|
||||||
|
if (placeCost >= COST_INF) {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
if (fromDown.getBlock() instanceof BlockAir) {
|
||||||
|
placeCost += 0.1; // slightly (1/200th of a second) penalize pillaring on what's currently air
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (from instanceof BlockLiquid || (fromDown.getBlock() instanceof BlockLiquid && context.assumeWalkOnWater)) {
|
if ((MovementHelper.isLiquid(fromState) && !MovementHelper.canPlaceAgainst(context.bsi, x, y - 1, z, fromDown)) || (MovementHelper.isLiquid(fromDown) && context.assumeWalkOnWater)) {
|
||||||
// otherwise, if we're standing in water, we cannot pillar
|
// otherwise, if we're standing in water, we cannot pillar
|
||||||
// if we're standing on water and assumeWalkOnWater is true, we cannot pillar
|
// if we're standing on water and assumeWalkOnWater is true, we cannot pillar
|
||||||
// if we're standing on water and assumeWalkOnWater is false, we must have ascended to here, or sneak backplaced, so it is possible to pillar again
|
// if we're standing on water and assumeWalkOnWater is false, we must have ascended to here, or sneak backplaced, so it is possible to pillar again
|
||||||
@@ -96,9 +107,9 @@ public class MovementPillar extends Movement {
|
|||||||
if (check.getBlock() instanceof BlockFalling) {
|
if (check.getBlock() instanceof BlockFalling) {
|
||||||
// see MovementAscend's identical check for breaking a falling block above our head
|
// see MovementAscend's identical check for breaking a falling block above our head
|
||||||
if (srcUp == null) {
|
if (srcUp == null) {
|
||||||
srcUp = context.get(x, y + 1, z).getBlock();
|
srcUp = context.get(x, y + 1, z);
|
||||||
}
|
}
|
||||||
if (!(toBreakBlock instanceof BlockFalling) || !(srcUp instanceof BlockFalling)) {
|
if (!(toBreakBlock instanceof BlockFalling) || !(srcUp.getBlock() instanceof BlockFalling)) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,7 +125,7 @@ public class MovementPillar extends Movement {
|
|||||||
if (ladder) {
|
if (ladder) {
|
||||||
return LADDER_UP_ONE_COST + hardness * 5;
|
return LADDER_UP_ONE_COST + hardness * 5;
|
||||||
} else {
|
} else {
|
||||||
return JUMP_ONE_BLOCK_COST + context.placeBlockCost + context.jumpPenalty + hardness;
|
return JUMP_ONE_BLOCK_COST + placeCost + context.jumpPenalty + hardness;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,8 +159,12 @@ public class MovementPillar extends Movement {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx.playerFeet().y < src.y) {
|
||||||
|
return state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
|
}
|
||||||
|
|
||||||
IBlockState fromDown = BlockStateInterface.get(ctx, src);
|
IBlockState fromDown = BlockStateInterface.get(ctx, src);
|
||||||
if (MovementHelper.isWater(fromDown.getBlock()) && MovementHelper.isWater(ctx, dest)) {
|
if (MovementHelper.isWater(fromDown) && MovementHelper.isWater(ctx, dest)) {
|
||||||
// stay centered while swimming up a water column
|
// stay centered while swimming up a water column
|
||||||
state.setTarget(new MovementState.MovementTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.getBlockPosCenter(dest), ctx.playerRotations()), false));
|
state.setTarget(new MovementState.MovementTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.getBlockPosCenter(dest), ctx.playerRotations()), false));
|
||||||
Vec3d destCenter = VecUtils.getBlockPosCenter(dest);
|
Vec3d destCenter = VecUtils.getBlockPosCenter(dest);
|
||||||
@@ -163,7 +178,7 @@ public class MovementPillar extends Movement {
|
|||||||
}
|
}
|
||||||
boolean ladder = fromDown.getBlock() == Blocks.LADDER || fromDown.getBlock() == Blocks.VINE;
|
boolean ladder = fromDown.getBlock() == Blocks.LADDER || fromDown.getBlock() == Blocks.VINE;
|
||||||
boolean vine = fromDown.getBlock() == Blocks.VINE;
|
boolean vine = fromDown.getBlock() == Blocks.VINE;
|
||||||
Rotation rotation = RotationUtils.calcRotationFromVec3d(ctx.player().getPositionEyes(1.0F),
|
Rotation rotation = RotationUtils.calcRotationFromVec3d(ctx.player().getEyePosition(1.0F),
|
||||||
VecUtils.getBlockPosCenter(positionToPlace),
|
VecUtils.getBlockPosCenter(positionToPlace),
|
||||||
new Rotation(ctx.player().rotationYaw, ctx.player().rotationPitch));
|
new Rotation(ctx.player().rotationYaw, ctx.player().rotationPitch));
|
||||||
if (!ladder) {
|
if (!ladder) {
|
||||||
@@ -172,7 +187,7 @@ public class MovementPillar extends Movement {
|
|||||||
|
|
||||||
boolean blockIsThere = MovementHelper.canWalkOn(ctx, src) || ladder;
|
boolean blockIsThere = MovementHelper.canWalkOn(ctx, src) || ladder;
|
||||||
if (ladder) {
|
if (ladder) {
|
||||||
BlockPos against = vine ? getAgainst(new CalculationContext(baritone), src) : src.offset(fromDown.getValue(BlockLadder.FACING).getOpposite());
|
BlockPos against = vine ? getAgainst(new CalculationContext(baritone), src) : src.offset(fromDown.get(BlockLadder.FACING).getOpposite());
|
||||||
if (against == null) {
|
if (against == null) {
|
||||||
logDebug("Unable to climb vines");
|
logDebug("Unable to climb vines");
|
||||||
return state.setStatus(MovementStatus.UNREACHABLE);
|
return state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
@@ -194,7 +209,7 @@ public class MovementPillar extends Movement {
|
|||||||
return state;
|
return state;
|
||||||
} else {
|
} else {
|
||||||
// Get ready to place a throwaway block
|
// Get ready to place a throwaway block
|
||||||
if (!MovementHelper.throwaway(ctx, true)) {
|
if (!((Baritone) baritone).getInventoryBehavior().selectThrowawayForLocation(src.x, src.y, src.z)) {
|
||||||
return state.setStatus(MovementStatus.UNREACHABLE);
|
return state.setStatus(MovementStatus.UNREACHABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,8 +237,15 @@ public class MovementPillar extends Movement {
|
|||||||
|
|
||||||
|
|
||||||
if (!blockIsThere) {
|
if (!blockIsThere) {
|
||||||
Block fr = BlockStateInterface.get(ctx, src).getBlock();
|
IBlockState frState = BlockStateInterface.get(ctx, src);
|
||||||
if (!(fr instanceof BlockAir || fr.isReplaceable(ctx.world(), src))) {
|
Block fr = frState.getBlock();
|
||||||
|
// TODO: Evaluate usage of getMaterial().isReplaceable()
|
||||||
|
if (!(fr instanceof BlockAir || frState.getMaterial().isReplaceable())) {
|
||||||
|
Optional<Rotation> reachable = RotationUtils.reachable(ctx.player(), src, ctx.playerController().getBlockReachDistance());
|
||||||
|
if (reachable.isPresent()) {
|
||||||
|
state.setTarget(new MovementState.MovementTarget(reachable.get(), true));
|
||||||
|
}
|
||||||
|
state.setInput(Input.JUMP, false); // breaking is like 5x slower when you're jumping
|
||||||
state.setInput(Input.CLICK_LEFT, true);
|
state.setInput(Input.CLICK_LEFT, true);
|
||||||
blockIsThere = false;
|
blockIsThere = false;
|
||||||
} else if (ctx.player().isSneaking() && (Objects.equals(src.down(), ctx.objectMouseOver().getBlockPos()) || Objects.equals(src, ctx.objectMouseOver().getBlockPos())) && ctx.player().posY > dest.getY() + 0.1) {
|
} else if (ctx.player().isSneaking() && (Objects.equals(src.down(), ctx.objectMouseOver().getBlockPos()) || Objects.equals(src, ctx.objectMouseOver().getBlockPos())) && ctx.player().posY > dest.getY() + 0.1) {
|
||||||
|
|||||||
@@ -30,12 +30,11 @@ import baritone.pathing.movement.Movement;
|
|||||||
import baritone.pathing.movement.MovementHelper;
|
import baritone.pathing.movement.MovementHelper;
|
||||||
import baritone.pathing.movement.MovementState;
|
import baritone.pathing.movement.MovementState;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.BlockDoor;
|
|
||||||
import net.minecraft.block.BlockFenceGate;
|
|
||||||
import net.minecraft.block.BlockSlab;
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.fluid.WaterFluid;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.state.properties.SlabType;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
@@ -67,11 +66,12 @@ public class MovementTraverse extends Movement {
|
|||||||
IBlockState pb0 = context.get(destX, y + 1, destZ);
|
IBlockState pb0 = context.get(destX, y + 1, destZ);
|
||||||
IBlockState pb1 = context.get(destX, y, destZ);
|
IBlockState pb1 = context.get(destX, y, destZ);
|
||||||
IBlockState destOn = context.get(destX, y - 1, destZ);
|
IBlockState destOn = context.get(destX, y - 1, destZ);
|
||||||
Block srcDown = context.getBlock(x, y - 1, z);
|
IBlockState down = context.get(x, y - 1, z);
|
||||||
|
Block srcDown = down.getBlock();
|
||||||
if (MovementHelper.canWalkOn(context.bsi, destX, y - 1, destZ, destOn)) {//this is a walk, not a bridge
|
if (MovementHelper.canWalkOn(context.bsi, destX, y - 1, destZ, destOn)) {//this is a walk, not a bridge
|
||||||
double WC = WALK_ONE_BLOCK_COST;
|
double WC = WALK_ONE_BLOCK_COST;
|
||||||
boolean water = false;
|
boolean water = false;
|
||||||
if (MovementHelper.isWater(pb0.getBlock()) || MovementHelper.isWater(pb1.getBlock())) {
|
if (MovementHelper.isWater(pb0) || MovementHelper.isWater(pb1)) {
|
||||||
WC = context.waterWalkSpeed;
|
WC = context.waterWalkSpeed;
|
||||||
water = true;
|
water = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -108,12 +108,13 @@ public class MovementTraverse extends Movement {
|
|||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (MovementHelper.isReplacable(destX, y - 1, destZ, destOn, context.bsi)) {
|
if (MovementHelper.isReplacable(destX, y - 1, destZ, destOn, context.bsi)) {
|
||||||
boolean throughWater = MovementHelper.isWater(pb0.getBlock()) || MovementHelper.isWater(pb1.getBlock());
|
boolean throughWater = MovementHelper.isWater(pb0) || MovementHelper.isWater(pb1);
|
||||||
if (MovementHelper.isWater(destOn.getBlock()) && throughWater) {
|
if (MovementHelper.isWater(destOn) && throughWater) {
|
||||||
// this happens when assume walk on water is true and this is a traverse in water, which isn't allowed
|
// this happens when assume walk on water is true and this is a traverse in water, which isn't allowed
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
if (!context.canPlaceThrowawayAt(destX, y - 1, destZ)) {
|
double placeCost = context.costOfPlacingAt(destX, y - 1, destZ);
|
||||||
|
if (placeCost >= COST_INF) {
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
double hardness1 = MovementHelper.getMiningDurationTicks(context, destX, y, destZ, pb1, false);
|
double hardness1 = MovementHelper.getMiningDurationTicks(context, destX, y, destZ, pb1, false);
|
||||||
@@ -130,18 +131,18 @@ public class MovementTraverse extends Movement {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (MovementHelper.canPlaceAgainst(context.bsi, againstX, againstY, againstZ)) { // found a side place option
|
if (MovementHelper.canPlaceAgainst(context.bsi, againstX, againstY, againstZ)) { // found a side place option
|
||||||
return WC + context.placeBlockCost + hardness1 + hardness2;
|
return WC + placeCost + hardness1 + hardness2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// now that we've checked all possible directions to side place, we actually need to backplace
|
// now that we've checked all possible directions to side place, we actually need to backplace
|
||||||
if (srcDown == Blocks.SOUL_SAND || (srcDown instanceof BlockSlab && !((BlockSlab) srcDown).isDouble())) {
|
if (srcDown == Blocks.SOUL_SAND || (srcDown instanceof BlockSlab && down.get(BlockSlab.TYPE) != SlabType.DOUBLE)) {
|
||||||
return COST_INF; // can't sneak and backplace against soul sand or half slabs (regardless of whether it's top half or bottom half) =/
|
return COST_INF; // can't sneak and backplace against soul sand or half slabs (regardless of whether it's top half or bottom half) =/
|
||||||
}
|
}
|
||||||
if (srcDown == Blocks.FLOWING_WATER || srcDown == Blocks.WATER) {
|
if (down.getFluidState() instanceof WaterFluid) {
|
||||||
return COST_INF; // this is obviously impossible
|
return COST_INF; // this is obviously impossible
|
||||||
}
|
}
|
||||||
WC = WC * (SNEAK_ONE_BLOCK_COST / WALK_ONE_BLOCK_COST);//since we are sneak backplacing, we are sneaking lol
|
WC = WC * (SNEAK_ONE_BLOCK_COST / WALK_ONE_BLOCK_COST);//since we are sneak backplacing, we are sneaking lol
|
||||||
return WC + context.placeBlockCost + hardness1 + hardness2;
|
return WC + placeCost + hardness1 + hardness2;
|
||||||
}
|
}
|
||||||
return COST_INF;
|
return COST_INF;
|
||||||
}
|
}
|
||||||
@@ -150,9 +151,11 @@ public class MovementTraverse extends Movement {
|
|||||||
@Override
|
@Override
|
||||||
public MovementState updateState(MovementState state) {
|
public MovementState updateState(MovementState state) {
|
||||||
super.updateState(state);
|
super.updateState(state);
|
||||||
|
IBlockState pb0 = BlockStateInterface.get(ctx, positionsToBreak[0]);
|
||||||
|
IBlockState pb1 = BlockStateInterface.get(ctx, positionsToBreak[1]);
|
||||||
if (state.getStatus() != MovementStatus.RUNNING) {
|
if (state.getStatus() != MovementStatus.RUNNING) {
|
||||||
// if the setting is enabled
|
// if the setting is enabled
|
||||||
if (!Baritone.settings().walkWhileBreaking.get()) {
|
if (!Baritone.settings().walkWhileBreaking.value) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
// and if we're prepping (aka mining the block in front)
|
// and if we're prepping (aka mining the block in front)
|
||||||
@@ -160,10 +163,10 @@ public class MovementTraverse extends Movement {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
// and if it's fine to walk into the blocks in front
|
// and if it's fine to walk into the blocks in front
|
||||||
if (MovementHelper.avoidWalkingInto(BlockStateInterface.get(ctx, positionsToBreak[0]).getBlock())) {
|
if (MovementHelper.avoidWalkingInto(pb0)) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
if (MovementHelper.avoidWalkingInto(BlockStateInterface.get(ctx, positionsToBreak[1]).getBlock())) {
|
if (MovementHelper.avoidWalkingInto(pb1)) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
// and we aren't already pressed up against the block
|
// and we aren't already pressed up against the block
|
||||||
@@ -176,6 +179,10 @@ public class MovementTraverse extends Movement {
|
|||||||
// it's safe to do this since the two blocks we break (in a traverse) are right on top of each other and so will have the same yaw
|
// it's safe to do this since the two blocks we break (in a traverse) are right on top of each other and so will have the same yaw
|
||||||
float yawToDest = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.calculateBlockCenter(ctx.world(), dest), ctx.playerRotations()).getYaw();
|
float yawToDest = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), VecUtils.calculateBlockCenter(ctx.world(), dest), ctx.playerRotations()).getYaw();
|
||||||
float pitchToBreak = state.getTarget().getRotation().get().getPitch();
|
float pitchToBreak = state.getTarget().getRotation().get().getPitch();
|
||||||
|
if ((pb0.isFullCube() || pb0.getBlock() instanceof BlockAir && (pb1.isFullCube() || pb1.getBlock() instanceof BlockAir))) {
|
||||||
|
// in the meantime, before we're right up against the block, we can break efficiently at this angle
|
||||||
|
pitchToBreak = 26;
|
||||||
|
}
|
||||||
|
|
||||||
state.setTarget(new MovementState.MovementTarget(new Rotation(yawToDest, pitchToBreak), true));
|
state.setTarget(new MovementState.MovementTarget(new Rotation(yawToDest, pitchToBreak), true));
|
||||||
return state.setInput(Input.MOVE_FORWARD, true).setInput(Input.SPRINT, true);
|
return state.setInput(Input.MOVE_FORWARD, true).setInput(Input.SPRINT, true);
|
||||||
@@ -186,8 +193,6 @@ public class MovementTraverse extends Movement {
|
|||||||
|
|
||||||
Block fd = BlockStateInterface.get(ctx, src.down()).getBlock();
|
Block fd = BlockStateInterface.get(ctx, src.down()).getBlock();
|
||||||
boolean ladder = fd == Blocks.LADDER || fd == Blocks.VINE;
|
boolean ladder = fd == Blocks.LADDER || fd == Blocks.VINE;
|
||||||
IBlockState pb0 = BlockStateInterface.get(ctx, positionsToBreak[0]);
|
|
||||||
IBlockState pb1 = BlockStateInterface.get(ctx, positionsToBreak[1]);
|
|
||||||
|
|
||||||
boolean door = pb0.getBlock() instanceof BlockDoor || pb1.getBlock() instanceof BlockDoor;
|
boolean door = pb0.getBlock() instanceof BlockDoor || pb1.getBlock() instanceof BlockDoor;
|
||||||
if (door) {
|
if (door) {
|
||||||
@@ -231,10 +236,17 @@ public class MovementTraverse extends Movement {
|
|||||||
if (ctx.playerFeet().equals(dest)) {
|
if (ctx.playerFeet().equals(dest)) {
|
||||||
return state.setStatus(MovementStatus.SUCCESS);
|
return state.setStatus(MovementStatus.SUCCESS);
|
||||||
}
|
}
|
||||||
|
Block low = BlockStateInterface.get(ctx, src).getBlock();
|
||||||
|
Block high = BlockStateInterface.get(ctx, src.up()).getBlock();
|
||||||
|
if (ctx.player().posY > src.y + 0.1D && !ctx.player().onGround && (low == Blocks.VINE || low == Blocks.LADDER || high == Blocks.VINE || high == Blocks.LADDER)) {
|
||||||
|
// hitting W could cause us to climb the ladder instead of going forward
|
||||||
|
// wait until we're on the ground
|
||||||
|
return state;
|
||||||
|
}
|
||||||
BlockPos into = dest.subtract(src).add(dest);
|
BlockPos into = dest.subtract(src).add(dest);
|
||||||
Block intoBelow = BlockStateInterface.get(ctx, into).getBlock();
|
IBlockState intoBelow = BlockStateInterface.get(ctx, into);
|
||||||
Block intoAbove = BlockStateInterface.get(ctx, into.up()).getBlock();
|
IBlockState intoAbove = BlockStateInterface.get(ctx, into.up());
|
||||||
if (wasTheBridgeBlockAlwaysThere && (!MovementHelper.isLiquid(ctx, ctx.playerFeet()) || Baritone.settings().sprintInWater.get()) && (!MovementHelper.avoidWalkingInto(intoBelow) || MovementHelper.isWater(intoBelow)) && !MovementHelper.avoidWalkingInto(intoAbove)) {
|
if (wasTheBridgeBlockAlwaysThere && (!MovementHelper.isLiquid(ctx, ctx.playerFeet()) || Baritone.settings().sprintInWater.value) && (!MovementHelper.avoidWalkingInto(intoBelow) || MovementHelper.isWater(intoBelow)) && !MovementHelper.avoidWalkingInto(intoAbove)) {
|
||||||
state.setInput(Input.SPRINT, true);
|
state.setInput(Input.SPRINT, true);
|
||||||
}
|
}
|
||||||
Block destDown = BlockStateInterface.get(ctx, dest.down()).getBlock();
|
Block destDown = BlockStateInterface.get(ctx, dest.down()).getBlock();
|
||||||
@@ -257,12 +269,12 @@ public class MovementTraverse extends Movement {
|
|||||||
}
|
}
|
||||||
double dist1 = Math.max(Math.abs(ctx.player().posX - (dest.getX() + 0.5D)), Math.abs(ctx.player().posZ - (dest.getZ() + 0.5D)));
|
double dist1 = Math.max(Math.abs(ctx.player().posX - (dest.getX() + 0.5D)), Math.abs(ctx.player().posZ - (dest.getZ() + 0.5D)));
|
||||||
PlaceResult p = MovementHelper.attemptToPlaceABlock(state, baritone, dest.down(), false);
|
PlaceResult p = MovementHelper.attemptToPlaceABlock(state, baritone, dest.down(), false);
|
||||||
if ((p == PlaceResult.READY_TO_PLACE || dist1 < 0.6) && !Baritone.settings().assumeSafeWalk.get()) {
|
if ((p == PlaceResult.READY_TO_PLACE || dist1 < 0.6) && !Baritone.settings().assumeSafeWalk.value) {
|
||||||
state.setInput(Input.SNEAK, true);
|
state.setInput(Input.SNEAK, true);
|
||||||
}
|
}
|
||||||
switch (p) {
|
switch (p) {
|
||||||
case READY_TO_PLACE: {
|
case READY_TO_PLACE: {
|
||||||
if (ctx.player().isSneaking() || Baritone.settings().assumeSafeWalk.get()) {
|
if (ctx.player().isSneaking() || Baritone.settings().assumeSafeWalk.value) {
|
||||||
state.setInput(Input.CLICK_RIGHT, true);
|
state.setInput(Input.CLICK_RIGHT, true);
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ import baritone.pathing.movement.MovementHelper;
|
|||||||
import baritone.pathing.movement.movements.*;
|
import baritone.pathing.movement.movements.*;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import baritone.utils.Helper;
|
import baritone.utils.Helper;
|
||||||
import net.minecraft.block.BlockLiquid;
|
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.init.Fluids;
|
||||||
import net.minecraft.util.Tuple;
|
import net.minecraft.util.Tuple;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
@@ -137,7 +137,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
Tuple<Double, BlockPos> status = closestPathPos(path);
|
Tuple<Double, BlockPos> status = closestPathPos(path);
|
||||||
if (possiblyOffPath(status, MAX_DIST_FROM_PATH)) {
|
if (possiblyOffPath(status, MAX_DIST_FROM_PATH)) {
|
||||||
ticksAway++;
|
ticksAway++;
|
||||||
System.out.println("FAR AWAY FROM PATH FOR " + ticksAway + " TICKS. Current distance: " + status.getFirst() + ". Threshold: " + MAX_DIST_FROM_PATH);
|
System.out.println("FAR AWAY FROM PATH FOR " + ticksAway + " TICKS. Current distance: " + status.getA() + ". Threshold: " + MAX_DIST_FROM_PATH);
|
||||||
if (ticksAway > MAX_TICKS_AWAY) {
|
if (ticksAway > MAX_TICKS_AWAY) {
|
||||||
logDebug("Too far away from path for too long, cancelling path");
|
logDebug("Too far away from path for too long, cancelling path");
|
||||||
cancel();
|
cancel();
|
||||||
@@ -229,21 +229,21 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
costEstimateIndex = pathPosition;
|
costEstimateIndex = pathPosition;
|
||||||
// do this only once, when the movement starts, and deliberately get the cost as cached when this path was calculated, not the cost as it is right now
|
// do this only once, when the movement starts, and deliberately get the cost as cached when this path was calculated, not the cost as it is right now
|
||||||
currentMovementOriginalCostEstimate = movement.getCost();
|
currentMovementOriginalCostEstimate = movement.getCost();
|
||||||
for (int i = 1; i < Baritone.settings().costVerificationLookahead.get() && pathPosition + i < path.length() - 1; i++) {
|
for (int i = 1; i < Baritone.settings().costVerificationLookahead.value && pathPosition + i < path.length() - 1; i++) {
|
||||||
if (path.movements().get(pathPosition + i).calculateCostWithoutCaching() >= ActionCosts.COST_INF && canCancel) {
|
if (((Movement) path.movements().get(pathPosition + i)).calculateCost(behavior.secretInternalGetCalculationContext()) >= ActionCosts.COST_INF && canCancel) {
|
||||||
logDebug("Something has changed in the world and a future movement has become impossible. Cancelling.");
|
logDebug("Something has changed in the world and a future movement has become impossible. Cancelling.");
|
||||||
cancel();
|
cancel();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double currentCost = movement.recalculateCost();
|
double currentCost = ((Movement) movement).recalculateCost(behavior.secretInternalGetCalculationContext());
|
||||||
if (currentCost >= ActionCosts.COST_INF && canCancel) {
|
if (currentCost >= ActionCosts.COST_INF && canCancel) {
|
||||||
logDebug("Something has changed in the world and this movement has become impossible. Cancelling.");
|
logDebug("Something has changed in the world and this movement has become impossible. Cancelling.");
|
||||||
cancel();
|
cancel();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!movement.calculatedWhileLoaded() && currentCost - currentMovementOriginalCostEstimate > Baritone.settings().maxCostIncrease.get() && canCancel) {
|
if (!movement.calculatedWhileLoaded() && currentCost - currentMovementOriginalCostEstimate > Baritone.settings().maxCostIncrease.value && canCancel) {
|
||||||
// don't do this if the movement was calculated while loaded
|
// don't do this if the movement was calculated while loaded
|
||||||
// that means that this isn't a cache error, it's just part of the path interfering with a later part
|
// that means that this isn't a cache error, it's just part of the path interfering with a later part
|
||||||
logDebug("Original cost " + currentMovementOriginalCostEstimate + " current cost " + currentCost + ". Cancelling.");
|
logDebug("Original cost " + currentMovementOriginalCostEstimate + " current cost " + currentCost + ". Cancelling.");
|
||||||
@@ -273,7 +273,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
ctx.player().setSprinting(false); // letting go of control doesn't make you stop sprinting actually
|
ctx.player().setSprinting(false); // letting go of control doesn't make you stop sprinting actually
|
||||||
}
|
}
|
||||||
ticksOnCurrent++;
|
ticksOnCurrent++;
|
||||||
if (ticksOnCurrent > currentMovementOriginalCostEstimate + Baritone.settings().movementTimeoutTicks.get()) {
|
if (ticksOnCurrent > currentMovementOriginalCostEstimate + Baritone.settings().movementTimeoutTicks.value) {
|
||||||
// only cancel if the total time has exceeded the initial estimate
|
// only cancel if the total time has exceeded the initial estimate
|
||||||
// as you break the blocks required, the remaining cost goes down, to the point where
|
// as you break the blocks required, the remaining cost goes down, to the point where
|
||||||
// ticksOnCurrent is greater than recalculateCost + 100
|
// ticksOnCurrent is greater than recalculateCost + 100
|
||||||
@@ -333,7 +333,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean possiblyOffPath(Tuple<Double, BlockPos> status, double leniency) {
|
private boolean possiblyOffPath(Tuple<Double, BlockPos> status, double leniency) {
|
||||||
double distanceFromPath = status.getFirst();
|
double distanceFromPath = status.getA();
|
||||||
if (distanceFromPath > leniency) {
|
if (distanceFromPath > leniency) {
|
||||||
// when we're midair in the middle of a fall, we're very far from both the beginning and the end, but we aren't actually off path
|
// when we're midair in the middle of a fall, we're very far from both the beginning and the end, but we aren't actually off path
|
||||||
if (path.movements().get(pathPosition) instanceof MovementFall) {
|
if (path.movements().get(pathPosition) instanceof MovementFall) {
|
||||||
@@ -353,7 +353,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
* @return Whether or not it was possible to snap to the current player feet
|
* @return Whether or not it was possible to snap to the current player feet
|
||||||
*/
|
*/
|
||||||
public boolean snipsnapifpossible() {
|
public boolean snipsnapifpossible() {
|
||||||
if (!ctx.player().onGround && !(ctx.world().getBlockState(ctx.playerFeet()).getBlock() instanceof BlockLiquid)) {
|
if (!ctx.player().onGround && ctx.world().getFluidState(ctx.playerFeet()).isEmpty()) {
|
||||||
// if we're falling in the air, and not in water, don't splice
|
// if we're falling in the air, and not in water, don't splice
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@@ -453,7 +453,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
if (current instanceof MovementFall) {
|
if (current instanceof MovementFall) {
|
||||||
Tuple<Vec3d, BlockPos> data = overrideFall((MovementFall) current);
|
Tuple<Vec3d, BlockPos> data = overrideFall((MovementFall) current);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
BlockPos fallDest = data.getSecond();
|
BlockPos fallDest = data.getB();
|
||||||
if (!path.positions().contains(fallDest)) {
|
if (!path.positions().contains(fallDest)) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
@@ -464,7 +464,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
clearKeys();
|
clearKeys();
|
||||||
behavior.baritone.getLookBehavior().updateTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), data.getFirst(), ctx.playerRotations()), false);
|
behavior.baritone.getLookBehavior().updateTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), data.getA(), ctx.playerRotations()), false);
|
||||||
behavior.baritone.getInputOverrideHandler().setInputForceState(Input.MOVE_FORWARD, true);
|
behavior.baritone.getInputOverrideHandler().setInputForceState(Input.MOVE_FORWARD, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -527,7 +527,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean sprintableAscend(IPlayerContext ctx, MovementTraverse current, MovementAscend next, IMovement nextnext) {
|
private static boolean sprintableAscend(IPlayerContext ctx, MovementTraverse current, MovementAscend next, IMovement nextnext) {
|
||||||
if (!Baritone.settings().sprintAscends.get()) {
|
if (!Baritone.settings().sprintAscends.value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!current.getDirection().equals(next.getDirection().down())) {
|
if (!current.getDirection().equals(next.getDirection().down())) {
|
||||||
@@ -556,10 +556,10 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (MovementHelper.avoidWalkingInto(ctx.world().getBlockState(current.getSrc().up(3)).getBlock())) {
|
if (MovementHelper.avoidWalkingInto(ctx.world().getBlockState(current.getSrc().up(3)))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !MovementHelper.avoidWalkingInto(ctx.world().getBlockState(next.getDest().up(2)).getBlock()); // codacy smh my head
|
return !MovementHelper.avoidWalkingInto(ctx.world().getBlockState(next.getDest().up(2))); // codacy smh my head
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean canSprintFromDescendInto(IPlayerContext ctx, IMovement current, IMovement next) {
|
private static boolean canSprintFromDescendInto(IPlayerContext ctx, IMovement current, IMovement next) {
|
||||||
@@ -569,7 +569,7 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
if (next instanceof MovementTraverse && next.getDirection().down().equals(current.getDirection()) && MovementHelper.canWalkOn(ctx, next.getDest().down())) {
|
if (next instanceof MovementTraverse && next.getDirection().down().equals(current.getDirection()) && MovementHelper.canWalkOn(ctx, next.getDest().down())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return next instanceof MovementDiagonal && Baritone.settings().allowOvershootDiagonalDescend.get();
|
return next instanceof MovementDiagonal && Baritone.settings().allowOvershootDiagonalDescend.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onChangeInPathPosition() {
|
private void onChangeInPathPosition() {
|
||||||
@@ -612,8 +612,8 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private PathExecutor cutIfTooLong() {
|
private PathExecutor cutIfTooLong() {
|
||||||
if (pathPosition > Baritone.settings().maxPathHistoryLength.get()) {
|
if (pathPosition > Baritone.settings().maxPathHistoryLength.value) {
|
||||||
int cutoffAmt = Baritone.settings().pathHistoryCutoffAmount.get();
|
int cutoffAmt = Baritone.settings().pathHistoryCutoffAmount.value;
|
||||||
CutoffPath newPath = new CutoffPath(path, cutoffAmt, path.length() - 1);
|
CutoffPath newPath = new CutoffPath(path, cutoffAmt, path.length() - 1);
|
||||||
if (!newPath.getDest().equals(path.getDest())) {
|
if (!newPath.getDest().equals(path.getDest())) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|||||||
@@ -0,0 +1,734 @@
|
|||||||
|
/*
|
||||||
|
* 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.process;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
|
import baritone.api.pathing.goals.Goal;
|
||||||
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
|
import baritone.api.pathing.goals.GoalComposite;
|
||||||
|
import baritone.api.pathing.goals.GoalGetToBlock;
|
||||||
|
import baritone.api.process.IBuilderProcess;
|
||||||
|
import baritone.api.process.PathingCommand;
|
||||||
|
import baritone.api.process.PathingCommandType;
|
||||||
|
import baritone.api.utils.*;
|
||||||
|
import baritone.api.utils.input.Input;
|
||||||
|
import baritone.pathing.movement.CalculationContext;
|
||||||
|
import baritone.pathing.movement.Movement;
|
||||||
|
import baritone.pathing.movement.MovementHelper;
|
||||||
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
|
import baritone.utils.BlockStateInterface;
|
||||||
|
import baritone.utils.PathingCommandContext;
|
||||||
|
import baritone.utils.schematic.AirSchematic;
|
||||||
|
import baritone.utils.schematic.Schematic;
|
||||||
|
import net.minecraft.block.BlockAir;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.item.BlockItemUseContext;
|
||||||
|
import net.minecraft.item.ItemBlock;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUseContext;
|
||||||
|
import net.minecraft.nbt.CompressedStreamTools;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.Tuple;
|
||||||
|
import net.minecraft.util.math.*;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static baritone.api.pathing.movement.ActionCosts.COST_INF;
|
||||||
|
|
||||||
|
public class BuilderProcess extends BaritoneProcessHelper implements IBuilderProcess {
|
||||||
|
|
||||||
|
private HashSet<BetterBlockPos> incorrectPositions;
|
||||||
|
private String name;
|
||||||
|
private ISchematic realSchematic;
|
||||||
|
private ISchematic schematic;
|
||||||
|
private Vec3i origin;
|
||||||
|
private int ticks;
|
||||||
|
private boolean paused;
|
||||||
|
private int layer;
|
||||||
|
|
||||||
|
public BuilderProcess(Baritone baritone) {
|
||||||
|
super(baritone);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean build(String schematicFile, BlockPos origin) {
|
||||||
|
File file = new File(new File(Minecraft.getInstance().gameDir, "schematics"), schematicFile);
|
||||||
|
System.out.println(file + " " + file.exists());
|
||||||
|
return build(schematicFile, file, origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void build(String name, ISchematic schematic, Vec3i origin) {
|
||||||
|
this.name = name;
|
||||||
|
this.schematic = schematic;
|
||||||
|
this.realSchematic = null;
|
||||||
|
this.origin = origin;
|
||||||
|
this.paused = false;
|
||||||
|
this.layer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resume() {
|
||||||
|
paused = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean build(String name, File schematic, Vec3i origin) {
|
||||||
|
NBTTagCompound tag;
|
||||||
|
try (FileInputStream fileIn = new FileInputStream(schematic)) {
|
||||||
|
tag = CompressedStreamTools.readCompressed(fileIn);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (tag == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
build(name, parse(tag), origin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearArea(BlockPos corner1, BlockPos corner2) {
|
||||||
|
BlockPos origin = new BlockPos(Math.min(corner1.getX(), corner2.getX()), Math.min(corner1.getY(), corner2.getY()), Math.min(corner1.getZ(), corner2.getZ()));
|
||||||
|
int widthX = Math.abs(corner1.getX() - corner2.getX()) + 1;
|
||||||
|
int heightY = Math.abs(corner1.getY() - corner2.getY()) + 1;
|
||||||
|
int lengthZ = Math.abs(corner1.getZ() - corner2.getZ()) + 1;
|
||||||
|
build("clear area", new AirSchematic(widthX, heightY, lengthZ), origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ISchematic parse(NBTTagCompound schematic) {
|
||||||
|
return new Schematic(schematic);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActive() {
|
||||||
|
return schematic != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBlockState placeAt(int x, int y, int z) {
|
||||||
|
if (!isActive()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!schematic.inSchematic(x - origin.getX(), y - origin.getY(), z - origin.getZ())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IBlockState state = schematic.desiredState(x - origin.getX(), y - origin.getY(), z - origin.getZ());
|
||||||
|
if (state.getBlock() instanceof BlockAir) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Optional<Tuple<BetterBlockPos, Rotation>> toBreakNearPlayer(BuilderCalculationContext bcc) {
|
||||||
|
BetterBlockPos center = ctx.playerFeet();
|
||||||
|
for (int dx = -5; dx <= 5; dx++) {
|
||||||
|
for (int dy = 0; dy <= 5; dy++) {
|
||||||
|
for (int dz = -5; dz <= 5; dz++) {
|
||||||
|
int x = center.x + dx;
|
||||||
|
int y = center.y + dy;
|
||||||
|
int z = center.z + dz;
|
||||||
|
IBlockState desired = bcc.getSchematic(x, y, z);
|
||||||
|
if (desired == null) {
|
||||||
|
continue; // irrelevant
|
||||||
|
}
|
||||||
|
IBlockState curr = bcc.bsi.get0(x, y, z);
|
||||||
|
if (!(curr.getBlock() instanceof BlockAir) && !valid(curr, desired)) {
|
||||||
|
BetterBlockPos pos = new BetterBlockPos(x, y, z);
|
||||||
|
Optional<Rotation> rot = RotationUtils.reachable(ctx.player(), pos, ctx.playerController().getBlockReachDistance());
|
||||||
|
if (rot.isPresent()) {
|
||||||
|
return Optional.of(new Tuple<>(pos, rot.get()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Placement {
|
||||||
|
private final int hotbarSelection;
|
||||||
|
private final BlockPos placeAgainst;
|
||||||
|
private final EnumFacing side;
|
||||||
|
private final Rotation rot;
|
||||||
|
|
||||||
|
public Placement(int hotbarSelection, BlockPos placeAgainst, EnumFacing side, Rotation rot) {
|
||||||
|
this.hotbarSelection = hotbarSelection;
|
||||||
|
this.placeAgainst = placeAgainst;
|
||||||
|
this.side = side;
|
||||||
|
this.rot = rot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Placement> searchForPlacables(BuilderCalculationContext bcc, List<IBlockState> desirableOnHotbar) {
|
||||||
|
BetterBlockPos center = ctx.playerFeet();
|
||||||
|
for (int dx = -5; dx <= 5; dx++) {
|
||||||
|
for (int dy = -5; dy <= 1; dy++) {
|
||||||
|
for (int dz = -5; dz <= 5; dz++) {
|
||||||
|
int x = center.x + dx;
|
||||||
|
int y = center.y + dy;
|
||||||
|
int z = center.z + dz;
|
||||||
|
IBlockState desired = bcc.getSchematic(x, y, z);
|
||||||
|
if (desired == null) {
|
||||||
|
continue; // irrelevant
|
||||||
|
}
|
||||||
|
IBlockState curr = bcc.bsi.get0(x, y, z);
|
||||||
|
if (MovementHelper.isReplacable(x, y, z, curr, bcc.bsi) && !valid(curr, desired)) {
|
||||||
|
if (dy == 1 && bcc.bsi.get0(x, y + 1, z).getBlock() instanceof BlockAir) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
desirableOnHotbar.add(desired);
|
||||||
|
Optional<Placement> opt = possibleToPlace(desired, x, y, z, bcc.bsi);
|
||||||
|
if (opt.isPresent()) {
|
||||||
|
return opt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean placementPlausible(BlockPos pos, IBlockState state) {
|
||||||
|
VoxelShape voxelshape = state.getCollisionShape(ctx.world(), pos);
|
||||||
|
return voxelshape.isEmpty() || ctx.world().checkNoEntityCollision(null, voxelshape.withOffset(pos.getX(), pos.getY(), pos.getZ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Placement> possibleToPlace(IBlockState toPlace, int x, int y, int z, BlockStateInterface bsi) {
|
||||||
|
for (EnumFacing against : EnumFacing.values()) {
|
||||||
|
BetterBlockPos placeAgainstPos = new BetterBlockPos(x, y, z).offset(against);
|
||||||
|
IBlockState placeAgainstState = bsi.get0(placeAgainstPos);
|
||||||
|
if (MovementHelper.isReplacable(placeAgainstPos.x, placeAgainstPos.y, placeAgainstPos.z, placeAgainstState, bsi)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!toPlace.isValidPosition(ctx.world(), new BetterBlockPos(x, y, z))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!placementPlausible(new BetterBlockPos(x, y, z), toPlace)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
AxisAlignedBB aabb = placeAgainstState.getShape(ctx.world(), placeAgainstPos).getBoundingBox();
|
||||||
|
for (Vec3d placementMultiplier : aabbSideMultipliers(against)) {
|
||||||
|
double placeX = placeAgainstPos.x + aabb.minX * placementMultiplier.x + aabb.maxX * (1 - placementMultiplier.x);
|
||||||
|
double placeY = placeAgainstPos.y + aabb.minY * placementMultiplier.y + aabb.maxY * (1 - placementMultiplier.y);
|
||||||
|
double placeZ = placeAgainstPos.z + aabb.minZ * placementMultiplier.z + aabb.maxZ * (1 - placementMultiplier.z);
|
||||||
|
Rotation rot = RotationUtils.calcRotationFromVec3d(ctx.playerHead(), new Vec3d(placeX, placeY, placeZ), ctx.playerRotations());
|
||||||
|
RayTraceResult result = RayTraceUtils.rayTraceTowards(ctx.player(), rot, ctx.playerController().getBlockReachDistance());
|
||||||
|
if (result != null && result.type == RayTraceResult.Type.BLOCK && result.getBlockPos().equals(placeAgainstPos) && result.sideHit == against.getOpposite()) {
|
||||||
|
OptionalInt hotbar = hasAnyItemThatWouldPlace(toPlace, result, rot);
|
||||||
|
if (hotbar.isPresent()) {
|
||||||
|
return Optional.of(new Placement(hotbar.getAsInt(), placeAgainstPos, against.getOpposite(), rot));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public OptionalInt hasAnyItemThatWouldPlace(IBlockState desired, RayTraceResult result, Rotation rot) {
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
ItemStack stack = ctx.player().inventory.mainInventory.get(i);
|
||||||
|
if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
float originalYaw = ctx.player().rotationYaw;
|
||||||
|
float originalPitch = ctx.player().rotationPitch;
|
||||||
|
// the state depends on the facing of the player sometimes
|
||||||
|
ctx.player().rotationYaw = rot.getYaw();
|
||||||
|
ctx.player().rotationPitch = rot.getPitch();
|
||||||
|
BlockItemUseContext meme = new BlockItemUseContext(new ItemUseContext(
|
||||||
|
ctx.player(),
|
||||||
|
stack,
|
||||||
|
result.getBlockPos().offset(result.sideHit),
|
||||||
|
result.sideHit,
|
||||||
|
(float) result.hitVec.x - result.getBlockPos().getX(),
|
||||||
|
(float) result.hitVec.y - result.getBlockPos().getY(),
|
||||||
|
(float) result.hitVec.z - result.getBlockPos().getZ()
|
||||||
|
));
|
||||||
|
IBlockState wouldBePlaced = ((ItemBlock) stack.getItem()).getBlock().getStateForPlacement(meme);
|
||||||
|
ctx.player().rotationYaw = originalYaw;
|
||||||
|
ctx.player().rotationPitch = originalPitch;
|
||||||
|
if (wouldBePlaced == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!meme.canPlace()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (valid(wouldBePlaced, desired)) {
|
||||||
|
return OptionalInt.of(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OptionalInt.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Vec3d[] aabbSideMultipliers(EnumFacing side) {
|
||||||
|
switch (side) {
|
||||||
|
case UP:
|
||||||
|
return new Vec3d[]{new Vec3d(0.5, 1, 0.5), new Vec3d(0.1, 1, 0.5), new Vec3d(0.9, 1, 0.5), new Vec3d(0.5, 1, 0.1), new Vec3d(0.5, 1, 0.9)};
|
||||||
|
case DOWN:
|
||||||
|
return new Vec3d[]{new Vec3d(0.5, 0, 0.5), new Vec3d(0.1, 0, 0.5), new Vec3d(0.9, 0, 0.5), new Vec3d(0.5, 0, 0.1), new Vec3d(0.5, 0, 0.9)};
|
||||||
|
case NORTH:
|
||||||
|
case SOUTH:
|
||||||
|
case EAST:
|
||||||
|
case WEST:
|
||||||
|
double x = side.getXOffset() == 0 ? 0.5 : (1 + side.getXOffset()) / 2D;
|
||||||
|
double z = side.getZOffset() == 0 ? 0.5 : (1 + side.getZOffset()) / 2D;
|
||||||
|
return new Vec3d[]{new Vec3d(x, 0.25, z), new Vec3d(x, 0.75, z)};
|
||||||
|
default: // null
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
||||||
|
if (baritone.getInputOverrideHandler().isInputForcedDown(Input.CLICK_LEFT)) {
|
||||||
|
ticks = 5;
|
||||||
|
} else {
|
||||||
|
ticks--;
|
||||||
|
}
|
||||||
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
|
if (paused) {
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
if (Baritone.settings().buildInLayers.value) {
|
||||||
|
if (realSchematic == null) {
|
||||||
|
realSchematic = schematic;
|
||||||
|
}
|
||||||
|
schematic = new ISchematic() {
|
||||||
|
@Override
|
||||||
|
public IBlockState desiredState(int x, int y, int z) {
|
||||||
|
return realSchematic.desiredState(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int widthX() {
|
||||||
|
return realSchematic.widthX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int heightY() {
|
||||||
|
return layer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int lengthZ() {
|
||||||
|
return realSchematic.lengthZ();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
BuilderCalculationContext bcc = new BuilderCalculationContext();
|
||||||
|
if (!recalc(bcc)) {
|
||||||
|
if (Baritone.settings().buildInLayers.value && layer < realSchematic.heightY()) {
|
||||||
|
logDirect("Starting layer " + layer);
|
||||||
|
layer++;
|
||||||
|
return onTick(calcFailed, isSafeToCancel);
|
||||||
|
}
|
||||||
|
int distance = Baritone.settings().buildRepeatDistance.value;
|
||||||
|
EnumFacing direction = Baritone.settings().buildRepeatDirection.value;
|
||||||
|
if (distance == 0) {
|
||||||
|
logDirect("Done building");
|
||||||
|
onLostControl();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// build repeat time
|
||||||
|
if (distance == -1) {
|
||||||
|
distance = schematic.size(direction.getAxis());
|
||||||
|
}
|
||||||
|
layer = 0;
|
||||||
|
origin = new BlockPos(origin).offset(direction, distance);
|
||||||
|
logDirect("Repeating build " + distance + " blocks to the " + direction + ", new origin is " + origin);
|
||||||
|
}
|
||||||
|
trim(bcc);
|
||||||
|
|
||||||
|
Optional<Tuple<BetterBlockPos, Rotation>> toBreak = toBreakNearPlayer(bcc);
|
||||||
|
if (toBreak.isPresent() && isSafeToCancel && ctx.player().onGround) {
|
||||||
|
// we'd like to pause to break this block
|
||||||
|
// only change look direction if it's safe (don't want to fuck up an in progress parkour for example
|
||||||
|
Rotation rot = toBreak.get().getB();
|
||||||
|
BetterBlockPos pos = toBreak.get().getA();
|
||||||
|
baritone.getLookBehavior().updateTarget(rot, true);
|
||||||
|
MovementHelper.switchToBestToolFor(ctx, bcc.get(pos));
|
||||||
|
if (ctx.player().isSneaking()) {
|
||||||
|
// really horrible bug where a block is visible for breaking while sneaking but not otherwise
|
||||||
|
// so you can't see it, it goes to place something else, sneaks, then the next tick it tries to break
|
||||||
|
// and is unable since it's unsneaked in the intermediary tick
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
||||||
|
}
|
||||||
|
if (Objects.equals(ctx.objectMouseOver().getBlockPos(), pos) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_LEFT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
List<IBlockState> desirableOnHotbar = new ArrayList<>();
|
||||||
|
Optional<Placement> toPlace = searchForPlacables(bcc, desirableOnHotbar);
|
||||||
|
if (toPlace.isPresent() && isSafeToCancel && ctx.player().onGround && ticks <= 0) {
|
||||||
|
Rotation rot = toPlace.get().rot;
|
||||||
|
baritone.getLookBehavior().updateTarget(rot, true);
|
||||||
|
ctx.player().inventory.currentItem = toPlace.get().hotbarSelection;
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
||||||
|
if ((Objects.equals(ctx.objectMouseOver().getBlockPos(), toPlace.get().placeAgainst) && ctx.objectMouseOver().sideHit.equals(toPlace.get().side)) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_RIGHT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<IBlockState> approxPlacable = placable(36);
|
||||||
|
if (Baritone.settings().allowInventory.value) {
|
||||||
|
ArrayList<Integer> usefulSlots = new ArrayList<>();
|
||||||
|
List<IBlockState> noValidHotbarOption = new ArrayList<>();
|
||||||
|
outer:
|
||||||
|
for (IBlockState desired : desirableOnHotbar) {
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
if (valid(approxPlacable.get(i), desired)) {
|
||||||
|
usefulSlots.add(i);
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
noValidHotbarOption.add(desired);
|
||||||
|
}
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for (int i = 9; i < 36; i++) {
|
||||||
|
for (IBlockState desired : noValidHotbarOption) {
|
||||||
|
if (valid(approxPlacable.get(i), desired)) {
|
||||||
|
baritone.getInventoryBehavior().attemptToPutOnHotbar(i, usefulSlots::contains);
|
||||||
|
break outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Goal goal = assemble(bcc, approxPlacable.subList(0, 9));
|
||||||
|
if (goal == null) {
|
||||||
|
goal = assemble(bcc, approxPlacable); // we're far away, so assume that we have our whole inventory to recalculate placable properly
|
||||||
|
if (goal == null) {
|
||||||
|
logDirect("Unable to do it. Pausing. resume to resume, cancel to cancel");
|
||||||
|
paused = true;
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new PathingCommandContext(goal, PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH, bcc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean recalc(BuilderCalculationContext bcc) {
|
||||||
|
if (incorrectPositions == null) {
|
||||||
|
incorrectPositions = new HashSet<>();
|
||||||
|
fullRecalc(bcc);
|
||||||
|
if (incorrectPositions.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
recalcNearby(bcc);
|
||||||
|
if (incorrectPositions.isEmpty()) {
|
||||||
|
fullRecalc(bcc);
|
||||||
|
}
|
||||||
|
return !incorrectPositions.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void trim(BuilderCalculationContext bcc) {
|
||||||
|
HashSet<BetterBlockPos> copy = new HashSet<>(incorrectPositions);
|
||||||
|
copy.removeIf(pos -> pos.distanceSq(ctx.player().posX, ctx.player().posY, ctx.player().posZ) > 200);
|
||||||
|
if (!copy.isEmpty()) {
|
||||||
|
incorrectPositions = copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void recalcNearby(BuilderCalculationContext bcc) {
|
||||||
|
BetterBlockPos center = ctx.playerFeet();
|
||||||
|
for (int dx = -5; dx <= 5; dx++) {
|
||||||
|
for (int dy = -5; dy <= 5; dy++) {
|
||||||
|
for (int dz = -5; dz <= 5; dz++) {
|
||||||
|
int x = center.x + dx;
|
||||||
|
int y = center.y + dy;
|
||||||
|
int z = center.z + dz;
|
||||||
|
IBlockState desired = bcc.getSchematic(x, y, z);
|
||||||
|
if (desired != null) {
|
||||||
|
// we care about this position
|
||||||
|
if (valid(bcc.bsi.get0(x, y, z), desired)) {
|
||||||
|
incorrectPositions.remove(new BetterBlockPos(x, y, z));
|
||||||
|
} else {
|
||||||
|
incorrectPositions.add(new BetterBlockPos(x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fullRecalc(BuilderCalculationContext bcc) {
|
||||||
|
incorrectPositions = new HashSet<>();
|
||||||
|
for (int y = 0; y < schematic.heightY(); y++) {
|
||||||
|
for (int z = 0; z < schematic.lengthZ(); z++) {
|
||||||
|
for (int x = 0; x < schematic.widthX(); x++) {
|
||||||
|
if (schematic.inSchematic(x, y, z) && !valid(bcc.bsi.get0(x + origin.getX(), y + origin.getY(), z + origin.getZ()), schematic.desiredState(x, y, z))) {
|
||||||
|
incorrectPositions.add(new BetterBlockPos(x + origin.getX(), y + origin.getY(), z + origin.getZ()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Goal assemble(BuilderCalculationContext bcc, List<IBlockState> approxPlacable) {
|
||||||
|
List<BetterBlockPos> placable = incorrectPositions.stream().filter(pos -> bcc.bsi.get0(pos).getBlock() instanceof BlockAir && approxPlacable.contains(bcc.getSchematic(pos.x, pos.y, pos.z))).collect(Collectors.toList());
|
||||||
|
Goal[] toBreak = incorrectPositions.stream().filter(pos -> !(bcc.bsi.get0(pos).getBlock() instanceof BlockAir)).map(GoalBreak::new).toArray(Goal[]::new);
|
||||||
|
Goal[] toPlace = placable.stream().filter(pos -> !placable.contains(pos.down()) && !placable.contains(pos.down(2))).map(pos -> placementgoal(pos, bcc)).toArray(Goal[]::new);
|
||||||
|
|
||||||
|
if (toPlace.length != 0) {
|
||||||
|
return new JankyGoalComposite(new GoalComposite(toPlace), new GoalComposite(toBreak));
|
||||||
|
}
|
||||||
|
if (toBreak.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new GoalComposite(toBreak);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class JankyGoalComposite implements Goal {
|
||||||
|
private final Goal primary;
|
||||||
|
private final Goal fallback;
|
||||||
|
|
||||||
|
public JankyGoalComposite(Goal primary, Goal fallback) {
|
||||||
|
this.primary = primary;
|
||||||
|
this.fallback = fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
|
return primary.isInGoal(x, y, z) || fallback.isInGoal(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double heuristic(int x, int y, int z) {
|
||||||
|
return primary.heuristic(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "JankyComposite Primary: " + primary + " Fallback: " + fallback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GoalBreak extends GoalGetToBlock {
|
||||||
|
|
||||||
|
public GoalBreak(BlockPos pos) {
|
||||||
|
super(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
|
// can't stand right on top of a block, that might not work (what if it's unsupported, can't break then)
|
||||||
|
if (y > this.y) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// but any other adjacent works for breaking, including inside or below
|
||||||
|
return super.isInGoal(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Goal placementgoal(BlockPos pos, BuilderCalculationContext bcc) {
|
||||||
|
if (!(ctx.world().getBlockState(pos).getBlock() instanceof BlockAir)) {
|
||||||
|
return new GoalPlace(pos);
|
||||||
|
}
|
||||||
|
boolean allowSameLevel = !(ctx.world().getBlockState(pos.up()).getBlock() instanceof BlockAir);
|
||||||
|
for (EnumFacing facing : Movement.HORIZONTALS_BUT_ALSO_DOWN____SO_EVERY_DIRECTION_EXCEPT_UP) {
|
||||||
|
if (MovementHelper.canPlaceAgainst(ctx, pos.offset(facing)) && placementPlausible(pos, bcc.getSchematic(pos.getX(), pos.getY(), pos.getZ()))) {
|
||||||
|
return new GoalAdjacent(pos, allowSameLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new GoalPlace(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GoalAdjacent extends GoalGetToBlock {
|
||||||
|
private boolean allowSameLevel;
|
||||||
|
|
||||||
|
public GoalAdjacent(BlockPos pos, boolean allowSameLevel) {
|
||||||
|
super(pos);
|
||||||
|
this.allowSameLevel = allowSameLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
|
if (x == this.x && y == this.y && z == this.z) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!allowSameLevel && y == this.y - 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (y < this.y - 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return super.isInGoal(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double heuristic(int x, int y, int z) {
|
||||||
|
// prioritize lower y coordinates
|
||||||
|
return this.y * 100 + super.heuristic(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GoalPlace extends GoalBlock {
|
||||||
|
public GoalPlace(BlockPos placeAt) {
|
||||||
|
super(placeAt.up());
|
||||||
|
}
|
||||||
|
|
||||||
|
public double heuristic(int x, int y, int z) {
|
||||||
|
// prioritize lower y coordinates
|
||||||
|
return this.y * 100 + super.heuristic(x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLostControl() {
|
||||||
|
incorrectPositions = null;
|
||||||
|
name = null;
|
||||||
|
schematic = null;
|
||||||
|
realSchematic = null;
|
||||||
|
layer = 0;
|
||||||
|
paused = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String displayName0() {
|
||||||
|
return paused ? "Builder Paused" : "Building " + name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<IBlockState> placable(int size) {
|
||||||
|
List<IBlockState> result = new ArrayList<>();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
ItemStack stack = ctx.player().inventory.mainInventory.get(i);
|
||||||
|
if (stack.isEmpty() || !(stack.getItem() instanceof ItemBlock)) {
|
||||||
|
result.add(Blocks.AIR.getDefaultState());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// <toxic cloud>
|
||||||
|
result.add(((ItemBlock) stack.getItem()).getBlock().getStateForPlacement(new BlockItemUseContext(new ItemUseContext(ctx.player(), stack, ctx.playerFeet(), EnumFacing.UP, (float) ctx.player().posX, (float) ctx.player().posY, (float) ctx.player().posZ))));
|
||||||
|
// </toxic cloud>
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean valid(IBlockState current, IBlockState desired) {
|
||||||
|
if (desired == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (current.getBlock() instanceof BlockAir && desired.getBlock() instanceof BlockAir) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// TODO more complicated comparison logic I guess
|
||||||
|
return current.equals(desired);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BuilderCalculationContext extends CalculationContext {
|
||||||
|
private final List<IBlockState> placable;
|
||||||
|
private final ISchematic schematic;
|
||||||
|
private final int originX;
|
||||||
|
private final int originY;
|
||||||
|
private final int originZ;
|
||||||
|
|
||||||
|
public BuilderCalculationContext() {
|
||||||
|
super(BuilderProcess.this.baritone, true); // wew lad
|
||||||
|
this.placable = placable(9);
|
||||||
|
this.schematic = BuilderProcess.this.schematic;
|
||||||
|
this.originX = origin.getX();
|
||||||
|
this.originY = origin.getY();
|
||||||
|
this.originZ = origin.getZ();
|
||||||
|
|
||||||
|
this.jumpPenalty += 10;
|
||||||
|
this.backtrackCostFavoringCoefficient = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IBlockState getSchematic(int x, int y, int z) {
|
||||||
|
if (schematic.inSchematic(x - originX, y - originY, z - originZ)) {
|
||||||
|
return schematic.desiredState(x - originX, y - originY, z - originZ);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double costOfPlacingAt(int x, int y, int z) {
|
||||||
|
if (isPossiblyProtected(x, y, z) || !worldBorder.canPlaceAt(x, z)) { // make calculation fail properly if we can't build
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
IBlockState sch = getSchematic(x, y, z);
|
||||||
|
if (sch != null) {
|
||||||
|
// TODO this can return true even when allowPlace is off.... is that an issue?
|
||||||
|
if (sch.getBlock() instanceof BlockAir) {
|
||||||
|
// we want this to be air, but they're asking if they can place here
|
||||||
|
// this won't be a schematic block, this will be a throwaway
|
||||||
|
return placeBlockCost * 2; // we're going to have to break it eventually
|
||||||
|
}
|
||||||
|
if (placable.contains(sch)) {
|
||||||
|
return 0; // thats right we gonna make it FREE to place a block where it should go in a structure
|
||||||
|
// no place block penalty at all 😎
|
||||||
|
// i'm such an idiot that i just tried to copy and paste the epic gamer moment emoji too
|
||||||
|
// get added to unicode when?
|
||||||
|
}
|
||||||
|
if (!hasThrowaway) {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
// we want it to be something that we don't have
|
||||||
|
// even more of a pain to place something wrong
|
||||||
|
return placeBlockCost * 3;
|
||||||
|
} else {
|
||||||
|
if (hasThrowaway) {
|
||||||
|
return placeBlockCost;
|
||||||
|
} else {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double breakCostMultiplierAt(int x, int y, int z) {
|
||||||
|
if (!allowBreak || isPossiblyProtected(x, y, z)) {
|
||||||
|
return COST_INF;
|
||||||
|
}
|
||||||
|
IBlockState sch = getSchematic(x, y, z);
|
||||||
|
if (sch != null) {
|
||||||
|
if (sch.getBlock() instanceof BlockAir) {
|
||||||
|
// it should be air
|
||||||
|
// regardless of current contents, we can break it
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// it should be a real block
|
||||||
|
// is it already that block?
|
||||||
|
if (valid(bsi.get0(x, y, z), sch)) {
|
||||||
|
return 3;
|
||||||
|
} else {
|
||||||
|
// can break if it's wrong
|
||||||
|
// would be great to return less than 1 here, but that would actually make the cost calculation messed up
|
||||||
|
// since we're breaking a block, if we underestimate the cost, then it'll fail when it really takes the correct amount of time
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
// TODO do blocks in render distace only?
|
||||||
|
// TODO allow breaking blocks that we have a tool to harvest and immediately place back?
|
||||||
|
} else {
|
||||||
|
return 1; // why not lol
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,8 +24,6 @@ import baritone.api.process.PathingCommand;
|
|||||||
import baritone.api.process.PathingCommandType;
|
import baritone.api.process.PathingCommandType;
|
||||||
import baritone.utils.BaritoneProcessHelper;
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* As set by ExampleBaritoneControl or something idk
|
* As set by ExampleBaritoneControl or something idk
|
||||||
*
|
*
|
||||||
@@ -46,7 +44,7 @@ public class CustomGoalProcess extends BaritoneProcessHelper implements ICustomG
|
|||||||
private State state;
|
private State state;
|
||||||
|
|
||||||
public CustomGoalProcess(Baritone baritone) {
|
public CustomGoalProcess(Baritone baritone) {
|
||||||
super(baritone, 3);
|
super(baritone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -79,20 +77,23 @@ public class CustomGoalProcess extends BaritoneProcessHelper implements ICustomG
|
|||||||
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
||||||
switch (this.state) {
|
switch (this.state) {
|
||||||
case GOAL_SET:
|
case GOAL_SET:
|
||||||
if (!baritone.getPathingBehavior().isPathing() && Objects.equals(baritone.getPathingBehavior().getGoal() + "", this.goal + "")) {
|
|
||||||
this.state = State.NONE;
|
|
||||||
}
|
|
||||||
return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
case PATH_REQUESTED:
|
case PATH_REQUESTED:
|
||||||
|
// return FORCE_REVALIDATE_GOAL_AND_PATH just once
|
||||||
PathingCommand ret = new PathingCommand(this.goal, PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH);
|
PathingCommand ret = new PathingCommand(this.goal, PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH);
|
||||||
this.state = State.EXECUTING;
|
this.state = State.EXECUTING;
|
||||||
return ret;
|
return ret;
|
||||||
case EXECUTING:
|
case EXECUTING:
|
||||||
if (calcFailed) {
|
if (calcFailed) {
|
||||||
onLostControl();
|
onLostControl();
|
||||||
|
return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
if (this.goal == null || this.goal.isInGoal(ctx.playerFeet())) {
|
if (this.goal == null || (this.goal.isInGoal(ctx.playerFeet()) && this.goal.isInGoal(baritone.getPathingBehavior().pathStart()))) {
|
||||||
onLostControl(); // we're there xd
|
onLostControl(); // we're there xd
|
||||||
|
if (Baritone.settings().disconnectOnArrival.value) {
|
||||||
|
ctx.world().sendQuittingDisconnectingPacket();
|
||||||
|
}
|
||||||
|
return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
return new PathingCommand(this.goal, PathingCommandType.SET_GOAL_AND_PATH);
|
return new PathingCommand(this.goal, PathingCommandType.SET_GOAL_AND_PATH);
|
||||||
default:
|
default:
|
||||||
@@ -107,7 +108,7 @@ public class CustomGoalProcess extends BaritoneProcessHelper implements ICustomG
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String displayName() {
|
public String displayName0() {
|
||||||
return "Custom Goal " + this.goal;
|
return "Custom Goal " + this.goal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* 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.process;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
|
import baritone.api.cache.ICachedWorld;
|
||||||
|
import baritone.api.pathing.goals.Goal;
|
||||||
|
import baritone.api.pathing.goals.GoalComposite;
|
||||||
|
import baritone.api.pathing.goals.GoalXZ;
|
||||||
|
import baritone.api.process.PathingCommand;
|
||||||
|
import baritone.api.process.PathingCommandType;
|
||||||
|
import baritone.cache.CachedWorld;
|
||||||
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ExploreProcess extends BaritoneProcessHelper {
|
||||||
|
|
||||||
|
private BlockPos explorationOrigin;
|
||||||
|
|
||||||
|
public ExploreProcess(Baritone baritone) {
|
||||||
|
super(baritone);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActive() {
|
||||||
|
return explorationOrigin != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void explore(int centerX, int centerZ) {
|
||||||
|
explorationOrigin = new BlockPos(centerX, 0, centerZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
||||||
|
if (calcFailed) {
|
||||||
|
logDirect("Failed");
|
||||||
|
onLostControl();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Goal[] closestUncached = closestUncachedChunks(explorationOrigin);
|
||||||
|
if (closestUncached == null) {
|
||||||
|
logDebug("awaiting region load from disk");
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
System.out.println("Closest uncached: " + closestUncached);
|
||||||
|
return new PathingCommand(new GoalComposite(closestUncached), PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Goal[] closestUncachedChunks(BlockPos center) {
|
||||||
|
int chunkX = center.getX() >> 4;
|
||||||
|
int chunkZ = center.getZ() >> 4;
|
||||||
|
ICachedWorld cache = baritone.getWorldProvider().getCurrentWorld().getCachedWorld();
|
||||||
|
for (int dist = 0; ; dist++) {
|
||||||
|
List<BlockPos> centers = new ArrayList<>();
|
||||||
|
for (int dx = -dist; dx <= dist; dx++) {
|
||||||
|
for (int dz = -dist; dz <= dist; dz++) {
|
||||||
|
int trueDist = Baritone.settings().exploreUsePythagorean.value ? dx * dx + dz * dz : Math.abs(dx) + Math.abs(dz);
|
||||||
|
if (trueDist != dist) {
|
||||||
|
continue; // not considering this one just yet in our expanding search
|
||||||
|
}
|
||||||
|
int centerX = (chunkX + dx) * 16 + 8;
|
||||||
|
int centerZ = (chunkZ + dz) * 18 + 8;
|
||||||
|
|
||||||
|
if (cache.isCached(centerX, centerZ)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!((CachedWorld) cache).regionLoaded(centerX, centerZ)) {
|
||||||
|
Baritone.getExecutor().execute(() -> {
|
||||||
|
((CachedWorld) cache).tryLoadFromDisk(centerX >> 9, centerZ >> 9);
|
||||||
|
});
|
||||||
|
return null; // we still need to load regions from disk in order to decide properly
|
||||||
|
}
|
||||||
|
centers.add(new BlockPos(centerX, 0, centerZ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!centers.isEmpty()) {
|
||||||
|
return centers.stream().map(pos -> new GoalXZ(pos.getX(), pos.getZ())).toArray(Goal[]::new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLostControl() {
|
||||||
|
explorationOrigin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String displayName0() {
|
||||||
|
return "Exploring around " + explorationOrigin + ", currently going to " + new GoalComposite(closestUncachedChunks(explorationOrigin));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,7 +46,7 @@ public final class FollowProcess extends BaritoneProcessHelper implements IFollo
|
|||||||
private List<Entity> cache;
|
private List<Entity> cache;
|
||||||
|
|
||||||
public FollowProcess(Baritone baritone) {
|
public FollowProcess(Baritone baritone) {
|
||||||
super(baritone, 1);
|
super(baritone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -58,13 +58,13 @@ public final class FollowProcess extends BaritoneProcessHelper implements IFollo
|
|||||||
|
|
||||||
private Goal towards(Entity following) {
|
private Goal towards(Entity following) {
|
||||||
BlockPos pos;
|
BlockPos pos;
|
||||||
if (Baritone.settings().followOffsetDistance.get() == 0) {
|
if (Baritone.settings().followOffsetDistance.value == 0) {
|
||||||
pos = new BlockPos(following);
|
pos = new BlockPos(following);
|
||||||
} else {
|
} else {
|
||||||
GoalXZ g = GoalXZ.fromDirection(following.getPositionVector(), Baritone.settings().followOffsetDirection.get(), Baritone.settings().followOffsetDistance.get());
|
GoalXZ g = GoalXZ.fromDirection(following.getPositionVector(), Baritone.settings().followOffsetDirection.value, Baritone.settings().followOffsetDistance.value);
|
||||||
pos = new BlockPos(g.getX(), following.posY, g.getZ());
|
pos = new BlockPos(g.getX(), following.posY, g.getZ());
|
||||||
}
|
}
|
||||||
return new GoalNear(pos, Baritone.settings().followRadius.get());
|
return new GoalNear(pos, Baritone.settings().followRadius.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ public final class FollowProcess extends BaritoneProcessHelper implements IFollo
|
|||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (entity.isDead) {
|
if (!entity.isAlive()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (entity.equals(ctx.player())) {
|
if (entity.equals(ctx.player())) {
|
||||||
@@ -101,8 +101,8 @@ public final class FollowProcess extends BaritoneProcessHelper implements IFollo
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String displayName() {
|
public String displayName0() {
|
||||||
return "Follow " + cache;
|
return "Following " + cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
private int tickCount = 0;
|
private int tickCount = 0;
|
||||||
|
|
||||||
public GetToBlockProcess(Baritone baritone) {
|
public GetToBlockProcess(Baritone baritone) {
|
||||||
super(baritone, 2);
|
super(baritone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -67,7 +67,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
rescan(new ArrayList<>(), new CalculationContext(baritone));
|
rescan(new ArrayList<>(), new CalculationContext(baritone));
|
||||||
}
|
}
|
||||||
if (knownLocations.isEmpty()) {
|
if (knownLocations.isEmpty()) {
|
||||||
if (Baritone.settings().exploreForBlocks.get() && !calcFailed) {
|
if (Baritone.settings().exploreForBlocks.value && !calcFailed) {
|
||||||
return new PathingCommand(new GoalRunAway(1, start) {
|
return new PathingCommand(new GoalRunAway(1, start) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isInGoal(int x, int y, int z) {
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
@@ -83,8 +83,8 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
}
|
}
|
||||||
Goal goal = new GoalComposite(knownLocations.stream().map(this::createGoal).toArray(Goal[]::new));
|
Goal goal = new GoalComposite(knownLocations.stream().map(this::createGoal).toArray(Goal[]::new));
|
||||||
if (calcFailed) {
|
if (calcFailed) {
|
||||||
if (Baritone.settings().blacklistOnGetToBlockFailure.get()) {
|
if (Baritone.settings().blacklistClosestOnFailure.value) {
|
||||||
logDirect("Unable to find any path to " + gettingTo + ", blacklisting presumably unreachable closest instances");
|
logDirect("Unable to find any path to " + gettingTo + ", blacklisting presumably unreachable closest instances...");
|
||||||
blacklistClosest();
|
blacklistClosest();
|
||||||
return onTick(false, isSafeToCancel); // gamer moment
|
return onTick(false, isSafeToCancel); // gamer moment
|
||||||
} else {
|
} else {
|
||||||
@@ -95,13 +95,13 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
return new PathingCommand(goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
return new PathingCommand(goal, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.get();
|
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.value;
|
||||||
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
||||||
List<BlockPos> current = new ArrayList<>(knownLocations);
|
List<BlockPos> current = new ArrayList<>(knownLocations);
|
||||||
CalculationContext context = new CalculationContext(baritone, true);
|
CalculationContext context = new CalculationContext(baritone, true);
|
||||||
Baritone.getExecutor().execute(() -> rescan(current, context));
|
Baritone.getExecutor().execute(() -> rescan(current, context));
|
||||||
}
|
}
|
||||||
if (goal.isInGoal(ctx.playerFeet()) && isSafeToCancel) {
|
if (goal.isInGoal(ctx.playerFeet()) && goal.isInGoal(baritone.getPathingBehavior().pathStart()) && isSafeToCancel) {
|
||||||
// we're there
|
// we're there
|
||||||
if (rightClickOnArrival(gettingTo)) {
|
if (rightClickOnArrival(gettingTo)) {
|
||||||
if (rightClick()) {
|
if (rightClick()) {
|
||||||
@@ -160,12 +160,15 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String displayName() {
|
public String displayName0() {
|
||||||
return "Get To Block " + gettingTo;
|
if (knownLocations.isEmpty()) {
|
||||||
|
return "Exploring randomly to find " + gettingTo + ", no known locations";
|
||||||
|
}
|
||||||
|
return "Get To " + gettingTo + ", " + knownLocations.size() + " known locations";
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void rescan(List<BlockPos> known, CalculationContext context) {
|
private synchronized void rescan(List<BlockPos> known, CalculationContext context) {
|
||||||
List<BlockPos> positions = MineProcess.searchWorld(context, Collections.singletonList(gettingTo), 64, known);
|
List<BlockPos> positions = MineProcess.searchWorld(context, Collections.singletonList(gettingTo), 64, known, blacklist);
|
||||||
positions.removeIf(blacklist::contains);
|
positions.removeIf(blacklist::contains);
|
||||||
knownLocations = positions;
|
knownLocations = positions;
|
||||||
}
|
}
|
||||||
@@ -200,14 +203,14 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean walkIntoInsteadOfAdjacent(Block block) {
|
private boolean walkIntoInsteadOfAdjacent(Block block) {
|
||||||
if (!Baritone.settings().enterPortal.get()) {
|
if (!Baritone.settings().enterPortal.value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return block == Blocks.PORTAL;
|
return block == Blocks.NETHER_PORTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean rightClickOnArrival(Block block) {
|
private boolean rightClickOnArrival(Block block) {
|
||||||
if (!Baritone.settings().rightClickContainerOnArrival.get()) {
|
if (!Baritone.settings().rightClickContainerOnArrival.value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return block == Blocks.CRAFTING_TABLE || block == Blocks.FURNACE || block == Blocks.ENDER_CHEST || block == Blocks.CHEST || block == Blocks.TRAPPED_CHEST;
|
return block == Blocks.CRAFTING_TABLE || block == Blocks.FURNACE || block == Blocks.ENDER_CHEST || block == Blocks.CHEST || block == Blocks.TRAPPED_CHEST;
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import baritone.pathing.movement.MovementHelper;
|
|||||||
import baritone.utils.BaritoneProcessHelper;
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockAir;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.item.EntityItem;
|
import net.minecraft.entity.item.EntityItem;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
@@ -54,13 +55,14 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
|
|
||||||
private List<Block> mining;
|
private List<Block> mining;
|
||||||
private List<BlockPos> knownOreLocations;
|
private List<BlockPos> knownOreLocations;
|
||||||
|
private List<BlockPos> blacklist; // inaccessible
|
||||||
private BlockPos branchPoint;
|
private BlockPos branchPoint;
|
||||||
private GoalRunAway branchPointRunaway;
|
private GoalRunAway branchPointRunaway;
|
||||||
private int desiredQuantity;
|
private int desiredQuantity;
|
||||||
private int tickCount;
|
private int tickCount;
|
||||||
|
|
||||||
public MineProcess(Baritone baritone) {
|
public MineProcess(Baritone baritone) {
|
||||||
super(baritone, 0);
|
super(baritone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -71,27 +73,34 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
@Override
|
@Override
|
||||||
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
||||||
if (desiredQuantity > 0) {
|
if (desiredQuantity > 0) {
|
||||||
Item item = mining.get(0).getItemDropped(mining.get(0).getDefaultState(), new Random(), 0);
|
Item item = mining.get(0).getItemDropped(mining.get(0).getDefaultState(), ctx.world(), null, 0).asItem();
|
||||||
int curr = ctx.player().inventory.mainInventory.stream().filter(stack -> item.equals(stack.getItem())).mapToInt(ItemStack::getCount).sum();
|
int curr = ctx.player().inventory.mainInventory.stream().filter(stack -> item.equals(stack.getItem())).mapToInt(ItemStack::getCount).sum();
|
||||||
System.out.println("Currently have " + curr + " " + item);
|
System.out.println("Currently have " + curr + " " + item);
|
||||||
if (curr >= desiredQuantity) {
|
if (curr >= desiredQuantity) {
|
||||||
logDirect("Have " + curr + " " + item.getItemStackDisplayName(new ItemStack(item, 1)));
|
logDirect("Have " + curr + " " + item.getDisplayName(new ItemStack(item, 1)));
|
||||||
cancel();
|
cancel();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (calcFailed) {
|
boolean shouldCancel = calcFailed;
|
||||||
|
if (calcFailed && !knownOreLocations.isEmpty() && Baritone.settings().blacklistClosestOnFailure.value) {
|
||||||
|
logDirect("Unable to find any path to " + mining + ", blacklisting presumably unreachable closest instance...");
|
||||||
|
knownOreLocations.stream().min(Comparator.comparingDouble(ctx.player()::getDistanceSq)).ifPresent(blacklist::add);
|
||||||
|
knownOreLocations.removeIf(blacklist::contains);
|
||||||
|
shouldCancel = false; // 😎
|
||||||
|
}
|
||||||
|
if (shouldCancel) {
|
||||||
logDirect("Unable to find any path to " + mining + ", canceling Mine");
|
logDirect("Unable to find any path to " + mining + ", canceling Mine");
|
||||||
cancel();
|
cancel();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.get();
|
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.value;
|
||||||
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
||||||
List<BlockPos> curr = new ArrayList<>(knownOreLocations);
|
List<BlockPos> curr = new ArrayList<>(knownOreLocations);
|
||||||
CalculationContext context = new CalculationContext(baritone, true);
|
CalculationContext context = new CalculationContext(baritone, true);
|
||||||
Baritone.getExecutor().execute(() -> rescan(curr, context));
|
Baritone.getExecutor().execute(() -> rescan(curr, context));
|
||||||
}
|
}
|
||||||
if (Baritone.settings().legitMine.get()) {
|
if (Baritone.settings().legitMine.value) {
|
||||||
addNearby();
|
addNearby();
|
||||||
}
|
}
|
||||||
PathingCommand command = updateGoal();
|
PathingCommand command = updateGoal();
|
||||||
@@ -110,15 +119,15 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String displayName() {
|
public String displayName0() {
|
||||||
return "Mine " + mining;
|
return "Mine " + mining;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PathingCommand updateGoal() {
|
private PathingCommand updateGoal() {
|
||||||
boolean legit = Baritone.settings().legitMine.get();
|
boolean legit = Baritone.settings().legitMine.value;
|
||||||
List<BlockPos> locs = knownOreLocations;
|
List<BlockPos> locs = knownOreLocations;
|
||||||
if (!locs.isEmpty()) {
|
if (!locs.isEmpty()) {
|
||||||
List<BlockPos> locs2 = prune(new CalculationContext(baritone), new ArrayList<>(locs), mining, ORE_LOCATIONS_COUNT);
|
List<BlockPos> locs2 = prune(new CalculationContext(baritone), new ArrayList<>(locs), mining, ORE_LOCATIONS_COUNT, blacklist);
|
||||||
// can't reassign locs, gotta make a new var locs2, because we use it in a lambda right here, and variables you use in a lambda must be effectively final
|
// can't reassign locs, gotta make a new var locs2, because we use it in a lambda right here, and variables you use in a lambda must be effectively final
|
||||||
Goal goal = new GoalComposite(locs2.stream().map(loc -> coalesce(ctx, loc, locs2)).toArray(Goal[]::new));
|
Goal goal = new GoalComposite(locs2.stream().map(loc -> coalesce(ctx, loc, locs2)).toArray(Goal[]::new));
|
||||||
knownOreLocations = locs2;
|
knownOreLocations = locs2;
|
||||||
@@ -129,7 +138,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// only in non-Xray mode (aka legit mode) do we do this
|
// only in non-Xray mode (aka legit mode) do we do this
|
||||||
int y = Baritone.settings().legitMineYLevel.get();
|
int y = Baritone.settings().legitMineYLevel.value;
|
||||||
if (branchPoint == null) {
|
if (branchPoint == null) {
|
||||||
/*if (!baritone.getPathingBehavior().isPathing() && playerFeet().y == y) {
|
/*if (!baritone.getPathingBehavior().isPathing() && playerFeet().y == y) {
|
||||||
// cool, path is over and we are at desired y
|
// cool, path is over and we are at desired y
|
||||||
@@ -157,13 +166,13 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
if (mining == null) {
|
if (mining == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Baritone.settings().legitMine.get()) {
|
if (Baritone.settings().legitMine.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<BlockPos> locs = searchWorld(context, mining, ORE_LOCATIONS_COUNT, already);
|
List<BlockPos> locs = searchWorld(context, mining, ORE_LOCATIONS_COUNT, already, blacklist);
|
||||||
locs.addAll(droppedItemsScan(mining, ctx.world()));
|
locs.addAll(droppedItemsScan(mining, ctx.world()));
|
||||||
if (locs.isEmpty()) {
|
if (locs.isEmpty()) {
|
||||||
logDebug("No locations for " + mining + " known, cancelling");
|
logDirect("No locations for " + mining + " known, cancelling");
|
||||||
cancel();
|
cancel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -171,24 +180,24 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Goal coalesce(IPlayerContext ctx, BlockPos loc, List<BlockPos> locs) {
|
private static Goal coalesce(IPlayerContext ctx, BlockPos loc, List<BlockPos> locs) {
|
||||||
if (!Baritone.settings().forceInternalMining.get()) {
|
if (!Baritone.settings().forceInternalMining.value) {
|
||||||
return new GoalTwoBlocks(loc);
|
return new GoalTwoBlocks(loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Here, BlockStateInterface is used because the position may be in a cached chunk (the targeted block is one that is kept track of)
|
// Here, BlockStateInterface is used because the position may be in a cached chunk (the targeted block is one that is kept track of)
|
||||||
boolean upwardGoal = locs.contains(loc.up()) || (Baritone.settings().internalMiningAirException.get() && BlockStateInterface.getBlock(ctx, loc.up()) == Blocks.AIR);
|
boolean upwardGoal = locs.contains(loc.up()) || (Baritone.settings().internalMiningAirException.value && BlockStateInterface.getBlock(ctx, loc.up()) instanceof BlockAir);
|
||||||
boolean downwardGoal = locs.contains(loc.down()) || (Baritone.settings().internalMiningAirException.get() && BlockStateInterface.getBlock(ctx, loc.down()) == Blocks.AIR);
|
boolean downwardGoal = locs.contains(loc.down()) || (Baritone.settings().internalMiningAirException.value && BlockStateInterface.getBlock(ctx, loc.down()) instanceof BlockAir);
|
||||||
return upwardGoal == downwardGoal ? new GoalTwoBlocks(loc) : upwardGoal ? new GoalBlock(loc) : new GoalBlock(loc.down());
|
return upwardGoal == downwardGoal ? new GoalTwoBlocks(loc) : upwardGoal ? new GoalBlock(loc) : new GoalBlock(loc.down());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<BlockPos> droppedItemsScan(List<Block> mining, World world) {
|
public static List<BlockPos> droppedItemsScan(List<Block> mining, World world) {
|
||||||
if (!Baritone.settings().mineScanDroppedItems.get()) {
|
if (!Baritone.settings().mineScanDroppedItems.value) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
Set<Item> searchingFor = new HashSet<>();
|
Set<Item> searchingFor = new HashSet<>();
|
||||||
for (Block block : mining) {
|
for (Block block : mining) {
|
||||||
Item drop = block.getItemDropped(block.getDefaultState(), new Random(), 0);
|
Item drop = block.getItemDropped(block.getDefaultState(), world, null, 0).asItem();
|
||||||
Item ore = Item.getItemFromBlock(block);
|
Item ore = block.asItem();
|
||||||
searchingFor.add(drop);
|
searchingFor.add(drop);
|
||||||
searchingFor.add(ore);
|
searchingFor.add(ore);
|
||||||
}
|
}
|
||||||
@@ -204,28 +213,30 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<BlockPos> searchWorld(CalculationContext ctx, List<Block> mining, int max, List<BlockPos> alreadyKnown) {
|
public static List<BlockPos> searchWorld(CalculationContext ctx, List<Block> mining, int max, List<BlockPos> alreadyKnown, List<BlockPos> blacklist) {
|
||||||
List<BlockPos> locs = new ArrayList<>();
|
List<BlockPos> locs = new ArrayList<>();
|
||||||
List<Block> uninteresting = new ArrayList<>();
|
List<Block> uninteresting = new ArrayList<>();
|
||||||
//long b = System.currentTimeMillis();
|
//long b = System.currentTimeMillis();
|
||||||
for (Block m : mining) {
|
for (Block m : mining) {
|
||||||
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(m)) {
|
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(m)) {
|
||||||
locs.addAll(ctx.worldData.getCachedWorld().getLocationsOf(ChunkPacker.blockToString(m), 1, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 2));
|
// maxRegionDistanceSq 2 means adjacent directly or adjacent diagonally; nothing further than that
|
||||||
|
locs.addAll(ctx.worldData.getCachedWorld().getLocationsOf(ChunkPacker.blockToString(m), Baritone.settings().maxCachedWorldScanCount.value, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 2));
|
||||||
} else {
|
} else {
|
||||||
uninteresting.add(m);
|
uninteresting.add(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
locs = prune(ctx, locs, mining, max, blacklist);
|
||||||
//System.out.println("Scan of cached chunks took " + (System.currentTimeMillis() - b) + "ms");
|
//System.out.println("Scan of cached chunks took " + (System.currentTimeMillis() - b) + "ms");
|
||||||
if (locs.isEmpty()) {
|
if (locs.isEmpty()) {
|
||||||
uninteresting = mining;
|
uninteresting = mining;
|
||||||
}
|
}
|
||||||
if (!uninteresting.isEmpty()) {
|
if (!uninteresting.isEmpty()) {
|
||||||
//long before = System.currentTimeMillis();
|
//long before = System.currentTimeMillis();
|
||||||
locs.addAll(WorldScanner.INSTANCE.scanChunkRadius(ctx.getBaritone().getPlayerContext(), uninteresting, max, 10, 26));
|
locs.addAll(WorldScanner.INSTANCE.scanChunkRadius(ctx.getBaritone().getPlayerContext(), uninteresting, max, 10, 32)); // maxSearchRadius is NOT sq
|
||||||
//System.out.println("Scan of loaded chunks took " + (System.currentTimeMillis() - before) + "ms");
|
//System.out.println("Scan of loaded chunks took " + (System.currentTimeMillis() - before) + "ms");
|
||||||
}
|
}
|
||||||
locs.addAll(alreadyKnown);
|
locs.addAll(alreadyKnown);
|
||||||
return prune(ctx, locs, mining, max);
|
return prune(ctx, locs, mining, max, blacklist);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addNearby() {
|
private void addNearby() {
|
||||||
@@ -241,17 +252,17 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
// is an x-ray and it'll get caught
|
// is an x-ray and it'll get caught
|
||||||
if (mining.contains(bsi.get0(x, y, z).getBlock())) {
|
if (mining.contains(bsi.get0(x, y, z).getBlock())) {
|
||||||
BlockPos pos = new BlockPos(x, y, z);
|
BlockPos pos = new BlockPos(x, y, z);
|
||||||
if ((Baritone.settings().legitMineIncludeDiagonals.get() && knownOreLocations.stream().anyMatch(ore -> ore.distanceSq(pos) <= 2 /* sq means this is pytha dist <= sqrt(2) */)) || RotationUtils.reachable(ctx.player(), pos, fakedBlockReachDistance).isPresent()) {
|
if ((Baritone.settings().legitMineIncludeDiagonals.value && knownOreLocations.stream().anyMatch(ore -> ore.distanceSq(pos) <= 2 /* sq means this is pytha dist <= sqrt(2) */)) || RotationUtils.reachable(ctx.player(), pos, fakedBlockReachDistance).isPresent()) {
|
||||||
knownOreLocations.add(pos);
|
knownOreLocations.add(pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
knownOreLocations = prune(new CalculationContext(baritone), knownOreLocations, mining, ORE_LOCATIONS_COUNT);
|
knownOreLocations = prune(new CalculationContext(baritone), knownOreLocations, mining, ORE_LOCATIONS_COUNT, blacklist);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<BlockPos> prune(CalculationContext ctx, List<BlockPos> locs2, List<Block> mining, int max) {
|
private static List<BlockPos> prune(CalculationContext ctx, List<BlockPos> locs2, List<Block> mining, int max, List<BlockPos> blacklist) {
|
||||||
List<BlockPos> dropped = droppedItemsScan(mining, ctx.world);
|
List<BlockPos> dropped = droppedItemsScan(mining, ctx.world);
|
||||||
dropped.removeIf(drop -> {
|
dropped.removeIf(drop -> {
|
||||||
for (BlockPos pos : locs2) {
|
for (BlockPos pos : locs2) {
|
||||||
@@ -271,6 +282,8 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
// remove any that are implausible to mine (encased in bedrock, or touching lava)
|
// remove any that are implausible to mine (encased in bedrock, or touching lava)
|
||||||
.filter(pos -> MineProcess.plausibleToBreak(ctx.bsi, pos))
|
.filter(pos -> MineProcess.plausibleToBreak(ctx.bsi, pos))
|
||||||
|
|
||||||
|
.filter(pos -> !blacklist.contains(pos))
|
||||||
|
|
||||||
.sorted(Comparator.comparingDouble(ctx.getBaritone().getPlayerContext().playerFeet()::distanceSq))
|
.sorted(Comparator.comparingDouble(ctx.getBaritone().getPlayerContext().playerFeet()::distanceSq))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
@@ -291,7 +304,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mineByName(int quantity, String... blocks) {
|
public void mineByName(int quantity, String... blocks) {
|
||||||
mine(quantity, blocks == null || blocks.length == 0 ? null : Arrays.stream(blocks).map(ChunkPacker::stringToBlock).toArray(Block[]::new));
|
mine(quantity, blocks == null || blocks.length == 0 ? null : Arrays.stream(blocks).map(ChunkPacker::stringToBlockRequired).toArray(Block[]::new));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -299,6 +312,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
this.mining = blocks == null || blocks.length == 0 ? null : Arrays.asList(blocks);
|
this.mining = blocks == null || blocks.length == 0 ? null : Arrays.asList(blocks);
|
||||||
this.desiredQuantity = quantity;
|
this.desiredQuantity = quantity;
|
||||||
this.knownOreLocations = new ArrayList<>();
|
this.knownOreLocations = new ArrayList<>();
|
||||||
|
this.blacklist = new ArrayList<>();
|
||||||
this.branchPoint = null;
|
this.branchPoint = null;
|
||||||
this.branchPointRunaway = null;
|
this.branchPointRunaway = null;
|
||||||
if (mining != null) {
|
if (mining != null) {
|
||||||
|
|||||||
@@ -23,14 +23,21 @@ import baritone.api.event.listener.AbstractGameEventListener;
|
|||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.pathing.goals.GoalBlock;
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
|
import net.minecraft.client.GameSettings;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.GuiMainMenu;
|
import net.minecraft.client.gui.GuiMainMenu;
|
||||||
import net.minecraft.client.settings.GameSettings;
|
|
||||||
import net.minecraft.client.tutorial.TutorialSteps;
|
import net.minecraft.client.tutorial.TutorialSteps;
|
||||||
|
import net.minecraft.server.integrated.IntegratedServer;
|
||||||
|
import net.minecraft.util.HttpUtil;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.GameType;
|
import net.minecraft.world.GameType;
|
||||||
import net.minecraft.world.WorldSettings;
|
import net.minecraft.world.WorldSettings;
|
||||||
import net.minecraft.world.WorldType;
|
import net.minecraft.world.WorldType;
|
||||||
|
import net.minecraft.world.dimension.DimensionType;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Responsible for automatically testing Baritone's pathing algorithm by automatically creating a world with a specific
|
* Responsible for automatically testing Baritone's pathing algorithm by automatically creating a world with a specific
|
||||||
@@ -88,11 +95,13 @@ public class BaritoneAutoTest implements AbstractGameEventListener, Helper {
|
|||||||
mc.launchIntegratedServer("BaritoneAutoTest", "BaritoneAutoTest", worldsettings);
|
mc.launchIntegratedServer("BaritoneAutoTest", "BaritoneAutoTest", worldsettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntegratedServer server = mc.getIntegratedServer();
|
||||||
|
|
||||||
// If the integrated server is launched and the world has initialized, set the spawn point
|
// If the integrated server is launched and the world has initialized, set the spawn point
|
||||||
// to our defined starting position
|
// to our defined starting position
|
||||||
if (mc.getIntegratedServer() != null && mc.getIntegratedServer().worlds[0] != null) {
|
if (server != null && server.getWorld(DimensionType.OVERWORLD) != null) {
|
||||||
mc.getIntegratedServer().worlds[0].setSpawnPoint(STARTING_POSITION);
|
server.getWorld(DimensionType.OVERWORLD).setSpawnPoint(STARTING_POSITION);
|
||||||
mc.getIntegratedServer().worlds[0].getGameRules().setOrCreateGameRule("spawnRadius", "0");
|
server.getWorld(DimensionType.OVERWORLD).getGameRules().setOrCreateGameRule("spawnRadius", "0", server);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.getType() == TickEvent.Type.IN) { // If we're in-game
|
if (event.getType() == TickEvent.Type.IN) { // If we're in-game
|
||||||
@@ -100,7 +109,7 @@ public class BaritoneAutoTest implements AbstractGameEventListener, Helper {
|
|||||||
// Force the integrated server to share the world to LAN so that
|
// Force the integrated server to share the world to LAN so that
|
||||||
// the ingame pause menu gui doesn't actually pause our game
|
// the ingame pause menu gui doesn't actually pause our game
|
||||||
if (mc.isSingleplayer() && !mc.getIntegratedServer().getPublic()) {
|
if (mc.isSingleplayer() && !mc.getIntegratedServer().getPublic()) {
|
||||||
mc.getIntegratedServer().shareToLAN(GameType.getByName("survival"), false);
|
mc.getIntegratedServer().shareToLAN(GameType.getByName("survival"), false, HttpUtil.getSuitableLanPort());
|
||||||
}
|
}
|
||||||
|
|
||||||
// For the first 200 ticks, wait for the world to generate
|
// For the first 200 ticks, wait for the world to generate
|
||||||
@@ -122,7 +131,16 @@ public class BaritoneAutoTest implements AbstractGameEventListener, Helper {
|
|||||||
// If we have reached our goal, print a message and safely close the game
|
// If we have reached our goal, print a message and safely close the game
|
||||||
if (GOAL.isInGoal(ctx.playerFeet())) {
|
if (GOAL.isInGoal(ctx.playerFeet())) {
|
||||||
System.out.println("Successfully pathed to " + ctx.playerFeet() + " in " + event.getCount() + " ticks");
|
System.out.println("Successfully pathed to " + ctx.playerFeet() + " in " + event.getCount() + " ticks");
|
||||||
|
try {
|
||||||
|
File file = new File("success");
|
||||||
|
System.out.println("Writing success to " + file.getAbsolutePath());
|
||||||
|
Files.write(file.getAbsoluteFile().toPath(), "Success!".getBytes());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
mc.shutdown();
|
mc.shutdown();
|
||||||
|
mc.shutdownMinecraftApplet();
|
||||||
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have exceeded the expected number of ticks to complete the pathing
|
// If we have exceeded the expected number of ticks to complete the pathing
|
||||||
|
|||||||
@@ -25,12 +25,10 @@ public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper
|
|||||||
|
|
||||||
protected final Baritone baritone;
|
protected final Baritone baritone;
|
||||||
protected final IPlayerContext ctx;
|
protected final IPlayerContext ctx;
|
||||||
private final double priority;
|
|
||||||
|
|
||||||
public BaritoneProcessHelper(Baritone baritone, double priority) {
|
public BaritoneProcessHelper(Baritone baritone) {
|
||||||
this.baritone = baritone;
|
this.baritone = baritone;
|
||||||
this.ctx = baritone.getPlayerContext();
|
this.ctx = baritone.getPlayerContext();
|
||||||
this.priority = priority;
|
|
||||||
baritone.getPathingControlManager().registerProcess(this);
|
baritone.getPathingControlManager().registerProcess(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,9 +36,4 @@ public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper
|
|||||||
public boolean isTemporary() {
|
public boolean isTemporary() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double priority() {
|
|
||||||
return priority;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public final class BlockBreakHelper implements Helper {
|
|||||||
|
|
||||||
public void tick(boolean isLeftClick) {
|
public void tick(boolean isLeftClick) {
|
||||||
RayTraceResult trace = playerContext.objectMouseOver();
|
RayTraceResult trace = playerContext.objectMouseOver();
|
||||||
boolean isBlockTrace = trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK;
|
boolean isBlockTrace = trace != null && trace.type == RayTraceResult.Type.BLOCK;
|
||||||
|
|
||||||
if (isLeftClick && isBlockTrace) {
|
if (isLeftClick && isBlockTrace) {
|
||||||
tryBreakBlock(trace.getBlockPos(), trace.sideHit);
|
tryBreakBlock(trace.getBlockPos(), trace.sideHit);
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import baritone.Baritone;
|
|||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.util.EnumActionResult;
|
import net.minecraft.util.EnumActionResult;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
|
||||||
public class BlockPlaceHelper implements Helper {
|
public class BlockPlaceHelper implements Helper {
|
||||||
@@ -38,16 +37,18 @@ public class BlockPlaceHelper implements Helper {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RayTraceResult mouseOver = ctx.objectMouseOver();
|
RayTraceResult mouseOver = ctx.objectMouseOver();
|
||||||
BlockPos pos = mouseOver.getBlockPos();
|
if (!rightClickRequested || ctx.player().isRowingBoat() || mouseOver == null || mouseOver.getBlockPos() == null || mouseOver.type != RayTraceResult.Type.BLOCK) {
|
||||||
if (!rightClickRequested || ctx.player().isRowingBoat() || pos == null || mouseOver.typeOfHit != RayTraceResult.Type.BLOCK) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rightClickTimer = Baritone.settings().rightClickSpeed.get();
|
rightClickTimer = Baritone.settings().rightClickSpeed.value;
|
||||||
for (EnumHand hand : EnumHand.values()) {
|
for (EnumHand hand : EnumHand.values()) {
|
||||||
if (ctx.playerController().processRightClickBlock(ctx.player(), ctx.world(), pos, mouseOver.sideHit, mouseOver.hitVec, hand) == EnumActionResult.SUCCESS) {
|
if (ctx.playerController().processRightClickBlock(ctx.player(), ctx.world(), mouseOver.getBlockPos(), mouseOver.sideHit, mouseOver.hitVec, hand) == EnumActionResult.SUCCESS) {
|
||||||
ctx.player().swingArm(hand);
|
ctx.player().swingArm(hand);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!ctx.player().getHeldItem(hand).isEmpty() && ctx.playerController().processRightClick(ctx.player(), ctx.world(), hand) == EnumActionResult.SUCCESS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ public class BlockStateInterface {
|
|||||||
} else {
|
} else {
|
||||||
this.loadedChunks = worldLoaded; // this will only be used on the main thread
|
this.loadedChunks = worldLoaded; // this will only be used on the main thread
|
||||||
}
|
}
|
||||||
this.useTheRealWorld = !Baritone.settings().pathThroughCachedOnly.get();
|
this.useTheRealWorld = !Baritone.settings().pathThroughCachedOnly.value;
|
||||||
if (!Minecraft.getMinecraft().isCallingFromMinecraftThread()) {
|
if (!Minecraft.getInstance().isCallingFromMinecraftThread()) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import baritone.api.cache.IWaypoint;
|
|||||||
import baritone.api.event.events.ChatEvent;
|
import baritone.api.event.events.ChatEvent;
|
||||||
import baritone.api.pathing.goals.*;
|
import baritone.api.pathing.goals.*;
|
||||||
import baritone.api.pathing.movement.ActionCosts;
|
import baritone.api.pathing.movement.ActionCosts;
|
||||||
|
import baritone.api.process.IBaritoneProcess;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.utils.SettingsUtil;
|
||||||
import baritone.behavior.Behavior;
|
import baritone.behavior.Behavior;
|
||||||
@@ -89,14 +90,14 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
@Override
|
@Override
|
||||||
public void onSendChatMessage(ChatEvent event) {
|
public void onSendChatMessage(ChatEvent event) {
|
||||||
String msg = event.getMessage();
|
String msg = event.getMessage();
|
||||||
if (Baritone.settings().prefixControl.get() && msg.startsWith(COMMAND_PREFIX)) {
|
if (Baritone.settings().prefixControl.value && msg.startsWith(COMMAND_PREFIX)) {
|
||||||
if (!runCommand(msg.substring(COMMAND_PREFIX.length()))) {
|
if (!runCommand(msg.substring(COMMAND_PREFIX.length()))) {
|
||||||
logDirect("Invalid command");
|
logDirect("Invalid command");
|
||||||
}
|
}
|
||||||
event.cancel(); // always cancel if using prefixControl
|
event.cancel(); // always cancel if using prefixControl
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!Baritone.settings().chatControl.get() && !Baritone.settings().removePrefix.get()) {
|
if (!Baritone.settings().chatControl.value && !Baritone.settings().removePrefix.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (runCommand(msg)) {
|
if (runCommand(msg)) {
|
||||||
@@ -225,6 +226,20 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.equals("proc")) {
|
||||||
|
Optional<IBaritoneProcess> proc = baritone.getPathingControlManager().mostRecentInControl();
|
||||||
|
if (!proc.isPresent()) {
|
||||||
|
logDirect("No process is in control");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
IBaritoneProcess p = proc.get();
|
||||||
|
logDirect("Class: " + p.getClass());
|
||||||
|
logDirect("Priority: " + p.priority());
|
||||||
|
logDirect("Temporary: " + p.isTemporary());
|
||||||
|
logDirect("Display name: " + p.displayName());
|
||||||
|
logDirect("Command: " + baritone.getPathingControlManager().mostRecentCommand());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.equals("version")) {
|
if (msg.equals("version")) {
|
||||||
String version = ExampleBaritoneControl.class.getPackage().getImplementationVersion();
|
String version = ExampleBaritoneControl.class.getPackage().getImplementationVersion();
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
@@ -241,7 +256,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
for (int x = playerChunkX - 40; x <= playerChunkX + 40; x++) {
|
for (int x = playerChunkX - 40; x <= playerChunkX + 40; x++) {
|
||||||
for (int z = playerChunkZ - 40; z <= playerChunkZ + 40; z++) {
|
for (int z = playerChunkZ - 40; z <= playerChunkZ + 40; z++) {
|
||||||
Chunk chunk = cli.getLoadedChunk(x, z);
|
Chunk chunk = cli.getChunk(x, z, false, false);
|
||||||
if (chunk != null) {
|
if (chunk != null) {
|
||||||
count++;
|
count++;
|
||||||
baritone.getWorldProvider().getCurrentWorld().getCachedWorld().queueForPacking(chunk);
|
baritone.getWorldProvider().getCurrentWorld().getCachedWorld().queueForPacking(chunk);
|
||||||
@@ -251,6 +266,22 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("Queued " + count + " chunks for repacking");
|
logDirect("Queued " + count + " chunks for repacking");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.startsWith("build")) {
|
||||||
|
String file;
|
||||||
|
BlockPos origin;
|
||||||
|
try {
|
||||||
|
String[] coords = msg.substring("build".length()).trim().split(" ");
|
||||||
|
file = coords[0] + ".schematic";
|
||||||
|
origin = new BlockPos(parseOrDefault(coords[1], ctx.playerFeet().x), parseOrDefault(coords[2], ctx.playerFeet().y), parseOrDefault(coords[3], ctx.playerFeet().z));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
file = msg.substring(5).trim() + ".schematic";
|
||||||
|
origin = ctx.playerFeet();
|
||||||
|
}
|
||||||
|
logDirect("Loading '" + file + "' to build from origin " + origin);
|
||||||
|
boolean success = baritone.getBuilderProcess().build(file, origin);
|
||||||
|
logDirect(success ? "Loaded" : "Unable to load");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.equals("come")) {
|
if (msg.equals("come")) {
|
||||||
customGoalProcess.setGoalAndPath(new GoalBlock(new BlockPos(mc.getRenderViewEntity())));
|
customGoalProcess.setGoalAndPath(new GoalBlock(new BlockPos(mc.getRenderViewEntity())));
|
||||||
logDirect("Coming");
|
logDirect("Coming");
|
||||||
@@ -296,6 +327,37 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.startsWith("cleararea")) {
|
||||||
|
String suffix = msg.substring("cleararea".length());
|
||||||
|
BlockPos corner1;
|
||||||
|
BlockPos corner2;
|
||||||
|
if (suffix.isEmpty()) {
|
||||||
|
// clear the area from the current goal to here
|
||||||
|
Goal goal = baritone.getPathingBehavior().getGoal();
|
||||||
|
if (goal == null || !(goal instanceof GoalBlock)) {
|
||||||
|
logDirect("Need to specify goal of opposite corner");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
corner1 = ((GoalBlock) goal).getGoalPos();
|
||||||
|
corner2 = ctx.playerFeet();
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
String[] spl = suffix.split(" ");
|
||||||
|
corner1 = ctx.playerFeet();
|
||||||
|
corner2 = new BlockPos(Integer.parseInt(spl[0]), Integer.parseInt(spl[1]), Integer.parseInt(spl[2]));
|
||||||
|
} catch (NumberFormatException | ArrayIndexOutOfBoundsException | NullPointerException ex) {
|
||||||
|
logDirect("unable to parse");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
baritone.getBuilderProcess().clearArea(corner1, corner2);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (msg.equals("resume")) {
|
||||||
|
baritone.getBuilderProcess().resume();
|
||||||
|
logDirect("resumed");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.equals("reset")) {
|
if (msg.equals("reset")) {
|
||||||
for (Settings.Setting setting : Baritone.settings().allSettings) {
|
for (Settings.Setting setting : Baritone.settings().allSettings) {
|
||||||
setting.reset();
|
setting.reset();
|
||||||
@@ -304,9 +366,14 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("Baritone settings reset");
|
logDirect("Baritone settings reset");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.equals("tunnel")) {
|
||||||
|
customGoalProcess.setGoalAndPath(new GoalStrictDirection(ctx.playerFeet(), ctx.player().getHorizontalFacing()));
|
||||||
|
logDirect("tunneling");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.equals("render")) {
|
if (msg.equals("render")) {
|
||||||
BetterBlockPos pf = ctx.playerFeet();
|
BetterBlockPos pf = ctx.playerFeet();
|
||||||
Minecraft.getMinecraft().renderGlobal.markBlockRangeForRenderUpdate(pf.x - 500, pf.y - 500, pf.z - 500, pf.x + 500, pf.y + 500, pf.z + 500);
|
Minecraft.getInstance().worldRenderer.markBlockRangeForRenderUpdate(pf.x - 500, pf.y - 500, pf.z - 500, pf.x + 500, pf.y + 500, pf.z + 500);
|
||||||
logDirect("okay");
|
logDirect("okay");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -349,8 +416,8 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
toFollow = ctx.getSelectedEntity();
|
toFollow = ctx.getSelectedEntity();
|
||||||
} else {
|
} else {
|
||||||
for (EntityPlayer pl : ctx.world().playerEntities) {
|
for (EntityPlayer pl : ctx.world().playerEntities) {
|
||||||
String theirName = pl.getName().trim().toLowerCase();
|
String theirName = pl.getName().getString().trim().toLowerCase();
|
||||||
if (!theirName.equals(ctx.player().getName().trim().toLowerCase()) && (theirName.contains(name) || name.contains(theirName))) { // don't follow ourselves lol
|
if (!theirName.equals(ctx.player().getName().getString().trim().toLowerCase()) && (theirName.contains(name) || name.contains(theirName))) { // don't follow ourselves lol
|
||||||
toFollow = Optional.of(pl);
|
toFollow = Optional.of(pl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -374,9 +441,24 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("ok");
|
logDirect("ok");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.startsWith("explore")) {
|
||||||
|
String rest = msg.substring("explore".length()).trim();
|
||||||
|
int centerX;
|
||||||
|
int centerZ;
|
||||||
|
try {
|
||||||
|
centerX = Integer.parseInt(rest.split(" ")[0]);
|
||||||
|
centerZ = Integer.parseInt(rest.split(" ")[1]);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
centerX = ctx.playerFeet().x;
|
||||||
|
centerZ = ctx.playerFeet().z;
|
||||||
|
}
|
||||||
|
baritone.getExploreProcess().explore(centerX, centerZ);
|
||||||
|
logDirect("Exploring from " + centerX + "," + centerZ);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.startsWith("find")) {
|
if (msg.startsWith("find")) {
|
||||||
String blockType = msg.substring(4).trim();
|
String blockType = msg.substring(4).trim();
|
||||||
LinkedList<BlockPos> locs = baritone.getWorldProvider().getCurrentWorld().getCachedWorld().getLocationsOf(blockType, 1, ctx.playerFeet().getX(), ctx.playerFeet().getZ(), 4);
|
ArrayList<BlockPos> locs = baritone.getWorldProvider().getCurrentWorld().getCachedWorld().getLocationsOf(blockType, 1, ctx.playerFeet().getX(), ctx.playerFeet().getZ(), 4);
|
||||||
logDirect("Have " + locs.size() + " locations");
|
logDirect("Have " + locs.size() + " locations");
|
||||||
for (BlockPos pos : locs) {
|
for (BlockPos pos : locs) {
|
||||||
Block actually = BlockStateInterface.get(ctx, pos).getBlock();
|
Block actually = BlockStateInterface.get(ctx, pos).getBlock();
|
||||||
@@ -390,14 +472,13 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
String[] blockTypes = msg.substring(4).trim().split(" ");
|
String[] blockTypes = msg.substring(4).trim().split(" ");
|
||||||
try {
|
try {
|
||||||
int quantity = Integer.parseInt(blockTypes[1]);
|
int quantity = Integer.parseInt(blockTypes[1]);
|
||||||
Block block = ChunkPacker.stringToBlock(blockTypes[0]);
|
Block block = ChunkPacker.stringToBlockRequired(blockTypes[0]);
|
||||||
Objects.requireNonNull(block);
|
|
||||||
baritone.getMineProcess().mine(quantity, block);
|
baritone.getMineProcess().mine(quantity, block);
|
||||||
logDirect("Will mine " + quantity + " " + blockTypes[0]);
|
logDirect("Will mine " + quantity + " " + blockTypes[0]);
|
||||||
return true;
|
return true;
|
||||||
} catch (NumberFormatException | ArrayIndexOutOfBoundsException | NullPointerException ex) {}
|
} catch (NumberFormatException | ArrayIndexOutOfBoundsException | NullPointerException ex) {}
|
||||||
for (String s : blockTypes) {
|
for (String s : blockTypes) {
|
||||||
if (ChunkPacker.stringToBlock(s) == null) {
|
if (ChunkPacker.stringToBlockNullable(s) == null) {
|
||||||
logDirect(s + " isn't a valid block name");
|
logDirect(s + " isn't a valid block name");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -411,7 +492,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiClickMeme()));
|
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiClick()));
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}).start();
|
}).start();
|
||||||
logDirect("aight dude");
|
logDirect("aight dude");
|
||||||
@@ -480,7 +561,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
IWaypoint waypoint;
|
IWaypoint waypoint;
|
||||||
if (tag == null) {
|
if (tag == null) {
|
||||||
String mining = waypointType;
|
String mining = waypointType;
|
||||||
Block block = ChunkPacker.stringToBlock(mining);
|
Block block = ChunkPacker.stringToBlockNullable(mining);
|
||||||
//logDirect("Not a valid tag. Tags are: " + Arrays.asList(Waypoint.Tag.values()).toString().toLowerCase());
|
//logDirect("Not a valid tag. Tags are: " + Arrays.asList(Waypoint.Tag.values()).toString().toLowerCase());
|
||||||
if (block == null) {
|
if (block == null) {
|
||||||
waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getAllWaypoints().stream().filter(w -> w.getName().equalsIgnoreCase(mining)).max(Comparator.comparingLong(IWaypoint::getCreationTimestamp)).orElse(null);
|
waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getAllWaypoints().stream().filter(w -> w.getName().equalsIgnoreCase(mining)).max(Comparator.comparingLong(IWaypoint::getCreationTimestamp)).orElse(null);
|
||||||
@@ -503,7 +584,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Goal goal = new GoalBlock(waypoint.getLocation());
|
Goal goal = waypoint.getTag() == Waypoint.Tag.BED ? new GoalGetToBlock(waypoint.getLocation()) : new GoalBlock(waypoint.getLocation());
|
||||||
customGoalProcess.setGoalAndPath(goal);
|
customGoalProcess.setGoalAndPath(goal);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -543,7 +624,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
while (moves.contains(null)) {
|
while (moves.contains(null)) {
|
||||||
moves.remove(null);
|
moves.remove(null);
|
||||||
}
|
}
|
||||||
moves.sort(Comparator.comparingDouble(Movement::getCost));
|
moves.sort(Comparator.comparingDouble(move -> move.getCost(new CalculationContext(baritone))));
|
||||||
for (Movement move : moves) {
|
for (Movement move : moves) {
|
||||||
String[] parts = move.getClass().toString().split("\\.");
|
String[] parts = move.getClass().toString().split("\\.");
|
||||||
double cost = move.getCost();
|
double cost = move.getCost();
|
||||||
@@ -561,10 +642,14 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int parseOrDefault(String str, int i) {
|
||||||
|
return str.equals("~") ? i : str.startsWith("~") ? Integer.parseInt(str.substring(1)) + i : Integer.parseInt(str);
|
||||||
|
}
|
||||||
|
|
||||||
private void log(List<ItemStack> stacks) {
|
private void log(List<ItemStack> stacks) {
|
||||||
for (ItemStack stack : stacks) {
|
for (ItemStack stack : stacks) {
|
||||||
if (!stack.isEmpty()) {
|
if (!stack.isEmpty()) {
|
||||||
logDirect(stack.getCount() + "x " + stack.getDisplayName() + "@" + stack.getItemDamage());
|
logDirect(stack.getCount() + "x " + stack.getDisplayName() + "@" + stack.getDamage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,316 @@
|
|||||||
|
/*
|
||||||
|
* 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.utils;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
|
import baritone.api.BaritoneAPI;
|
||||||
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
|
import baritone.api.pathing.goals.GoalTwoBlocks;
|
||||||
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.util.math.*;
|
||||||
|
import org.lwjgl.BufferUtils;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL11.*;
|
||||||
|
|
||||||
|
public class GuiClick extends GuiScreen {
|
||||||
|
|
||||||
|
// My name is Brady and I grant leijurv permission to use this pasted code
|
||||||
|
private final FloatBuffer MODELVIEW = BufferUtils.createFloatBuffer(16);
|
||||||
|
private final FloatBuffer PROJECTION = BufferUtils.createFloatBuffer(16);
|
||||||
|
private final IntBuffer VIEWPORT = BufferUtils.createIntBuffer(16);
|
||||||
|
private final FloatBuffer TO_WORLD_BUFFER = BufferUtils.createFloatBuffer(3);
|
||||||
|
|
||||||
|
private BlockPos clickStart;
|
||||||
|
private BlockPos currentMouseOver;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean doesGuiPauseGame() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(int mouseX, int mouseY, float partialTicks) {
|
||||||
|
double mx = mc.mouseHelper.getMouseX();
|
||||||
|
double my = mc.mouseHelper.getMouseY();
|
||||||
|
my = mc.mainWindow.getHeight() - my;
|
||||||
|
my *= mc.mainWindow.getFramebufferHeight() / (double) mc.mainWindow.getHeight();
|
||||||
|
mx *= mc.mainWindow.getFramebufferWidth() / (double) mc.mainWindow.getWidth();
|
||||||
|
Vec3d near = toWorld(mx, my, 0);
|
||||||
|
Vec3d far = toWorld(mx, my, 1); // "Use 0.945 that's what stack overflow says" - leijurv
|
||||||
|
if (near != null && far != null) {
|
||||||
|
Vec3d viewerPos = new Vec3d(mc.getRenderManager().viewerPosX, mc.getRenderManager().viewerPosY, mc.getRenderManager().viewerPosZ);
|
||||||
|
RayTraceResult result = mc.world.rayTraceBlocks(near.add(viewerPos), far.add(viewerPos), RayTraceFluidMode.NEVER, false, true);
|
||||||
|
if (result != null && result.type == RayTraceResult.Type.BLOCK) {
|
||||||
|
currentMouseOver = result.getBlockPos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseReleased(double mouseX, double mouseY, int mouseButton) {
|
||||||
|
if (mouseButton == 0) {
|
||||||
|
if (clickStart != null && !clickStart.equals(currentMouseOver)) {
|
||||||
|
((Baritone) BaritoneAPI.getProvider().getPrimaryBaritone()).getBuilderProcess().clearArea(clickStart, currentMouseOver);
|
||||||
|
clickStart = null;
|
||||||
|
} else {
|
||||||
|
BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalTwoBlocks(currentMouseOver));
|
||||||
|
}
|
||||||
|
} else if (mouseButton == 1) {
|
||||||
|
BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalBlock(currentMouseOver.up()));
|
||||||
|
}
|
||||||
|
clickStart = null;
|
||||||
|
return super.mouseReleased(mouseX, mouseY, mouseButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) {
|
||||||
|
clickStart = currentMouseOver;
|
||||||
|
return super.mouseClicked(mouseX, mouseY, mouseButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onRender() {
|
||||||
|
GlStateManager.getFloatv(GL_MODELVIEW_MATRIX, (FloatBuffer) MODELVIEW.clear());
|
||||||
|
GlStateManager.getFloatv(GL_PROJECTION_MATRIX, (FloatBuffer) PROJECTION.clear());
|
||||||
|
GL11.glGetIntegerv(GL_VIEWPORT, (IntBuffer) VIEWPORT.clear());
|
||||||
|
|
||||||
|
if (currentMouseOver != null) {
|
||||||
|
Entity e = mc.getRenderViewEntity();
|
||||||
|
// drawSingleSelectionBox WHEN?
|
||||||
|
PathRenderer.drawManySelectionBoxes(e, Collections.singletonList(currentMouseOver), Color.CYAN);
|
||||||
|
if (clickStart != null && !clickStart.equals(currentMouseOver)) {
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
|
GlStateManager.color4f(Color.RED.getColorComponents(null)[0], Color.RED.getColorComponents(null)[1], Color.RED.getColorComponents(null)[2], 0.4F);
|
||||||
|
GlStateManager.lineWidth(Baritone.settings().pathRenderLineWidthPixels.value);
|
||||||
|
GlStateManager.disableTexture2D();
|
||||||
|
GlStateManager.depthMask(false);
|
||||||
|
GlStateManager.disableDepthTest();
|
||||||
|
BetterBlockPos a = new BetterBlockPos(currentMouseOver);
|
||||||
|
BetterBlockPos b = new BetterBlockPos(clickStart);
|
||||||
|
PathRenderer.drawAABB(new AxisAlignedBB(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.min(a.z, b.z), Math.max(a.x, b.x) + 1, Math.max(a.y, b.y) + 1, Math.max(a.z, b.z) + 1));
|
||||||
|
GlStateManager.enableDepthTest();
|
||||||
|
|
||||||
|
GlStateManager.depthMask(true);
|
||||||
|
GlStateManager.enableTexture2D();
|
||||||
|
GlStateManager.disableBlend();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vec3d toWorld(double x, double y, double z) {
|
||||||
|
boolean result = gluUnProject((float) x, (float) y, (float) z, MODELVIEW, PROJECTION, VIEWPORT, (FloatBuffer) TO_WORLD_BUFFER.clear());
|
||||||
|
if (result) {
|
||||||
|
return new Vec3d(TO_WORLD_BUFFER.get(0), TO_WORLD_BUFFER.get(1), TO_WORLD_BUFFER.get(2));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// skidded from lwjgl2 :ok_hand:
|
||||||
|
// its uhhhhh mit license so its ok
|
||||||
|
// here is the uhh license
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2002-2007 Lightweight Java Game Library Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of 'Light Weight Java Game Library' nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static boolean gluUnProject(
|
||||||
|
float winx,
|
||||||
|
float winy,
|
||||||
|
float winz,
|
||||||
|
FloatBuffer modelMatrix,
|
||||||
|
FloatBuffer projMatrix,
|
||||||
|
IntBuffer viewport,
|
||||||
|
FloatBuffer obj_pos) {
|
||||||
|
FloatBuffer finalMatrix = BufferUtils.createFloatBuffer(16);
|
||||||
|
float[] in = new float[4];
|
||||||
|
float[] out = new float[4];
|
||||||
|
|
||||||
|
__gluMultMatricesf(modelMatrix, projMatrix, finalMatrix);
|
||||||
|
|
||||||
|
if (!__gluInvertMatrixf(finalMatrix, finalMatrix))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
in[0] = winx;
|
||||||
|
in[1] = winy;
|
||||||
|
in[2] = winz;
|
||||||
|
in[3] = 1.0f;
|
||||||
|
|
||||||
|
// Map x and y from window coordinates
|
||||||
|
in[0] = (in[0] - viewport.get(viewport.position() + 0)) / viewport.get(viewport.position() + 2);
|
||||||
|
in[1] = (in[1] - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3);
|
||||||
|
|
||||||
|
// Map to range -1 to 1
|
||||||
|
in[0] = in[0] * 2 - 1;
|
||||||
|
in[1] = in[1] * 2 - 1;
|
||||||
|
in[2] = in[2] * 2 - 1;
|
||||||
|
|
||||||
|
__gluMultMatrixVecf(finalMatrix, in, out);
|
||||||
|
|
||||||
|
if (out[3] == 0.0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
out[3] = 1.0f / out[3];
|
||||||
|
|
||||||
|
obj_pos.put(obj_pos.position() + 0, out[0] * out[3]);
|
||||||
|
obj_pos.put(obj_pos.position() + 1, out[1] * out[3]);
|
||||||
|
obj_pos.put(obj_pos.position() + 2, out[2] * out[3]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void __gluMultMatrixVecf(FloatBuffer m, float[] in, float[] out) {
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
out[i] =
|
||||||
|
in[0] * m.get(m.position() + 0 * 4 + i)
|
||||||
|
+ in[1] * m.get(m.position() + 1 * 4 + i)
|
||||||
|
+ in[2] * m.get(m.position() + 2 * 4 + i)
|
||||||
|
+ in[3] * m.get(m.position() + 3 * 4 + i);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void __gluMultMatricesf(FloatBuffer a, FloatBuffer b, FloatBuffer r) {
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
r.put(r.position() + i * 4 + j,
|
||||||
|
a.get(a.position() + i * 4 + 0) * b.get(b.position() + 0 * 4 + j) + a.get(a.position() + i * 4 + 1) * b.get(b.position() + 1 * 4 + j) + a.get(a.position() + i * 4 + 2) * b.get(b.position() + 2 * 4 + j) + a.get(a.position() + i * 4 + 3) * b.get(b.position() + 3 * 4 + j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean __gluInvertMatrixf(FloatBuffer src, FloatBuffer inverse) {
|
||||||
|
int i, j, k, swap;
|
||||||
|
float t;
|
||||||
|
FloatBuffer temp = BufferUtils.createFloatBuffer(16);
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
temp.put(i, src.get(i + src.position()));
|
||||||
|
}
|
||||||
|
__gluMakeIdentityf(inverse);
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
/*
|
||||||
|
* * Look for largest element in column
|
||||||
|
*/
|
||||||
|
swap = i;
|
||||||
|
for (j = i + 1; j < 4; j++) {
|
||||||
|
/*
|
||||||
|
* if (fabs(temp[j][i]) > fabs(temp[i][i])) { swap = j;
|
||||||
|
*/
|
||||||
|
if (Math.abs(temp.get(j * 4 + i)) > Math.abs(temp.get(i * 4 + i))) {
|
||||||
|
swap = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swap != i) {
|
||||||
|
/*
|
||||||
|
* * Swap rows.
|
||||||
|
*/
|
||||||
|
for (k = 0; k < 4; k++) {
|
||||||
|
t = temp.get(i * 4 + k);
|
||||||
|
temp.put(i * 4 + k, temp.get(swap * 4 + k));
|
||||||
|
temp.put(swap * 4 + k, t);
|
||||||
|
|
||||||
|
t = inverse.get(i * 4 + k);
|
||||||
|
inverse.put(i * 4 + k, inverse.get(swap * 4 + k));
|
||||||
|
//inverse.put((i << 2) + k, inverse.get((swap << 2) + k));
|
||||||
|
inverse.put(swap * 4 + k, t);
|
||||||
|
//inverse.put((swap << 2) + k, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (temp.get(i * 4 + i) == 0) {
|
||||||
|
/*
|
||||||
|
* * No non-zero pivot. The matrix is singular, which shouldn't *
|
||||||
|
* happen. This means the user gave us a bad matrix.
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
t = temp.get(i * 4 + i);
|
||||||
|
for (k = 0; k < 4; k++) {
|
||||||
|
temp.put(i * 4 + k, temp.get(i * 4 + k) / t);
|
||||||
|
inverse.put(i * 4 + k, inverse.get(i * 4 + k) / t);
|
||||||
|
}
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
if (j != i) {
|
||||||
|
t = temp.get(j * 4 + i);
|
||||||
|
for (k = 0; k < 4; k++) {
|
||||||
|
temp.put(j * 4 + k, temp.get(j * 4 + k) - temp.get(i * 4 + k) * t);
|
||||||
|
inverse.put(j * 4 + k, inverse.get(j * 4 + k) - inverse.get(i * 4 + k) * t);
|
||||||
|
/*inverse.put(
|
||||||
|
(j << 2) + k,
|
||||||
|
inverse.get((j << 2) + k) - inverse.get((i << 2) + k) * t);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final float[] IDENTITY_MATRIX =
|
||||||
|
new float[]{
|
||||||
|
1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
private static void __gluMakeIdentityf(FloatBuffer m) {
|
||||||
|
int oldPos = m.position();
|
||||||
|
m.put(IDENTITY_MATRIX);
|
||||||
|
m.position(oldPos);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,102 +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.utils;
|
|
||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
|
||||||
import baritone.api.pathing.goals.GoalBlock;
|
|
||||||
import baritone.api.pathing.goals.GoalTwoBlocks;
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import org.lwjgl.BufferUtils;
|
|
||||||
import org.lwjgl.input.Mouse;
|
|
||||||
import org.lwjgl.opengl.Display;
|
|
||||||
import org.lwjgl.util.glu.GLU;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.FloatBuffer;
|
|
||||||
import java.nio.IntBuffer;
|
|
||||||
import java.util.Collections;
|
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
|
||||||
|
|
||||||
public class GuiClickMeme extends GuiScreen {
|
|
||||||
|
|
||||||
// My name is Brady and I grant Leijurv permission to use this pasted code
|
|
||||||
private final FloatBuffer MODELVIEW = BufferUtils.createFloatBuffer(16);
|
|
||||||
private final FloatBuffer PROJECTION = BufferUtils.createFloatBuffer(16);
|
|
||||||
private final IntBuffer VIEWPORT = BufferUtils.createIntBuffer(16);
|
|
||||||
private final FloatBuffer TO_SCREEN_BUFFER = BufferUtils.createFloatBuffer(3);
|
|
||||||
private final FloatBuffer TO_WORLD_BUFFER = BufferUtils.createFloatBuffer(3);
|
|
||||||
|
|
||||||
private BlockPos meme;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean doesGuiPauseGame() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
|
|
||||||
int mx = Mouse.getX();
|
|
||||||
int my = Mouse.getY();
|
|
||||||
Vec3d near = toWorld(mx, my, 0);
|
|
||||||
Vec3d far = toWorld(mx, my, 1); // "Use 0.945 that's what stack overflow says" - Leijurv
|
|
||||||
if (near != null && far != null) {
|
|
||||||
Vec3d viewerPos = new Vec3d(mc.getRenderManager().viewerPosX, mc.getRenderManager().viewerPosY, mc.getRenderManager().viewerPosZ);
|
|
||||||
RayTraceResult result = mc.world.rayTraceBlocks(near.add(viewerPos), far.add(viewerPos), false, false, true);
|
|
||||||
if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK) {
|
|
||||||
meme = result.getBlockPos();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
|
|
||||||
super.mouseClicked(mouseX, mouseY, mouseButton);
|
|
||||||
if (mouseButton == 0) {
|
|
||||||
BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalTwoBlocks(meme));
|
|
||||||
} else if (mouseButton == 1) {
|
|
||||||
BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalBlock(meme.up()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onRender(float partialTicks) {
|
|
||||||
GlStateManager.getFloat(GL_MODELVIEW_MATRIX, (FloatBuffer) MODELVIEW.clear());
|
|
||||||
GlStateManager.getFloat(GL_PROJECTION_MATRIX, (FloatBuffer) PROJECTION.clear());
|
|
||||||
GlStateManager.glGetInteger(GL_VIEWPORT, (IntBuffer) VIEWPORT.clear());
|
|
||||||
|
|
||||||
if (meme != null) {
|
|
||||||
Entity e = mc.getRenderViewEntity();
|
|
||||||
// drawSingleSelectionBox WHEN?
|
|
||||||
PathRenderer.drawManySelectionBoxes(e, Collections.singletonList(meme), Color.CYAN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vec3d toWorld(double x, double y, double z) {
|
|
||||||
boolean result = GLU.gluUnProject((float) x, (float) y, (float) z, MODELVIEW, PROJECTION, VIEWPORT, (FloatBuffer) TO_WORLD_BUFFER.clear());
|
|
||||||
if (result) {
|
|
||||||
return new Vec3d(TO_WORLD_BUFFER.get(0), TO_WORLD_BUFFER.get(1), TO_WORLD_BUFFER.get(2));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -42,7 +42,7 @@ public interface Helper {
|
|||||||
TextFormatting.GRAY
|
TextFormatting.GRAY
|
||||||
));
|
));
|
||||||
|
|
||||||
Minecraft mc = Minecraft.getMinecraft();
|
Minecraft mc = Minecraft.getInstance();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a message to chat only if chatDebug is on
|
* Send a message to chat only if chatDebug is on
|
||||||
@@ -50,7 +50,7 @@ public interface Helper {
|
|||||||
* @param message The message to display in chat
|
* @param message The message to display in chat
|
||||||
*/
|
*/
|
||||||
default void logDebug(String message) {
|
default void logDebug(String message) {
|
||||||
if (!Baritone.settings().chatDebug.get()) {
|
if (!Baritone.settings().chatDebug.value) {
|
||||||
//System.out.println("Suppressed debug message:");
|
//System.out.println("Suppressed debug message:");
|
||||||
//System.out.println(message);
|
//System.out.println(message);
|
||||||
return;
|
return;
|
||||||
@@ -64,9 +64,9 @@ public interface Helper {
|
|||||||
* @param message The message to display in chat
|
* @param message The message to display in chat
|
||||||
*/
|
*/
|
||||||
default void logDirect(String message) {
|
default void logDirect(String message) {
|
||||||
ITextComponent component = MESSAGE_PREFIX.createCopy();
|
ITextComponent component = MESSAGE_PREFIX.shallowCopy();
|
||||||
component.getStyle().setColor(TextFormatting.GRAY);
|
component.getStyle().setColor(TextFormatting.GRAY);
|
||||||
component.appendSibling(new TextComponentString(" " + message));
|
component.appendSibling(new TextComponentString(" " + message));
|
||||||
Minecraft.getMinecraft().addScheduledTask(() -> Baritone.settings().logger.get().accept(component));
|
Minecraft.getInstance().addScheduledTask(() -> Baritone.settings().logger.value.accept(component));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public final class InputOverrideHandler extends Behavior implements IInputOverri
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ctx.player().movementInput.getClass() == PlayerMovementInput.class) { // allow other movement inputs that aren't this one, e.g. for a freecam
|
if (ctx.player().movementInput.getClass() == PlayerMovementInput.class) { // allow other movement inputs that aren't this one, e.g. for a freecam
|
||||||
ctx.player().movementInput = new MovementInputFromOptions(Minecraft.getMinecraft().gameSettings);
|
ctx.player().movementInput = new MovementInputFromOptions(Minecraft.getInstance().gameSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// only set it if it was previously incorrect
|
// only set it if it was previously incorrect
|
||||||
|
|||||||
@@ -33,10 +33,12 @@ import net.minecraft.client.renderer.Tessellator;
|
|||||||
import net.minecraft.client.renderer.tileentity.TileEntityBeaconRenderer;
|
import net.minecraft.client.renderer.tileentity.TileEntityBeaconRenderer;
|
||||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -51,6 +53,7 @@ import static org.lwjgl.opengl.GL11.*;
|
|||||||
*/
|
*/
|
||||||
public final class PathRenderer implements Helper {
|
public final class PathRenderer implements Helper {
|
||||||
|
|
||||||
|
private static final ResourceLocation TEXTURE_BEACON_BEAM = new ResourceLocation("textures/entity/beacon_beam.png");
|
||||||
private static final Tessellator TESSELLATOR = Tessellator.getInstance();
|
private static final Tessellator TESSELLATOR = Tessellator.getInstance();
|
||||||
private static final BufferBuilder BUFFER = TESSELLATOR.getBuffer();
|
private static final BufferBuilder BUFFER = TESSELLATOR.getBuffer();
|
||||||
|
|
||||||
@@ -59,12 +62,12 @@ public final class PathRenderer implements Helper {
|
|||||||
public static void render(RenderEvent event, PathingBehavior behavior) {
|
public static void render(RenderEvent event, PathingBehavior behavior) {
|
||||||
float partialTicks = event.getPartialTicks();
|
float partialTicks = event.getPartialTicks();
|
||||||
Goal goal = behavior.getGoal();
|
Goal goal = behavior.getGoal();
|
||||||
if (mc.currentScreen instanceof GuiClickMeme) {
|
if (mc.currentScreen instanceof GuiClick) {
|
||||||
((GuiClickMeme) mc.currentScreen).onRender(partialTicks);
|
((GuiClick) mc.currentScreen).onRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
int thisPlayerDimension = behavior.baritone.getPlayerContext().world().provider.getDimensionType().getId();
|
int thisPlayerDimension = behavior.baritone.getPlayerContext().world().getDimension().getType().getId();
|
||||||
int currentRenderViewDimension = BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world().provider.getDimensionType().getId();
|
int currentRenderViewDimension = BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext().world().getDimension().getType().getId();
|
||||||
|
|
||||||
if (thisPlayerDimension != currentRenderViewDimension) {
|
if (thisPlayerDimension != currentRenderViewDimension) {
|
||||||
// this is a path for a bot in a different dimension, don't render it
|
// this is a path for a bot in a different dimension, don't render it
|
||||||
@@ -81,44 +84,44 @@ public final class PathRenderer implements Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (goal != null && Baritone.settings().renderGoal.value) {
|
if (goal != null && Baritone.settings().renderGoal.value) {
|
||||||
drawDankLitGoalBox(renderView, goal, partialTicks, Baritone.settings().colorGoalBox.get());
|
drawDankLitGoalBox(renderView, goal, partialTicks, Baritone.settings().colorGoalBox.value);
|
||||||
}
|
}
|
||||||
if (!Baritone.settings().renderPath.get()) {
|
|
||||||
|
if (!Baritone.settings().renderPath.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
PathExecutor current = behavior.getCurrent(); // this should prevent most race conditions?
|
||||||
|
PathExecutor next = behavior.getNext(); // like, now it's not possible for current!=null to be true, then suddenly false because of another thread
|
||||||
|
if (current != null && Baritone.settings().renderSelectionBoxes.value) {
|
||||||
|
drawManySelectionBoxes(renderView, current.toBreak(), Baritone.settings().colorBlocksToBreak.value);
|
||||||
|
drawManySelectionBoxes(renderView, current.toPlace(), Baritone.settings().colorBlocksToPlace.value);
|
||||||
|
drawManySelectionBoxes(renderView, current.toWalkInto(), Baritone.settings().colorBlocksToWalkInto.value);
|
||||||
|
}
|
||||||
|
|
||||||
//drawManySelectionBoxes(player, Collections.singletonList(behavior.pathStart()), partialTicks, Color.WHITE);
|
//drawManySelectionBoxes(player, Collections.singletonList(behavior.pathStart()), partialTicks, Color.WHITE);
|
||||||
//long start = System.nanoTime();
|
//long start = System.nanoTime();
|
||||||
|
|
||||||
|
|
||||||
PathExecutor current = behavior.getCurrent(); // this should prevent most race conditions?
|
|
||||||
PathExecutor next = behavior.getNext(); // like, now it's not possible for current!=null to be true, then suddenly false because of another thread
|
|
||||||
|
|
||||||
// Render the current path, if there is one
|
// Render the current path, if there is one
|
||||||
if (current != null && current.getPath() != null) {
|
if (current != null && current.getPath() != null) {
|
||||||
int renderBegin = Math.max(current.getPosition() - 3, 0);
|
int renderBegin = Math.max(current.getPosition() - 3, 0);
|
||||||
drawPath(current.getPath(), renderBegin, renderView, partialTicks, Baritone.settings().colorCurrentPath.get(), Baritone.settings().fadePath.get(), 10, 20);
|
drawPath(current.getPath(), renderBegin, renderView, partialTicks, Baritone.settings().colorCurrentPath.value, Baritone.settings().fadePath.value, 10, 20);
|
||||||
}
|
}
|
||||||
if (next != null && next.getPath() != null) {
|
if (next != null && next.getPath() != null) {
|
||||||
drawPath(next.getPath(), 0, renderView, partialTicks, Baritone.settings().colorNextPath.get(), Baritone.settings().fadePath.get(), 10, 20);
|
drawPath(next.getPath(), 0, renderView, partialTicks, Baritone.settings().colorNextPath.value, Baritone.settings().fadePath.value, 10, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
//long split = System.nanoTime();
|
//long split = System.nanoTime();
|
||||||
if (current != null) {
|
|
||||||
drawManySelectionBoxes(renderView, current.toBreak(), Baritone.settings().colorBlocksToBreak.get());
|
|
||||||
drawManySelectionBoxes(renderView, current.toPlace(), Baritone.settings().colorBlocksToPlace.get());
|
|
||||||
drawManySelectionBoxes(renderView, current.toWalkInto(), Baritone.settings().colorBlocksToWalkInto.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is a path calculation currently running, render the path calculation process
|
// If there is a path calculation currently running, render the path calculation process
|
||||||
behavior.getInProgress().ifPresent(currentlyRunning -> {
|
behavior.getInProgress().ifPresent(currentlyRunning -> {
|
||||||
currentlyRunning.bestPathSoFar().ifPresent(p -> {
|
currentlyRunning.bestPathSoFar().ifPresent(p -> {
|
||||||
drawPath(p, 0, renderView, partialTicks, Baritone.settings().colorBestPathSoFar.get(), Baritone.settings().fadePath.get(), 10, 20);
|
drawPath(p, 0, renderView, partialTicks, Baritone.settings().colorBestPathSoFar.value, Baritone.settings().fadePath.value, 10, 20);
|
||||||
});
|
});
|
||||||
currentlyRunning.pathToMostRecentNodeConsidered().ifPresent(mr -> {
|
currentlyRunning.pathToMostRecentNodeConsidered().ifPresent(mr -> {
|
||||||
|
|
||||||
drawPath(mr, 0, renderView, partialTicks, Baritone.settings().colorMostRecentConsidered.get(), Baritone.settings().fadePath.get(), 10, 20);
|
drawPath(mr, 0, renderView, partialTicks, Baritone.settings().colorMostRecentConsidered.value, Baritone.settings().fadePath.value, 10, 20);
|
||||||
drawManySelectionBoxes(renderView, Collections.singletonList(mr.getDest()), Baritone.settings().colorMostRecentConsidered.get());
|
drawManySelectionBoxes(renderView, Collections.singletonList(mr.getDest()), Baritone.settings().colorMostRecentConsidered.value);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
//long end = System.nanoTime();
|
//long end = System.nanoTime();
|
||||||
@@ -130,13 +133,13 @@ public final class PathRenderer implements Helper {
|
|||||||
|
|
||||||
public static void drawPath(IPath path, int startIndex, Entity player, float partialTicks, Color color, boolean fadeOut, int fadeStart0, int fadeEnd0) {
|
public static void drawPath(IPath path, int startIndex, Entity player, float partialTicks, Color color, boolean fadeOut, int fadeStart0, int fadeEnd0) {
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
GlStateManager.color(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.4F);
|
GlStateManager.color4f(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.4F);
|
||||||
GlStateManager.glLineWidth(Baritone.settings().pathRenderLineWidthPixels.get());
|
GlStateManager.lineWidth(Baritone.settings().pathRenderLineWidthPixels.value);
|
||||||
GlStateManager.disableTexture2D();
|
GlStateManager.disableTexture2D();
|
||||||
GlStateManager.depthMask(false);
|
GlStateManager.depthMask(false);
|
||||||
if (Baritone.settings().renderPathIgnoreDepth.get()) {
|
if (Baritone.settings().renderPathIgnoreDepth.value) {
|
||||||
GlStateManager.disableDepth();
|
GlStateManager.disableDepthTest();
|
||||||
}
|
}
|
||||||
List<BetterBlockPos> positions = path.positions();
|
List<BetterBlockPos> positions = path.positions();
|
||||||
int next;
|
int next;
|
||||||
@@ -173,13 +176,13 @@ public final class PathRenderer implements Helper {
|
|||||||
}
|
}
|
||||||
alpha = 0.4F * (1.0F - (float) (i - fadeStart) / (float) (fadeEnd - fadeStart));
|
alpha = 0.4F * (1.0F - (float) (i - fadeStart) / (float) (fadeEnd - fadeStart));
|
||||||
}
|
}
|
||||||
GlStateManager.color(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], alpha);
|
GlStateManager.color4f(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], alpha);
|
||||||
}
|
}
|
||||||
drawLine(player, x1, y1, z1, x2, y2, z2);
|
drawLine(x1, y1, z1, x2, y2, z2);
|
||||||
tessellator.draw();
|
tessellator.draw();
|
||||||
}
|
}
|
||||||
if (Baritone.settings().renderPathIgnoreDepth.get()) {
|
if (Baritone.settings().renderPathIgnoreDepth.value) {
|
||||||
GlStateManager.enableDepth();
|
GlStateManager.enableDepthTest();
|
||||||
}
|
}
|
||||||
//GlStateManager.color(0.0f, 0.0f, 0.0f, 0.4f);
|
//GlStateManager.color(0.0f, 0.0f, 0.0f, 0.4f);
|
||||||
GlStateManager.depthMask(true);
|
GlStateManager.depthMask(true);
|
||||||
@@ -187,7 +190,7 @@ public final class PathRenderer implements Helper {
|
|||||||
GlStateManager.disableBlend();
|
GlStateManager.disableBlend();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void drawLine(Entity player, double bp1x, double bp1y, double bp1z, double bp2x, double bp2y, double bp2z) {
|
public static void drawLine(double bp1x, double bp1y, double bp1z, double bp2x, double bp2y, double bp2z) {
|
||||||
double d0 = mc.getRenderManager().viewerPosX;
|
double d0 = mc.getRenderManager().viewerPosX;
|
||||||
double d1 = mc.getRenderManager().viewerPosY;
|
double d1 = mc.getRenderManager().viewerPosY;
|
||||||
double d2 = mc.getRenderManager().viewerPosZ;
|
double d2 = mc.getRenderManager().viewerPosZ;
|
||||||
@@ -201,56 +204,29 @@ public final class PathRenderer implements Helper {
|
|||||||
|
|
||||||
public static void drawManySelectionBoxes(Entity player, Collection<BlockPos> positions, Color color) {
|
public static void drawManySelectionBoxes(Entity player, Collection<BlockPos> positions, Color color) {
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
GlStateManager.color(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.4F);
|
GlStateManager.color4f(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.4F);
|
||||||
GlStateManager.glLineWidth(Baritone.settings().pathRenderLineWidthPixels.get());
|
GlStateManager.lineWidth(Baritone.settings().pathRenderLineWidthPixels.value);
|
||||||
GlStateManager.disableTexture2D();
|
GlStateManager.disableTexture2D();
|
||||||
GlStateManager.depthMask(false);
|
GlStateManager.depthMask(false);
|
||||||
|
|
||||||
if (Baritone.settings().renderSelectionBoxesIgnoreDepth.get()) {
|
if (Baritone.settings().renderSelectionBoxesIgnoreDepth.value) {
|
||||||
GlStateManager.disableDepth();
|
GlStateManager.disableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
float expand = 0.002F;
|
|
||||||
//BlockPos blockpos = movingObjectPositionIn.getBlockPos();
|
//BlockPos blockpos = movingObjectPositionIn.getBlockPos();
|
||||||
BlockStateInterface bsi = new BlockStateInterface(BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext()); // TODO this assumes same dimension between primary baritone and render view? is this safe?
|
BlockStateInterface bsi = new BlockStateInterface(BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext()); // TODO this assumes same dimension between primary baritone and render view? is this safe?
|
||||||
positions.forEach(pos -> {
|
positions.forEach(pos -> {
|
||||||
IBlockState state = bsi.get0(pos);
|
IBlockState state = bsi.get0(pos);
|
||||||
AxisAlignedBB toDraw;
|
VoxelShape shape = state.getShape(player.world, pos);
|
||||||
if (state.getBlock().equals(Blocks.AIR)) {
|
AxisAlignedBB toDraw = shape.isEmpty() ? VoxelShapes.fullCube().getBoundingBox() : shape.getBoundingBox();
|
||||||
toDraw = Blocks.DIRT.getDefaultState().getSelectedBoundingBox(player.world, pos);
|
toDraw = toDraw.offset(pos);
|
||||||
} else {
|
drawAABB(toDraw);
|
||||||
toDraw = state.getSelectedBoundingBox(player.world, pos);
|
|
||||||
}
|
|
||||||
toDraw = toDraw.expand(expand, expand, expand).offset(-mc.getRenderManager().viewerPosX, -mc.getRenderManager().viewerPosY, -mc.getRenderManager().viewerPosZ);
|
|
||||||
BUFFER.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION);
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
|
||||||
TESSELLATOR.draw();
|
|
||||||
BUFFER.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION);
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
|
||||||
TESSELLATOR.draw();
|
|
||||||
BUFFER.begin(GL_LINES, DefaultVertexFormats.POSITION);
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.minZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.maxZ).endVertex();
|
|
||||||
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.maxZ).endVertex();
|
|
||||||
TESSELLATOR.draw();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Baritone.settings().renderSelectionBoxesIgnoreDepth.get()) {
|
if (Baritone.settings().renderSelectionBoxesIgnoreDepth.value) {
|
||||||
GlStateManager.enableDepth();
|
GlStateManager.enableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlStateManager.depthMask(true);
|
GlStateManager.depthMask(true);
|
||||||
@@ -258,6 +234,35 @@ public final class PathRenderer implements Helper {
|
|||||||
GlStateManager.disableBlend();
|
GlStateManager.disableBlend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void drawAABB(AxisAlignedBB aabb) {
|
||||||
|
float expand = 0.002F;
|
||||||
|
AxisAlignedBB toDraw = aabb.expand(expand, expand, expand).offset(-mc.getRenderManager().viewerPosX, -mc.getRenderManager().viewerPosY, -mc.getRenderManager().viewerPosZ);
|
||||||
|
BUFFER.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION);
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
||||||
|
TESSELLATOR.draw();
|
||||||
|
BUFFER.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION);
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
||||||
|
TESSELLATOR.draw();
|
||||||
|
BUFFER.begin(GL_LINES, DefaultVertexFormats.POSITION);
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.minZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.minY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.maxX, toDraw.maxY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.minY, toDraw.maxZ).endVertex();
|
||||||
|
BUFFER.pos(toDraw.minX, toDraw.maxY, toDraw.maxZ).endVertex();
|
||||||
|
TESSELLATOR.draw();
|
||||||
|
}
|
||||||
|
|
||||||
public static void drawDankLitGoalBox(Entity player, Goal goal, float partialTicks, Color color) {
|
public static void drawDankLitGoalBox(Entity player, Goal goal, float partialTicks, Color color) {
|
||||||
double renderPosX = mc.getRenderManager().viewerPosX;
|
double renderPosX = mc.getRenderManager().viewerPosX;
|
||||||
double renderPosY = mc.getRenderManager().viewerPosY;
|
double renderPosY = mc.getRenderManager().viewerPosY;
|
||||||
@@ -292,13 +297,13 @@ public final class PathRenderer implements Helper {
|
|||||||
} else if (goal instanceof GoalXZ) {
|
} else if (goal instanceof GoalXZ) {
|
||||||
GoalXZ goalPos = (GoalXZ) goal;
|
GoalXZ goalPos = (GoalXZ) goal;
|
||||||
|
|
||||||
if (Baritone.settings().renderGoalXZBeacon.get()) {
|
if (Baritone.settings().renderGoalXZBeacon.value) {
|
||||||
glPushAttrib(GL_LIGHTING_BIT);
|
glPushAttrib(GL_LIGHTING_BIT);
|
||||||
|
|
||||||
mc.getTextureManager().bindTexture(TileEntityBeaconRenderer.TEXTURE_BEACON_BEAM);
|
mc.getTextureManager().bindTexture(TEXTURE_BEACON_BEAM);
|
||||||
|
|
||||||
if (Baritone.settings().renderGoalIgnoreDepth.get()) {
|
if (Baritone.settings().renderGoalIgnoreDepth.value) {
|
||||||
GlStateManager.disableDepth();
|
GlStateManager.disableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
TileEntityBeaconRenderer.renderBeamSegment(
|
TileEntityBeaconRenderer.renderBeamSegment(
|
||||||
@@ -307,14 +312,18 @@ public final class PathRenderer implements Helper {
|
|||||||
goalPos.getZ() - renderPosZ,
|
goalPos.getZ() - renderPosZ,
|
||||||
partialTicks,
|
partialTicks,
|
||||||
1.0,
|
1.0,
|
||||||
player.world.getTotalWorldTime(),
|
player.world.getGameTime(),
|
||||||
0,
|
0,
|
||||||
256,
|
256,
|
||||||
color.getColorComponents(null)
|
color.getColorComponents(null),
|
||||||
|
|
||||||
|
// Arguments filled by the private method lol
|
||||||
|
0.2D,
|
||||||
|
0.25D
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Baritone.settings().renderGoalIgnoreDepth.get()) {
|
if (Baritone.settings().renderGoalIgnoreDepth.value) {
|
||||||
GlStateManager.enableDepth();
|
GlStateManager.enableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
@@ -340,13 +349,13 @@ public final class PathRenderer implements Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
|
GlStateManager.blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
|
||||||
GlStateManager.color(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.6F);
|
GlStateManager.color4f(color.getColorComponents(null)[0], color.getColorComponents(null)[1], color.getColorComponents(null)[2], 0.6F);
|
||||||
GlStateManager.glLineWidth(Baritone.settings().goalRenderLineWidthPixels.get());
|
GlStateManager.lineWidth(Baritone.settings().goalRenderLineWidthPixels.value);
|
||||||
GlStateManager.disableTexture2D();
|
GlStateManager.disableTexture2D();
|
||||||
GlStateManager.depthMask(false);
|
GlStateManager.depthMask(false);
|
||||||
if (Baritone.settings().renderGoalIgnoreDepth.get()) {
|
if (Baritone.settings().renderGoalIgnoreDepth.value) {
|
||||||
GlStateManager.disableDepth();
|
GlStateManager.disableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
renderHorizontalQuad(minX, maxX, minZ, maxZ, y1);
|
renderHorizontalQuad(minX, maxX, minZ, maxZ, y1);
|
||||||
@@ -363,8 +372,8 @@ public final class PathRenderer implements Helper {
|
|||||||
BUFFER.pos(minX, maxY, maxZ).endVertex();
|
BUFFER.pos(minX, maxY, maxZ).endVertex();
|
||||||
TESSELLATOR.draw();
|
TESSELLATOR.draw();
|
||||||
|
|
||||||
if (Baritone.settings().renderGoalIgnoreDepth.get()) {
|
if (Baritone.settings().renderGoalIgnoreDepth.value) {
|
||||||
GlStateManager.enableDepth();
|
GlStateManager.enableDepthTest();
|
||||||
}
|
}
|
||||||
GlStateManager.depthMask(true);
|
GlStateManager.depthMask(true);
|
||||||
GlStateManager.enableTexture2D();
|
GlStateManager.enableTexture2D();
|
||||||
|
|||||||
+13
-10
@@ -15,15 +15,18 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.gradle.util;
|
package baritone.utils;
|
||||||
|
|
||||||
/**
|
import baritone.api.pathing.goals.Goal;
|
||||||
* All credits go to AsmLibGradle and its contributors.
|
import baritone.api.process.PathingCommand;
|
||||||
*
|
import baritone.api.process.PathingCommandType;
|
||||||
* @see <a href="https://github.com/pozzed/AsmLibGradle/blob/8f917dbc3939eab7a3d9daf54d9d285fdf34f4b2/src/main/java/net/futureclient/asmlib/forgegradle/MappingType.java">Original Source</a>
|
import baritone.pathing.movement.CalculationContext;
|
||||||
*/
|
|
||||||
public enum MappingType {
|
public class PathingCommandContext extends PathingCommand {
|
||||||
SEARGE,
|
public final CalculationContext desiredCalcContext;
|
||||||
NOTCH,
|
|
||||||
CUSTOM // forgegradle
|
public PathingCommandContext(Goal goal, PathingCommandType commandType, CalculationContext context) {
|
||||||
|
super(goal, commandType);
|
||||||
|
this.desiredCalcContext = context;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -24,16 +24,17 @@ import baritone.api.pathing.calc.IPathingControlManager;
|
|||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.process.IBaritoneProcess;
|
import baritone.api.process.IBaritoneProcess;
|
||||||
import baritone.api.process.PathingCommand;
|
import baritone.api.process.PathingCommand;
|
||||||
|
import baritone.api.process.PathingCommandType;
|
||||||
import baritone.behavior.PathingBehavior;
|
import baritone.behavior.PathingBehavior;
|
||||||
import baritone.pathing.path.PathExecutor;
|
import baritone.pathing.path.PathExecutor;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class PathingControlManager implements IPathingControlManager {
|
public class PathingControlManager implements IPathingControlManager {
|
||||||
private final Baritone baritone;
|
private final Baritone baritone;
|
||||||
private final HashSet<IBaritoneProcess> processes; // unGh
|
private final HashSet<IBaritoneProcess> processes; // unGh
|
||||||
|
private final List<IBaritoneProcess> active;
|
||||||
private IBaritoneProcess inControlLastTick;
|
private IBaritoneProcess inControlLastTick;
|
||||||
private IBaritoneProcess inControlThisTick;
|
private IBaritoneProcess inControlThisTick;
|
||||||
private PathingCommand command;
|
private PathingCommand command;
|
||||||
@@ -41,13 +42,13 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
public PathingControlManager(Baritone baritone) {
|
public PathingControlManager(Baritone baritone) {
|
||||||
this.baritone = baritone;
|
this.baritone = baritone;
|
||||||
this.processes = new HashSet<>();
|
this.processes = new HashSet<>();
|
||||||
|
this.active = new ArrayList<>();
|
||||||
baritone.getGameEventHandler().registerEventListener(new AbstractGameEventListener() { // needs to be after all behavior ticks
|
baritone.getGameEventHandler().registerEventListener(new AbstractGameEventListener() { // needs to be after all behavior ticks
|
||||||
@Override
|
@Override
|
||||||
public void onTick(TickEvent event) {
|
public void onTick(TickEvent event) {
|
||||||
if (event.getType() == TickEvent.Type.OUT) {
|
if (event.getType() == TickEvent.Type.IN) {
|
||||||
return;
|
postTick();
|
||||||
}
|
}
|
||||||
postTick();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -62,6 +63,7 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
inControlLastTick = null;
|
inControlLastTick = null;
|
||||||
inControlThisTick = null;
|
inControlThisTick = null;
|
||||||
command = null;
|
command = null;
|
||||||
|
active.clear();
|
||||||
for (IBaritoneProcess proc : processes) {
|
for (IBaritoneProcess proc : processes) {
|
||||||
proc.onLostControl();
|
proc.onLostControl();
|
||||||
if (proc.isActive() && !proc.isTemporary()) { // it's okay only for a temporary thing (like combat pause) to maintain control even if you say to cancel
|
if (proc.isActive() && !proc.isTemporary()) { // it's okay only for a temporary thing (like combat pause) to maintain control even if you say to cancel
|
||||||
@@ -87,8 +89,14 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
command = executeProcesses();
|
command = executeProcesses();
|
||||||
if (command == null) {
|
if (command == null) {
|
||||||
p.cancelSegmentIfSafe();
|
p.cancelSegmentIfSafe();
|
||||||
|
p.secretInternalSetGoal(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (inControlThisTick != inControlLastTick && command.commandType != PathingCommandType.REQUEST_PAUSE) {
|
||||||
|
// if control has changed, and the new process wants to do something
|
||||||
|
p.cancelSegmentIfSafe();
|
||||||
|
// get rid of the in progress stuff from the last process
|
||||||
|
}
|
||||||
switch (command.commandType) {
|
switch (command.commandType) {
|
||||||
case REQUEST_PAUSE:
|
case REQUEST_PAUSE:
|
||||||
p.requestPause();
|
p.requestPause();
|
||||||
@@ -99,18 +107,18 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
break;
|
break;
|
||||||
case FORCE_REVALIDATE_GOAL_AND_PATH:
|
case FORCE_REVALIDATE_GOAL_AND_PATH:
|
||||||
if (!p.isPathing() && !p.getInProgress().isPresent()) {
|
if (!p.isPathing() && !p.getInProgress().isPresent()) {
|
||||||
p.secretInternalSetGoalAndPath(command.goal);
|
p.secretInternalSetGoalAndPath(command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REVALIDATE_GOAL_AND_PATH:
|
case REVALIDATE_GOAL_AND_PATH:
|
||||||
if (!p.isPathing() && !p.getInProgress().isPresent()) {
|
if (!p.isPathing() && !p.getInProgress().isPresent()) {
|
||||||
p.secretInternalSetGoalAndPath(command.goal);
|
p.secretInternalSetGoalAndPath(command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SET_GOAL_AND_PATH:
|
case SET_GOAL_AND_PATH:
|
||||||
// now this i can do
|
// now this i can do
|
||||||
if (command.goal != null) {
|
if (command.goal != null) {
|
||||||
baritone.getPathingBehavior().secretInternalSetGoalAndPath(command.goal);
|
baritone.getPathingBehavior().secretInternalSetGoalAndPath(command);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -133,13 +141,13 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
// pwnage
|
// pwnage
|
||||||
p.softCancelIfSafe();
|
p.softCancelIfSafe();
|
||||||
}
|
}
|
||||||
p.secretInternalSetGoalAndPath(command.goal);
|
p.secretInternalSetGoalAndPath(command);
|
||||||
break;
|
break;
|
||||||
case REVALIDATE_GOAL_AND_PATH:
|
case REVALIDATE_GOAL_AND_PATH:
|
||||||
if (Baritone.settings().cancelOnGoalInvalidation.get() && (command.goal == null || revalidateGoal(command.goal))) {
|
if (Baritone.settings().cancelOnGoalInvalidation.value && (command.goal == null || revalidateGoal(command.goal))) {
|
||||||
p.softCancelIfSafe();
|
p.softCancelIfSafe();
|
||||||
}
|
}
|
||||||
p.secretInternalSetGoalAndPath(command.goal);
|
p.secretInternalSetGoalAndPath(command);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
@@ -172,12 +180,20 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
|
|
||||||
|
|
||||||
public PathingCommand executeProcesses() {
|
public PathingCommand executeProcesses() {
|
||||||
Stream<IBaritoneProcess> inContention = processes.stream()
|
for (IBaritoneProcess process : processes) {
|
||||||
.filter(IBaritoneProcess::isActive)
|
if (process.isActive()) {
|
||||||
.sorted(Comparator.comparingDouble(IBaritoneProcess::priority).reversed());
|
if (!active.contains(process)) {
|
||||||
|
// put a newly active process at the very front of the queue
|
||||||
|
active.add(0, process);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
active.remove(process);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ties are broken by which was added to the beginning of the list first
|
||||||
|
active.sort(Comparator.comparingDouble(IBaritoneProcess::priority).reversed());
|
||||||
|
|
||||||
|
Iterator<IBaritoneProcess> iterator = active.iterator();
|
||||||
Iterator<IBaritoneProcess> iterator = inContention.iterator();
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
IBaritoneProcess proc = iterator.next();
|
IBaritoneProcess proc = iterator.next();
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user