v2.0.1!
Some checks failed
build-ci / build (push) Has been cancelled

This commit is contained in:
NK 2023-05-15 21:22:01 +02:00
parent 44d80afc58
commit a06cc35c0e
17 changed files with 246 additions and 626 deletions

View file

@ -36,4 +36,9 @@
- v2.0
- Added a config for disabling words and crabby
- Fixing cofl macro cannot open issue
- Adding auto sell to cofl macro
- Adding auto sell to cofl macro
- v2.0.1
- Fix webhook issues, now it would send when soneone bought your item
- Remove sniper option, only cofl macro exist now
- Added purse to webhook
- Added many more stuff to debug

42
.github/README.md vendored
View file

@ -1,6 +1,6 @@
<h1> Auction House Flipper - Lilase</h1>
<div style="text-align: center;">
<img align="center" src="https://cdn.discordapp.com/attachments/842014909264953354/1082373275038003210/lilase.png" width="300" />
<img align="center" src="https://cdn.discordapp.com/attachments/842014909264953354/1082373275038003210/lilase.png" width="300" alt="icon"/>
</div>
# Introduction:
@ -9,11 +9,9 @@ If you have any questions please join [Discord Server](https://night0721.me/disc
For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)**
# Features:
- Auto buy any item you want, with query customised by yourself
- Auto walk to the auction house
- Auto sell after buying with profit check, so profit is ensured
- Can customise fetch time (the faster, the higher chance to get the item you want)
- Webhook system to send you that an item has been bought
- Webhook system to send you that an item has been bought, sold, flipped
- Failsafe in Limbo
- Auto reconnect to server when disconnected
- Auto skip confirmation screen
@ -25,6 +23,7 @@ For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)**
- Modules toggleable in game
- Check maximum profit percentage before buying so duped items won't be bought
- COFL macro
- auto sell to cofl macro
- Server ID on scoreboard hider
- page flipper [WIP]
@ -39,57 +38,24 @@ For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)**
8. save the file and press END key to start auction house sniper(or change it in control settings)
9. For example configuration, see [here](https://github.com/night0721/Lilase#example-config)
# **IMPORTANT INFO**
List of things you can put in Tier section
```
ANY, COMMON, UNCOMMON, RARE, EPIC, LEGENDARY, MYTHIC, DIVINE, SPECIAL, VERY_SPECIAL
```
List of things you can put in Type section
```
ANY, WEAPON, ARMOR, ACCESSORIES, CONSUMABLES, BLOCKS, MISC
```
# Changelog:
[ChangeLog](https://github.com/night0721/Lilase/blob/master/.github/CHANGELOG.md)
# To Do Features:
- Console client??
- Page flipper for specific items(query)
- Wither Impact in lore check
- Blue omelette in lore check
- pre api?
# Example Config:
```cfg
```json
{
"APIKey": "",
"SendMessageToWebhook": true,
"Webhook": "",
"ReconnectDelay": 20,
"AuctionHouseDelay": 8,
"BedSpamDelay": 100,
"OnlySniper": false,
"checkMaximumProfitPercentageBeforeBuy": false,
"MaximumProfitPercentage": 1000,
"MinimumProfitPercentage": 400,
"items": [
{"Name": " ", "Type": "ANY", "Price": 1000, "Tier": "ANY"},
{
"Name": "Livid Dagger",
"Type": "WEAPON",
"Price": 5000000,
"Tier": "LEGENDARY"
},
{"Name": "", "Type": "", "Price": 0, "Tier": ""}
],
"blacklist": [
{"Name": "Rune", "Type": "ANY", "Price": 1, "Tier": "ANY"},
{"Name": "", "Type": "", "Price": 0, "Tier": ""},
{"Name": "", "Type": "", "Price": 0, "Tier": ""}
],
"BedSpam": true,
"GUI": true,
"checkProfitPercentageBeforeBuy": false,
"GUI_COLOR": -1,
"SniperMode": true
}

View file

@ -1,6 +1,6 @@
mod_name = Lilase
mod_id = lilase
mod_version = 2.0
mod_version = 2.0.1
essential.defaults.loom=0

View file

@ -26,15 +26,13 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import java.io.IOException;
import static me.night0721.lilase.config.AHConfig.RECONNECT_DELAY;
@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";
public static final String VERSION = "2.0.1";
public static final Minecraft mc = Minecraft.getMinecraft();
public static Sniper sniper;
public static PageFlipper pageFlipper;
@ -66,11 +64,10 @@ public class Lilase {
}
@SubscribeEvent
public void onTick(TickEvent.ClientTickEvent event) throws IOException {
public void onTick(TickEvent.ClientTickEvent event) {
if (mc.thePlayer == null || event.phase != TickEvent.Phase.START) return;
tickAmount++;
if (tickAmount % 20 == 0) Utils.checkFooter();
if (tickAmount % (20 * 60) == 0) sniper.start();
if (tickAmount % 2400 == 0) configHandler.checkWebhookAndAPI();
if (pageFlipper != null) pageFlipper.switchStates();
if (QueueItem.flipper != null) QueueItem.flipper.switchStates();

View file

@ -15,15 +15,9 @@ public class AHConfig extends Config {
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("AUCTION_HOUSE_DELAY", () -> Lilase.configHandler.setInt("AuctionHouseDelay", Math.round(AUCTION_HOUSE_DELAY)));
addListener("SNIPER_MODE", () -> Lilase.configHandler.setInt("SniperMode", SNIPER_MODE));
addListener("BED_SPAM", () -> Lilase.configHandler.setBoolean("BedSpam", BED_SPAM));
addListener("BED_SPAM_DELAY", () -> Lilase.configHandler.setInt("BedSpamDelay", Math.round(BED_SPAM_DELAY)));
addListener("ONLY_SNIPER", () -> Lilase.configHandler.setBoolean("OnlySniper", ONLY_SNIPER));
addListener("CHECK_PERCENTAGE", () -> Lilase.configHandler.setBoolean("checkProfitPercentageBeforeBuy", CHECK_PERCENTAGE));
addListener("MINIMUM_PROFIT_PERCENTAGE", () -> Lilase.configHandler.setInt("MinimumProfitPercentage", Math.round(MINIMUM_PROFIT_PERCENTAGE)));
addListener("CHECK_MAXIMUM_PROFIT", () -> Lilase.configHandler.setBoolean("checkMaxiumProfitPercentageBeforeBuy", CHECK_MAXIMUM_PROFIT));
addListener("MAXIMUM_PROFIT_PERCENTAGE", () -> Lilase.configHandler.setInt("MaximumProfitPercentage", MAXIMUM_PROFIT_PERCENTAGE));
addListener("GUI", () -> Lilase.configHandler.setBoolean("GUI", GUI));
addListener("GUI_COLOR", () -> Lilase.configHandler.setInt("GUI_COLOR", GUI_COLOR.getRGB()));
addDependency("WEBHOOK", "SEND_MESSAGE");
@ -32,12 +26,6 @@ public class AHConfig extends Config {
addDependency("GUI_COLOR", "GUI");
}
@Slider(name = "Time per fetch (seconds)", min = 5, max = 15, step = 1, category = "Auction House", subcategory = "Sniper", description = "Time between each fetch of the auction house, the faster the fetch, the more likely you will snipe the item")
public static int AUCTION_HOUSE_DELAY = 8;
@Dropdown(name = "Sniper Mode", category = "Auction House", subcategory = "Sniper", options = {"API", "Page Flipper[WIP]", "COFL"})
public static int SNIPER_MODE = 2;
@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")
public static boolean BED_SPAM = true;
@ -56,18 +44,6 @@ public class AHConfig extends Config {
@Number(name = "Reconnect Delay", min = 5, max = 20, category = "Failsafe", description = "Delay between each reconnect attempt to the server")
public static int RECONNECT_DELAY = 20;
@Switch(name = "Check Profit Percentage Before Buying", category = "Flipper", description = "Check the profit percentage before buying the item, if the profit percentage is too low, it will not buy the item")
public static boolean CHECK_PERCENTAGE = false;
@Number(name = "Minimum Profit Percentage", min = 100, max = 5000, step = 50, category = "Flipper", description = "Profit percentage to check before buying the item, if the profit percentage is too low, it will not buy the item")
public static int MINIMUM_PROFIT_PERCENTAGE = 400;
@Switch(name = "Check Maximum Profit Before Buying", category = "Flipper", description = "Check the maximal profit before buying the item, if the maximal profit is too high, it will not buy the item (Can prevent duped items)")
public static boolean CHECK_MAXIMUM_PROFIT = false;
@Number(name = "Maximum Profit Percentage", min = 1000, max = 10000, step = 1000, category = "Flipper", description = "Maximum profit to check before buying the item, if the maximal profit is too high, it will not buy the item (Can prevent duped items)")
public static int MAXIMUM_PROFIT_PERCENTAGE = 1000;
@Checkbox(name = "GUI", category = "GUI", description = "Enable the GUI")
public static boolean GUI = true;

View file

@ -1,7 +1,6 @@
package me.night0721.lilase.config;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.night0721.lilase.utils.Utils;
@ -10,7 +9,7 @@ import java.io.*;
public class ConfigHandler {
private final Gson gson = new Gson();
String path = "/config/Lilase.json";
private final String path = "/config/Lilase.json";
private JsonObject config;
public void init() {
@ -20,7 +19,6 @@ public class ConfigHandler {
public void reloadConfig() {
// TODO: Fix
if (hasNoKey("APIKey")) setString("APIKey", "");
if (hasNoKey("SendMessageToWebhook")) setBoolean("SendMessageToWebhook", true);
if (hasNoKey("Webhook")) setString("Webhook", "");
if (hasNoKey("ReconnectDelay")) setInt("ReconnectDelay", 20);
@ -29,27 +27,8 @@ public class ConfigHandler {
if (hasNoKey("BedSpam")) setBoolean("BedSpam", true);
if (hasNoKey("BedSpamDelay")) setInt("BedSpamDelay", 100);
if (hasNoKey("OnlySniper")) setBoolean("OnlySniper", false);
if (hasNoKey("checkProfitPercentageBeforeBuy")) setBoolean("checkProfitPercentageBeforeBuy", false);
if (hasNoKey("checkMaximumProfitPercentageBeforeBuy"))
setBoolean("checkMaximumProfitPercentageBeforeBuy", false);
if (hasNoKey("MaximumProfitPercentage")) setInt("MaximumProfitPercentage", 1000); //1000%
if (hasNoKey("MinimumProfitPercentage")) setInt("MinimumProfitPercentage", 400); //400%
if (hasNoKey("GUI")) setBoolean("GUI", true);
if (hasNoKey("GUI_COLOR")) setInt("GUI_COLOR", 0x003153);
if (hasNoKey("items")) setArray("items", new JsonObject[]{});
if (hasNoKey("blacklist")) setArray("blacklist", new JsonObject[]{});
for (int i = 1; i <= 3; i++) {
if (hasNoItemKey(i, "Name")) setItems(i, "Name", "");
if (hasNoItemKey(i, "Type")) setItems(i, "Type", "");
if (hasNoItemKey(i, "Price")) setItems(i, "Price", 0);
if (hasNoItemKey(i, "Tier")) setItems(i, "Tier", "");
}
for (int i = 1; i <= 3; i++) {
if (hasNoBlacklistKey(i, "Name")) setBlacklists(i, "Name", "");
if (hasNoBlacklistKey(i, "Type")) setBlacklists(i, "Type", "");
if (hasNoBlacklistKey(i, "Price")) setBlacklists(i, "Price", 0);
if (hasNoBlacklistKey(i, "Tier")) setBlacklists(i, "Tier", "");
}
}
public void checkWebhookAndAPI() {
@ -80,63 +59,12 @@ public class ConfigHandler {
return config.get(key) == null;
}
public boolean hasNoItemKey(int i, String key) {
config = readConfigFile();
try {
if (config.getAsJsonArray("items").get(i - 1) == null) return true;
} catch (Exception e) {
return true;
}
return config.getAsJsonArray("items").get(i - 1).getAsJsonObject().get(key) == null;
}
public boolean hasNoBlacklistKey(int i, String key) {
config = readConfigFile();
try {
if (config.getAsJsonArray("blacklist").get(i - 1) == null) return true;
} catch (Exception e) {
return true;
}
return config.getAsJsonArray("blacklist").get(i - 1).getAsJsonObject().get(key) == null;
}
public boolean getBoolean(String key) {
config = readConfigFile();
if (config.get(key) != null) return config.get(key).getAsBoolean();
return false;
}
public int getInt(String key) {
config = readConfigFile();
if (config.get(key) != null) return config.get(key).getAsInt();
return 0;
}
public String getString(String key) {
config = readConfigFile();
if (config.get(key) != null) return config.get(key).getAsString();
return null;
}
public String getString(int item, String key) {
config = readConfigFile();
try {
if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null)
return config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key).getAsString();
} catch (Exception ignore) {
}
return "";
}
public int getInt(int item, String key) {
config = readConfigFile();
try {
if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null)
return config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key).getAsInt();
} catch (Exception ignore) {
}
return 0;
}
public void setBoolean(String key, boolean value) {
config = readConfigFile();
@ -159,61 +87,6 @@ public class ConfigHandler {
writeJsonToFile(config);
}
public void setArray(String key, JsonObject[] value) {
config = readConfigFile();
if (config.get(key) != null) config.remove(key);
JsonArray array = new JsonArray();
for (JsonObject object : value) {
array.add(object);
}
config.add(key, array);
writeJsonToFile(config);
}
public void setItems(int item, String key, Object value) {
config = readConfigFile();
try {
if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null)
config.getAsJsonArray("items").get(item - 1).getAsJsonObject().remove(key);
} catch (Exception e) {
JsonObject object = new JsonObject();
object.addProperty("Name", "");
object.addProperty("Type", "");
object.addProperty("Price", 0);
object.addProperty("Tier", "");
config.getAsJsonArray("items").add(object);
}
if (value instanceof Integer)
config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (Integer) value);
else if (value instanceof String)
config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (String) value);
else if (value instanceof Boolean)
config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (Boolean) value);
writeJsonToFile(config);
}
public void setBlacklists(int item, String key, Object value) {
config = readConfigFile();
try {
if (config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().get(key) != null)
config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().remove(key);
} catch (Exception e) {
JsonObject object = new JsonObject();
object.addProperty("Name", "");
object.addProperty("Type", "");
object.addProperty("Price", 0);
object.addProperty("Tier", "");
config.getAsJsonArray("blacklist").add(object);
}
if (value instanceof Integer)
config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (Integer) value);
else if (value instanceof String)
config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (String) value);
else if (value instanceof Boolean)
config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (Boolean) value);
writeJsonToFile(config);
}
public void writeJsonToFile(JsonObject jsonObject) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + path));

View file

@ -8,8 +8,8 @@ import net.minecraftforge.fml.common.eventhandler.Event;
// TODO: Implement Lombok Library for clean code
@Cancelable
public class ScoreboardRenderEvent extends Event {
public ScoreObjective objective;
public ScaledResolution resolution;
public final ScoreObjective objective;
public final ScaledResolution resolution;
public ScoreboardRenderEvent(ScoreObjective objective, ScaledResolution resolution) {
this.objective = objective;

View file

@ -27,6 +27,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import org.lwjgl.input.Keyboard;
import java.awt.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -36,7 +37,7 @@ import java.util.regex.Pattern;
import static me.night0721.lilase.config.AHConfig.GUI_COLOR;
import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE;
import static me.night0721.lilase.features.flipper.Flipper.rotation;
import static me.night0721.lilase.features.flipper.Flipper.*;
import static me.night0721.lilase.features.flipper.FlipperState.START;
import static me.night0721.lilase.utils.PlayerUtils.sendPacketWithoutEvent;
@ -44,21 +45,39 @@ public class SniperFlipperEvents {
private int windowId = 1, price;
private boolean buying = false, bought = false;
private final Clock clock = new Clock();
private final Pattern
AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"),
BOUGHT_PATTERN = Pattern.compile("You purchased (\\w+(?:\\s+\\w+)*) for ([\\d,]+)\\s*(\\w+)!"),
BOUGHT_PATTERN_2 = Pattern.compile("You claimed (.+?) from (.+?)'s auction!"),
BOUGHT_PATTERN_3 = Pattern.compile("You (purchased|claimed)( (\\\\d+x))? ([^\\\\s]+(\\\\s+[^\\\\d,]+)*)((,| for) (\\\\d+,?)+ coins?(!)?)?");
// TODO: Split into one pattern
private final Pattern AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"),
pattern = Pattern.compile("You purchased (\\w+(?:\\s+\\w+)*) for ([\\d,]+)\\s*(\\w+)|You claimed (.+?) from (.+?)'s auction!|(You (purchased|claimed)( (\\\\d+x))? ([^\\\\s]+(\\\\s+[^\\\\d,]+)*)((,| for) (\\\\d+,?)+ coins?(!)?))?");
public static final List<String> postedNames = new ArrayList<>();
@SubscribeEvent
public void onChat(ClientChatReceivedEvent event) throws InterruptedException {
String message = event.message.getUnformattedText();
Matcher matcher = AUCTION_SOLD_PATTERN.matcher(message);
Matcher boughtMatcher = BOUGHT_PATTERN.matcher(message);
Matcher boughtMatcher2 = BOUGHT_PATTERN_2.matcher(message);
Matcher boughtMatcher3 = BOUGHT_PATTERN_3.matcher(message);
if (message.startsWith("§6[Auction]")) {
Matcher matcher = AUCTION_SOLD_PATTERN.matcher(ScoreboardUtils.cleanSB(message));
if (matcher.matches()) {
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:", matcher.group(1).split("[Auction] ")[1], true)
.setColor(Color.decode("#003153")));
if (SEND_MESSAGE) webhook.execute();
Utils.debugLog("Notified Webhook");
} catch (Exception e) {
e.printStackTrace();
Utils.debugLog("Failed to send webhook");
}
Lilase.sniper.incrementAuctionsFlipped();
}
}
/*
§6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK
*/
Matcher boughtMatcher = pattern.matcher(message);
if (!message.contains(":")) {
if (message.equals("You didn't participate in this auction!")) {
Utils.debugLog("Failed to buy item, not fast enough. Closing the menu");
@ -66,22 +85,12 @@ public class SniperFlipperEvents {
} else 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);
} else if (message.contains("Your new API key is")) {
Utils.debugLog("Detected new API key, saving it to config");
Utils.debugLog("Saved new API key to config");
String apiKey = message.replace("Your new API key is ", "");
Lilase.configHandler.setString("APIKey", apiKey);
} else if ((boughtMatcher.matches() || boughtMatcher2.matches() || boughtMatcher3.matches()) && bought) {
} else if (boughtMatcher.matches() && bought) {
new Thread(() -> {
bought = false;
Utils.debugLog("Bought an item, starting to sell");
try {
if (SEND_MESSAGE) Lilase.sniper.webhook.execute();
} catch (Exception e) {
Utils.debugLog("Failed to send webhook");
}
Utils.debugLog("Target price " + Cofl.price);
price = Cofl.price;
Utils.debugLog("Target price " + Cofl.target);
price = Cofl.target;
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
@ -93,26 +102,24 @@ public class SniperFlipperEvents {
InventoryUtils.clickOpenContainerSlot(13);
Lilase.mc.thePlayer.closeScreen();
Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper");
Lilase.sniper.toggleAuction();
Lilase.cofl.toggleAuction();
Flipper.state = FlipperState.NONE;
} else if (message.contains("Can't create a BIN auction for this item for a PRICE this LOW!")) {
Lilase.mc.thePlayer.closeScreen();
Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper");
Lilase.sniper.toggleAuction();
Lilase.cofl.toggleAuction();
Flipper.state = FlipperState.NONE;
} else 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.sniper.getOpen()) Lilase.sniper.toggleAuction();
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();
} else if (matcher.matches() && postedNames.contains(matcher.group(2))) {
Lilase.sniper.incrementAuctionsFlipped();
}
}
}
@ -156,7 +163,7 @@ public class SniperFlipperEvents {
}
Lilase.mc.thePlayer.sendChatMessage("/hub");
Thread.sleep(6000);
Lilase.sniper.toggleAuction();
Lilase.cofl.toggleAuction();
} catch (Exception ignore) {
}
@ -175,6 +182,7 @@ public class SniperFlipperEvents {
if (Flipper.state != FlipperState.NONE) {
new Thread(() -> {
Utils.debugLog("Interrupting Flipper selling");
Flipper.sendInterrupt();
Lilase.mc.thePlayer.closeScreen();
Flipper.state = FlipperState.NONE;
Lilase.cofl.toggleAuction();
@ -184,8 +192,8 @@ public class SniperFlipperEvents {
Utils.debugLog("[PageFlipper] Interrupting PageFlipper sniping");
Lilase.pageFlipper.toggleAuction();
}).start();
} else if (Lilase.sniper.getOpen()) {
Lilase.sniper.toggleAuction();
} else if (Lilase.cofl.getOpen()) {
Lilase.cofl.toggleAuction();
}
}
}
@ -214,7 +222,7 @@ public class SniperFlipperEvents {
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onInventoryRendering(GuiScreenEvent.BackgroundDrawnEvent event) {
String windowName = InventoryUtils.getInventoryName();
if (AHConfig.BED_SPAM && (Lilase.sniper.getOpen() || Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) {
if (AHConfig.BED_SPAM && (Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) {
if ("BIN Auction View".equals(windowName)) {
ItemStack is = InventoryUtils.getStackInOpenContainerSlot(31);
if (is != null) {
@ -237,17 +245,13 @@ public class SniperFlipperEvents {
buying = false;
Lilase.mc.thePlayer.closeScreen();
}
} else {
System.out.println("No item in slot 31, ??");
// buying = false;
// Lilase.mc.thePlayer.closeScreen();
}
}
if (buying && "Confirm Purchase".equals(windowName)) {
System.out.println("Window ID: " + Lilase.mc.thePlayer.openContainer.windowId);
Lilase.mc.playerController.windowClick(windowId + 1, 11, 0, 0, Lilase.mc.thePlayer);
buying = false;
if (Lilase.sniper.buying || Lilase.cofl.getQueue().isRunning()) bought = true;
if (Lilase.cofl.getQueue().isRunning()) bought = true;
}
}
}

View file

@ -3,18 +3,25 @@ package me.night0721.lilase.features.cofl;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.night0721.lilase.Lilase;
import me.night0721.lilase.config.AHConfig;
import me.night0721.lilase.features.flipper.Flipper;
import me.night0721.lilase.features.flipper.FlipperState;
import me.night0721.lilase.player.EffectState;
import me.night0721.lilase.utils.UngrabUtils;
import me.night0721.lilase.utils.Utils;
import java.io.PrintStream;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Pattern;
import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE;
public class Cofl {
private final Queue queue = new Queue();
private boolean open = false;
public static int price = 0;
public Thread thread = new Thread(() -> {
public static int target = 0;
private final ThreadLocalRandom random = ThreadLocalRandom.current();
public final Thread thread = new Thread(() -> {
while (true) {
try {
Thread.sleep(1);
@ -45,19 +52,22 @@ public class Cofl {
public void handleMessage(String str) {
try {
if (AHConfig.SNIPER_MODE != 2 || !getOpen() || !str.startsWith("Received:")) return;
if (!getOpen() || !str.startsWith("Received:")) return;
if (pattern.matcher(str).find()) {
// Utils.debugLog("Doing some motion as we don't want to be AFK");
Lilase.mc.thePlayer.inventory.currentItem = random.nextInt(9);
String[] split = str.split("Received: ");
JsonObject auction = new JsonParser().parse(new JsonParser().parse(split[1]).getAsJsonObject().get("data").getAsString()).getAsJsonObject();
String itemName = auction.get("auction").getAsJsonObject().get("itemName").getAsString();
String id = auction.get("auction").getAsJsonObject().get("uuid").getAsString();
price = auction.get("target").getAsInt();
price = auction.get("auction").getAsJsonObject().get("startingBid").getAsInt();
target = auction.get("target").getAsInt();
// Utils.debugLog("Item Name: " + itemName);
// Utils.debugLog("ID: " + id);
// Utils.debugLog("Price: " + price);
if (itemName != null && id != null && price != 0) {
Utils.debugLog("Adding auction to queue: " + id, "Target Price: " + price, "Name: " + itemName);
getQueue().add(new QueueItem(id, itemName, price));
if (itemName != null && id != null && price != 0 && target != 0) {
Utils.debugLog("Adding auction to queue: " + id, "Price: " + price, "Target Price: " + target, "Name: " + itemName);
getQueue().add(new QueueItem(id, itemName, price, target));
getQueue().scheduleClear();
}
}
@ -75,7 +85,17 @@ public class Cofl {
setOpen(false);
UngrabUtils.regrabMouse();
} else {
if (Utils.checkInHub()) {
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 (Utils.cookie == EffectState.ON || Utils.checkInHub()) {
Utils.sendMessage("Started COFL Sniper");
setOpen(true);
boolean threadStatus = thread.isAlive();
@ -84,7 +104,9 @@ public class Cofl {
thread.start();
}
UngrabUtils.ungrabMouse();
} else Utils.sendMessage("Detected not in hub, please go to hub to start");
} else {
Utils.sendMessage("Detected not in hub, please go to hub to start");
}
}
}

View file

@ -7,17 +7,19 @@ import me.night0721.lilase.utils.Utils;
public class QueueItem {
private final String command, name;
private final int price;
private final int target;
public static Flipper flipper = null;
public QueueItem(String command, String name, int price) {
public QueueItem(String command, String name, int price, int target) {
this.command = command;
this.name = name;
this.price = price;
this.target = target;
}
public void openAuction() {
Utils.debugLog("Executing: " + command);
Utils.sendServerMessage("/viewauction " + command);
flipper = new Flipper(name, price);
flipper = new Flipper(name, price, target);
}
}

View file

@ -1,7 +1,5 @@
package me.night0721.lilase.features.flipper;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.night0721.lilase.Lilase;
import me.night0721.lilase.events.SniperFlipperEvents;
import me.night0721.lilase.player.EffectState;
@ -9,61 +7,64 @@ import me.night0721.lilase.player.Rotation;
import me.night0721.lilase.utils.*;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityArmorStand;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.StringUtils;
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.awt.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE;
// TODO: Fix repeating code (I will do it soon)
public class Flipper {
private final String itemname;
private static String bytedata;
private final int itemprice;
private static String itemname = "";
private static int itemprice = 0;
private static int target = 0;
public static FlipperState state = FlipperState.NONE;
public static final Rotation rotation = new Rotation();
private final Clock buyWait = new Clock();
private static JsonObject object;
public static final DiscordWebhook webhook = new DiscordWebhook(Lilase.configHandler.getString("Webhook"));
public static final NumberFormat format = NumberFormat.getInstance(Locale.US);
public static final DecimalFormat df = new DecimalFormat("#.##");
public static final String icon = "https://camo.githubusercontent.com/57a8295f890970d2173b895c7a0f6c60527fb3bec4489b233b221ab45cb9fa42/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3834323031343930393236343935333335342f313038323337333237353033383030333231302f6c696c6173652e706e67";
public Flipper(String name, String data, int price) {
itemname = name;
bytedata = data;
itemprice = price;
}
public Flipper(String name, int price) {
public Flipper(String name, int price, int targetprice) {
itemname = name;
itemprice = price;
target = targetprice;
webhook.setUsername("Lilase");
webhook.setAvatarUrl(icon);
}
public int getItemPrice() {
if (object == null) {
try {
object = getItemData();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return object.get("price").getAsInt();
}
public int checkProfitPercentage() throws IOException {
if (object == null) object = getItemData();
return object.get("price").getAsInt() / itemprice * 100;
}
public void sellItem() {
Utils.checkFooter();
Lilase.sniper.incrementAuctionsSniped();
Utils.sendMessage("Flipper is running, stopping, will resume when flipper is done");
if (Lilase.sniper.getOpen()) Lilase.sniper.toggleAuction();
if (Lilase.cofl.getOpen()) Lilase.cofl.toggleAuction();
UngrabUtils.ungrabMouse();
Utils.checkFooter();
Utils.debugLog("Cookie: " + (Utils.cookie == EffectState.ON ? "ON" : "OFF"));
Utils.debugLog("Have screen: " + (Lilase.mc.currentScreen != null ? "Yes" : "No"));
Utils.debugLog("Profit Percentage: " + target / itemprice);
try {
webhook.addEmbed(new DiscordWebhook.EmbedObject()
.setTitle("Just purchased an item!")
.setFooter("Purse: " + format.format(Utils.getPurse()), icon)
.addField("Item:", itemname, true)
.addField("Price:", format.format(itemprice), true)
.addField("Target Price:", format.format(target), true)
.addField("Profit Percentage:", df.format(target / itemprice * 100L) + "%", true)
.setColor(Color.decode("#003153")));
if (SEND_MESSAGE) webhook.execute();
Utils.debugLog("Notified Webhook");
} catch (Exception e) {
e.printStackTrace();
Utils.debugLog("Failed to send webhook");
}
if (Utils.cookie != EffectState.ON) {
Utils.sendServerMessage("/hub");
state = FlipperState.WALKING_TO_FIRST_POINT;
@ -123,8 +124,25 @@ public class Flipper {
if (InventoryUtils.isStoneButton() && buyWait.passed()) {
if (InventoryUtils.getSlotForItem(itemname) == -1) {
Utils.debugLog("Cannot find item in inventory, stopping flipper");
try {
webhook.addEmbed(new DiscordWebhook.EmbedObject()
.setTitle("Failed to post an item!")
.setDescription("Could not find item in inventory, sending so you can post it manually")
.setFooter("Purse: " + format.format(Utils.getPurse()), icon)
.addField("Item:", itemname, true)
.addField("Price:", format.format(itemprice), true)
.addField("Target Price:", format.format(target), true)
.addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true)
.setColor(Color.decode("#ff0000")));
if (SEND_MESSAGE) webhook.execute();
Utils.debugLog("Notified Webhook");
} catch (Exception e) {
e.printStackTrace();
Utils.debugLog("Failed to send webhook");
}
Lilase.mc.thePlayer.closeScreen();
state = FlipperState.NONE;
Lilase.sniper.setOpen(true);
Lilase.cofl.setOpen(true);
return;
}
InventoryUtils.clickOpenContainerSlot(InventoryUtils.getSlotForItem(itemname));
@ -138,8 +156,46 @@ public class Flipper {
buyWait.schedule(1000);
} // TODO: Ternary Expression
} else if (InventoryUtils.inventoryNameContains("Manage Auction") && buyWait.passed()) {
InventoryUtils.clickOpenContainerSlot(24);
buyWait.schedule(1500);
ItemStack slot24 = InventoryUtils.getStackInOpenContainerSlot(24);
ItemStack slot33 = InventoryUtils.getStackInOpenContainerSlot(33);
ItemStack slot42 = InventoryUtils.getStackInOpenContainerSlot(42);
ItemStack slot51 = InventoryUtils.getStackInOpenContainerSlot(51);
if (slot24 != null && slot24.getItem() == Items.golden_horse_armor) {
InventoryUtils.clickOpenContainerSlot(24);
buyWait.schedule(1000);
} else if (slot33 != null && slot33.getItem() == Items.golden_horse_armor) {
InventoryUtils.clickOpenContainerSlot(33);
buyWait.schedule(1000);
} else if (slot42 != null && slot42.getItem() == Items.golden_horse_armor) {
InventoryUtils.clickOpenContainerSlot(42);
buyWait.schedule(1000);
} else if (slot51 != null && slot51.getItem() == Items.golden_horse_armor) {
InventoryUtils.clickOpenContainerSlot(51);
buyWait.schedule(1000);
} else {
Utils.debugLog("Can't find create auction button, stopping flipper");
try {
webhook.addEmbed(new DiscordWebhook.EmbedObject()
.setTitle("Failed to post an item!")
.setDescription("Could not find create auction button, sending so you can post it manually")
.setFooter("Purse: " + format.format(Utils.getPurse()), icon)
.addField("Item:", itemname, true)
.addField("Price:", format.format(itemprice), true)
.addField("Target Price:", format.format(target), true)
.addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true)
.setColor(Color.decode("#ff0000")));
if (SEND_MESSAGE) webhook.execute();
Utils.debugLog("Notified Webhook");
} catch (Exception e) {
e.printStackTrace();
Utils.debugLog("Failed to send webhook");
}
Lilase.mc.thePlayer.closeScreen();
state = FlipperState.NONE;
Lilase.cofl.setOpen(true);
return;
}
}
case START:
if (!InventoryUtils.isStoneButton() && InventoryUtils.isToAuctionItem(itemname) && InventoryUtils.inventoryNameStartsWith("Create BIN Auction") && buyWait.passed()) {
@ -163,28 +219,24 @@ public class Flipper {
break;
}
}
public static JsonObject getItemData() throws IOException {
URL url = new URL("https://www.night0721.me/api/skyblock");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.addRequestProperty("Content-Type", "text/plain");
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
out.write(bytedata);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null)
content.append(inputLine);
in.close();
connection.disconnect();
object = (JsonObject) new JsonParser().parse(content.toString());
System.out.println("Price" + object.get("price"));
return object;
public static void sendInterrupt() {
try {
webhook.addEmbed(new DiscordWebhook.EmbedObject()
.setTitle("Failed to post an item!")
.setDescription("Could not find create as interruption, sending so you can post it manually")
.setFooter("Purse: " + format.format(Utils.getPurse()), icon)
.addField("Item:", itemname, true)
.addField("Price:", format.format(itemprice), true)
.addField("Target Price:", format.format(target), true)
.addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true)
.setColor(Color.decode("#ff0000")));
if (SEND_MESSAGE) webhook.execute();
Utils.debugLog("Notified Webhook");
} catch (Exception e) {
e.printStackTrace();
Utils.debugLog("Failed to send webhook");
}
}
public static float distanceToFirstPoint() {
return (float) Math.sqrt(Math.pow(Lilase.mc.thePlayer.posX - (-2.5), 2) + Math.pow(Lilase.mc.thePlayer.posZ - (-91.5), 2));
}

View file

@ -13,7 +13,7 @@ import static me.night0721.lilase.features.flipper.Flipper.*;
public class PageFlipper {
public PageFlipperState state = PageFlipperState.NONE;
public Clock cooldown = new Clock();
public final Clock cooldown = new Clock();
public boolean open = false;
private Thread loop;

View file

@ -1,264 +1,9 @@
package me.night0721.lilase.features.sniper;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.night0721.lilase.Lilase;
import me.night0721.lilase.config.AHConfig;
import me.night0721.lilase.features.flipper.Flipper;
import me.night0721.lilase.features.flipper.FlipperState;
import me.night0721.lilase.player.EffectState;
import me.night0721.lilase.utils.DiscordWebhook;
import me.night0721.lilase.utils.UngrabUtils;
import me.night0721.lilase.utils.Utils;
import javax.net.ssl.HttpsURLConnection;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE;
public class Sniper {
private Boolean open = false;
public Boolean buying = false;
private int auctionsSniped = 0;
private int auctionsPosted = 0;
private int auctionsFlipped = 0;
public final DiscordWebhook webhook = new DiscordWebhook(Lilase.configHandler.getString("Webhook"));
private final List<Item> items = new ArrayList<>();
private final List<Item> blacklist = new ArrayList<>();
private final List<String> posted = new ArrayList<>();
private final ThreadLocalRandom randomSlot;
public static Flipper flipper;
private final List<Long> times = Arrays.asList(TimeUnit.DAYS.toMillis(365), TimeUnit.DAYS.toMillis(30), TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1), TimeUnit.SECONDS.toMillis(1));
private final List<String> timesString = Arrays.asList("year", "month", "day", "hour", "minute", "second");
public Sniper() {
for (int i = 1; i <= 99; i++) {
if (!Lilase.configHandler.getString(i, "Name").equals("") && !Lilase.configHandler.getString(i, "Type").equals("") && !Lilase.configHandler.getString(i, "Tier").equals("") && Lilase.configHandler.getInt(i, "Price") != 0) {
try {
ItemType.valueOf(Lilase.configHandler.getString(i, "Type"));
ItemType.valueOf(Lilase.configHandler.getString(i, "Tier"));
} catch (IllegalArgumentException e) {
System.out.println("Invalid item type or tier for item " + i + ", please check your config");
}
items.add(new Item(Lilase.configHandler.getString(i, "Name"), ItemType.valueOf(Lilase.configHandler.getString(i, "Type")), Lilase.configHandler.getInt(i, "Price"), ItemTier.valueOf(Lilase.configHandler.getString(i, "Tier"))));
}
}
for (int i = 1; i <= 99; i++) {
if (!Lilase.configHandler.getString(i, "Name").equals(""))
blacklist.add(new Item(Lilase.configHandler.getString(i, "Name"), null, null, null));
}
webhook.setUsername("Lilase - Auction House");
webhook.setAvatarUrl("https://th.bing.com/th/id/OIP.Lk2cSujieY70GbsgPZ0TyAHaEK?w=325&h=182&c=7&r=0&o=5&pid=1.7");
webhook.setTts(false);
randomSlot = ThreadLocalRandom.current();
}
private JsonObject getHypixelData(String player) throws IOException {
URL url = new URL("https://api.hypixel.net/player?key=" + Lilase.configHandler.getString("APIKey") + "&uuid=" + player);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
connection.disconnect();
return (JsonObject) new JsonParser().parse(content.toString());
}
public void start() throws IOException {
if (AHConfig.SNIPER_MODE != 0) return;
if (!open) return;
if (Utils.cookie != EffectState.ON && !Utils.checkInHub()) {
Utils.sendMessage("You have no cookie but you are not in hub, stopping");
setOpen(false);
return;
}
if (items.size() == 0) {
Utils.sendMessage("No Item queued, stopping");
setOpen(false);
return;
}
if (Lilase.configHandler.getString("APIKey").equals("") || Lilase.configHandler.getString("Webhook").equals("")) {
Utils.sendMessage("Missing APIKey, stopping");
setOpen(false);
return;
}
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.mc.currentScreen != null) Lilase.mc.thePlayer.closeScreen();
Utils.debugLog("Doing some motion as we don't want to be AFK");
Lilase.mc.thePlayer.inventory.currentItem = randomSlot.nextInt(9);
URL url = new URL("https://api.hypixel.net/skyblock/auctions");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int status = connection.getResponseCode();
if (status != 200) {
Utils.sendMessage("Error getting data from Hypixel API, either API down or internal error");
return;
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
connection.disconnect();
Utils.sendMessage("Getting item from auction house");
JsonObject data = (JsonObject) new JsonParser().parse(content.toString());
JsonArray auctions = data.getAsJsonArray("auctions");
for (int i = 0; i < auctions.size(); i++) {
JsonObject auction = auctions.get(i).getAsJsonObject();
for (Item item : items) {
String lore = " ";
ItemType type = item.getType();
String itemName = auction.get("item_name").getAsString();
String uuid = auction.get("uuid").getAsString();
Integer price = auction.get("starting_bid").getAsInt();
boolean found = false;
switch (item.query) {
case "Bal":
lore = "Made of Lava";
break;
case "Squid":
lore = "More Ink";
break;
case "Monkey":
lore = "Treeborn";
break;
case "Ocelot":
lore = "Tree Hugger";
break;
case "Dolphin":
lore = "Echolocation";
break;
case "Flying Fish":
lore = "Water Bender";
break;
}
if (posted.contains(uuid)) break;
for (Item blacklisted : blacklist) {
if (itemName.contains(blacklisted.getQuery())) {
found = true;
break;
}
}
if (found) break;
if (!itemName.toLowerCase().contains(item.query.toLowerCase())) break;
if (!auction.get("item_lore").getAsString().contains(lore)) break;
if (price > item.getPrice()) break;
if (item.getTier() != ItemTier.ANY)
if (!auction.get("tier").getAsString().equals(item.getTier().name())) break;
if (type != ItemType.ANY) if (!auction.get("category").getAsString().equals(type.getLowercase())) break;
if (!auction.get("bin").getAsBoolean()) break;
if (!posted.contains(uuid)) {
posted.add(uuid);
flipper = new Flipper(itemName, auction.get("item_bytes").getAsString(), price);
NumberFormat format = NumberFormat.getInstance(Locale.US);
JsonObject profile = getHypixelData(auction.get("auctioneer").getAsString());
String profileName = profile.get("player").getAsJsonObject().get("displayname").getAsString();
if (profileName.equalsIgnoreCase(Lilase.mc.thePlayer.getName())) break;
String updated = auction.get("item_lore").getAsString().replaceAll("§[0-9a-z]", "");
DecimalFormat df = new DecimalFormat("#.##");
if (Lilase.configHandler.getBoolean("checkProfitPercentageBeforeBuy")) {
float multi = flipper.checkProfitPercentage();
Utils.debugLog("Found an item, checking profit percentage");
if (multi > Lilase.configHandler.getInt("ProfitPercentage")) {
Utils.debugLog("Higher than required profit percentage, buying now");
buying = true;
}
} else {
Utils.debugLog("Found an item, trying to buy");
buying = true;
}
if (buying) {
Utils.sendServerMessage("/viewauction " + uuid);
webhook.addEmbed(new DiscordWebhook.EmbedObject().setTitle("Bought an item on low price").setUrl("https://sky.coflnet.com/auction/" + uuid).setAuthor("night0721", "https://github.com/night0721", "https://avatars.githubusercontent.com/u/77528305?v=4").setDescription(updated.replace("\n", "\\n")).addField("Item", itemName, true).addField("Price", format.format(price) + " coins", true).addField("Profit", format.format(flipper.getItemPrice() - price) + " coins", true).addField("Profit Percentage", Float.parseFloat(df.format(flipper.getItemPrice() - price)) + "%", true).addField("Seller", profileName, true).addField("Started for", toDuration(System.currentTimeMillis() - auction.get("start").getAsLong()), true).addField("Ends in", getTimeSinceDate(auction.get("end").getAsLong() - System.currentTimeMillis()), true).setColor(Color.decode("#003153")));
webhook.setContent(itemName + " is sale at " + format.format(price) + "! `" + "/viewauction " + uuid + "`");
}
return;
}
}
}
}
public String toDuration(long duration) {
StringBuilder res = new StringBuilder();
for (int i = 0; i < times.size(); i++) {
Long current = times.get(i);
long temp = duration / current;
if (temp > 0) {
res.append(temp).append(" ").append(timesString.get(i)).append(temp != 1 ? "s" : "").append(" ago");
break;
}
}
if ("".equals(res.toString())) return "0 seconds ago";
else return res.toString();
}
private String getTimeSinceDate(long timeSinceDate) {
long seconds = TimeUnit.MILLISECONDS.toSeconds(timeSinceDate);
long minutes = TimeUnit.MILLISECONDS.toMinutes(timeSinceDate);
long hours = TimeUnit.MILLISECONDS.toHours(timeSinceDate);
long days = TimeUnit.MILLISECONDS.toDays(timeSinceDate);
if (seconds < 60) return "in " + seconds + " seconds";
else if (minutes < 60) return "in " + minutes + " minutes";
else if (hours < 24) return "in " + hours + " hours";
else return "in " + days + " days";
}
public void toggleAuction() {
if (getOpen()) {
Utils.sendMessage("Stopped AH Sniper");
setOpen(false);
UngrabUtils.regrabMouse();
} else {
if (Utils.checkInHub()) {
Utils.sendMessage("Started AH Sniper");
setOpen(true);
UngrabUtils.ungrabMouse();
} 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;
}
public int getAuctionsSniped() {
return auctionsSniped;
@ -286,50 +31,4 @@ public class Sniper {
}
enum ItemTier {
ANY, COMMON, UNCOMMON, RARE, EPIC, LEGENDARY, MYTHIC, DIVINE, SPECIAL, VERY_SPECIAL
}
enum ItemType {
ANY("any"), WEAPON("weapon"), ARMOR("armor"), ACCESSORIES("accessories"), CONSUMABLES("consumables"), BLOCKS("blocks"), MISC("misc");
public final String lowercase;
public String getLowercase() {
return lowercase;
}
ItemType(String lowercase) {
this.lowercase = lowercase;
}
}
class Item {
public final String query;
public final ItemType type;
public final Integer price;
public final ItemTier tier;
public Item(String query, ItemType type, Integer price, ItemTier tier) {
this.query = query;
this.type = type;
this.price = price;
this.tier = tier;
}
public String getQuery() {
return query;
}
public ItemType getType() {
return type;
}
public Integer getPrice() {
return price;
}
public ItemTier getTier() {
return tier;
}
}

View file

@ -26,7 +26,7 @@ public class MixinGuiIngame {
if (txt.startsWith("www")) return "§4w§cw§6w§e.§2n§ai§bg§3h§1t§90§d7§42§c1§6.§em§2e";
if (txt.startsWith("SKY")) return "§d§lLILASE";
if (Pattern.compile("\\d{2}/\\d{2}/\\d{2}").matcher(txt).find()) return txt.split(" ")[0];
if (text.startsWith(EnumChatFormatting.RED + "") && Pattern.compile("\\d+").matcher(txt).matches()) return "";
if (text.startsWith(String.valueOf(EnumChatFormatting.RED)) && Pattern.compile("\\d+").matcher(txt).matches()) return "";
else return text;
}

View file

@ -118,8 +118,14 @@ public class DiscordWebhook {
jsonEmbed.put("fields", jsonFields.toArray());
embedObjects.add(jsonEmbed);
}
if (embedObjects.size() > 1) {
for (int i = 1; i < embedObjects.size(); i++) {
embedObjects.remove(i);
}
}
json.put("embeds", embedObjects.toArray());
}
System.out.println(json);
URL url = new URL(this.url);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.addRequestProperty("Content-Type", "application/json");
@ -127,7 +133,7 @@ public class DiscordWebhook {
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStream stream = connection.getOutputStream();
stream.write(json.toString().getBytes(StandardCharsets.UTF_16));
stream.write(json.toString().getBytes(StandardCharsets.UTF_8));
stream.flush();
stream.close();
connection.getInputStream().close();

View file

@ -1,7 +1,6 @@
package me.night0721.lilase.utils;
import me.night0721.lilase.Lilase;
import me.night0721.lilase.config.AHConfig;
import net.minecraft.client.settings.KeyBinding;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@ -21,20 +20,12 @@ public class KeyBindingManager {
public void onKeyPress(InputEvent.KeyInputEvent event) {
if (keyBindings[0].isPressed()) {
// TODO: Add sniper interface and use nested switch loop to prevent .toggleAuction(); repeating
switch (AHConfig.SNIPER_MODE) {
case 0:
Lilase.sniper.toggleAuction();
break;
case 1:
Lilase.pageFlipper.toggleAuction();
break;
case 2:
Lilase.cofl.toggleAuction();
break;
}
Lilase.cofl.toggleAuction();
}
if (keyBindings[1].isPressed())
if (keyBindings[1].isPressed()) {
Lilase.config.openGui();
ScoreboardUtils.cleanSB("§6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK");
}
}
public static void rightClick() {

View file

@ -7,13 +7,17 @@ import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static me.night0721.lilase.Lilase.mc;
public class Utils {
public static IChatComponent header = null, footer = null;
private static final Pattern PATTERN_HUB_LOCATIONS = Pattern.compile("(forest|village|farm|mountain|wilderness|community|graveyard|bazaar|auction)");
private static final Pattern PATTERN_PURSE = Pattern.compile("(Purse|Piggy): (?:§.)?([0-9.,]+)");
public static EffectState cookie;
public static String translateAlternateColorCodes(String text) {
@ -48,12 +52,35 @@ public class Utils {
}
}
public static int getPurse() {
String purse = "";
List<String> matches = ScoreboardUtils.getSidebarLines().stream()
.map(ScoreboardUtils::cleanSB)
.map(PATTERN_PURSE::matcher)
.filter(Matcher::find)
.map(Matcher::group)
.collect(Collectors.toList());
String purseline = matches.get(0);
Matcher matcher = PATTERN_PURSE.matcher(purseline);
if (matcher.find()) {
System.out.println("Group: " + matcher.group());
purse = matcher.group(2);
purse = purse.replace(",", "");
purse = purse.replaceAll("\\..*", "");
Utils.debugLog("Purse: " + purse);
return Integer.parseInt(purse);
}
return Integer.parseInt(purse);
}
public static void sendMessage(String message) {
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "" + EnumChatFormatting.BOLD + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + message));
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + String.valueOf(EnumChatFormatting.BOLD) + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + message));
}
public static void debugLog(String message) {
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "" + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.WHITE + message));
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.WHITE + message));
}
public static void debugLog(String... messages) {