Skip to content

Commit 77907b2

Browse files
authored
Add Baritone integration for automatic mining (xpple#117)
* Add Baritone integration for automatic mining * Keep track of already mined blocks * Add information about Baritone integration * Also allow ore vein blocks to be automatically mined * Stop automatically mining blocks when Baritone's #stop is executed * Update README
1 parent a159aa0 commit 77907b2

File tree

14 files changed

+284
-3
lines changed

14 files changed

+284
-3
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ Usage: `/sm:source (run)|(as <entity>)|(positioned <position>)|(rotated <rotatio
7777

7878
Executes a given command from a modified source. For example, modifying the source's position will execute the command as if you were in that position. This command is really powerful, use it!
7979

80+
### Baritone integration
81+
If [Meteor's version of Baritone](https://maven.meteordev.org/#/snapshots/meteordevelopment/baritone) is present, the `AutoMine` config will be visible. When set to true, certain blocks highlighted by `/sm:highlight` will be automatically mined. You can stop Baritone by executing `#stop` as usual. Make sure `#allowBreak` is set to true in Baritone's configs, otherwise Baritone will get stuck forever and no blocks will be mined.
82+
8083
## Building from source
8184
This mod internally uses (a fork of) the C library [cubiomes](https://github.com/Cubitect/cubiomes) by Cubitect. Java bindings for this library were created with (also a fork of) [jextract](https://github.com/openjdk/jextract). The bindings use the [Foreign Function & Memory API](https://openjdk.org/jeps/454) from [Project Panama](https://openjdk.org/projects/panama/). See [CreateJavaBindingsTask.java](https://github.com/xpple/SeedMapper/blob/master/buildSrc/src/main/java/dev/xpple/seedmapper/buildscript/CreateJavaBindingsTask.java) for the Gradle task that automates this.
8285

build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ repositories {
3131
name = 'DJtheRedstoner'
3232
url = 'https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1'
3333
}
34+
maven {
35+
name = 'MeteorDevelopment'
36+
url = 'https://maven.meteordev.org/snapshots'
37+
}
3438
}
3539

3640
dependencies {
@@ -57,6 +61,8 @@ dependencies {
5761
exclude group: 'net.fabricmc', module: 'fabric-loader'
5862
}
5963

64+
modCompileOnly "meteordevelopment:baritone:${project.baritone_version}"
65+
6066
testImplementation platform("org.junit:junit-bom:${project.junit_version}")
6167
testImplementation 'org.junit.jupiter:junit-jupiter'
6268
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ betterconfig_version=2.5.0
2424
clientarguments_version=1.11.6
2525
simplewaypoints_version=1.2.0
2626

27+
# Optional library dependencies
28+
baritone_version=1.21.11-SNAPSHOT
29+
2730
devauth_version=1.2.2
2831

2932
# Test dependencies
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package dev.xpple.seedmapper;
2+
3+
import org.objectweb.asm.tree.ClassNode;
4+
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
5+
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
6+
7+
import java.util.List;
8+
import java.util.Set;
9+
10+
public class MixinConfigPlugin implements IMixinConfigPlugin {
11+
12+
private static final Set<String> BARITONE_MIXINS = Set.of(
13+
"dev.xpple.seedmapper.mixin.baritone.CustomGoalProcessMixin",
14+
"dev.xpple.seedmapper.mixin.baritone.PathingBehaviorMixin"
15+
);
16+
17+
@Override
18+
public void onLoad(String mixinPackage) {
19+
}
20+
21+
@Override
22+
public String getRefMapperConfig() {
23+
return null;
24+
}
25+
26+
@Override
27+
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
28+
if (BARITONE_MIXINS.contains(mixinClassName)) {
29+
return SeedMapper.BARITONE_AVAILABLE;
30+
}
31+
return true;
32+
}
33+
34+
@Override
35+
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
36+
}
37+
38+
@Override
39+
public List<String> getMixins() {
40+
return null;
41+
}
42+
43+
@Override
44+
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
45+
}
46+
47+
@Override
48+
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
49+
}
50+
}

src/main/java/dev/xpple/seedmapper/SeedMapper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.mojang.blaze3d.platform.InputConstants;
44
import com.mojang.brigadier.CommandDispatcher;
5+
import com.mojang.logging.LogUtils;
56
import dev.xpple.betterconfig.api.ModConfigBuilder;
67
import dev.xpple.seedmapper.command.arguments.DurationArgument;
78
import dev.xpple.seedmapper.command.arguments.MapFeatureArgument;
@@ -40,6 +41,7 @@
4041
import net.minecraft.client.KeyMapping;
4142
import net.minecraft.commands.CommandBuildContext;
4243
import net.minecraft.resources.Identifier;
44+
import org.slf4j.Logger;
4345

4446
import java.io.IOException;
4547
import java.nio.file.Files;
@@ -53,6 +55,10 @@ public class SeedMapper implements ClientModInitializer {
5355

5456
public static final Path modConfigPath = FabricLoader.getInstance().getConfigDir().resolve(MOD_ID);
5557

58+
private static final Logger LOGGER = LogUtils.getLogger();
59+
60+
public static final boolean BARITONE_AVAILABLE = FabricLoader.getInstance().getModContainer("baritone-meteor").isPresent();
61+
5662
static {
5763
String libraryName = System.mapLibraryName("cubiomes");
5864
ModContainer modContainer = FabricLoader.getInstance().getModContainer(MOD_ID).orElseThrow();
@@ -102,6 +108,11 @@ public void onInitializeClient() {
102108
ClientCommandRegistrationCallback.EVENT.register(SeedMapper::registerCommands);
103109
RenderManager.registerEvents();
104110
MinimapManager.registerHudElement();
111+
112+
if (BARITONE_AVAILABLE) {
113+
LOGGER.info("Baritone detected, Baritone integration will be available!");
114+
LOGGER.info("Set AutoMine to true to automatically mine certain blocks highlighted by `/sm:highlight`");
115+
}
105116
}
106117

107118
private static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandBuildContext context) {

src/main/java/dev/xpple/seedmapper/command/commands/HighlightCommand.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
import com.mojang.brigadier.CommandDispatcher;
1414
import com.mojang.brigadier.exceptions.CommandSyntaxException;
1515
import com.mojang.datafixers.util.Pair;
16+
import dev.xpple.seedmapper.SeedMapper;
1617
import dev.xpple.seedmapper.command.CommandExceptions;
1718
import dev.xpple.seedmapper.command.CustomClientCommandSource;
1819
import dev.xpple.seedmapper.config.Configs;
1920
import dev.xpple.seedmapper.feature.OreTypes;
2021
import dev.xpple.seedmapper.render.RenderManager;
22+
import dev.xpple.seedmapper.util.BaritoneIntegration;
2123
import dev.xpple.seedmapper.util.ComponentUtils;
2224
import dev.xpple.seedmapper.util.SeedIdentifier;
2325
import dev.xpple.seedmapper.util.SpiralLoop;
@@ -172,6 +174,9 @@ private static int highlightBlock(CustomClientCommandSource source, Pair<Integer
172174
count[0] += blockOres.size();
173175
source.getClient().schedule(() -> {
174176
RenderManager.drawBoxes(blockOres, colour);
177+
if (SeedMapper.BARITONE_AVAILABLE && Configs.AutoMine) {
178+
BaritoneIntegration.addGoals(blockOres);
179+
}
175180
source.sendFeedback(Component.translatable("command.highlight.block.chunkSuccess", accent(String.valueOf(blockOres.size())), ComponentUtils.formatXZ(chunkX, chunkZ)));
176181
});
177182

@@ -232,6 +237,9 @@ private static int highlightOreVein(CustomClientCommandSource source, int chunkR
232237
count[0] += positions.size();
233238
int colour = BLOCKS.values().stream().filter(pair -> Objects.equals(block, pair.getFirst())).findAny().orElseThrow().getSecond();
234239
RenderManager.drawBoxes(positions, colour);
240+
if (SeedMapper.BARITONE_AVAILABLE && Configs.AutoMine) {
241+
BaritoneIntegration.addGoals(positions);
242+
}
235243
if (block == Cubiomes.RAW_COPPER_BLOCK() || block == Cubiomes.RAW_IRON_BLOCK()) {
236244
source.getClient().schedule(() -> source.sendFeedback(Component.translatable("command.highlight.oreVein.rawBlocks", ComponentUtils.formatXYZCollection(positions))));
237245
}

src/main/java/dev/xpple/seedmapper/command/commands/LocateCommand.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ public static TwoDTree calculateStrongholds(long seed, int dimension, int versio
257257
tree.insert(new BlockPos(Pos.x(pos), 0, Pos.z(pos)));
258258
}
259259
}
260+
tree.balance();
260261
return tree;
261262
}
262263

src/main/java/dev/xpple/seedmapper/config/Configs.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import dev.xpple.seedmapper.render.RenderManager;
1010
import dev.xpple.seedmapper.seedmap.MapFeature;
1111
import dev.xpple.seedmapper.seedmap.SeedMapScreen;
12+
import dev.xpple.seedmapper.util.BaritoneIntegration;
1213
import dev.xpple.seedmapper.util.ComponentUtils;
1314
import dev.xpple.seedmapper.util.SeedIdentifier;
1415
import net.minecraft.ChatFormatting;
1516
import net.minecraft.client.Minecraft;
17+
import net.minecraft.commands.SharedSuggestionProvider;
1618
import net.minecraft.network.chat.Component;
1719
import net.minecraft.util.Util;
1820

@@ -140,4 +142,15 @@ private static Component getDevModeComment() {
140142
private static void updateHighlightDuration(Duration oldValue, Duration newValue) {
141143
RenderManager.rebuildLineSet();
142144
}
145+
146+
@Config(condition = "hasBaritoneAvailable", onChange = "updateBaritoneGoals")
147+
public static boolean AutoMine = false;
148+
private static boolean hasBaritoneAvailable(SharedSuggestionProvider source) {
149+
return SeedMapper.BARITONE_AVAILABLE;
150+
}
151+
private static void updateBaritoneGoals(boolean oldValue, boolean newValue) {
152+
if (!newValue) {
153+
BaritoneIntegration.clearGoals();
154+
}
155+
}
143156
}

src/main/java/dev/xpple/seedmapper/mixin/ClientPacketListenerMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dev.xpple.seedmapper.mixin;
22

3+
import dev.xpple.seedmapper.SeedMapper;
34
import dev.xpple.seedmapper.command.CustomClientCommandSource;
45
import dev.xpple.seedmapper.render.RenderManager;
56
import dev.xpple.seedmapper.seedmap.MinimapManager;
7+
import dev.xpple.seedmapper.util.BaritoneIntegration;
68
import net.minecraft.client.multiplayer.ClientPacketListener;
79
import net.minecraft.network.protocol.game.ClientboundLoginPacket;
810
import net.minecraft.network.protocol.game.ClientboundRespawnPacket;
@@ -18,6 +20,10 @@ private void onHandleLogin(ClientboundLoginPacket packet, CallbackInfo ci) {
1820
RenderManager.clear();
1921

2022
MinimapManager.hide();
23+
24+
if (SeedMapper.BARITONE_AVAILABLE) {
25+
BaritoneIntegration.clearMinedBlocks();
26+
}
2127
}
2228

2329
@Inject(method = "handleRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/PacketUtils;ensureRunningOnSameThread(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;Lnet/minecraft/network/PacketProcessor;)V", shift = At.Shift.AFTER))
@@ -26,5 +32,9 @@ private void onHandleRespawn(ClientboundRespawnPacket packet, CallbackInfo ci) {
2632

2733
int dimension = CustomClientCommandSource.inferDimension(packet.commonPlayerSpawnInfo().dimensionType().value());
2834
MinimapManager.updateDimension(dimension);
35+
36+
if (SeedMapper.BARITONE_AVAILABLE) {
37+
BaritoneIntegration.clearMinedBlocks();
38+
}
2939
}
3040
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.xpple.seedmapper.mixin.baritone;
2+
3+
import baritone.Baritone;
4+
import baritone.api.pathing.goals.Goal;
5+
import baritone.api.process.ICustomGoalProcess;
6+
import baritone.process.CustomGoalProcess;
7+
import baritone.utils.BaritoneProcessHelper;
8+
import dev.xpple.seedmapper.SeedMapper;
9+
import dev.xpple.seedmapper.config.Configs;
10+
import dev.xpple.seedmapper.util.BaritoneIntegration;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
import org.spongepowered.asm.mixin.injection.Inject;
15+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
16+
17+
@Mixin(value = CustomGoalProcess.class, remap = false)
18+
public abstract class CustomGoalProcessMixin extends BaritoneProcessHelper implements ICustomGoalProcess {
19+
@Shadow private Goal a;
20+
21+
public CustomGoalProcessMixin(Baritone baritone) {
22+
super(baritone);
23+
}
24+
25+
@Inject(method = "onLostControl", at = @At("HEAD"), remap = false)
26+
private void onFinished(CallbackInfo ci) {
27+
if (SeedMapper.BARITONE_AVAILABLE && Configs.AutoMine) {
28+
BaritoneIntegration.onGoalCompletion(this.a);
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)