[+] Add block destroy listener

This commit is contained in:
Hykilpikonna
2020-02-19 17:35:40 -05:00
parent 05a5d89376
commit eddbb9eba2
4 changed files with 46 additions and 1 deletions
@@ -18,6 +18,7 @@
package baritone.api.event.listener; package baritone.api.event.listener;
import baritone.api.event.events.*; import baritone.api.event.events.*;
import net.minecraft.util.math.BlockPos;
/** /**
* An implementation of {@link IGameEventListener} that has all methods * An implementation of {@link IGameEventListener} that has all methods
@@ -71,4 +72,7 @@ public interface AbstractGameEventListener extends IGameEventListener {
@Override @Override
default void onPathEvent(PathEvent event) {} default void onPathEvent(PathEvent event) {}
@Override
default void onBlockBreak(BlockPos pos) {}
} }
@@ -20,10 +20,10 @@ package baritone.api.event.listener;
import baritone.api.event.events.*; import baritone.api.event.events.*;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity; 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.gui.screen.Screen;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.BlockPos;
/** /**
* @author Brady * @author Brady
@@ -137,4 +137,11 @@ public interface IGameEventListener {
* @param event The event * @param event The event
*/ */
void onPathEvent(PathEvent event); void onPathEvent(PathEvent event);
/**
* This is called when the player breaks blocks.
*
* @param pos Block position
*/
void onBlockBreak(BlockPos pos);
} }
@@ -17,16 +17,28 @@
package baritone.launch.mixins; package baritone.launch.mixins;
import baritone.api.BaritoneAPI;
import baritone.api.IBaritone;
import baritone.utils.accessor.IPlayerControllerMP; import baritone.utils.accessor.IPlayerControllerMP;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.PlayerController; import net.minecraft.client.multiplayer.PlayerController;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; 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.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker; 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) @Mixin(PlayerController.class)
public abstract class MixinPlayerController implements IPlayerControllerMP { public abstract class MixinPlayerController implements IPlayerControllerMP {
@Shadow
@Final
private Minecraft mc;
@Accessor @Accessor
@Override @Override
public abstract void setIsHittingBlock(boolean isHittingBlock); public abstract void setIsHittingBlock(boolean isHittingBlock);
@@ -38,4 +50,20 @@ public abstract class MixinPlayerController implements IPlayerControllerMP {
@Invoker @Invoker
@Override @Override
public abstract void callSyncCurrentPlayItem(); public abstract void callSyncCurrentPlayItem();
@Inject(
method = "onPlayerDestroyBlock",
at = @At(value = "TAIL")
)
public void onPlayerDestroyBlock(BlockPos pos, CallbackInfoReturnable<Boolean> 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);
}
}
} }
@@ -25,6 +25,7 @@ import baritone.api.event.listener.IGameEventListener;
import baritone.api.utils.Helper; import baritone.api.utils.Helper;
import baritone.cache.WorldProvider; import baritone.cache.WorldProvider;
import baritone.utils.BlockStateInterface; import baritone.utils.BlockStateInterface;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
@@ -161,4 +162,9 @@ public final class GameEventHandler implements IEventBus, Helper {
public final void registerEventListener(IGameEventListener listener) { public final void registerEventListener(IGameEventListener listener) {
this.listeners.add(listener); this.listeners.add(listener);
} }
public final void onBlockBreak(BlockPos blockPos)
{
listeners.forEach(l -> l.onBlockBreak(blockPos));
}
} }