From d38ec6da413ab161540e5d8168c1b2dcdb8bec63 Mon Sep 17 00:00:00 2001 From: Watchedfungus88 <135542282+Watchedfungus88@users.noreply.github.com> Date: Mon, 27 Jul 2026 00:23:33 +0300 Subject: [PATCH] Port Baritone to Minecraft 26.2 --- fabric/src/main/resources/fabric.mod.json | 4 +- forge/src/main/resources/META-INF/mods.toml | 2 +- gradle.properties | 6 +- .../resources/META-INF/neoforge.mods.toml | 2 +- src/api/java/baritone/api/Settings.java | 2 +- .../api/command/manager/ICommandManager.java | 6 +- .../baritone/api/utils/gui/BaritoneToast.java | 2 +- .../mixins/MixinFireworkRocketEntity.java | 4 +- .../launch/mixins/MixinMinecraft.java | 26 ++---- .../launch/mixins/MixinRenderPipelines.java | 6 +- .../launch/mixins/MixinWorldRenderer.java | 20 +++-- src/main/java/baritone/Baritone.java | 2 +- src/main/java/baritone/cache/CachedChunk.java | 64 +++++++------- .../java/baritone/cache/WorldProvider.java | 10 +-- .../command/ExampleBaritoneControl.java | 16 ++-- .../command/defaults/RenderCommand.java | 12 +-- .../command/manager/CommandManager.java | 24 +++--- .../baritone/pathing/path/PathExecutor.java | 24 +++--- .../java/baritone/process/BuilderProcess.java | 26 +++--- .../java/baritone/process/ElytraProcess.java | 4 +- .../process/elytra/ElytraBehavior.java | 2 +- src/main/java/baritone/utils/IRenderer.java | 86 ++++++++++++------- .../java/baritone/utils/PathRenderer.java | 4 +- .../utils/accessor/IRenderPipelines.java | 2 +- .../litematica/LitematicaHelper.java | 6 +- .../schematica/SchematicaHelper.java | 6 +- 26 files changed, 190 insertions(+), 178 deletions(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f73d2ffec2..1cb1819059 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,8 +24,8 @@ "mixins.baritone-meteor.json" ], "depends": { - "fabricloader": ">=0.18.6", - "minecraft": ["26.1", "26.1.1", "26.1.2"] + "fabricloader": ">=0.19.3", + "minecraft": "26.2" }, "custom": { "modmenu": { diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 6c0b4d6bd9..5328e7bbf4 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -35,6 +35,6 @@ A Minecraft pathfinder bot. modId="minecraft" mandatory=true # This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange="[26.1]" +versionRange="[26.2]" ordering="NONE" side="BOTH" diff --git a/gradle.properties b/gradle.properties index 31eb0e45ae..e3a17a9dc3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,19 +2,19 @@ org.gradle.jvmargs=-Xmx4G available_loaders=fabric -mod_version=26.1-SNAPSHOT +mod_version=26.2-SNAPSHOT maven_group=baritone archives_base_name=baritone java_version=25 -minecraft_version=26.1 +minecraft_version=26.2 forge_version=62.0.9 neoforge_version=19-beta -fabric_version=0.18.6 +fabric_version=0.19.3 nether_pathfinder_version=1.4.1 diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 180be727f9..4eec7768ea 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -35,7 +35,7 @@ A Minecraft pathfinder bot. modId="minecraft" type="required" # This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange="[26.1]" +versionRange="[26.2]" ordering="NONE" side="BOTH" diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index 4bc7052af9..7cb0aa996a 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -1278,7 +1278,7 @@ public final class Settings { public final Setting> logger = new Setting<>((msg) -> { try { final GuiMessageTag tag = useMessageTag.value ? Helper.MESSAGE_TAG : null; - final ChatComponent chat = Minecraft.getInstance().gui.getChat(); + final ChatComponent chat = Minecraft.getInstance().gui.hud.getChat(); if (tag != null) { chat.addPlayerMessage(msg, new MessageSignature(new byte[MessageSignature.BYTES]), tag); } else { diff --git a/src/api/java/baritone/api/command/manager/ICommandManager.java b/src/api/java/baritone/api/command/manager/ICommandManager.java index 3f2d81f244..1430d2538e 100644 --- a/src/api/java/baritone/api/command/manager/ICommandManager.java +++ b/src/api/java/baritone/api/command/manager/ICommandManager.java @@ -21,7 +21,7 @@ import baritone.api.command.ICommand; import baritone.api.command.argument.ICommandArgument; import baritone.api.command.registry.Registry; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import java.util.List; import java.util.stream.Stream; @@ -44,9 +44,9 @@ public interface ICommandManager { boolean execute(String string); - boolean execute(Tuple> expanded); + boolean execute(Pair> expanded); - Stream tabComplete(Tuple> expanded); + Stream tabComplete(Pair> expanded); Stream tabComplete(String prefix); } diff --git a/src/api/java/baritone/api/utils/gui/BaritoneToast.java b/src/api/java/baritone/api/utils/gui/BaritoneToast.java index effa0b8046..25e1318c99 100644 --- a/src/api/java/baritone/api/utils/gui/BaritoneToast.java +++ b/src/api/java/baritone/api/utils/gui/BaritoneToast.java @@ -24,6 +24,6 @@ public class BaritoneToast { private static final SystemToast.SystemToastId BARITONE_TOAST_ID = new SystemToast.SystemToastId(5000L); public static void addOrUpdate(Component title, Component subtitle) { - SystemToast.addOrUpdate(Minecraft.getInstance().getToastManager(), BARITONE_TOAST_ID, title, subtitle); + SystemToast.addOrUpdate(Minecraft.getInstance().gui.toastManager(), BARITONE_TOAST_ID, title, subtitle); } } diff --git a/src/launch/java/baritone/launch/mixins/MixinFireworkRocketEntity.java b/src/launch/java/baritone/launch/mixins/MixinFireworkRocketEntity.java index b4c8e05b67..17321cca30 100644 --- a/src/launch/java/baritone/launch/mixins/MixinFireworkRocketEntity.java +++ b/src/launch/java/baritone/launch/mixins/MixinFireworkRocketEntity.java @@ -20,7 +20,7 @@ import baritone.utils.accessor.IFireworkRocketEntity; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.level.Level; @@ -44,7 +44,7 @@ public abstract class MixinFireworkRocketEntity extends Entity implements IFirew public abstract boolean isAttachedToEntity(); private MixinFireworkRocketEntity(Level level) { - super(EntityType.FIREWORK_ROCKET, level); + super(EntityTypes.FIREWORK_ROCKET, level); } @Override diff --git a/src/launch/java/baritone/launch/mixins/MixinMinecraft.java b/src/launch/java/baritone/launch/mixins/MixinMinecraft.java index 7a1c16c526..5f05dc1fa9 100644 --- a/src/launch/java/baritone/launch/mixins/MixinMinecraft.java +++ b/src/launch/java/baritone/launch/mixins/MixinMinecraft.java @@ -24,10 +24,10 @@ import baritone.api.event.events.WorldEvent; import baritone.api.event.events.type.EventState; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -65,18 +65,9 @@ private void postInit(CallbackInfo ci) { @Inject( method = "tick", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "net/minecraft/client/Minecraft.screen:Lnet/minecraft/client/gui/screens/Screen;", - ordinal = 0, + value = "INVOKE", + target = "Lnet/minecraft/client/gui/Gui;overlay()Lnet/minecraft/client/gui/screens/Overlay;", shift = At.Shift.BEFORE - ), - slice = @Slice( - from = @At( - value = "FIELD", - opcode = Opcodes.PUTFIELD, - target = "net/minecraft/client/Minecraft.missTime:I" - ) ) ) private void runTick(CallbackInfo ci) { @@ -165,14 +156,13 @@ private void postLoadWorld(final ClientLevel world, final CallbackInfo ci) { @Redirect( method = "tick", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/client/Minecraft;screen:Lnet/minecraft/client/gui/screens/Screen;" + value = "INVOKE", + target = "Lnet/minecraft/client/gui/Gui;screen()Lnet/minecraft/client/gui/screens/Screen;" ), slice = @Slice( from = @At( value = "INVOKE", - target = "Lnet/minecraft/client/gui/components/DebugScreenOverlay;showDebugScreen()Z" + target = "Lnet/minecraft/client/gui/Gui;overlay()Lnet/minecraft/client/gui/screens/Overlay;" ), to = @At( value = "CONSTANT", @@ -180,12 +170,12 @@ private void postLoadWorld(final ClientLevel world, final CallbackInfo ci) { ) ) ) - private Screen passEvents(Minecraft instance) { + private Screen passEvents(Gui instance) { // allow user input is only the primary baritone if (BaritoneAPI.getProvider().getPrimaryBaritone().getPathingBehavior().isPathing() && player != null) { return null; } - return instance.screen; + return instance.screen(); } // TODO diff --git a/src/launch/java/baritone/launch/mixins/MixinRenderPipelines.java b/src/launch/java/baritone/launch/mixins/MixinRenderPipelines.java index f5a8a6e97e..34366bccf4 100644 --- a/src/launch/java/baritone/launch/mixins/MixinRenderPipelines.java +++ b/src/launch/java/baritone/launch/mixins/MixinRenderPipelines.java @@ -30,7 +30,7 @@ public class MixinRenderPipelines implements IRenderPipelines { private static RenderPipeline.Snippet LINES_SNIPPET; @Final @Shadow - private static RenderPipeline.Snippet MATRICES_FOG_SNIPPET; + private static RenderPipeline.Snippet BEACON_BEAM_SNIPPET; @Shadow private static RenderPipeline register(final RenderPipeline renderPipeline) { return null; } @@ -40,8 +40,8 @@ public RenderPipeline.Snippet getLinesSnippet() { } @Override - public RenderPipeline.Snippet getMatricesFogSnippet() { - return MATRICES_FOG_SNIPPET; + public RenderPipeline.Snippet getBeaconBeamSnippet() { + return BEACON_BEAM_SNIPPET; } @Override diff --git a/src/launch/java/baritone/launch/mixins/MixinWorldRenderer.java b/src/launch/java/baritone/launch/mixins/MixinWorldRenderer.java index 0218f7f451..3d54b4488a 100644 --- a/src/launch/java/baritone/launch/mixins/MixinWorldRenderer.java +++ b/src/launch/java/baritone/launch/mixins/MixinWorldRenderer.java @@ -20,12 +20,12 @@ import baritone.api.BaritoneAPI; import baritone.api.IBaritone; import baritone.api.event.events.RenderEvent; +import baritone.utils.IRenderer; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import net.minecraft.client.renderer.state.level.CameraRenderState; import org.joml.Matrix4f; import org.joml.Matrix4fc; @@ -43,15 +43,19 @@ public class MixinWorldRenderer { @Inject( - method = "renderLevel", + method = "render", at = @At("RETURN") ) - private void onStartHand(final GraphicsResourceAllocator graphicsResourceAllocator, final DeltaTracker deltaTracker, final boolean bl, final CameraRenderState cameraRenderState, final Matrix4fc worldMatrix, final GpuBufferSlice gpuBufferSlice, final Vector4f vector4f, final boolean bl2, final ChunkSectionsToRender chunkSectionsToRender, final CallbackInfo ci) { - for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) { - PoseStack poseStack = new PoseStack(); - poseStack.mulPose(worldMatrix); - Matrix4f projection = new Matrix4f(cameraRenderState.projectionMatrix); - ibaritone.getGameEventHandler().onRenderPass(new RenderEvent(deltaTracker.getGameTimeDeltaPartialTick(false), poseStack, projection)); + private void onStartHand(final GraphicsResourceAllocator graphicsResourceAllocator, final DeltaTracker deltaTracker, final boolean bl, final CameraRenderState cameraRenderState, final Matrix4fc worldMatrix, final GpuBufferSlice gpuBufferSlice, final Vector4f vector4f, final boolean bl2, final CallbackInfo ci) { + try { + for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) { + PoseStack poseStack = new PoseStack(); + poseStack.mulPose(worldMatrix); + Matrix4f projection = new Matrix4f(cameraRenderState.projectionMatrix); + ibaritone.getGameEventHandler().onRenderPass(new RenderEvent(deltaTracker.getGameTimeDeltaPartialTick(false), poseStack, projection)); + } + } finally { + IRenderer.endFrame(); } } } diff --git a/src/main/java/baritone/Baritone.java b/src/main/java/baritone/Baritone.java index ad68714137..53f2bd3e0a 100755 --- a/src/main/java/baritone/Baritone.java +++ b/src/main/java/baritone/Baritone.java @@ -245,7 +245,7 @@ public void openClick() { new Thread(() -> { try { Thread.sleep(100); - mc.execute(() -> mc.setScreen(new GuiClick())); + mc.execute(() -> mc.gui.setScreen(new GuiClick())); } catch (Exception ignored) {} }).start(); } diff --git a/src/main/java/baritone/cache/CachedChunk.java b/src/main/java/baritone/cache/CachedChunk.java index 86a849e5a6..de0b6404c7 100644 --- a/src/main/java/baritone/cache/CachedChunk.java +++ b/src/main/java/baritone/cache/CachedChunk.java @@ -50,22 +50,22 @@ public final class CachedChunk { Blocks.SPAWNER, Blocks.BARRIER, Blocks.OBSERVER, - Blocks.WHITE_SHULKER_BOX, - Blocks.ORANGE_SHULKER_BOX, - Blocks.MAGENTA_SHULKER_BOX, - Blocks.LIGHT_BLUE_SHULKER_BOX, - Blocks.YELLOW_SHULKER_BOX, - Blocks.LIME_SHULKER_BOX, - Blocks.PINK_SHULKER_BOX, - Blocks.GRAY_SHULKER_BOX, - Blocks.LIGHT_GRAY_SHULKER_BOX, - Blocks.CYAN_SHULKER_BOX, - Blocks.PURPLE_SHULKER_BOX, - Blocks.BLUE_SHULKER_BOX, - Blocks.BROWN_SHULKER_BOX, - Blocks.GREEN_SHULKER_BOX, - Blocks.RED_SHULKER_BOX, - Blocks.BLACK_SHULKER_BOX, + Blocks.DYED_SHULKER_BOX.white(), + Blocks.DYED_SHULKER_BOX.orange(), + Blocks.DYED_SHULKER_BOX.magenta(), + Blocks.DYED_SHULKER_BOX.lightBlue(), + Blocks.DYED_SHULKER_BOX.yellow(), + Blocks.DYED_SHULKER_BOX.lime(), + Blocks.DYED_SHULKER_BOX.pink(), + Blocks.DYED_SHULKER_BOX.gray(), + Blocks.DYED_SHULKER_BOX.lightGray(), + Blocks.DYED_SHULKER_BOX.cyan(), + Blocks.DYED_SHULKER_BOX.purple(), + Blocks.DYED_SHULKER_BOX.blue(), + Blocks.DYED_SHULKER_BOX.brown(), + Blocks.DYED_SHULKER_BOX.green(), + Blocks.DYED_SHULKER_BOX.red(), + Blocks.DYED_SHULKER_BOX.black(), Blocks.NETHER_PORTAL, Blocks.HOPPER, Blocks.BEACON, @@ -87,22 +87,22 @@ public final class CachedChunk { Blocks.WITHER_SKELETON_WALL_SKULL, Blocks.ENCHANTING_TABLE, Blocks.ANVIL, - Blocks.WHITE_BED, - Blocks.ORANGE_BED, - Blocks.MAGENTA_BED, - Blocks.LIGHT_BLUE_BED, - Blocks.YELLOW_BED, - Blocks.LIME_BED, - Blocks.PINK_BED, - Blocks.GRAY_BED, - Blocks.LIGHT_GRAY_BED, - Blocks.CYAN_BED, - Blocks.PURPLE_BED, - Blocks.BLUE_BED, - Blocks.BROWN_BED, - Blocks.GREEN_BED, - Blocks.RED_BED, - Blocks.BLACK_BED, + Blocks.BED.white(), + Blocks.BED.orange(), + Blocks.BED.magenta(), + Blocks.BED.lightBlue(), + Blocks.BED.yellow(), + Blocks.BED.lime(), + Blocks.BED.pink(), + Blocks.BED.gray(), + Blocks.BED.lightGray(), + Blocks.BED.cyan(), + Blocks.BED.purple(), + Blocks.BED.blue(), + Blocks.BED.brown(), + Blocks.BED.green(), + Blocks.BED.red(), + Blocks.BED.black(), Blocks.DRAGON_EGG, Blocks.JUKEBOX, Blocks.END_GATEWAY, diff --git a/src/main/java/baritone/cache/WorldProvider.java b/src/main/java/baritone/cache/WorldProvider.java index f503a07990..d6321e8ace 100644 --- a/src/main/java/baritone/cache/WorldProvider.java +++ b/src/main/java/baritone/cache/WorldProvider.java @@ -22,7 +22,7 @@ import baritone.api.utils.IPlayerContext; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.resources.Identifier; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.LevelResource; import org.apache.commons.lang3.SystemUtils; @@ -71,8 +71,8 @@ public final WorldData getCurrentWorld() { */ public final void initWorld(Level world) { this.getSaveDirectories(world).ifPresent(dirs -> { - final Path worldDir = dirs.getA(); - final Path readmeDir = dirs.getB(); + final Path worldDir = dirs.first(); + final Path readmeDir = dirs.second(); try { // lol wtf is this baritone folder in my minecraft save? @@ -119,7 +119,7 @@ private Path getWorldDataDirectory(Path parent, Level world) { * @return An {@link Optional} containing the world's baritone dir and readme dir, or {@link Optional#empty()} if * the world isn't valid for caching. */ - private Optional> getSaveDirectories(Level world) { + private Optional> getSaveDirectories(Level world) { Path worldDir; Path readmeDir; @@ -156,7 +156,7 @@ private Optional> getSaveDirectories(Level world) { readmeDir = baritone.getDirectory(); } - return Optional.of(new Tuple<>(worldDir, readmeDir)); + return Optional.of(new Pair<>(worldDir, readmeDir)); } /** diff --git a/src/main/java/baritone/command/ExampleBaritoneControl.java b/src/main/java/baritone/command/ExampleBaritoneControl.java index bb9681e97d..67ce324dd2 100644 --- a/src/main/java/baritone/command/ExampleBaritoneControl.java +++ b/src/main/java/baritone/command/ExampleBaritoneControl.java @@ -38,7 +38,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import net.minecraft.util.Util; import java.util.List; @@ -66,7 +66,7 @@ public void onSendChatMessage(ChatEvent event) { event.cancel(); String commandStr = msg.substring(forceRun ? FORCE_COMMAND_PREFIX.length() : prefix.length()); if (!runCommand(commandStr) && !commandStr.trim().isEmpty()) { - new CommandNotFoundException(CommandManager.expand(commandStr).getA()).handle(null, null); + new CommandNotFoundException(CommandManager.expand(commandStr).first()).handle(null, null); } } else if ((settings.chatControl.value || settings.chatControlAnyway.value) && runCommand(msg)) { event.cancel(); @@ -103,10 +103,10 @@ public boolean runCommand(String msg) { if (msg.isEmpty()) { return this.runCommand("help"); } - Tuple> pair = CommandManager.expand(msg); - String command = pair.getA(); - String rest = msg.substring(pair.getA().length()); - ArgConsumer argc = new ArgConsumer(this.manager, pair.getB()); + Pair> pair = CommandManager.expand(msg); + String command = pair.first(); + String rest = msg.substring(pair.first().length()); + ArgConsumer argc = new ArgConsumer(this.manager, pair.second()); if (!argc.hasAny()) { Settings.Setting setting = settings.byLowerName.get(command.toLowerCase(Locale.US)); if (setting != null) { @@ -123,7 +123,7 @@ public boolean runCommand(String msg) { if (setting.isJavaOnly()) { continue; } - if (setting.getName().equalsIgnoreCase(pair.getA())) { + if (setting.getName().equalsIgnoreCase(pair.first())) { logRanCommand(command, rest); try { this.manager.execute(String.format("set %s %s", setting.getName(), argc.getString())); @@ -134,7 +134,7 @@ public boolean runCommand(String msg) { } // If the command exists, then handle echoing the input - if (this.manager.getCommand(pair.getA()) != null) { + if (this.manager.getCommand(pair.first()) != null) { logRanCommand(command, rest); } diff --git a/src/main/java/baritone/command/defaults/RenderCommand.java b/src/main/java/baritone/command/defaults/RenderCommand.java index 37d70b42b8..37b261d968 100644 --- a/src/main/java/baritone/command/defaults/RenderCommand.java +++ b/src/main/java/baritone/command/defaults/RenderCommand.java @@ -21,7 +21,6 @@ import baritone.api.command.Command; import baritone.api.command.argument.IArgConsumer; import baritone.api.command.exception.CommandException; -import baritone.api.utils.BetterBlockPos; import java.util.Arrays; import java.util.List; @@ -36,16 +35,7 @@ public RenderCommand(IBaritone baritone) { @Override public void execute(String label, IArgConsumer args) throws CommandException { args.requireMax(0); - BetterBlockPos origin = ctx.playerFeet(); - int renderDistance = (ctx.minecraft().options.renderDistance().get() + 1) * 16; - ctx.minecraft().levelRenderer.setBlocksDirty( - origin.x - renderDistance, - ctx.world().getMinY(), - origin.z - renderDistance, - origin.x + renderDistance, - ctx.world().getMaxY(), - origin.z + renderDistance - ); + ctx.minecraft().levelExtractor.allChanged(); logDirect("Done"); } diff --git a/src/main/java/baritone/command/manager/CommandManager.java b/src/main/java/baritone/command/manager/CommandManager.java index 8712165f14..6586a439e2 100644 --- a/src/main/java/baritone/command/manager/CommandManager.java +++ b/src/main/java/baritone/command/manager/CommandManager.java @@ -30,7 +30,7 @@ import baritone.command.argument.ArgConsumer; import baritone.command.argument.CommandArguments; import baritone.command.defaults.DefaultCommands; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import java.util.List; import java.util.Locale; @@ -79,7 +79,7 @@ public boolean execute(String string) { } @Override - public boolean execute(Tuple> expanded) { + public boolean execute(Pair> expanded) { ExecutionWrapper execution = this.from(expanded); if (execution != null) { execution.execute(); @@ -88,16 +88,16 @@ public boolean execute(Tuple> expanded) { } @Override - public Stream tabComplete(Tuple> expanded) { + public Stream tabComplete(Pair> expanded) { ExecutionWrapper execution = this.from(expanded); return execution == null ? Stream.empty() : execution.tabComplete(); } @Override public Stream tabComplete(String prefix) { - Tuple> pair = expand(prefix, true); - String label = pair.getA(); - List args = pair.getB(); + Pair> pair = expand(prefix, true); + String label = pair.first(); + List args = pair.second(); if (args.isEmpty()) { return new TabCompleteHelper() .addCommands(this.baritone.getCommandManager()) @@ -108,21 +108,21 @@ public Stream tabComplete(String prefix) { } } - private ExecutionWrapper from(Tuple> expanded) { - String label = expanded.getA(); - ArgConsumer args = new ArgConsumer(this, expanded.getB()); + private ExecutionWrapper from(Pair> expanded) { + String label = expanded.first(); + ArgConsumer args = new ArgConsumer(this, expanded.second()); ICommand command = this.getCommand(label); return command == null ? null : new ExecutionWrapper(command, label, args); } - private static Tuple> expand(String string, boolean preserveEmptyLast) { + private static Pair> expand(String string, boolean preserveEmptyLast) { String label = string.split("\\s", 2)[0]; List args = CommandArguments.from(string.substring(label.length()), preserveEmptyLast); - return new Tuple<>(label, args); + return new Pair<>(label, args); } - public static Tuple> expand(String string) { + public static Pair> expand(String string) { return expand(string, false); } diff --git a/src/main/java/baritone/pathing/path/PathExecutor.java b/src/main/java/baritone/pathing/path/PathExecutor.java index 8a5359b5bd..9a3c06ef2c 100644 --- a/src/main/java/baritone/pathing/path/PathExecutor.java +++ b/src/main/java/baritone/pathing/path/PathExecutor.java @@ -34,7 +34,7 @@ import baritone.utils.BlockStateInterface; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import net.minecraft.world.phys.Vec3; import java.util.*; @@ -125,10 +125,10 @@ public boolean onTick() { } } } - Tuple status = closestPathPos(path); + Pair status = closestPathPos(path); if (possiblyOffPath(status, MAX_DIST_FROM_PATH)) { ticksAway++; - System.out.println("FAR AWAY FROM PATH FOR " + ticksAway + " TICKS. Current distance: " + status.getA() + ". Threshold: " + MAX_DIST_FROM_PATH); + System.out.println("FAR AWAY FROM PATH FOR " + ticksAway + " TICKS. Current distance: " + status.first() + ". Threshold: " + MAX_DIST_FROM_PATH); if (ticksAway > MAX_TICKS_AWAY) { logDebug("Too far away from path for too long, cancelling path"); cancel(); @@ -252,7 +252,7 @@ public boolean onTick() { return canCancel; // movement is in progress, but if it reports cancellable, PathingBehavior is good to cut onto the next path } - private Tuple closestPathPos(IPath path) { + private Pair closestPathPos(IPath path) { double best = -1; BlockPos bestPos = null; for (IMovement movement : path.movements()) { @@ -264,7 +264,7 @@ private Tuple closestPathPos(IPath path) { } } } - return new Tuple<>(best, bestPos); + return new Pair<>(best, bestPos); } private boolean shouldPause() { @@ -300,8 +300,8 @@ private boolean shouldPause() { return positions.contains(ctx.playerFeet()); } - private boolean possiblyOffPath(Tuple status, double leniency) { - double distanceFromPath = status.getA(); + private boolean possiblyOffPath(Pair status, double leniency) { + double distanceFromPath = status.first(); 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 if (path.movements().get(pathPosition) instanceof MovementFall) { @@ -451,9 +451,9 @@ private boolean shouldSprintNextTick() { } } if (current instanceof MovementFall) { - Tuple data = overrideFall((MovementFall) current); + Pair data = overrideFall((MovementFall) current); if (data != null) { - BetterBlockPos fallDest = new BetterBlockPos(data.getB()); + BetterBlockPos fallDest = new BetterBlockPos(data.second()); if (!path.positions().contains(fallDest)) { throw new IllegalStateException(String.format( "Fall override at %s %s %s returned illegal destination %s %s %s", @@ -466,7 +466,7 @@ private boolean shouldSprintNextTick() { return true; } clearKeys(); - behavior.baritone.getLookBehavior().updateTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), data.getA(), ctx.playerRotations()), false); + behavior.baritone.getLookBehavior().updateTarget(RotationUtils.calcRotationFromVec3d(ctx.playerHead(), data.first(), ctx.playerRotations()), false); behavior.baritone.getInputOverrideHandler().setInputForceState(Input.MOVE_FORWARD, true); return true; } @@ -474,7 +474,7 @@ private boolean shouldSprintNextTick() { return false; } - private Tuple overrideFall(MovementFall movement) { + private Pair overrideFall(MovementFall movement) { Vec3i dir = movement.getDirection(); if (dir.getY() < -3) { return null; @@ -508,7 +508,7 @@ private Tuple overrideFall(MovementFall movement) { return null; // no valid extension exists } double len = i - pathPosition - 0.4; - return new Tuple<>( + return new Pair<>( new Vec3(flatDir.getX() * len + movement.getDest().x + 0.5, movement.getDest().y, flatDir.getZ() * len + movement.getDest().z + 0.5), movement.getDest().offset(flatDir.getX() * (i - pathPosition), 0, flatDir.getZ() * (i - pathPosition))); } diff --git a/src/main/java/baritone/process/BuilderProcess.java b/src/main/java/baritone/process/BuilderProcess.java index 0bcffc83a0..3ff812bb3c 100644 --- a/src/main/java/baritone/process/BuilderProcess.java +++ b/src/main/java/baritone/process/BuilderProcess.java @@ -46,7 +46,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -203,10 +203,10 @@ private ISchematic applyMapArtAndSelection(Vec3i origin, IStaticSchematic parsed @Override public void buildOpenSchematic() { if (SchematicaHelper.isSchematicaPresent()) { - Optional> schematic = SchematicaHelper.getOpenSchematic(); + Optional> schematic = SchematicaHelper.getOpenSchematic(); if (schematic.isPresent()) { - IStaticSchematic raw = schematic.get().getA(); - BlockPos origin = schematic.get().getB(); + IStaticSchematic raw = schematic.get().first(); + BlockPos origin = schematic.get().second(); ISchematic schem = applyMapArtAndSelection(origin, raw); this.build(raw.toString(), schem, origin); } else { @@ -222,10 +222,10 @@ public void buildOpenLitematic(int i) { if (LitematicaHelper.isLitematicaPresent()) { //if java.lang.NoSuchMethodError is thrown see comment in SchematicPlacementManager if (LitematicaHelper.hasLoadedSchematic(i)) { - Tuple schematic = LitematicaHelper.getSchematic(i); - Vec3i correctedOrigin = schematic.getB(); - ISchematic schematic2 = applyMapArtAndSelection(correctedOrigin, schematic.getA()); - build(schematic.getA().toString(), schematic2, correctedOrigin); + Pair schematic = LitematicaHelper.getSchematic(i); + Vec3i correctedOrigin = schematic.second(); + ISchematic schematic2 = applyMapArtAndSelection(correctedOrigin, schematic.first()); + build(schematic.first().toString(), schematic2, correctedOrigin); } else { logDirect(String.format("List of placements has no entry %s", i + 1)); } @@ -266,7 +266,7 @@ public BlockState placeAt(int x, int y, int z, BlockState current) { return state; } - private Optional> toBreakNearPlayer(BuilderCalculationContext bcc) { + private Optional> toBreakNearPlayer(BuilderCalculationContext bcc) { BetterBlockPos center = ctx.playerFeet(); BetterBlockPos pathStart = baritone.getPathingBehavior().pathStart(); for (int dx = -5; dx <= 5; dx++) { @@ -287,7 +287,7 @@ private Optional> toBreakNearPlayer(BuilderCalcu BetterBlockPos pos = new BetterBlockPos(x, y, z); Optional rot = RotationUtils.reachable(ctx, pos, ctx.playerController().getBlockReachDistance()); if (rot.isPresent()) { - return Optional.of(new Tuple<>(pos, rot.get())); + return Optional.of(new Pair<>(pos, rot.get())); } } } @@ -531,12 +531,12 @@ public int lengthZ() { trim(); } - Optional> toBreak = toBreakNearPlayer(bcc); + Optional> 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(); + Rotation rot = toBreak.get().second(); + BetterBlockPos pos = toBreak.get().first(); baritone.getLookBehavior().updateTarget(rot, true); MovementHelper.switchToBestToolFor(ctx, bcc.get(pos)); if (ctx.player().isCrouching()) { diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index 2c00dd481f..734ad8ee10 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -141,7 +141,7 @@ public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { } if (ctx.player().isFallFlying() && this.state != State.LANDING && (this.behavior.pathManager.isComplete() || safetyLanding)) { final BetterBlockPos last = this.behavior.pathManager.path.getLast(); - if (last != null && (ctx.player().position().distanceToSqr(last.getCenter()) < (48 * 48) || safetyLanding) && (!goingToLandingSpot || (safetyLanding && this.landingSpot == null))) { + if (last != null && (ctx.player().position().distanceToSqr(Vec3.atCenterOf(last)) < (48 * 48) || safetyLanding) && (!goingToLandingSpot || (safetyLanding && this.landingSpot == null))) { logDirect("Path complete, picking a nearby safe landing spot..."); BetterBlockPos landingSpot = findSafeLandingSpot(ctx.playerFeet()); // if this fails we will just keep orbiting the last node until we run out of rockets or the user intervenes @@ -152,7 +152,7 @@ public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { this.goingToLandingSpot = true; } - if (last != null && ctx.player().position().distanceToSqr(last.getCenter()) < 1) { + if (last != null && ctx.player().position().distanceToSqr(Vec3.atCenterOf(last)) < 1) { if (Baritone.settings().notificationOnPathComplete.value && !reachedGoal) { logNotification("Pathing complete", false); } diff --git a/src/main/java/baritone/process/elytra/ElytraBehavior.java b/src/main/java/baritone/process/elytra/ElytraBehavior.java index f4801fa875..2fd2d63518 100644 --- a/src/main/java/baritone/process/elytra/ElytraBehavior.java +++ b/src/main/java/baritone/process/elytra/ElytraBehavior.java @@ -246,7 +246,7 @@ public void pathNextSegment(final int afterIncl) { final Throwable cause = ex.getCause(); if (cause instanceof PathCalculationException) { logDirect("Failed to compute next segment"); - if (ctx.player().distanceToSqr(pathStart.getCenter()) < 16 * 16) { + if (ctx.player().distanceToSqr(Vec3.atCenterOf(pathStart)) < 16 * 16) { logVerbose("Player is near the segment start, therefore repeating this calculation is pointless. Marking as complete"); completePath = true; } diff --git a/src/main/java/baritone/utils/IRenderer.java b/src/main/java/baritone/utils/IRenderer.java index a496292a4e..4009a6e63a 100644 --- a/src/main/java/baritone/utils/IRenderer.java +++ b/src/main/java/baritone/utils/IRenderer.java @@ -22,16 +22,17 @@ import baritone.utils.accessor.IEntityRenderManager; import baritone.utils.accessor.IRenderPipelines; import baritone.utils.accessor.IRenderType; +import com.mojang.blaze3d.PrimitiveTopology; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.ColorTargetState; import com.mojang.blaze3d.pipeline.DepthStencilState; import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.BlendFactor; import com.mojang.blaze3d.platform.CompareOp; -import com.mojang.blaze3d.platform.DestFactor; -import com.mojang.blaze3d.platform.SourceFactor; import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.renderer.StagedVertexBuffer; import net.minecraft.client.renderer.blockentity.BeaconRenderer; import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; @@ -47,14 +48,14 @@ public interface IRenderer { - Tesselator tessellator = Tesselator.getInstance(); + RenderBatch renderBatch = new RenderBatch(); IEntityRenderManager renderManager = (IEntityRenderManager) Minecraft.getInstance().getEntityRenderDispatcher(); Settings settings = BaritoneAPI.getSettings(); BlendFunction BARITONE_LINES_BLEND = new BlendFunction( - SourceFactor.SRC_ALPHA, - DestFactor.ONE_MINUS_SRC_ALPHA, - SourceFactor.ONE, - DestFactor.ZERO + BlendFactor.SRC_ALPHA, + BlendFactor.ONE_MINUS_SRC_ALPHA, + BlendFactor.ONE, + BlendFactor.ZERO ); RenderPipeline.Snippet BARITONE_LINES_SNIPPET = RenderPipeline.builder(((IRenderPipelines) new RenderPipelines()).getLinesSnippet()) @@ -63,12 +64,8 @@ public interface IRenderer { .withCull(false) .buildSnippet(); - RenderPipeline.Snippet BARITONE_BEACON_BEAM_SNIPPET = RenderPipeline.builder(((IRenderPipelines) new RenderPipelines()).getMatricesFogSnippet()) - .withVertexShader("core/rendertype_beacon_beam") - .withFragmentShader("core/rendertype_beacon_beam") - .withSampler("Sampler0") - .withVertexFormat(DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS) - .buildSnippet(); + RenderPipeline.Snippet BARITONE_BEACON_BEAM_SNIPPET = + ((IRenderPipelines) new RenderPipelines()).getBeaconBeamSnippet(); RenderPipeline BEACON_BEAM_OPAQUE = ((IRenderPipelines) new RenderPipelines()).baritone$registerPipeline(RenderPipeline.builder(BARITONE_BEACON_BEAM_SNIPPET) .withLocation("pipeline/baritone_beacon_beam_opaque") @@ -90,7 +87,6 @@ public interface IRenderer { .withLocation("pipelines/baritone_lines_with_depth") .withDepthStencilState(new DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, false)) .build()) - .bufferSize(256) .createRenderSetup() ); RenderType linesNoDepthRenderType = ((IRenderType) RenderTypes.lines()).createRenderType( @@ -99,7 +95,6 @@ public interface IRenderer { .withLocation("pipelines/baritone_lines_no_depth") .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .build()) - .bufferSize(256) .createRenderSetup() ); @@ -125,7 +120,7 @@ static void glColor(Color color, float alpha) { static BufferBuilder startLines(Color color, float alpha) { glColor(color, alpha); - return tessellator.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH); + return renderBatch.begin(DefaultVertexFormat.POSITION_COLOR_NORMAL_LINE_WIDTH, PrimitiveTopology.LINES); } static BufferBuilder startLines(Color color) { @@ -133,25 +128,19 @@ static BufferBuilder startLines(Color color) { } static void endLines(BufferBuilder bufferBuilder, boolean ignoredDepth) { - MeshData meshData = bufferBuilder.build(); - if (meshData != null) { - if (ignoredDepth) { - linesNoDepthRenderType.draw(meshData); - } else { - linesWithDepthRenderType.draw(meshData); - } - } + renderBatch.draw(ignoredDepth ? linesNoDepthRenderType : linesWithDepthRenderType); } static BufferBuilder startBlockQuads() { - return tessellator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + return renderBatch.begin(DefaultVertexFormat.BLOCK, PrimitiveTopology.QUADS); } static void endBuffer(BufferBuilder bufferBuilder, RenderType renderType) { - MeshData meshData = bufferBuilder.build(); - if (meshData != null) { - renderType.draw(meshData); - } + renderBatch.draw(renderType); + } + + static void endFrame() { + renderBatch.endFrame(); } static void emitLine(BufferBuilder bufferBuilder, PoseStack stack, double x1, double y1, double z1, double x2, double y2, double z2, float lineWidth) { @@ -240,4 +229,43 @@ static RenderType beaconBeam(Identifier identifier, boolean bl) { static RenderType beaconBeam(Identifier identifier, boolean bl, boolean ignoreDepth) { return ignoreDepth ? beaconBeam(identifier, bl) : RenderTypes.beaconBeam(identifier, bl); } + + final class RenderBatch { + private final StagedVertexBuffer stagedBuffer = + new StagedVertexBuffer(() -> "Baritone immediate geometry", 256 * 1024); + private StagedVertexBuffer.Draw draw; + + private BufferBuilder begin(VertexFormat format, PrimitiveTopology primitiveTopology) { + if (draw != null) { + throw new IllegalStateException("Previous Baritone render batch was not drawn"); + } + + draw = stagedBuffer.appendDraw(format, primitiveTopology); + return (BufferBuilder) stagedBuffer.getVertexBuilder(draw); + } + + private void draw(RenderType renderType) { + if (draw == null) { + throw new IllegalStateException("No Baritone render batch is active"); + } + + try { + stagedBuffer.upload(); + StagedVertexBuffer.ExecuteInfo executeInfo = stagedBuffer.getExecuteInfo(draw); + if (executeInfo != null) { + renderType.prepare().drawFromBuffer(executeInfo); + } + } finally { + stagedBuffer.endDraw(); + draw = null; + } + } + + private void endFrame() { + if (draw != null) { + throw new IllegalStateException("Cannot end the Baritone render frame with an active batch"); + } + stagedBuffer.endFrame(); + } + } } diff --git a/src/main/java/baritone/utils/PathRenderer.java b/src/main/java/baritone/utils/PathRenderer.java index 95506ab5ce..3883883eec 100644 --- a/src/main/java/baritone/utils/PathRenderer.java +++ b/src/main/java/baritone/utils/PathRenderer.java @@ -74,8 +74,8 @@ public static void render(RenderEvent event, PathingBehavior behavior) { if (ctx.world() == null) { return; } - if (ctx.minecraft().screen instanceof GuiClick) { - ((GuiClick) ctx.minecraft().screen).onRender(event.getModelViewStack(), event.getProjectionMatrix()); + if (ctx.minecraft().gui.screen() instanceof GuiClick click) { + click.onRender(event.getModelViewStack(), event.getProjectionMatrix()); } final float partialTicks = event.getPartialTicks(); diff --git a/src/main/java/baritone/utils/accessor/IRenderPipelines.java b/src/main/java/baritone/utils/accessor/IRenderPipelines.java index 35ebca33b9..baf6c924b9 100644 --- a/src/main/java/baritone/utils/accessor/IRenderPipelines.java +++ b/src/main/java/baritone/utils/accessor/IRenderPipelines.java @@ -21,7 +21,7 @@ public interface IRenderPipelines { RenderPipeline.Snippet getLinesSnippet(); - RenderPipeline.Snippet getMatricesFogSnippet(); + RenderPipeline.Snippet getBeaconBeamSnippet(); RenderPipeline baritone$registerPipeline(RenderPipeline pipeline); } diff --git a/src/main/java/baritone/utils/schematic/litematica/LitematicaHelper.java b/src/main/java/baritone/utils/schematic/litematica/LitematicaHelper.java index febe985d23..9ccd849c5d 100644 --- a/src/main/java/baritone/utils/schematic/litematica/LitematicaHelper.java +++ b/src/main/java/baritone/utils/schematic/litematica/LitematicaHelper.java @@ -28,7 +28,7 @@ import fi.dy.masa.litematica.world.WorldSchematic; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; @@ -93,7 +93,7 @@ private static Vec3i transform(Vec3i in, Mirror mirror, Rotation rotation) { * @param i index of the Schematic in the schematic placement list. * @return The transformed schematic and the position of its minimum corner */ - public static Tuple getSchematic(int i) { + public static Pair getSchematic(int i) { SchematicPlacement placement = getPlacement(i); int minX = Integer.MAX_VALUE; int minY = Integer.MAX_VALUE; @@ -129,7 +129,7 @@ public static Tuple getSchematic(int i) { Vec3i pos = entry.getKey().offset(-minX, -minY, -minZ); composite.put(entry.getValue(), pos.getX(), pos.getY(), pos.getZ()); } - return new Tuple<>(composite, placement.getOrigin().offset(minX, minY, minZ)); + return new Pair<>(composite, placement.getOrigin().offset(minX, minY, minZ)); } private static class LitematicaPlacementSchematic extends CompositeSchematic implements IStaticSchematic { diff --git a/src/main/java/baritone/utils/schematic/schematica/SchematicaHelper.java b/src/main/java/baritone/utils/schematic/schematica/SchematicaHelper.java index 35b11c8e1d..11a511194b 100644 --- a/src/main/java/baritone/utils/schematic/schematica/SchematicaHelper.java +++ b/src/main/java/baritone/utils/schematic/schematica/SchematicaHelper.java @@ -21,7 +21,7 @@ import com.github.lunatrius.schematica.Schematica; import com.github.lunatrius.schematica.proxy.ClientProxy; import net.minecraft.core.BlockPos; -import net.minecraft.util.Tuple; +import baritone.api.utils.Pair; import java.util.Optional; public enum SchematicaHelper { @@ -36,9 +36,9 @@ public static boolean isSchematicaPresent() { } } - public static Optional> getOpenSchematic() { + public static Optional> getOpenSchematic() { return Optional.ofNullable(ClientProxy.schematic) - .map(world -> new Tuple<>(new SchematicAdapter(world), world.position)); + .map(world -> new Pair<>(new SchematicAdapter(world), world.position)); } }