Add automatic bed waypoints on interact, fixes #79
This commit is contained in:
parent
fcb947bedc
commit
060eeb9737
@ -1,9 +1,14 @@
|
|||||||
package baritone.behavior.impl;
|
package baritone.behavior.impl;
|
||||||
|
|
||||||
import baritone.behavior.Behavior;
|
import baritone.behavior.Behavior;
|
||||||
|
import baritone.chunk.Waypoint;
|
||||||
|
import baritone.chunk.WorldProvider;
|
||||||
|
import baritone.event.events.BlockInteractEvent;
|
||||||
import baritone.event.events.PacketEvent;
|
import baritone.event.events.PacketEvent;
|
||||||
import baritone.event.events.PlayerUpdateEvent;
|
import baritone.event.events.PlayerUpdateEvent;
|
||||||
import baritone.event.events.type.EventState;
|
import baritone.event.events.type.EventState;
|
||||||
|
import baritone.utils.BlockStateInterface;
|
||||||
|
import net.minecraft.block.BlockBed;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.Packet;
|
||||||
import net.minecraft.network.play.client.CPacketCloseWindow;
|
import net.minecraft.network.play.client.CPacketCloseWindow;
|
||||||
@ -104,6 +109,13 @@ public class MemoryBehavior extends Behavior {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockInteract(BlockInteractEvent event) {
|
||||||
|
if (event.getType() == BlockInteractEvent.Type.USE && BlockStateInterface.get(event.getPos()) instanceof BlockBed) {
|
||||||
|
WorldProvider.INSTANCE.getCurrentWorld().waypoints.addWaypoint(new Waypoint("bed", Waypoint.Tag.BED, playerFeet()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Optional<RememberedInventory> getInventoryFromWindow(int windowId) {
|
private Optional<RememberedInventory> getInventoryFromWindow(int windowId) {
|
||||||
return this.rememberedInventories.values().stream().filter(i -> i.windowId == windowId).findFirst();
|
return this.rememberedInventories.values().stream().filter(i -> i.windowId == windowId).findFirst();
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ public class Waypoints {
|
|||||||
try (
|
try (
|
||||||
FileInputStream fileIn = new FileInputStream(fileName.toFile());
|
FileInputStream fileIn = new FileInputStream(fileName.toFile());
|
||||||
BufferedInputStream bufIn = new BufferedInputStream(fileIn);
|
BufferedInputStream bufIn = new BufferedInputStream(fileIn);
|
||||||
DataInputStream in = new DataInputStream(bufIn);
|
DataInputStream in = new DataInputStream(bufIn)
|
||||||
) {
|
) {
|
||||||
while (true) {
|
while (true) {
|
||||||
String name = in.readUTF();
|
String name = in.readUTF();
|
||||||
@ -71,7 +71,7 @@ public class Waypoints {
|
|||||||
int z = in.readInt();
|
int z = in.readInt();
|
||||||
waypoints.get(tag).add(new Waypoint(name, tag, new BlockPos(x, y, z), creationTimestamp));
|
waypoints.get(tag).add(new Waypoint(name, tag, new BlockPos(x, y, z), creationTimestamp));
|
||||||
}
|
}
|
||||||
} catch (IOException ex) { }
|
} catch (IOException ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void save(Waypoint.Tag tag) {
|
private synchronized void save(Waypoint.Tag tag) {
|
||||||
|
@ -174,6 +174,11 @@ public final class GameEventHandler implements IGameEventListener, Helper {
|
|||||||
dispatch(listener -> listener.onPlayerRelativeMove(event));
|
dispatch(listener -> listener.onPlayerRelativeMove(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockInteract(BlockInteractEvent event) {
|
||||||
|
dispatch(listener -> listener.onBlockInteract(event));
|
||||||
|
}
|
||||||
|
|
||||||
public final void registerEventListener(IGameEventListener listener) {
|
public final void registerEventListener(IGameEventListener listener) {
|
||||||
this.listeners.add(listener);
|
this.listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
69
src/main/java/baritone/event/events/BlockInteractEvent.java
Normal file
69
src/main/java/baritone/event/events/BlockInteractEvent.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Baritone.
|
||||||
|
*
|
||||||
|
* Baritone is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package baritone.event.events;
|
||||||
|
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Brady
|
||||||
|
* @since 8/22/2018
|
||||||
|
*/
|
||||||
|
public final class BlockInteractEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The position of the block interacted with
|
||||||
|
*/
|
||||||
|
private final BlockPos pos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of interaction that occurred
|
||||||
|
*/
|
||||||
|
private final Type type;
|
||||||
|
|
||||||
|
public BlockInteractEvent(BlockPos pos, Type type) {
|
||||||
|
this.pos = pos;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The position of the block interacted with
|
||||||
|
*/
|
||||||
|
public final BlockPos getPos() {
|
||||||
|
return this.pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The type of interaction with the target block
|
||||||
|
*/
|
||||||
|
public final Type getType() {
|
||||||
|
return this.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Type {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We're breaking the target block.
|
||||||
|
*/
|
||||||
|
BREAK,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We're right clicking on the target block. Either placing or interacting with.
|
||||||
|
*/
|
||||||
|
USE
|
||||||
|
}
|
||||||
|
}
|
@ -80,4 +80,7 @@ public interface AbstractGameEventListener extends IGameEventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
default void onPlayerRelativeMove(RelativeMoveEvent event) {}
|
default void onPlayerRelativeMove(RelativeMoveEvent event) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default void onBlockInteract(BlockInteractEvent event) {}
|
||||||
}
|
}
|
||||||
|
@ -132,4 +132,12 @@ public interface IGameEventListener {
|
|||||||
* @see Entity#moveRelative(float, float, float, float)
|
* @see Entity#moveRelative(float, float, float, float)
|
||||||
*/
|
*/
|
||||||
void onPlayerRelativeMove(RelativeMoveEvent event);
|
void onPlayerRelativeMove(RelativeMoveEvent event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the local player interacts with a block, whether it is breaking or opening/placing.
|
||||||
|
*
|
||||||
|
* @see Minecraft#clickMouse()
|
||||||
|
* @see Minecraft#rightClickMouse()
|
||||||
|
*/
|
||||||
|
void onBlockInteract(BlockInteractEvent event);
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ package baritone.launch.mixins;
|
|||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
import baritone.behavior.impl.PathingBehavior;
|
import baritone.behavior.impl.PathingBehavior;
|
||||||
|
import baritone.event.events.BlockInteractEvent;
|
||||||
import baritone.event.events.TickEvent;
|
import baritone.event.events.TickEvent;
|
||||||
import baritone.event.events.WorldEvent;
|
import baritone.event.events.WorldEvent;
|
||||||
import baritone.event.events.type.EventState;
|
import baritone.event.events.type.EventState;
|
||||||
@ -26,6 +27,10 @@ import baritone.utils.ExampleBaritoneControl;
|
|||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
import net.minecraft.client.multiplayer.WorldClient;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.EnumActionResult;
|
||||||
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import org.spongepowered.asm.lib.Opcodes;
|
import org.spongepowered.asm.lib.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@ -33,6 +38,7 @@ 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.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Brady
|
* @author Brady
|
||||||
@ -155,4 +161,27 @@ public class MixinMinecraft {
|
|||||||
private boolean isAllowUserInput(GuiScreen screen) {
|
private boolean isAllowUserInput(GuiScreen screen) {
|
||||||
return PathingBehavior.INSTANCE.getCurrent() != null || screen.allowUserInput;
|
return PathingBehavior.INSTANCE.getCurrent() != null || screen.allowUserInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "clickMouse",
|
||||||
|
at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "net/minecraft/client/multiplayer/PlayerControllerMP.clickBlock(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumFacing;)Z"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
private void clickMouse(CallbackInfo ci, BlockPos pos) {
|
||||||
|
Baritone.INSTANCE.getGameEventHandler().onBlockInteract(new BlockInteractEvent(pos, BlockInteractEvent.Type.BREAK));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "rightClickMouse",
|
||||||
|
at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "net/minecraft/client/entity/EntityPlayerSP.swingArm(Lnet/minecraft/util/EnumHand;)V"
|
||||||
|
),
|
||||||
|
locals = LocalCapture.CAPTURE_FAILHARD
|
||||||
|
)
|
||||||
|
private void onBlockInteract(CallbackInfo ci, EnumHand var1[], int var2, int var3, EnumHand enumhand, ItemStack itemstack, BlockPos blockpos, int i, EnumActionResult enumactionresult) {
|
||||||
|
Baritone.INSTANCE.getGameEventHandler().onBlockInteract(new BlockInteractEvent(blockpos, BlockInteractEvent.Type.USE));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user