From eddbb9eba2e68faf07d5927fa353ded51580b927 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Wed, 19 Feb 2020 17:35:40 -0500 Subject: [PATCH] [+] Add block destroy listener --- .../listener/AbstractGameEventListener.java | 4 +++ .../event/listener/IGameEventListener.java | 9 +++++- .../launch/mixins/MixinPlayerController.java | 28 +++++++++++++++++++ .../java/baritone/event/GameEventHandler.java | 6 ++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/api/java/baritone/api/event/listener/AbstractGameEventListener.java b/src/api/java/baritone/api/event/listener/AbstractGameEventListener.java index 9eac8de4..d5775752 100644 --- a/src/api/java/baritone/api/event/listener/AbstractGameEventListener.java +++ b/src/api/java/baritone/api/event/listener/AbstractGameEventListener.java @@ -18,6 +18,7 @@ package baritone.api.event.listener; import baritone.api.event.events.*; +import net.minecraft.util.math.BlockPos; /** * An implementation of {@link IGameEventListener} that has all methods @@ -71,4 +72,7 @@ public interface AbstractGameEventListener extends IGameEventListener { @Override default void onPathEvent(PathEvent event) {} + + @Override + default void onBlockBreak(BlockPos pos) {} } diff --git a/src/api/java/baritone/api/event/listener/IGameEventListener.java b/src/api/java/baritone/api/event/listener/IGameEventListener.java index 21474fb5..4b449b00 100644 --- a/src/api/java/baritone/api/event/listener/IGameEventListener.java +++ b/src/api/java/baritone/api/event/listener/IGameEventListener.java @@ -20,10 +20,10 @@ package baritone.api.event.listener; import baritone.api.event.events.*; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.gui.screen.DeathScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; /** * @author Brady @@ -137,4 +137,11 @@ public interface IGameEventListener { * @param event The event */ void onPathEvent(PathEvent event); + + /** + * This is called when the player breaks blocks. + * + * @param pos Block position + */ + void onBlockBreak(BlockPos pos); } diff --git a/src/launch/java/baritone/launch/mixins/MixinPlayerController.java b/src/launch/java/baritone/launch/mixins/MixinPlayerController.java index 071cbc9a..e9eb1762 100644 --- a/src/launch/java/baritone/launch/mixins/MixinPlayerController.java +++ b/src/launch/java/baritone/launch/mixins/MixinPlayerController.java @@ -17,16 +17,28 @@ package baritone.launch.mixins; +import baritone.api.BaritoneAPI; +import baritone.api.IBaritone; import baritone.utils.accessor.IPlayerControllerMP; +import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerController; import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PlayerController.class) public abstract class MixinPlayerController implements IPlayerControllerMP { + @Shadow + @Final + private Minecraft mc; + @Accessor @Override public abstract void setIsHittingBlock(boolean isHittingBlock); @@ -38,4 +50,20 @@ public abstract class MixinPlayerController implements IPlayerControllerMP { @Invoker @Override public abstract void callSyncCurrentPlayItem(); + + @Inject( + method = "onPlayerDestroyBlock", + at = @At(value = "TAIL") + ) + public void onPlayerDestroyBlock(BlockPos pos, CallbackInfoReturnable cir) + { + // Check if the block is broken + if (!cir.getReturnValue()) return; + + // Call event + IBaritone baritone = BaritoneAPI.getProvider().getBaritoneForPlayer(this.mc.player); + if (baritone != null) { + baritone.getGameEventHandler().onBlockBreak(pos); + } + } } diff --git a/src/main/java/baritone/event/GameEventHandler.java b/src/main/java/baritone/event/GameEventHandler.java index ba40f1b6..5cedc54e 100644 --- a/src/main/java/baritone/event/GameEventHandler.java +++ b/src/main/java/baritone/event/GameEventHandler.java @@ -25,6 +25,7 @@ import baritone.api.event.listener.IGameEventListener; import baritone.api.utils.Helper; import baritone.cache.WorldProvider; import baritone.utils.BlockStateInterface; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -161,4 +162,9 @@ public final class GameEventHandler implements IEventBus, Helper { public final void registerEventListener(IGameEventListener listener) { this.listeners.add(listener); } + + public final void onBlockBreak(BlockPos blockPos) + { + listeners.forEach(l -> l.onBlockBreak(blockPos)); + } }