summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/EnchantCommand.java
diff options
context:
space:
mode:
authordavidovski <david@davidovski.xyz>2025-10-11 04:55:51 +0100
committerdavidovski <david@davidovski.xyz>2025-10-11 04:55:51 +0100
commit10b327e9f6441a8863227ce3e075a5a587654065 (patch)
tree5e94ecc91290febacf5181d3596563a7a24bd010 /src/main/java/net/uomc/mineshaft/EnchantCommand.java
v0.3.1
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/EnchantCommand.java')
-rw-r--r--src/main/java/net/uomc/mineshaft/EnchantCommand.java132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/main/java/net/uomc/mineshaft/EnchantCommand.java b/src/main/java/net/uomc/mineshaft/EnchantCommand.java
new file mode 100644
index 0000000..f85c92b
--- /dev/null
+++ b/src/main/java/net/uomc/mineshaft/EnchantCommand.java
@@ -0,0 +1,132 @@
+package net.uomc.mineshaft;
+
+import com.mouldycheerio.dbot.CustomBot;
+import com.mouldycheerio.dbot.commands.CommandDetails;
+import com.mouldycheerio.dbot.commands.CommandFail;
+import com.mouldycheerio.dbot.commands.DetailedCommand;
+
+import com.mouldycheerio.dbot.util.PeelingUtils;
+import com.vdurmont.emoji.EmojiParser;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+
+public class EnchantCommand extends DetailedCommand {
+
+ private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Enchanting_Table.gif";
+ private static final double MIN_DISCOUNT = 0.4;
+ private static final double MAX_BOOKSHELVES = 24;
+ private static final String COMMAND_TITLE = "Enchanting Table";
+ Mineshaft bot;
+
+ public EnchantCommand(Mineshaft bot) {
+ setCommandDetails(CommandDetails.from("enchant,enchanting,ench,etable,enchantingtable", "", "enchant"));
+ this.bot = bot;
+ }
+
+ @Override
+ public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail {
+
+ long ench_tables = bot.getItem(e.getMember(), MineshaftItem.ENCHANTING_TABLE);
+
+ if (ench_tables < 1) {
+ b.sendErrorMessage(e, ":x: You need to have at least **"
+ + bot.getItem(MineshaftItem.ENCHANTING_TABLE).prettyValue(1)
+ + "** to use this!");
+ return;
+ }
+
+ if (args.length > 0) {
+ enchant(e, args);
+ return;
+ }
+
+ int fortune = bot.getPickaxes().getPickaxeFortune(e.getMember());
+ long bookshelves = bot.getItem(e.getMember(), MineshaftItem.BOOKSHELF);
+ String bookshelfDiscountPercent = "-" + (int) Math.ceil((1 -bookshelfDiscount(bookshelves))*100) + "%";
+ long xpLevel = getXpLevel(fortune, bookshelves);
+ long lapisLevel = getLapisLevel(fortune, bookshelves);
+
+ long xpLevelNormal = getXpLevel(fortune, 0);
+ long lapisLevelNormal = getLapisLevel(fortune, 0);
+
+ String curr = "";
+ if (fortune > 0) {
+ curr = "Your pickaxe has **Fortune " + Pickaxes.getRomanNumber(fortune) + "**\n\n";
+ }
+
+ String description = curr + "Enchant your pickaxe with `" + b.getPrefixManager().getPrefix(e.getGuild()) + "enchant fortune`\n\n";
+
+ description += "**Cost:**\n";
+
+ if (bookshelves > 0)
+ description += "~~" + PeelingUtils.amountToString(lapisLevelNormal) + "~~ ";
+
+ description += "**" + bot.getItem(MineshaftItem.LAPIS).prettyValue(lapisLevel) + "**";
+ description += "\n";
+
+ if (bookshelves > 0)
+ description += "~~" + PeelingUtils.amountToString(xpLevelNormal) + "~~ ";
+
+ description += "**" + bot.getItem(MineshaftItem.XP).prettyValue(xpLevel) + "**";
+
+ if (bookshelves > 0) {
+ description += "\n\nYour ";
+ description += bot.getItem(MineshaftItem.BOOKSHELF).prettyValue(bookshelves);
+ description += " are giving you a **" + bookshelfDiscountPercent + "** discount!";
+ }
+
+ EmbedBuilder em = new EmbedBuilder();
+ em.setTitle(COMMAND_TITLE);
+ em.setDescription(description);
+ em.setThumbnail(COMMAND_IMAGE);
+ em.setColor(PeelingUtils.hex2Rgb("#0a0711"));
+
+ if (bookshelves == 0) {
+ em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "Bookshelves give you a discount on your enchantments");
+ }
+
+ e.getMessage().replyEmbeds(em.build()).queue();
+ }
+
+ private long getLapisLevel(int fortune, long bookshelves) {
+ return (long) (Math.pow(2, fortune + 4) * bookshelfDiscount(bookshelves));
+ }
+
+ private double bookshelfDiscount(long bookshelves) {
+ double b = Math.min(bookshelves, MAX_BOOKSHELVES);
+ return MIN_DISCOUNT + Math.log10( 1.0 + (9.0 * ((MAX_BOOKSHELVES - b) / MAX_BOOKSHELVES))) * MIN_DISCOUNT;
+ }
+
+ private long getXpLevel(int fortune, long bookshelves) {
+ return (long) (15000l * Math.pow(fortune + 1, 2) * bookshelfDiscount(bookshelves));
+ }
+
+ private void enchant(MessageReceivedEvent e, String[] args) {
+ int fortune = bot.getPickaxes().getPickaxeFortune(e.getMember());
+ long bookshelves = bot.getItem(e.getMember(), MineshaftItem.BOOKSHELF);
+ long xpLevel = getXpLevel(fortune, bookshelves);
+ long lapisLevel = getLapisLevel(fortune, bookshelves);
+
+ long memberLapis = bot.getItem(e.getMember(), MineshaftItem.LAPIS);
+ long memberXp = bot.getItem(e.getMember(), MineshaftItem.XP);
+
+ if (memberLapis < lapisLevel) {
+ bot.sendErrorMessage(e, ":x: You need " + bot.getItem(MineshaftItem.LAPIS).prettyValue(lapisLevel - memberLapis) + " more lapis!" );
+ return;
+ }
+
+ if (memberXp < xpLevel) {
+ bot.sendErrorMessage(e, ":x: You need " + bot.getItem(MineshaftItem.XP).prettyValue(xpLevel - memberXp) + " more xp!" );
+ return;
+ }
+
+ bot.removeItem(e.getMember(), MineshaftItem.LAPIS, lapisLevel);
+ bot.removeItem(e.getMember(), MineshaftItem.XP, xpLevel);
+ int level = bot.getPickaxes().incrementFortune(e.getMember());
+
+ bot.sendSuccessMessage(e, ":white_check_mark: You enchanted your pickaxe. Now it has **Fortune " + Pickaxes.getRomanNumber(level) + "**");
+
+ }
+
+}