diff --git a/src/api/java/baritone/api/bot/IUserManager.java b/src/api/java/baritone/api/bot/IUserManager.java index 812d22b1d..dbcafa48b 100644 --- a/src/api/java/baritone/api/bot/IUserManager.java +++ b/src/api/java/baritone/api/bot/IUserManager.java @@ -74,8 +74,20 @@ public interface IUserManager { */ default Optional getUserByUUID(UUID uuid) { return uuid == null - ? Optional.empty() - : this.getUsers().stream().filter(user -> user.getProfile().getId().equals(uuid)).findFirst(); + ? Optional.empty() + : this.getUsers().stream().filter(user -> user.getProfile().getId().equals(uuid)).findFirst(); + } + + /** + * Finds the {@link IBaritoneUser} associated with the specified username + * + * @param username The username of the user + * @return The user, {@link Optional#empty()} if no match or {@code uuid} is {@code null} + */ + default Optional getUserByName(String username) { + return username == null || username.isEmpty() + ? Optional.empty() + : this.getUsers().stream().filter(user -> user.getProfile().getName().equalsIgnoreCase(username)).findFirst(); } /** diff --git a/src/main/java/baritone/bot/UserManager.java b/src/main/java/baritone/bot/UserManager.java index f49bd9995..b61a5d4c8 100644 --- a/src/main/java/baritone/bot/UserManager.java +++ b/src/main/java/baritone/bot/UserManager.java @@ -175,9 +175,8 @@ public final class UserManager implements IUserManager, Helper { user.getNetworkManager().closeChannel(null); } this.users.remove(user); - if (reason != null) { - logDirect(user.getSession().getUsername() + " Disconnected: " + reason.getUnformattedText()); - } + logDirect(user.getSession().getUsername() + " Disconnected: " + + (reason == null ? "Unknown" : reason.getUnformattedText())); } } diff --git a/src/main/java/baritone/bot/handler/BotNetHandlerPlayClient.java b/src/main/java/baritone/bot/handler/BotNetHandlerPlayClient.java index 9219332aa..3093672f9 100644 --- a/src/main/java/baritone/bot/handler/BotNetHandlerPlayClient.java +++ b/src/main/java/baritone/bot/handler/BotNetHandlerPlayClient.java @@ -488,17 +488,11 @@ public final class BotNetHandlerPlayClient extends NetHandlerPlayClient { @Override public void handleHeldItemChange(@Nonnull SPacketHeldItemChange packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - - if (InventoryPlayer.isHotbar(packetIn.getHeldItemHotbarIndex())) { - this.player.inventory.currentItem = packetIn.getHeldItemHotbarIndex(); - } + super.handleHeldItemChange(packetIn); } @Override - public void handleDisplayObjective(@Nonnull SPacketDisplayObjective packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - } + public void handleDisplayObjective(@Nonnull SPacketDisplayObjective packetIn) {} @Override public void handleEntityMetadata(@Nonnull SPacketEntityMetadata packetIn) { @@ -536,18 +530,12 @@ public final class BotNetHandlerPlayClient extends NetHandlerPlayClient { @Override public void handleSetExperience(@Nonnull SPacketSetExperience packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - - this.player.setXPStats(packetIn.getExperienceBar(), packetIn.getTotalExperience(), packetIn.getLevel()); + super.handleSetExperience(packetIn); } @Override public void handleUpdateHealth(@Nonnull SPacketUpdateHealth packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - - this.player.setPlayerSPHealth(packetIn.getHealth()); - this.player.getFoodStats().setFoodLevel(packetIn.getFoodLevel()); - this.player.getFoodStats().setFoodSaturationLevel(packetIn.getSaturationLevel()); + super.handleUpdateHealth(packetIn); } @Override @@ -562,11 +550,8 @@ public final class BotNetHandlerPlayClient extends NetHandlerPlayClient { @Override public void handleTimeUpdate(@Nonnull SPacketTimeUpdate packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - this.world.setTotalWorldTime(packetIn.getTotalWorldTime()); this.world.setWorldTime(packetIn.getWorldTime()); - - // TODO: Calculate World TPS } @Override @@ -653,19 +638,12 @@ public final class BotNetHandlerPlayClient extends NetHandlerPlayClient { @Override public void handleCooldown(@Nonnull SPacketCooldown packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - - if (packetIn.getTicks() == 0) { // There is no cooldown - this.player.getCooldownTracker().removeCooldown(packetIn.getItem()); - } else { - this.player.getCooldownTracker().setCooldown(packetIn.getItem(), packetIn.getTicks()); - } + super.handleCooldown(packetIn); } @Override public void handleMoveVehicle(@Nonnull SPacketMoveVehicle packetIn) { - PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - /* Atm Baritone doesn't even work on vehicles that well at all, so this is a major TODO */ + super.handleMoveVehicle(packetIn); } @Override @@ -679,7 +657,7 @@ public final class BotNetHandlerPlayClient extends NetHandlerPlayClient { @Override public void onDisconnect(@Nonnull ITextComponent reason) { - // TODO Maybe more world unloadinde + // TODO Maybe more world unloading this.world.removeEntity(this.player); this.user.getManager().disconnect(this.user, reason); } diff --git a/src/main/java/baritone/bot/spec/BotMinecraft.java b/src/main/java/baritone/bot/spec/BotMinecraft.java index 7e155ebf1..4a32e2e24 100644 --- a/src/main/java/baritone/bot/spec/BotMinecraft.java +++ b/src/main/java/baritone/bot/spec/BotMinecraft.java @@ -24,6 +24,7 @@ import baritone.utils.accessor.IGameSettings; import com.google.common.util.concurrent.ListenableFuture; import com.mojang.authlib.minecraft.MinecraftSessionService; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundHandler; import net.minecraft.client.main.GameConfiguration; import net.minecraft.client.settings.GameSettings; import net.minecraft.client.settings.KeyBinding; @@ -46,7 +47,7 @@ import java.util.concurrent.Callable; public final class BotMinecraft extends Minecraft implements Helper { private IBaritoneUser user; - private BotTutorial tutorial; + private Tutorial tutorial; private BotMinecraft(GameConfiguration gameConfig) { super(gameConfig); @@ -79,10 +80,15 @@ public final class BotMinecraft extends Minecraft implements Helper { return this.tutorial; } + @Override + public SoundHandler getSoundHandler() { + return BotSoundHandler.INSTANCE; + } + public static BotMinecraft allocate(IBaritoneUser user) { BotMinecraft bm = ObjectAllocator.allocate(BotMinecraft.class); bm.user = user; - bm.tutorial = new BotTutorial(bm); + bm.tutorial = new Tutorial(bm); bm.gameSettings = createGameSettings(bm); return bm; } diff --git a/src/main/java/baritone/bot/spec/BotTutorial.java b/src/main/java/baritone/bot/spec/BotSoundHandler.java similarity index 56% rename from src/main/java/baritone/bot/spec/BotTutorial.java rename to src/main/java/baritone/bot/spec/BotSoundHandler.java index c208aeae9..9a3dce000 100644 --- a/src/main/java/baritone/bot/spec/BotTutorial.java +++ b/src/main/java/baritone/bot/spec/BotSoundHandler.java @@ -17,15 +17,25 @@ package baritone.bot.spec; -import net.minecraft.client.tutorial.Tutorial; +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.SoundHandler; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.settings.GameSettings; + +import javax.annotation.Nonnull; /** * @author Brady - * @since 3/3/2020 + * @since 3/7/2020 */ -public final class BotTutorial extends Tutorial { +public final class BotSoundHandler extends SoundHandler { - public BotTutorial(BotMinecraft minecraft) { - super(minecraft); + public static final BotSoundHandler INSTANCE = new BotSoundHandler(null, null); + + public BotSoundHandler(IResourceManager manager, GameSettings gameSettingsIn) { + super(manager, gameSettingsIn); } + + @Override + public void playSound(@Nonnull ISound sound) {} } diff --git a/src/main/java/baritone/bot/spec/BotWorld.java b/src/main/java/baritone/bot/spec/BotWorld.java index d671d9c28..e7a438f6a 100644 --- a/src/main/java/baritone/bot/spec/BotWorld.java +++ b/src/main/java/baritone/bot/spec/BotWorld.java @@ -20,6 +20,8 @@ package baritone.bot.spec; import net.minecraft.client.multiplayer.ChunkProviderClient; import net.minecraft.entity.Entity; import net.minecraft.profiler.Profiler; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; import net.minecraft.world.DimensionType; import net.minecraft.world.World; import net.minecraft.world.WorldSettings; @@ -33,7 +35,7 @@ import javax.annotation.Nonnull; * @author Brady * @since 11/7/2018 */ -public class BotWorld extends World { +public final class BotWorld extends World { private static Profiler BOT_WORLD_PROFILER = new Profiler(); private static int worldNum = 0; @@ -63,6 +65,11 @@ public class BotWorld extends World { return allowEmpty || !this.chunkProviderClient.provideChunk(x, z).isEmpty(); } + @Override + public void playSound(double x, double y, double z, SoundEvent soundIn, SoundCategory category, float volume, float pitch, boolean distanceDelay) { + // Do nothing + } + public void addEntityToWorld(int entityID, EntityBot entity) { this.removeEntityFromWorld(entityID); this.spawnEntity(entity); diff --git a/src/main/java/baritone/command/defaults/BotCommand.java b/src/main/java/baritone/command/defaults/BotCommand.java index 7f2605ab8..1063878af 100644 --- a/src/main/java/baritone/command/defaults/BotCommand.java +++ b/src/main/java/baritone/command/defaults/BotCommand.java @@ -18,17 +18,16 @@ package baritone.command.defaults; import baritone.api.IBaritone; +import baritone.api.bot.IBaritoneUser; import baritone.api.bot.connect.IConnectionResult; import baritone.api.command.Command; import baritone.api.command.argument.IArgConsumer; import baritone.api.command.exception.CommandException; +import baritone.api.command.exception.CommandInvalidTypeException; import baritone.bot.UserManager; import net.minecraft.util.Session; -import java.net.InetAddress; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Stream; /** @@ -43,10 +42,28 @@ public class BotCommand extends Command { @Override public void execute(String label, IArgConsumer args) throws CommandException { - args.requireMax(0); - IConnectionResult result = UserManager.INSTANCE.connect( - new Session("Bot" + System.currentTimeMillis() % 1000, UUID.randomUUID().toString(), "", "")); - logDirect(result.toString()); + if (args.hasExactly(0)) { + IConnectionResult result = UserManager.INSTANCE.connect( + new Session("Bot" + System.currentTimeMillis() % 1000, UUID.randomUUID().toString(), "", "")); + logDirect(result.toString()); + } else if (args.hasExactly(2)) { + Action action = Action.getByName(args.getString()); + if (action == null) { + throw new CommandInvalidTypeException(args.consumed(), "an action"); + } + + Optional bot = UserManager.INSTANCE.getUserByName(args.getString()); + if (!bot.isPresent()) { + throw new CommandInvalidTypeException(args.consumed(), "a bot name"); + } + + switch (action) { + case DISCONNECT: { + UserManager.INSTANCE.disconnect(bot.get(), null); + break; + } + } + } } @Override @@ -65,7 +82,36 @@ public class BotCommand extends Command { "Spawns a bot", "", "Usage:", - "> bot" + "> bot", + "> bot " ); } + + private enum Action { + DISCONNECT("disconnect", "dc"); + private final String[] names; + + Action(String... names) { + this.names = names; + } + + public static Action getByName(String name) { + for (Action action : Action.values()) { + for (String alias : action.names) { + if (alias.equalsIgnoreCase(name)) { + return action; + } + } + } + return null; + } + + public static String[] getAllNames() { + Set names = new HashSet<>(); + for (Action action : Action.values()) { + names.addAll(Arrays.asList(action.names)); + } + return names.toArray(new String[0]); + } + } }