diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 29b9c8e..dd98bc0 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -63,4 +63,11 @@ - Used onTick instead of thread in cofl macro - Added custom listing time, 1, 6, 12, 24, 48 hours - Adding mod id hider - - Added image to minecraft mod list and oneconfig \ No newline at end of file + - Added image to minecraft mod list and oneconfig +- v2.0.4 + - Added toggle to enable custom scoreboard + - Added toggle to use shorten number when listing + - Relocated some events + - Added auto relister which run every hour by default to relist expired items + - Added detection for captcha and send webhook when captcha is detected + - A discord bot to show the items it bought and sold and to start any modules \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 28c3227..1885c82 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -56,6 +56,7 @@ val shade: Configuration by configurations.creating { repositories { maven("https://repo.polyfrost.cc/releases") + mavenCentral() } dependencies { @@ -65,6 +66,9 @@ dependencies { shade("cc.polyfrost:oneconfig-wrapper-launchwrapper:1.0.0-beta+") compileOnly("org.projectlombok:lombok:1.18.26") annotationProcessor("org.projectlombok:lombok:1.18.26") + implementation("net.dv8tion:JDA:5.0.0-beta.9") { + exclude (module = "opus-java") + } } } diff --git a/gradle.properties b/gradle.properties index 3f3c982..5f7a6bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name = Lilase mod_id = lilase -mod_version = 2.0.4 +mod_version = 3.0.0 essential.defaults.loom=0 diff --git a/src/main/java/me/night0721/lilase/Lilase.java b/src/main/java/me/night0721/lilase/Lilase.java index 6eb1dc6..61ff3f6 100644 --- a/src/main/java/me/night0721/lilase/Lilase.java +++ b/src/main/java/me/night0721/lilase/Lilase.java @@ -5,12 +5,17 @@ import cc.polyfrost.oneconfig.events.event.InitializationEvent; import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; import me.night0721.lilase.config.AHConfig; import me.night0721.lilase.config.ConfigHandler; +import me.night0721.lilase.events.ChatReceivedEvent; import me.night0721.lilase.events.SniperFlipperEvents; import me.night0721.lilase.features.claimer.Claimer; import me.night0721.lilase.features.cofl.Cofl; //import me.night0721.lilase.features.pageflipper.PageFlipper; import me.night0721.lilase.features.cofl.QueueItem; -import me.night0721.lilase.gui.ImageRenderer; +import me.night0721.lilase.features.flipper.Flipper; +import me.night0721.lilase.features.flipper.FlipperState; +import me.night0721.lilase.features.relister.Relister; +import me.night0721.lilase.gui.GUIRenderer; +import me.night0721.lilase.remotecontrol.RemoteControl; import me.night0721.lilase.utils.Clock; import me.night0721.lilase.utils.KeyBindingManager; import me.night0721.lilase.utils.Utils; @@ -26,32 +31,40 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import static me.night0721.lilase.config.AHConfig.RECONNECT_DELAY; +import static me.night0721.lilase.config.AHConfig.*; +import static me.night0721.lilase.features.flipper.Flipper.icon; +import static me.night0721.lilase.features.flipper.Flipper.webhook; @Mod(modid = Lilase.MODID, name = Lilase.MOD_NAME, version = Lilase.VERSION, acceptedMinecraftVersions = "[1.8.9]") public class Lilase { public static final String MOD_NAME = "Lilase"; public static final String MODID = "Lilase"; - public static final String VERSION = "2.0.4"; + public static final String VERSION = "3.0.0"; public static final Minecraft mc = Minecraft.getMinecraft(); // public static PageFlipper pageFlipper; public static Claimer claimer; + public static Relister relister; public static Cofl cofl; public static AHConfig config; public static ConfigHandler configHandler; private int tickAmount; private final Clock clock = new Clock(); + public static RemoteControl remoteControl; @Mod.EventHandler public void init(FMLInitializationEvent event) { (configHandler = new ConfigHandler()).init(); KeyBindingManager keyBindingManager = new KeyBindingManager(); - addToEventBus(this, keyBindingManager, new SniperFlipperEvents(), new ImageRenderer()); + addToEventBus(this, keyBindingManager, new SniperFlipperEvents(), new ChatReceivedEvent(), new GUIRenderer()); EventManager.INSTANCE.register(this); // pageFlipper = new PageFlipper(); keyBindingManager.registerKeyBindings(); (cofl = new Cofl()).onOpen(); claimer = new Claimer(); + relister = new Relister(); + webhook.setUsername("Lilase"); + webhook.setAvatarUrl(icon); + remoteControl = new RemoteControl(); } private void addToEventBus(Object... objects) { @@ -69,8 +82,13 @@ public class Lilase { tickAmount++; if (tickAmount % 20 == 0) Utils.checkFooter(); // if (pageFlipper != null) pageFlipper.switchStates(); + if (tickAmount % (RELIST_CHECK_TIMEOUT * 72_000) == 0) { + relister.shouldBeRelisting = true; + if (Flipper.state == FlipperState.NONE) relister.toggle(); + } if (claimer != null) claimer.onTick(); - if (cofl.getOpen() && !cofl.queue.isEmpty() && !cofl.queue.isRunning()) { + if (relister != null) relister.onTick(); + if (cofl.isOpen() && !cofl.queue.isEmpty() && !cofl.queue.isRunning()) { cofl.queue.setRunning(true); QueueItem item = cofl.queue.get(); item.openAuction(); diff --git a/src/main/java/me/night0721/lilase/config/AHConfig.java b/src/main/java/me/night0721/lilase/config/AHConfig.java index c1b6f08..ebad635 100644 --- a/src/main/java/me/night0721/lilase/config/AHConfig.java +++ b/src/main/java/me/night0721/lilase/config/AHConfig.java @@ -10,21 +10,32 @@ import me.night0721.lilase.Lilase; public class AHConfig extends Config { public AHConfig() { - super(new Mod("Lilase", ModType.SKYBLOCK, "/assets/lilase.png", 100, 100), "lilase.json"); + super(new Mod("Lilase", ModType.SKYBLOCK, "/assets/lilase.png", 84, 84), "lilase.json"); initialize(); addListener("SEND_MESSAGE", () -> Lilase.configHandler.setBoolean("SendMessageToWebhook", SEND_MESSAGE)); addListener("WEBHOOK", () -> Lilase.configHandler.setString("Webhook", WEBHOOK)); - addListener("RECONNECT_DELAY", () -> Lilase.configHandler.setInt("ReconnectDelay", Math.round(RECONNECT_DELAY))); + addListener("RECONNECT_DELAY", () -> Lilase.configHandler.setInt("ReconnectDelay", RECONNECT_DELAY)); addListener("BED_SPAM", () -> Lilase.configHandler.setBoolean("BedSpam", BED_SPAM)); - addListener("BED_SPAM_DELAY", () -> Lilase.configHandler.setInt("BedSpamDelay", Math.round(BED_SPAM_DELAY))); + addListener("BED_SPAM_DELAY", () -> Lilase.configHandler.setInt("BedSpamDelay", BED_SPAM_DELAY)); addListener("ONLY_SNIPER", () -> Lilase.configHandler.setBoolean("OnlySniper", ONLY_SNIPER)); addListener("GUI", () -> Lilase.configHandler.setBoolean("GUI", GUI)); addListener("GUI_COLOR", () -> Lilase.configHandler.setInt("GUI_COLOR", GUI_COLOR.getRGB())); - addListener("RELIST_TIMEOUT", () -> Lilase.configHandler.setInt("RelistTimeout", Math.round(RELIST_TIMEOUT))); + addListener("RELIST_TIMEOUT", () -> Lilase.configHandler.setInt("RelistTimeout", RELIST_TIMEOUT)); addListener("DEBUG", () -> Lilase.configHandler.setBoolean("Debug", DEBUG)); - addListener("AUCTION_LENGTH", () -> Lilase.configHandler.setInt("AuctionLength", Math.round(AUCTION_LENGTH))); + addListener("AUCTION_LENGTH", () -> Lilase.configHandler.setInt("AuctionLength", AUCTION_LENGTH)); + addListener("AUTO_RELIST", () -> Lilase.configHandler.setBoolean("AutoRelist", AUTO_RELIST)); + addListener("AUTO_CLAIM", () -> Lilase.configHandler.setBoolean("AutoClaim", AUTO_CLAIM)); + addListener("RELIST_CHECK_TIMEOUT", () -> Lilase.configHandler.setFloat("RelistCheckTimeout", RELIST_CHECK_TIMEOUT)); + addListener("CUSTOM_SCOREBOARD", () -> Lilase.configHandler.setBoolean("CustomScoreboard", CUSTOM_SCOREBOARD)); + addListener("SHORTEN_NUMBERS", () -> Lilase.configHandler.setBoolean("ShortenNumbers", SHORTEN_NUMBERS)); + addListener("REMOTE_CONTROL", () -> Lilase.configHandler.setBoolean("RemoteControl", REMOTE_CONTROL)); + addListener("BOT_TOKEN", () -> Lilase.configHandler.setString("BotToken", BOT_TOKEN)); + addListener("LOG_CHANNEL", () -> Lilase.configHandler.setString("LogChannel", LOG_CHANNEL)); addDependency("WEBHOOK", "SEND_MESSAGE"); addDependency("GUI_COLOR", "GUI"); + addDependency("RELIST_CHECK_TIMEOUT", "AUTO_RELIST"); + addDependency("BOT_TOKEN", "REMOTE_CONTROL"); + addDependency("LOG_CHANNEL", "REMOTE_CONTROL"); } @Switch(name = "Bed Spam & Skip Confirm", category = "Auction House", subcategory = "Sniper", description = "Spam the bed to buy the item just after the grace period ends and skips the confirmation of buying the item") @@ -35,9 +46,22 @@ public class AHConfig extends Config { @Number(name = "Relist timeout (ms)", min = 1500, max = 60000, step = 500, category = "Auction House", subcategory = "Flipper", description = "Delay between buying and relisting an item (milliseconds)") public static int RELIST_TIMEOUT = 1500; + + @Number(name = "Relist check timeout (hours)", min = 0.5f, max = 2f, category = "Auction House", subcategory = "Flipper", description = "Delay between checking if an item is expired and relisting it (hours)") + public static float RELIST_CHECK_TIMEOUT = 1f; + @Dropdown(name = "Auction Listing Length", options = {"1 Hour", "6 Hours", "12 Hours", "24 Hours", "2 Days"}, category = "Auction House", subcategory = "Flipper", description = "Length of the auction listing") public static int AUCTION_LENGTH = 2; + @Checkbox(name = "Shorten Numbers when listing", category = "Auction House", subcategory = "Flipper", description = "Shorten numbers when listing items") + public static boolean SHORTEN_NUMBERS = false; + + @Checkbox(name = "Auto Relist", category = "Auction House", subcategory = "Flipper", description = "Automatically relist items after auctions are expired") + public static boolean AUTO_RELIST = true; + + @Checkbox(name = "Auto Claim", category = "Auction House", subcategory = "Flipper", description = "Automatically claim items when it is bought") + public static boolean AUTO_CLAIM = true; + @Switch(name = "Debug", category = "Auction House", subcategory = "Sniper", description = "Debug mode") public static boolean DEBUG = false; @@ -64,4 +88,16 @@ public class AHConfig extends Config { @Color(name = "GUI Color", category = "GUI") public static OneColor GUI_COLOR = new OneColor(0, 49, 83); + + @Switch(name = "Custom Scoreboard", category = "GUI", description = "Enable the custom scoreboard") + public static boolean CUSTOM_SCOREBOARD = true; + + @Switch(name = "Remote Control", category = "Remote Control", description = "Enable remote control") + public static boolean REMOTE_CONTROL = false; + + @Text(name = "Bot Token", placeholder = "Token", category = "Remote Control", description = "Discord bot token") + public static String BOT_TOKEN = ""; + + @Text(name = "Log Channel", placeholder = "Channel ID", category = "Remote Control", description = "Discord channel ID to log messages to") + public static String LOG_CHANNEL = ""; } diff --git a/src/main/java/me/night0721/lilase/config/ConfigHandler.java b/src/main/java/me/night0721/lilase/config/ConfigHandler.java index fabd135..70fb9fb 100644 --- a/src/main/java/me/night0721/lilase/config/ConfigHandler.java +++ b/src/main/java/me/night0721/lilase/config/ConfigHandler.java @@ -21,7 +21,6 @@ public class ConfigHandler { if (hasNoKey("SendMessageToWebhook")) setBoolean("SendMessageToWebhook", true); if (hasNoKey("Webhook")) setString("Webhook", ""); if (hasNoKey("ReconnectDelay")) setInt("ReconnectDelay", 20); - if (hasNoKey("AuctionHouseDelay")) setInt("AuctionHouseDelay", 8); if (hasNoKey("SniperMode")) setBoolean("SniperMode", true); if (hasNoKey("BedSpam")) setBoolean("BedSpam", true); if (hasNoKey("BedSpamDelay")) setInt("BedSpamDelay", 100); @@ -31,6 +30,13 @@ public class ConfigHandler { if (hasNoKey("Debug")) setBoolean("Debug", false); if (hasNoKey("RelistTimeout")) setInt("RelistTimeout", 1500); if (hasNoKey("AuctionLength")) setInt("AuctionLength", 2); + if (hasNoKey("AutoRelist")) setBoolean("AutoRelist", true); + if (hasNoKey("AutoClaim")) setBoolean("AutoClaim", true); + if (hasNoKey("CustomScoreboard")) setBoolean("CustomScoreboard", true); + if (hasNoKey("ShortenNumbers")) setBoolean("ShortenNumbers", true); + if (hasNoKey("RemoteControl")) setBoolean("RemoteControl", false); + if (hasNoKey("BotToken")) setString("BotToken", ""); + if (hasNoKey("LogChannel")) setString("LogChannel", ""); } public JsonObject readConfigFile() { @@ -38,7 +44,10 @@ public class ConfigHandler { File configFile = new File(System.getProperty("user.dir") + path); if (configFile.exists()) return new JsonParser().parse(new FileReader(configFile)).getAsJsonObject(); else { - configFile.createNewFile(); + boolean success = configFile.createNewFile(); + if (!success) { + System.out.println("Failed to create config file"); + } BufferedWriter writer = new BufferedWriter(new FileWriter(configFile)); writer.write("{}"); writer.close(); @@ -61,6 +70,11 @@ public class ConfigHandler { return null; } + public boolean getBoolean(String key) { + config = readConfigFile(); + if (config.get(key) != null) return config.get(key).getAsBoolean(); + return false; + } public void setBoolean(String key, boolean value) { config = readConfigFile(); @@ -76,6 +90,13 @@ public class ConfigHandler { writeJsonToFile(config); } + public void setFloat(String key, float value) { + config = readConfigFile(); + if (config.get(key) != null) config.remove(key); + config.addProperty(key, value); + writeJsonToFile(config); + } + public void setString(String key, String value) { config = readConfigFile(); if (config.get(key) != null) config.remove(key); diff --git a/src/main/java/me/night0721/lilase/events/ChatReceivedEvent.java b/src/main/java/me/night0721/lilase/events/ChatReceivedEvent.java new file mode 100644 index 0000000..b0f0692 --- /dev/null +++ b/src/main/java/me/night0721/lilase/events/ChatReceivedEvent.java @@ -0,0 +1,171 @@ +package me.night0721.lilase.events; + +import me.night0721.lilase.Lilase; +import me.night0721.lilase.features.flipper.Flipper; +import me.night0721.lilase.features.flipper.FlipperState; +import me.night0721.lilase.remotecontrol.BotUtils; +import me.night0721.lilase.utils.*; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.utils.FileUpload; +import net.minecraft.init.Blocks; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.awt.*; +import java.io.File; +import java.util.HashMap; +import java.util.Objects; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static me.night0721.lilase.config.AHConfig.*; +import static me.night0721.lilase.features.flipper.Flipper.*; + +public class ChatReceivedEvent { + private final Pattern AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"); + + @SubscribeEvent + public void onChat(ClientChatReceivedEvent event) { + String message = event.message.getUnformattedText(); + if (!message.contains(":")) { + if (message.startsWith("§6[Auction]")) { + // §6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK + Matcher matcher = AUCTION_SOLD_PATTERN.matcher(ScoreboardUtils.cleanSB(message)); + if (matcher.matches()) { + + String purchaser; + try { + purchaser = matcher.group(1).split("\\[Auction] ")[1]; + } catch (Exception ignored) { + purchaser = message.split("\\[Auction] ")[1].split(" bought")[0]; + } + HashMap sold_item = new HashMap<>(); + sold_item.put("item", matcher.group(2)); + sold_item.put("price", matcher.group(3)); + Lilase.cofl.sold_items.add(sold_item); + if (SEND_MESSAGE) { + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject().setTitle("Someone bought an item!").setFooter("Purse: " + format.format(Utils.getPurse()), icon).addField("Item:", matcher.group(2), true).addField("Price:", matcher.group(3), true).addField("Purchaser:", purchaser, true).setColor(Color.decode("#003153"))); + webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + } + if (AUTO_CLAIM) { + if (state == FlipperState.NONE) { + Utils.debugLog("Claiming items as if Claimer and Flipper aren't open"); + if (!Lilase.claimer.isOpen()) Lilase.claimer.toggle(); + } else { + Utils.debugLog("Claiming items after Flipper is done"); + } + } + } + } + if (message.equals("You didn't participate in this auction!")) { + Utils.debugLog("Failed to buy item, not fast enough. Closing the menu"); + InventoryUtils.clickOpenContainerSlot(49); + } + if (message.equals("You don't have enough coins to afford this bid!")) { + Utils.debugLog("Failed to buy item, not enough money. Closing the menu"); + InventoryUtils.clickOpenContainerSlot(49); + } + if (message.equals("Your starting bid must be at least 10 coins!") || message.contains("Can't create a BIN auction for this item for a PRICE this LOW!")) { + InventoryUtils.clickOpenContainerSlot(13); + Lilase.mc.thePlayer.closeScreen(); + Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper"); + Lilase.cofl.toggleAuction(); + Flipper.state = FlipperState.NONE; + } + if (message.contains("You were spawned in Limbo")) { + try { + Utils.debugLog("Detected in Limbo, stopping everything for 5 minutes"); + Utils.addTitle("You got sent to Limbo!"); + Flipper.state = FlipperState.NONE; + if (Lilase.cofl.isOpen()) Lilase.cofl.toggleAuction(); + Thread.sleep(5000); + Utils.sendServerMessage("/lobby"); + Thread.sleep(5000); + Utils.sendServerMessage("/skyblock"); + Thread bzchillingthread = new Thread(bazaarChilling); + bzchillingthread.start(); + } catch (Exception ignored) { + } + } + if (message.contains("Hello there, you acted suspiciously like a macro bot")) { + Utils.debugLog("Detected macro"); + if (REMOTE_CONTROL) { + TextChannel channel = Lilase.remoteControl.bot.getTextChannelById(Long.parseLong(LOG_CHANNEL)); + if (channel != null) { + FileUpload screenshot = FileUpload.fromData(new File(Objects.requireNonNull(BotUtils.takeScreenShot())), "image.png"); + channel.sendMessageEmbeds( + new EmbedBuilder() + .setTitle("Detected as macro"). + setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .setDescription("Detected as macro, please login to solve the captcha as soon as possible") + .setColor(Color.decode("#003153")) + .setImage("attachment://image.png") + .build() + ).addFiles(screenshot).queue(); + } + } + if (SEND_MESSAGE) { + try { + webhook.addEmbed( + new DiscordWebhook.EmbedObject() + .setTitle("Detected as macro") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .setDescription("Detected as macro, please login to solve the captcha as soon as possible") + .setColor(Color.decode("#003153"))); + webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + } + } + } + } + + private final Runnable bazaarChilling = () -> { + try { + rotation.reset(); + rotation.easeTo(103f, -11f, 1000); + Thread.sleep(1500); + KeyBindingManager.updateKeys(true, false, false, false, false, true, false); + long timeout = System.currentTimeMillis(); + boolean timedOut = false; + while (BlockUtils.getRelativeBlock(0, 0, 1) != Blocks.spruce_stairs) { + if ((System.currentTimeMillis() - timeout) > 10000) { + Utils.debugLog("Couldn't find bz, gonna chill here"); + timedOut = true; + break; + } + } + KeyBindingManager.stopMovement(); + Random random = new Random(); + if (!timedOut) { + // about 5 minutes + for (int i = 0; i < 50; i++) { + Thread.sleep(6000); + KeyBindingManager.rightClick(); + Thread.sleep(3000); + InventoryUtils.clickOpenContainerSlot(random.nextInt(20)); + Lilase.mc.thePlayer.closeScreen(); + } + } else { + Thread.sleep(1000 * 60 * 5); + } + Lilase.mc.thePlayer.sendChatMessage("/hub"); + Thread.sleep(6000); + Lilase.cofl.toggleAuction(); + } catch (Exception ignore) { + } + + }; + +} diff --git a/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java b/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java index 854f3c4..da23b71 100644 --- a/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java +++ b/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java @@ -5,10 +5,8 @@ import me.night0721.lilase.config.AHConfig; import me.night0721.lilase.features.cofl.QueueItem; import me.night0721.lilase.features.flipper.Flipper; import me.night0721.lilase.features.flipper.FlipperState; -import me.night0721.lilase.gui.TextRenderer; import me.night0721.lilase.player.EffectState; import me.night0721.lilase.utils.*; -import net.minecraft.client.Minecraft; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -19,87 +17,23 @@ import net.minecraft.network.play.server.S2DPacketOpenWindow; import net.minecraft.network.play.server.S2FPacketSetSlot; import net.minecraft.network.play.server.S33PacketUpdateSign; import net.minecraft.util.IChatComponent; -import net.minecraftforge.client.event.ClientChatReceivedEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.input.Keyboard; -import java.awt.*; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static me.night0721.lilase.config.AHConfig.*; import static me.night0721.lilase.features.flipper.Flipper.*; import static me.night0721.lilase.features.flipper.FlipperState.TIME; +import static me.night0721.lilase.utils.InventoryUtils.clickWindow; import static me.night0721.lilase.utils.PlayerUtils.sendPacketWithoutEvent; public class SniperFlipperEvents { - private final Clock clock = new Clock(); public static final ArrayList selling_queue = new ArrayList<>(); - private final Pattern AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"); - - @SubscribeEvent - public void onChat(ClientChatReceivedEvent event) throws InterruptedException { - String message = event.message.getUnformattedText(); - if (!message.contains(":")) { - if (message.startsWith("§6[Auction]")) { - // §6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK - Matcher matcher = AUCTION_SOLD_PATTERN.matcher(ScoreboardUtils.cleanSB(message)); - if (matcher.matches()) { - Lilase.cofl.incrementAuctionsFlipped(); - String purchaser; - try { - purchaser = matcher.group(1).split("\\[Auction] ")[1]; - } catch (Exception ignored) { - purchaser = message.split("\\[Auction] ")[1].split(" bought")[0]; - } - if (SEND_MESSAGE) { - try { - webhook.setUsername("Lilase"); - webhook.setAvatarUrl(icon); - webhook.addEmbed(new DiscordWebhook.EmbedObject().setTitle("Someone bought an item!").setFooter("Purse: " + format.format(Utils.getPurse()), icon).addField("Item:", matcher.group(2), true).addField("Price:", matcher.group(3), true).addField("Purchaser:", purchaser, true).setColor(Color.decode("#003153"))); - webhook.execute(); - Utils.debugLog("Notified Webhook"); - } catch (Exception e) { - e.printStackTrace(); - Utils.debugLog("Failed to send webhook"); - } - } - } - } - if (message.equals("You didn't participate in this auction!")) { - Utils.debugLog("Failed to buy item, not fast enough. Closing the menu"); - InventoryUtils.clickOpenContainerSlot(49); - } - if (message.equals("You don't have enough coins to afford this bid!")) { - Utils.debugLog("Failed to buy item, not enough money. Closing the menu"); - InventoryUtils.clickOpenContainerSlot(49); - } - if (message.equals("Your starting bid must be at least 10 coins!") || message.contains("Can't create a BIN auction for this item for a PRICE this LOW!")) { - InventoryUtils.clickOpenContainerSlot(13); - Lilase.mc.thePlayer.closeScreen(); - Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper"); - Lilase.cofl.toggleAuction(); - Flipper.state = FlipperState.NONE; - } - if (message.contains("You were spawned in Limbo")) { - Utils.debugLog("Detected in Limbo, stopping everything for 5 minutes"); - Utils.addTitle("You got sent to Limbo!"); - Flipper.state = FlipperState.NONE; - if (Lilase.cofl.getOpen()) Lilase.cofl.toggleAuction(); - Thread.sleep(5000); - Utils.sendServerMessage("/lobby"); - Thread.sleep(5000); - Utils.sendServerMessage("/skyblock"); - Thread bzchillingthread = new Thread(bazaarChilling); - bzchillingthread.start(); - } - } - } + public static boolean ah_full = false; @SubscribeEvent public void onTick(TickEvent.ClientTickEvent event) { @@ -110,51 +44,6 @@ public class SniperFlipperEvents { } } - private final Runnable bazaarChilling = () -> { - try { - rotation.reset(); - rotation.easeTo(103f, -11f, 1000); - Thread.sleep(1500); - KeyBindingManager.updateKeys(true, false, false, false, false, true, false); - long timeout = System.currentTimeMillis(); - boolean timedOut = false; - while (BlockUtils.getRelativeBlock(0, 0, 1) != Blocks.spruce_stairs) { - if ((System.currentTimeMillis() - timeout) > 10000) { - Utils.debugLog("Couldn't find bz, gonna chill here"); - timedOut = true; - break; - } - } - KeyBindingManager.stopMovement(); - - if (!timedOut) { - // about 5 minutes - for (int i = 0; i < 15; i++) { - Thread.sleep(6000); - KeyBindingManager.rightClick(); - Thread.sleep(3000); - InventoryUtils.clickOpenContainerSlot(11); - Thread.sleep(3000); - InventoryUtils.clickOpenContainerSlot(11); - Thread.sleep(3000); - InventoryUtils.clickOpenContainerSlot(10); - Thread.sleep(3000); - InventoryUtils.clickOpenContainerSlot(10); - Thread.sleep(3000); - // TODO: Remove duplication - Lilase.mc.thePlayer.closeScreen(); - } - } else { - Thread.sleep(1000 * 60 * 5); - } - Lilase.mc.thePlayer.sendChatMessage("/hub"); - Thread.sleep(6000); - Lilase.cofl.toggleAuction(); - } catch (Exception ignore) { - } - - }; - @SubscribeEvent public void onLastRender(RenderWorldLastEvent event) { if (rotation.rotating) { @@ -167,55 +56,37 @@ public class SniperFlipperEvents { if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { if (Flipper.state != FlipperState.NONE) { new Thread(() -> { - Utils.debugLog("Interrupting Flipper selling"); - selling_queue.get(0).sendInterrupt(); - selling_queue.remove(0); - Lilase.mc.thePlayer.closeScreen(); - Flipper.state = FlipperState.NONE; - Lilase.cofl.toggleAuction(); + try { + Utils.debugLog("Interrupting Flipper selling"); + selling_queue.get(0).sendInterrupt(); + selling_queue.remove(0); + Lilase.mc.thePlayer.closeScreen(); + Flipper.state = FlipperState.NONE; + Lilase.cofl.toggleAuction(); + } catch (Exception ignored) { + } }).start(); // } else if (Lilase.pageFlipper.state != PageFlipperState.NONE) { // new Thread(() -> { // Utils.debugLog("[PageFlipper] Interrupting PageFlipper sniping"); // Lilase.pageFlipper.toggleAuction(); // }).start(); - } else if (Lilase.cofl.getOpen()) { + } else if (Lilase.cofl.isOpen()) { Lilase.cofl.toggleAuction(); } } } - @SubscribeEvent - public void onGuiRender(RenderGameOverlayEvent event) { - if (event.type == RenderGameOverlayEvent.ElementType.TEXT) { - if (AHConfig.GUI) { - Calendar cal = Calendar.getInstance(); - cal.setTimeZone(TimeZone.getDefault()); - int hour = cal.get(Calendar.HOUR_OF_DAY); - int minute = cal.get(Calendar.MINUTE); - String time = String.format("%02d:%02d", hour, minute); - int days = (int) (Lilase.mc.theWorld.getWorldTime() / 24000); - String lines = "X: " + Math.round(Lilase.mc.thePlayer.posX) + "\n" + "Y: " + Math.round(Lilase.mc.thePlayer.posY) + "\n" + "Z: " + Math.round(Lilase.mc.thePlayer.posZ) + "\n" + time + "\n" + "FPS: " + Minecraft.getDebugFPS() + "\n" + "Day: " + days + "\n" + "Auctions Sniped: " + Lilase.cofl.getAuctionsSniped() + "\n" + "Auctions Posted: " + Lilase.cofl.getAuctionsPosted() + "\n" + "Auctions Flipped: " + Lilase.cofl.getAuctionsFlipped() + "\n"; - TextRenderer.drawString(lines, 0, 0, 0.9, GUI_COLOR.getRGB()); - } - } else if (event.type == RenderGameOverlayEvent.ElementType.CHAT) { - if (AHConfig.HKNO1) { - TextRenderer.drawGradientString(Lilase.mc.fontRendererObj, "Lilase", 50, 100, 0x00FBAA, 0xFF3EFC); - TextRenderer.drawAnimatedString(Lilase.mc.fontRendererObj, "Hong Kong No.1", 50, 110, 0x00FBAA, 0xFF3EFC, 0.5f); - } - } - } - private int latestWindowId = -1; private final Thread spam = new Thread(() -> { int tries = 0; try { while (tries < 50) { - if (clock.passed()) { + if (InventoryUtils.inventoryNameStartsWith("BIN Auction View")) { clickWindow(latestWindowId, 31); clickWindow(latestWindowId + 1, 11); tries++; - clock.schedule(AHConfig.BED_SPAM_DELAY); + Thread.sleep(BED_SPAM_DELAY); } } } catch (Exception ignored) { @@ -224,8 +95,8 @@ public class SniperFlipperEvents { @SubscribeEvent public void onPacketReceive(PacketReceivedEvent event) { - if (AHConfig.BED_SPAM && Lilase.cofl.getOpen()) { -// if (AHConfig.BED_SPAM && (Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) { + if (AHConfig.BED_SPAM && Lilase.cofl.isOpen()) { +// if (AHConfig.BED_SPAM && (Lilase.pageFlipper.isOpen() || Lilase.cofl.isOpen())) { if (event.packet instanceof S2DPacketOpenWindow && ((S2DPacketOpenWindow) event.packet).getGuiId().equals("minecraft:chest")) { S2DPacketOpenWindow packetOpenWindow = (S2DPacketOpenWindow) event.packet; if (packetOpenWindow.getWindowTitle().getUnformattedText().equals("BIN Auction View")) @@ -243,6 +114,13 @@ public class SniperFlipperEvents { if (!threadStatus) { spam.start(); } + new Thread(() -> { + try { + Thread.sleep(4000); + spam.interrupt(); + } catch (Exception ignored) { + } + }).start(); } else if (itemStack.getItem() == Items.gold_nugget || Item.getItemFromBlock(Blocks.gold_block) == itemStack.getItem()) { if (spam.isAlive()) { spam.interrupt(); @@ -253,8 +131,8 @@ public class SniperFlipperEvents { Utils.debugLog("Auction was bought by someone else, closing window"); Lilase.mc.thePlayer.closeScreen(); } - } else if (stack != null && packetSetSlot.func_149175_c() == 0 && Lilase.cofl.getOpen()) { -// } else if (stack != null && packetSetSlot.func_149175_c() == 0 && (Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) { + } else if (stack != null && packetSetSlot.func_149175_c() == 0 && Lilase.cofl.isOpen()) { +// } else if (stack != null && packetSetSlot.func_149175_c() == 0 && (Lilase.pageFlipper.isOpen() || Lilase.cofl.isOpen())) { try { String uuid = stack.getTagCompound().getCompoundTag("ExtraAttributes").getString("uuid"); String uid = uuid.split("-")[4]; @@ -264,6 +142,10 @@ public class SniperFlipperEvents { int slot = packetSetSlot.func_149173_d(); NBTTagCompound tag = stack.getTagCompound(); System.out.println("Slot: " + slot + "\nStack Name: " + unFormattedName + " \nStack NBT: " + tag); + HashMap map = new HashMap<>(); + map.put("name", unFormattedName); + map.put("price", format.format(item.price)); + Lilase.cofl.bought_items.add(map); new Thread(() -> { if (!ONLY_SNIPER) { item.flipper = new Flipper(item.name, item.price, item.target, uuid); @@ -292,7 +174,8 @@ public class SniperFlipperEvents { IChatComponent[] lines = packetUpdateSign.getLines(); Utils.debugLog("Target Price: " + selling_queue.get(0).target, "Shortened Target Price: " + Utils.convertToShort(selling_queue.get(0).target)); Thread.sleep(300); - lines[0] = IChatComponent.Serializer.jsonToComponent("{\"text\":\"" + Utils.convertToShort(selling_queue.get(0).target) + "\"}"); + String price = SHORTEN_NUMBERS ? Utils.convertToShort(selling_queue.get(0).target) : String.valueOf(selling_queue.get(0).target); + lines[0] = IChatComponent.Serializer.jsonToComponent("{\"text\":\"" + price + "\"}"); sendPacketWithoutEvent(new C12PacketUpdateSign(packetUpdateSign.getPos(), lines)); } catch (RuntimeException | InterruptedException e) { e.printStackTrace(); @@ -300,8 +183,4 @@ public class SniperFlipperEvents { } } } - - public static void clickWindow(int window, int slot) { - Lilase.mc.playerController.windowClick(window, slot, 0, 0, Lilase.mc.thePlayer); - } } diff --git a/src/main/java/me/night0721/lilase/features/claimer/Claimer.java b/src/main/java/me/night0721/lilase/features/claimer/Claimer.java index b7f5225..bc0960a 100644 --- a/src/main/java/me/night0721/lilase/features/claimer/Claimer.java +++ b/src/main/java/me/night0721/lilase/features/claimer/Claimer.java @@ -3,6 +3,7 @@ package me.night0721.lilase.features.claimer; import me.night0721.lilase.Lilase; import me.night0721.lilase.features.flipper.Flipper; import me.night0721.lilase.features.flipper.FlipperState; +import me.night0721.lilase.features.relister.RelisterState; import me.night0721.lilase.features.sniper.Sniper; import me.night0721.lilase.player.EffectState; import me.night0721.lilase.utils.*; @@ -13,12 +14,14 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagList; +import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.Objects; import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; -import static me.night0721.lilase.events.SniperFlipperEvents.clickWindow; +import static me.night0721.lilase.events.SniperFlipperEvents.ah_full; +import static me.night0721.lilase.utils.InventoryUtils.clickWindow; import static me.night0721.lilase.features.flipper.Flipper.*; import static me.night0721.lilase.utils.KeyBindingManager.stopMovement; @@ -91,6 +94,11 @@ public class Claimer extends Sniper { Utils.debugLog("Claimed all sold items"); toClaim.clear(); if (isOpen()) toggle(); + if (ah_full) { + ah_full = false; + Utils.debugLog("Continue sniping after claiming"); + Lilase.cofl.toggleAuction(); + } return; } for (int i = 10; i <= 25; i++) { @@ -110,6 +118,21 @@ public class Claimer extends Sniper { clickWindow(Lilase.mc.thePlayer.openContainer.windowId, i); Thread.sleep(300); clickWindow(Lilase.mc.thePlayer.openContainer.windowId + 1, 31); + if (SEND_MESSAGE) { + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Just claimed an item!") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", ScoreboardUtils.cleanSB(is.getDisplayName()), true) + .setColor(Color.decode("#003153")) + ); + webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + } cooldown.schedule(500); break; } catch (InterruptedException ignore) { @@ -126,7 +149,6 @@ public class Claimer extends Sniper { case NONE: break; } - } @Override @@ -149,6 +171,11 @@ public class Claimer extends Sniper { setOpen(false); return; } + if (Lilase.relister.state != RelisterState.NONE) { + Utils.sendMessage("Relister is running, stopping"); + setOpen(false); + return; + } if (Utils.cookie == EffectState.ON || Utils.checkInHub()) { Utils.sendMessage("Started Auto Claimer"); setOpen(true); diff --git a/src/main/java/me/night0721/lilase/features/cofl/Cofl.java b/src/main/java/me/night0721/lilase/features/cofl/Cofl.java index 05322df..422b430 100644 --- a/src/main/java/me/night0721/lilase/features/cofl/Cofl.java +++ b/src/main/java/me/night0721/lilase/features/cofl/Cofl.java @@ -3,6 +3,7 @@ package me.night0721.lilase.features.cofl; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.Getter; +import lombok.Setter; import me.night0721.lilase.Lilase; import me.night0721.lilase.features.flipper.Flipper; import me.night0721.lilase.features.flipper.FlipperState; @@ -11,6 +12,8 @@ import me.night0721.lilase.utils.UngrabUtils; import me.night0721.lilase.utils.Utils; import java.io.PrintStream; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Random; import java.util.regex.Pattern; @@ -18,20 +21,9 @@ import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; public class Cofl { public final Queue queue = new Queue(); - private boolean open = false; - public @Getter int auctionsSniped = 0; - public @Getter int auctionsPosted = 0; - public @Getter int auctionsFlipped = 0; - - public void incrementAuctionsSniped() { - this.auctionsSniped += 1; - } - public void incrementAuctionsPosted() { - this.auctionsPosted += 1; - } - public void incrementAuctionsFlipped() { - this.auctionsFlipped += 1; - } + private @Getter @Setter boolean open = false; + public ArrayList> sold_items = new ArrayList<>(); + public ArrayList> bought_items = new ArrayList<>(); public void onOpen() { System.setOut(new PrintStream(System.out) { @@ -46,7 +38,7 @@ public class Cofl { public void handleMessage(String str) { try { - if (!getOpen() || !str.startsWith("Received:")) return; + if (!isOpen() || !str.startsWith("Received:")) return; if (pattern.matcher(str).find()) { Random random = new Random(); Lilase.mc.thePlayer.inventory.currentItem = random.nextInt(9); @@ -72,7 +64,7 @@ public class Cofl { public void toggleAuction() { - if (getOpen()) { + if (isOpen()) { Utils.sendMessage("Stopped COFL Sniper"); Lilase.mc.thePlayer.closeScreen(); queue.clear(); @@ -102,15 +94,6 @@ public class Cofl { } } - - public boolean getOpen() { - return open; - } - - public void setOpen(boolean open) { - this.open = open; - } - public Queue getQueue() { return this.queue; } diff --git a/src/main/java/me/night0721/lilase/features/flipper/Flipper.java b/src/main/java/me/night0721/lilase/features/flipper/Flipper.java index 73c6e85..5001640 100644 --- a/src/main/java/me/night0721/lilase/features/flipper/Flipper.java +++ b/src/main/java/me/night0721/lilase/features/flipper/Flipper.java @@ -1,6 +1,7 @@ package me.night0721.lilase.features.flipper; import me.night0721.lilase.Lilase; +import me.night0721.lilase.features.relister.RelisterState; import me.night0721.lilase.player.EffectState; import me.night0721.lilase.player.Rotation; import me.night0721.lilase.utils.*; @@ -16,6 +17,7 @@ import java.text.NumberFormat; import java.util.Locale; import static me.night0721.lilase.config.AHConfig.*; +import static me.night0721.lilase.events.SniperFlipperEvents.ah_full; import static me.night0721.lilase.events.SniperFlipperEvents.selling_queue; // TODO: Fix repeating code (I will do it soon) @@ -44,9 +46,14 @@ public class Flipper { public void sellItem() { Utils.checkFooter(); - Lilase.cofl.incrementAuctionsSniped(); + if (Lilase.relister.state != RelisterState.NONE) { + Utils.debugLog("Relister is running, stopping, will resume when flipper is done"); + Lilase.relister.toggle(); + } Utils.sendMessage("Flipper is running, stopping, will resume when flipper is done"); - if (Lilase.cofl.getOpen()) Lilase.cofl.toggleAuction(); + if (Lilase.cofl.isOpen()) { + Lilase.cofl.toggleAuction(); + } UngrabUtils.ungrabMouse(); Utils.debugLog("Cookie: " + (Utils.cookie == EffectState.ON ? "ON" : "OFF")); System.out.println("Slot in inventory: " + InventoryUtils.getSlotForItemm(this.uuid)); @@ -149,6 +156,7 @@ public class Flipper { buyWait.schedule(1000); } else if (slot33 != null) { if (slot33.getSubCompound("display", false).getString("Name").startsWith("§c")) { + ah_full = true; Utils.debugLog("Auction slots full, stopping sniper for a while"); selling_queue.remove(0); if (SEND_MESSAGE) { @@ -207,14 +215,27 @@ public class Flipper { buyWait.schedule(1000); } else if (InventoryUtils.inventoryNameContains("BIN Auction View") && buyWait.passed()) { InventoryUtils.clickOpenContainerSlot(49); - Lilase.cofl.incrementAuctionsPosted(); buyWait.schedule(500); Lilase.mc.thePlayer.closeScreen(); buyWait.schedule(500); - Utils.sendMessage("Posted item on Auction House, continue sniping now"); state = FlipperState.NONE; - Lilase.cofl.toggleAuction(); - selling_queue.remove(0); + if (ah_full) { + Utils.sendMessage("Posted item on Auction House, claiming item now as slots aren't full anymore"); + if (!Lilase.claimer.isOpen()) Lilase.claimer.toggle(); + } else if (Lilase.relister.toRelist.size() > 1) { + Utils.debugLog("Still have items to relist, continuing to relist"); + Lilase.relister.toggle(); + } else if (Lilase.relister.toRelist.size() == 1) { + Utils.debugLog("Relisted all items, stopping relister and continuing to snipe"); + Lilase.relister.toggle(); + Lilase.cofl.toggleAuction(); + } else if (Lilase.relister.shouldBeRelisting) { + Lilase.relister.toggle(); + } else { + Utils.sendMessage("Posted item on Auction House, continue sniping now"); + Lilase.cofl.toggleAuction(); + } + if (selling_queue.get(0) != null) selling_queue.remove(0); } case NONE: break; diff --git a/src/main/java/me/night0721/lilase/features/pageflipper/PageFlipper.java b/src/main/java/me/night0721/lilase/features/pageflipper/PageFlipper.java index f3a8b7b..fab9bfc 100644 --- a/src/main/java/me/night0721/lilase/features/pageflipper/PageFlipper.java +++ b/src/main/java/me/night0721/lilase/features/pageflipper/PageFlipper.java @@ -1,5 +1,7 @@ package me.night0721.lilase.features.pageflipper; +import lombok.Getter; +import lombok.Setter; import me.night0721.lilase.Lilase; import me.night0721.lilase.player.EffectState; import me.night0721.lilase.utils.*; @@ -14,7 +16,7 @@ import static me.night0721.lilase.features.flipper.Flipper.*; public class PageFlipper { public PageFlipperState state = PageFlipperState.NONE; public final Clock cooldown = new Clock(); - public boolean open = false; + public @Getter @Setter boolean open = false; private Thread loop; public void start() { @@ -105,7 +107,7 @@ public class PageFlipper { } public void toggleAuction() { - if (getOpen()) { + if (isOpen()) { Utils.sendMessage("Stopped Page Flipper"); Lilase.mc.thePlayer.closeScreen(); state = PageFlipperState.NONE; @@ -120,12 +122,4 @@ public class PageFlipper { } else Utils.sendMessage("Detected not in hub, please go to hub to start"); } } - - public Boolean getOpen() { - return open; - } - - public void setOpen(Boolean open) { - this.open = open; - } } diff --git a/src/main/java/me/night0721/lilase/features/relister/Relister.java b/src/main/java/me/night0721/lilase/features/relister/Relister.java new file mode 100644 index 0000000..25d7c40 --- /dev/null +++ b/src/main/java/me/night0721/lilase/features/relister/Relister.java @@ -0,0 +1,210 @@ +package me.night0721.lilase.features.relister; + +import me.night0721.lilase.Lilase; +import me.night0721.lilase.features.claimer.ClaimerState; +import me.night0721.lilase.features.flipper.Flipper; +import me.night0721.lilase.features.flipper.FlipperState; +import me.night0721.lilase.features.sniper.Sniper; +import me.night0721.lilase.player.EffectState; +import me.night0721.lilase.utils.*; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagList; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; +import static me.night0721.lilase.events.SniperFlipperEvents.selling_queue; +import static me.night0721.lilase.features.flipper.Flipper.*; +import static me.night0721.lilase.utils.InventoryUtils.clickWindow; +import static me.night0721.lilase.utils.KeyBindingManager.stopMovement; + +public class Relister extends Sniper { + public RelisterState state = RelisterState.NONE; + public boolean shouldBeRelisting = false; + public List toRelist = new ArrayList<>(); + private final Pattern BUYITNOW = Pattern.compile("Buy it now: (\\d+)"); + + @Override + public void onTick() { + switch (state) { + case WALKING_TO_FIRST_POINT: + if (Lilase.mc.currentScreen != null) { + Lilase.mc.thePlayer.closeScreen(); + } else if (distanceToFirstPoint() < 0.7f) { + System.out.println("Moving to auction house"); + KeyBindingManager.updateKeys(false, false, false, false, false); + state = RelisterState.WALKING_INTO_AUCTION_HOUSE; + } else if (distanceToFirstPoint() < 5f) { + System.out.println("Crouching to point 1"); + KeyBindingManager.updateKeys(true, false, false, false, false, true, false); + } else { + KeyBindingManager.updateKeys(true, false, false, false, false); + } + break; + case WALKING_INTO_AUCTION_HOUSE: + if (Lilase.mc.currentScreen != null) { + Lilase.mc.thePlayer.closeScreen(); + } else if (AngleUtils.smallestAngleDifference(AngleUtils.get360RotationYaw(), 88f) > 1.2) { + System.out.println("Rotating to Auction Master"); + rotation.easeTo(88f, Lilase.mc.thePlayer.rotationPitch, 500); + } else if (distanceToAuctionMaster() < 0.7f) { + Utils.debugLog("At Auction Master, opening shop"); + KeyBindingManager.updateKeys(false, false, false, false, false); + state = RelisterState.OPENING; + } else if (distanceToAuctionMaster() < 5f) { + System.out.println("Crouching to Auction Master"); + KeyBindingManager.updateKeys(true, false, false, false, false, true, false); + } else { + KeyBindingManager.updateKeys(true, false, false, false, false); + } + break; + case OPENING: + if (Utils.cookie != EffectState.ON && Lilase.mc.currentScreen == null && cooldown.passed()) { + final Entity auctionMaster = getAuctionMaster(); + if (auctionMaster == null) { + Utils.debugLog("Cannot find shop NPC, retrying"); + cooldown.schedule(500); + } else { + Lilase.mc.playerController.interactWithEntitySendPacket(Lilase.mc.thePlayer, auctionMaster); + cooldown.schedule(1500); + } + } + if (Utils.cookie == EffectState.ON) { + if (Lilase.mc.currentScreen != null) Lilase.mc.thePlayer.closeScreen(); + else Utils.sendServerMessage("/ah"); + } + if (InventoryUtils.inventoryNameContains("Auction House") && cooldown.passed()) { + InventoryUtils.clickOpenContainerSlot(15); + state = RelisterState.START; + cooldown.schedule(500); + } + case START: + if (InventoryUtils.inventoryNameContains("Manage Auctions") && cooldown.passed()) { + long relisting = Lilase.mc.thePlayer.openContainer.inventorySlots + .stream() + .filter(slot -> slot.getStack() != null) + .filter(slot -> InventoryUtils.getLore(slot.getStack()) != null) + .filter(slot -> ScoreboardUtils.cleanSB(Objects.requireNonNull(InventoryUtils.getLore(slot.getStack())).toString()).contains("Status: Expired")).count(); + System.out.println(relisting + " items to relist"); + if (relisting == 0) { + Utils.debugLog("No items to relist"); + Utils.debugLog("Relisted all expired items"); + toRelist.clear(); + if (isOpen()) toggle(); + Utils.debugLog("Continue sniping after relisting"); + Lilase.cofl.toggleAuction(); + return; + } + for (int i = 10; i <= 25; i++) { + if (i == 17 || i == 18) continue; + ItemStack is = Lilase.mc.thePlayer.openContainer.getSlot(i).getStack(); + if (is == null) continue; + Item item = is.getItem(); + if (item == Items.golden_horse_armor || item == Items.arrow || item == Item.getItemFromBlock(Blocks.hopper) || item == Item.getItemFromBlock(Blocks.stained_glass_pane) || item == Item.getItemFromBlock(Blocks.cauldron)) + continue; + NBTTagList list = InventoryUtils.getLore(is); + if (list != null) { + toRelist.add(i); + try { + System.out.println("Item NBT: " + ScoreboardUtils.cleanSB(list.toString())); + String nbtString = ScoreboardUtils.cleanSB(list.toString()); + Matcher matcher = BUYITNOW.matcher(nbtString); + if (nbtString.contains("Status: Expired") && matcher.find()) { + String name = ScoreboardUtils.cleanSB(is.getDisplayName()); + int price = (int) Long.parseLong(matcher.group(1).replace(",", "")); + int target = Math.round(price * 0.98f); + String uuid = is.getTagCompound().getCompoundTag("ExtraAttributes").getString("uuid"); + clickWindow(Lilase.mc.thePlayer.openContainer.windowId, i); + Thread.sleep(300); + clickWindow(Lilase.mc.thePlayer.openContainer.windowId + 1, 31); + Thread.sleep(300); + if (SEND_MESSAGE) { + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Relisting an item!") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", ScoreboardUtils.cleanSB(is.getDisplayName()), true) + .addField("Target Price:", format.format(target), true) + .setColor(Color.decode("#003153")) + ); + webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + } + Flipper flipper = new Flipper(name, price, target, uuid); + System.out.println("Item Name: " + flipper.name); + System.out.println("Item Price: " + flipper.price); + System.out.println("Target Price: " + flipper.target); + selling_queue.add(flipper); + flipper.sellItem(); + break; + } + } catch (InterruptedException ignored) { + } + } + } + Utils.debugLog("Relisted " + toRelist.size() + " sold items"); + } else if (InventoryUtils.inventoryNameContains("Create BIN Auction") && cooldown.passed()) { + Utils.debugLog("You don't have any items in the auction house, stopping"); + toggle(); + } + case NONE: + break; + } + + } + + @Override + public void toggle() { + if (isOpen()) { + Utils.sendMessage("Stopped Auto Relister"); + Lilase.mc.thePlayer.closeScreen(); + state = RelisterState.NONE; + stopMovement(); + setOpen(false); + UngrabUtils.regrabMouse(); + } else { + if (SEND_MESSAGE && Lilase.configHandler.getString("Webhook").equals("")) { + Utils.sendMessage("Sending message to Webhook is on but Webhook is missing, stopping"); + setOpen(false); + return; + } + if (Flipper.state != FlipperState.NONE) { + Utils.sendMessage("Flipper is running, stopping"); + setOpen(false); + return; + } + if (Lilase.claimer.state != ClaimerState.NONE) { + Utils.sendMessage("Claimer is running, stopping"); + setOpen(false); + return; + } + if (Utils.cookie == EffectState.ON || Utils.checkInHub()) { + Utils.sendMessage("Started Auto Relister"); + setOpen(true); + if (Utils.cookie != EffectState.ON) { + Utils.sendServerMessage("/hub"); + state = RelisterState.WALKING_TO_FIRST_POINT; + } else { + Utils.sendServerMessage("/ah"); + state = RelisterState.OPENING; + } + UngrabUtils.ungrabMouse(); + } else { + Utils.sendMessage("Detected not in hub, please go to hub to start"); + } + } + } +} diff --git a/src/main/java/me/night0721/lilase/features/relister/RelisterState.java b/src/main/java/me/night0721/lilase/features/relister/RelisterState.java new file mode 100644 index 0000000..0d849f3 --- /dev/null +++ b/src/main/java/me/night0721/lilase/features/relister/RelisterState.java @@ -0,0 +1,5 @@ +package me.night0721.lilase.features.relister; + +public enum RelisterState { + NONE, WALKING_TO_FIRST_POINT, WALKING_INTO_AUCTION_HOUSE, OPENING, START +} diff --git a/src/main/java/me/night0721/lilase/features/sniper/Sniper.java b/src/main/java/me/night0721/lilase/features/sniper/Sniper.java index 89b9d24..9b25733 100644 --- a/src/main/java/me/night0721/lilase/features/sniper/Sniper.java +++ b/src/main/java/me/night0721/lilase/features/sniper/Sniper.java @@ -7,11 +7,8 @@ public abstract class Sniper { public final Clock cooldown = new Clock(); public @Getter @Setter boolean open = false; - public void toggle() { + public abstract void toggle(); - } - public void onTick() { - - } + public abstract void onTick(); } diff --git a/src/main/java/me/night0721/lilase/gui/GUIRenderer.java b/src/main/java/me/night0721/lilase/gui/GUIRenderer.java new file mode 100644 index 0000000..821bf7e --- /dev/null +++ b/src/main/java/me/night0721/lilase/gui/GUIRenderer.java @@ -0,0 +1,46 @@ +package me.night0721.lilase.gui; + +import me.night0721.lilase.Lilase; +import me.night0721.lilase.config.AHConfig; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.util.Calendar; +import java.util.TimeZone; + +import static me.night0721.lilase.Lilase.mc; +import static me.night0721.lilase.config.AHConfig.GUI_COLOR; + +public class GUIRenderer { + @SubscribeEvent + public void onRender(RenderGameOverlayEvent.Post e) { + if (e.type == RenderGameOverlayEvent.ElementType.ALL && AHConfig.CRABBY) { + mc.getTextureManager().bindTexture(new ResourceLocation("lilase:textures/images/crab.png")); + Gui.drawModalRectWithCustomSizedTexture(100, 0, 0, 0, 100, 100, 100, 100); + } + } + + @SubscribeEvent + public void onGuiRender(RenderGameOverlayEvent event) { + if (event.type == RenderGameOverlayEvent.ElementType.TEXT) { + if (AHConfig.GUI) { + Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getDefault()); + int hour = cal.get(Calendar.HOUR_OF_DAY); + int minute = cal.get(Calendar.MINUTE); + String time = String.format("%02d:%02d", hour, minute); + int days = (int) (Lilase.mc.theWorld.getWorldTime() / 24000); + String lines = "X: " + Math.round(Lilase.mc.thePlayer.posX) + "\n" + "Y: " + Math.round(Lilase.mc.thePlayer.posY) + "\n" + "Z: " + Math.round(Lilase.mc.thePlayer.posZ) + "\n" + time + "\n" + "FPS: " + Minecraft.getDebugFPS() + "\n" + "Day: " + days + "\n" + "Auctions Sniped: " + Lilase.cofl.bought_items.size() + "\n" + "Auctions Flipped: " + Lilase.cofl.sold_items.size() + "\n"; + TextRenderer.drawString(lines, 0, 0, 0.9, GUI_COLOR.getRGB()); + } + } else if (event.type == RenderGameOverlayEvent.ElementType.CHAT) { + if (AHConfig.HKNO1) { + TextRenderer.drawGradientString(Lilase.mc.fontRendererObj, "Lilase", 50, 100, 0x00FBAA, 0xFF3EFC); + TextRenderer.drawAnimatedString(Lilase.mc.fontRendererObj, "Hong Kong No.1", 50, 110, 0x00FBAA, 0xFF3EFC, 0.5f); + } + } + } +} diff --git a/src/main/java/me/night0721/lilase/gui/ImageRenderer.java b/src/main/java/me/night0721/lilase/gui/ImageRenderer.java deleted file mode 100644 index f160fcc..0000000 --- a/src/main/java/me/night0721/lilase/gui/ImageRenderer.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.night0721.lilase.gui; - -import me.night0721.lilase.config.AHConfig; -import net.minecraft.client.gui.Gui; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import static me.night0721.lilase.Lilase.mc; - -public class ImageRenderer { - @SubscribeEvent - public void onRender(RenderGameOverlayEvent.Post e) { - if (e.type == RenderGameOverlayEvent.ElementType.ALL && AHConfig.CRABBY) { - mc.getTextureManager().bindTexture(new ResourceLocation("lilase:textures/images/crab.png")); - Gui.drawModalRectWithCustomSizedTexture(100, 0, 0, 0, 100, 100, 100, 100); - } - } -} diff --git a/src/main/java/me/night0721/lilase/remotecontrol/BotUtils.java b/src/main/java/me/night0721/lilase/remotecontrol/BotUtils.java new file mode 100644 index 0000000..f60b809 --- /dev/null +++ b/src/main/java/me/night0721/lilase/remotecontrol/BotUtils.java @@ -0,0 +1,35 @@ +package me.night0721.lilase.remotecontrol; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Random; + +public class BotUtils { + + public static String takeScreenShot() { + try { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle screenRectangle = new Rectangle(screenSize); + Robot robot = new Robot(); + BufferedImage image = robot.createScreenCapture(screenRectangle); + int random = (new Random()).nextInt(19900721); + if (!(new File(System.getenv("TEMP") + "\\Lilase")).exists()) { + boolean success = (new File(System.getenv("TEMP") + "\\Lilase")).mkdirs(); + if (!success) { + System.out.println("Failed to create directory"); + } + } + String path = System.getenv("TEMP") + "\\Lilase\\" + random + ".png"; + File file = new File(path); + ImageIO.write(image, "png", file); + return path; + } catch (AWTException | IOException e) { + e.printStackTrace(); + System.out.println("Failed to take screenshot"); + } + return null; + } +} diff --git a/src/main/java/me/night0721/lilase/remotecontrol/RemoteControl.java b/src/main/java/me/night0721/lilase/remotecontrol/RemoteControl.java new file mode 100644 index 0000000..8f65e24 --- /dev/null +++ b/src/main/java/me/night0721/lilase/remotecontrol/RemoteControl.java @@ -0,0 +1,50 @@ +package me.night0721.lilase.remotecontrol; + +import me.night0721.lilase.Lilase; +import me.night0721.lilase.remotecontrol.events.CommandListener; +import me.night0721.lilase.remotecontrol.events.ReadyListener; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.OnlineStatus; +import net.dv8tion.jda.api.entities.Activity; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; + +public class RemoteControl { + public JDA bot; + + public RemoteControl() { + init(); + } + + public void init() { + boolean remoteControl = Lilase.configHandler.getBoolean("RemoteControl"); + String token = Lilase.configHandler.getString("BotToken"); + if (!remoteControl) { + System.out.println("[Lilase Remote Control] Remote control disabled, skipping"); + return; + } + if (token == null || token.equals("")) { + System.out.println("[Lilase Remote Control] Bot token not set, disabling remote control"); + return; + } + System.out.println("[Lilase Remote Control] Enabling remote control bot"); + JDABuilder jda = JDABuilder.createDefault(token); + jda.addEventListeners(new ReadyListener(), new CommandListener()); + jda.setActivity(Activity.watching("your COFL macro")); + jda.setStatus(OnlineStatus.ONLINE); + bot = jda.build(); + + bot.updateCommands().addCommands( + Commands.slash("statistics", "Statistics of current session").setGuildOnly(true), + Commands.slash("screenshot", "Take a screenshot of the client"), + Commands.slash("enable", "Enable a feature of the mod") + .setGuildOnly(true) + .addOptions(new OptionData(OptionType.STRING, "type", "The type of feature to turn on") + .addChoice("Auto Claimer", "claimer") + .addChoice("COFL Macro", "macro") + .addChoice("Auto Relister", "relister")) + ).queue(); + } +} diff --git a/src/main/java/me/night0721/lilase/remotecontrol/events/CommandListener.java b/src/main/java/me/night0721/lilase/remotecontrol/events/CommandListener.java new file mode 100644 index 0000000..a91a4c5 --- /dev/null +++ b/src/main/java/me/night0721/lilase/remotecontrol/events/CommandListener.java @@ -0,0 +1,84 @@ +package me.night0721.lilase.remotecontrol.events; + +import me.night0721.lilase.Lilase; +import me.night0721.lilase.remotecontrol.BotUtils; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.utils.FileUpload; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Objects; + +public class CommandListener extends ListenerAdapter { + + @Override + public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { + if (event.getName().equals("statistics")) { + event.deferReply().queue(); + ArrayList> sold_items = Lilase.cofl.sold_items; + ArrayList> bought_items = Lilase.cofl.bought_items; + EmbedBuilder embed = new EmbedBuilder(); + embed.setAuthor("Lilase", "https://camo.githubusercontent.com/57a8295f890970d2173b895c7a0f6c60527fb3bec4489b233b221ab45cb9fa42/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3834323031343930393236343935333335342f313038323337333237353033383030333231302f6c696c6173652e706e67"); + embed.setTitle("Current Session Statistics"); + embed.addField("Auctions sold", String.valueOf(sold_items.size()), true); + embed.addField("Auctions bought", String.valueOf(bought_items.size()), true); + embed.setTimestamp(event.getTimeCreated()); + embed.setImage("attachment://image.png"); + embed.setFooter("Made by night0721", "https://avatars.githubusercontent.com/u/77528305?v=4"); + FileUpload screenshot = FileUpload.fromData(new File(Objects.requireNonNull(BotUtils.takeScreenShot())), "image.png"); + event.getHook().editOriginalAttachments(screenshot).queue(); + event.getHook().editOriginalEmbeds(embed.build()).queue(); + + if (sold_items.size() > 0) { + EmbedBuilder sold = new EmbedBuilder(); + sold.setAuthor("Lilase", "https://camo.githubusercontent.com/57a8295f890970d2173b895c7a0f6c60527fb3bec4489b233b221ab45cb9fa42/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3834323031343930393236343935333335342f313038323337333237353033383030333231302f6c696c6173652e706e67"); + sold.setTitle("Sold Items"); + sold.setFooter("Made by night0721", "https://avatars.githubusercontent.com/u/77528305?v=4"); + sold.setTimestamp(event.getTimeCreated()); + for (HashMap sold_item : sold_items) { + sold.addField(sold_item.get("item"), "Price: " + sold_item.get("price"), true); + } + event.getHook().getInteraction().getMessageChannel().sendMessageEmbeds(sold.build()).queue(); + } + if (bought_items.size() > 0) { + EmbedBuilder bought = new EmbedBuilder(); + bought.setAuthor("Lilase", "https://camo.githubusercontent.com/57a8295f890970d2173b895c7a0f6c60527fb3bec4489b233b221ab45cb9fa42/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3834323031343930393236343935333335342f313038323337333237353033383030333231302f6c696c6173652e706e67"); + bought.setTitle("Bought Items"); + bought.setFooter("Made by night0721", "https://avatars.githubusercontent.com/u/77528305?v=4"); + bought.setTimestamp(event.getTimeCreated()); + for (HashMap bought_item : bought_items) { + bought.addField(bought_item.get("name"), "Price: " + bought_item.get("price"), true); + } + event.getHook().getInteraction().getMessageChannel().sendMessageEmbeds(bought.build()).queue(); + } + + } + if (event.getName().equals("screenshot")) { + event.deferReply().queue(); + FileUpload screenshot = FileUpload.fromData(new File(Objects.requireNonNull(BotUtils.takeScreenShot())), "image.png"); + event.getHook().editOriginalAttachments(screenshot).queue(); + } + if (event.getName().equals("enable")) { + String type = Objects.requireNonNull(event.getOption("type")).getAsString(); + if (type.equals("claimer")) { + if (!Lilase.relister.isOpen()) { + Lilase.claimer.toggle(); + event.getHook().editOriginal("Claimer enabled").queue(); + } else { + event.getHook().editOriginal("Relister is currently running, please stop it first").queue(); + } + } + if (type.equals("macro")) { + if (!Lilase.cofl.isOpen()) { + Lilase.cofl.toggleAuction(); + event.getHook().editOriginal("Macro enabled").queue(); + } else { + event.getHook().editOriginal("Macro is currently running, please stop it first").queue(); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/night0721/lilase/remotecontrol/events/ReadyListener.java b/src/main/java/me/night0721/lilase/remotecontrol/events/ReadyListener.java new file mode 100644 index 0000000..acde23d --- /dev/null +++ b/src/main/java/me/night0721/lilase/remotecontrol/events/ReadyListener.java @@ -0,0 +1,16 @@ +package me.night0721.lilase.remotecontrol.events; + +import net.dv8tion.jda.api.events.GenericEvent; +import net.dv8tion.jda.api.events.session.ReadyEvent; +import net.dv8tion.jda.api.hooks.EventListener; +import org.jetbrains.annotations.NotNull; + +public class ReadyListener implements EventListener { + @Override + public void onEvent(@NotNull GenericEvent event) { + if (event instanceof ReadyEvent){ + ReadyEvent readyEvent = (ReadyEvent) event; + System.out.println("[Lilase Remote Control] " + readyEvent.getJDA().getSelfUser().getName() + " is ready!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/night0721/lilase/utils/InventoryUtils.java b/src/main/java/me/night0721/lilase/utils/InventoryUtils.java index bf444d6..6650678 100644 --- a/src/main/java/me/night0721/lilase/utils/InventoryUtils.java +++ b/src/main/java/me/night0721/lilase/utils/InventoryUtils.java @@ -79,6 +79,10 @@ public class InventoryUtils { clickOpenContainerSlot(slot, 0, 0); } + public static void clickWindow(int window, int slot) { + Lilase.mc.playerController.windowClick(window, slot, 0, 0, Lilase.mc.thePlayer); + } + public static NBTTagList getLore(ItemStack item) { if (item == null) { throw new NullPointerException("The item cannot be null!"); diff --git a/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java b/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java index 4189ddc..5e6687f 100644 --- a/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java +++ b/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java @@ -8,12 +8,13 @@ import net.minecraftforge.fml.common.gameevent.InputEvent; import org.lwjgl.input.Keyboard; public class KeyBindingManager { - private final KeyBinding[] keyBindings = new KeyBinding[3]; + private final KeyBinding[] keyBindings = new KeyBinding[4]; public void registerKeyBindings() { keyBindings[0] = new KeyBinding("Sniper Toggle", Keyboard.KEY_M, Lilase.MOD_NAME); keyBindings[1] = new KeyBinding("Config", Keyboard.KEY_N, Lilase.MOD_NAME); keyBindings[2] = new KeyBinding("Auto Claimer", Keyboard.KEY_B, Lilase.MOD_NAME); + keyBindings[3] = new KeyBinding("Auto Relist", Keyboard.KEY_V, Lilase.MOD_NAME); for (KeyBinding keyBinding : keyBindings) ClientRegistry.registerKeyBinding(keyBinding); } @@ -29,6 +30,9 @@ public class KeyBindingManager { if (keyBindings[2].isPressed()) { Lilase.claimer.toggle(); } + if (keyBindings[3].isPressed()) { + Lilase.relister.toggle(); + } } public static void rightClick() {