diff options
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/MineCommand.java')
| -rw-r--r-- | src/main/java/net/uomc/mineshaft/MineCommand.java | 135 |
1 files changed, 98 insertions, 37 deletions
diff --git a/src/main/java/net/uomc/mineshaft/MineCommand.java b/src/main/java/net/uomc/mineshaft/MineCommand.java index ecee140..730ae85 100644 --- a/src/main/java/net/uomc/mineshaft/MineCommand.java +++ b/src/main/java/net/uomc/mineshaft/MineCommand.java @@ -46,9 +46,13 @@ public class MineCommand extends CooldownCommand { private static final double DIAMOND_SPAWN_AMOUNT = 1; private static final double OBSIDIAN_SPAWN_AMOUNT = 1; private static final double XP_SPAWN_AMOUNT = 1000; + private static final double QUARTZ_SPAWN_AMOUNT = 16; + private static final double SKULL_SPAWN_AMOUNT = 1; + private static final double NETHERITE_SPAWN_AMOUNT = 1; private Map<String, String> ores; private List<String> oresList; + private List<String> netherOresList; private Mineshaft bot; @@ -57,14 +61,15 @@ public class MineCommand extends CooldownCommand { this.bot = bot; setCooldown(15l * 1000l); + setDetails(CommandDetails.from("mine", "mine diamonds")); this.ores = loadOreImages(); oresList = loadOreOrder(); + netherOresList = loadNetherOreOrder(); } public List<String> loadOreOrder() { - // lololol no return List.of( "coal", "copper", @@ -74,10 +79,44 @@ public class MineCommand extends CooldownCommand { "gold", "diamond", "emerald", + "obsidian", "obsidian" ); } + public List<String> loadNetherOreOrder() { + return List.of( + "quartz", + "quartz", + "quartz", + "quartz", + "gold", + "gold", + "skull", + "skull", + "netherite", + "netherite" + ); + } + + private int levelToMaxOre(int pickaxe) { + switch (pickaxe) { + case 0: // stone pickaxe + return 2; // copper + case 1: // copper pickaxe + return 4; // lapis + case 2: // iron pickaxe + return 6; // gold + case 3: // gold pickaxe + return 8; // diamond + case 4: // diamond pickaxe + return 9; // obsidian + case 5: // netherite pickaxe + return 10; // obsidian, 2 + } + return 9; + } + public Map<String, String> loadOreImages() { Map<String, String> ores = new LinkedHashMap<String, String>(); JSONObject config = bot.getConfig(); @@ -94,12 +133,22 @@ public class MineCommand extends CooldownCommand { return ores; } - public MineshaftItem getOre(int pickaxe) { + public MineshaftItem getOre(Member m) { + return getOre(m, false); + } + + public MineshaftItem getOre(Member m, boolean nether) { + int pickaxe = bot.getPickaxes().getPickaxeLevel(m); double random = Math.random(); int maxOre = levelToMaxOre(pickaxe); - int i = (int) Math.floor(Math.pow(random, 2) * maxOre); - String oreName = oresList.get(i); + + List<String> list = oresList; + if(nether) list = netherOresList; + + double c = getEfficiencyCurve(m); + int i = (int) Math.floor(Math.pow(random, c) * maxOre); + String oreName = list.get(i); MineshaftItem ore = MineshaftItem.valueOf(oreName.toUpperCase()); return ore; } @@ -107,34 +156,23 @@ public class MineCommand extends CooldownCommand { @Override public boolean trigger(MessageReceivedEvent e) { - int pickaxe = bot.getPickaxes().getPickaxeLevel(e.getMember()); - MineshaftItem ore = getOre(pickaxe); - int i = oresList.indexOf(ore.toString().toLowerCase()); + boolean nether = bot.getPickaxes().isNether(e.getMember()); + MineshaftItem ore = getOre(e.getMember(), nether); + int i; + if (nether) { + i = oresList.indexOf(ore.toString().toLowerCase()); + } else { + i = netherOresList.indexOf(ore.toString().toLowerCase()); + } - spawnDrop(e.getChannel(), ore, i, m -> {}); + spawnDrop(e.getChannel(), ore, i, nether, m -> {}); e.getMessage().addReaction(Emoji.fromUnicode(EmojiParser.parseToUnicode(":pick:"))).queue(); return true; } - private int levelToMaxOre(int pickaxe) { - switch (pickaxe) { - case 0: // stone pickaxe - return 2; // copper - case 1: // copper pickaxe - return 4; // lapis - case 2: // iron pickaxe - return 6; // gold - case 3: // gold pickaxe - return 8; // diamond - case 4: // diamond pickaxe - return 9; // obsidian - // TODO for obsidian u can make nether portal - } - return 9; - } - public void spawnDrop(MessageChannel channel, MineshaftItem ore, int oreLevel, Consumer<MessageChannel> then) { - sendDrop(channel, ore, m -> { + public void spawnDrop(MessageChannel channel, MineshaftItem ore, int oreLevel, boolean nether, Consumer<MessageChannel> then) { + sendDrop(channel, ore, nether, m -> { EventWaiter eventWaiter = new EventWaiter(); channel.getJDA().addEventListener(eventWaiter); @@ -155,14 +193,14 @@ public class MineCommand extends CooldownCommand { }); }, DROP_DURATION_SECONDS, TimeUnit.SECONDS, () -> { cleanup(channel, m, ore); - endDrop(m, ore); }); }); } public void cleanup(MessageChannel channel, Message message, MineshaftItem ore) { - message.delete().queue(); + + message.delete().queue(a -> {}, x -> {}); channel.getHistoryAfter(message, 100).queueAfter(5, TimeUnit.SECONDS, h -> { ArrayList<Message> msgs = new ArrayList<Message>(); @@ -176,11 +214,11 @@ public class MineCommand extends CooldownCommand { ; } - public void sendDrop(MessageChannel channel, MineshaftItem ore, Consumer<Message> callback) { + public void sendDrop(MessageChannel channel, MineshaftItem ore, boolean nether, Consumer<Message> callback) { EmbedBuilder embedBuilder = new EmbedBuilder(); embedBuilder.setColor(bot.getColor()); - embedBuilder.setImage(getOreUrl(ore)); + embedBuilder.setImage(getOreUrl(ore, nether)); embedBuilder.setTitle(String.format(DROP_TITLE)); embedBuilder.setDescription(String.format(DROP_DESCRIPTION, getPickString(ore), PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l))); @@ -195,10 +233,6 @@ public class MineCommand extends CooldownCommand { embedBuilder.setColor(bot.getColor()); Map<MineshaftItem, Long> awards = getAwards(member, ore); - int fortune = bot.getPickaxes().getPickaxeFortune(member); - if (fortune > 0) { - bot.multiply(awards, fortune + 1); - } bot.addItems(member, awards); String awardsList = bot.createItemList(awards, "+%s"); @@ -208,6 +242,7 @@ public class MineCommand extends CooldownCommand { channel.sendMessageEmbeds(embedBuilder.build()).queue(callback); } + public void endDrop(Message message, MineshaftItem ore) { EmbedBuilder embedBuilder = new EmbedBuilder(); @@ -221,8 +256,12 @@ public class MineCommand extends CooldownCommand { }); } - public String getOreUrl(MineshaftItem ore) { - String oreName = ore.toString(); + public String getOreUrl(MineshaftItem ore, boolean nether) { + String prefix = ""; + if (nether) + prefix = "nether_"; + + String oreName = prefix + ore.toString(); if (ores.containsKey(oreName)) return ores.get(oreName); @@ -262,6 +301,7 @@ public class MineCommand extends CooldownCommand { break; case EMERALD: award.put(MineshaftItem.EMERALD, (long) Math.ceil(Math.random() * EMERALD_SPAWN_AMOUNT)); + award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 5l)); break; case DIAMOND: award.put(MineshaftItem.DIAMOND, (long) Math.ceil(Math.random() * DIAMOND_SPAWN_AMOUNT)); @@ -269,12 +309,33 @@ public class MineCommand extends CooldownCommand { break; case OBSIDIAN: award.put(MineshaftItem.OBSIDIAN, (long) Math.ceil(Math.random() * OBSIDIAN_SPAWN_AMOUNT)); + break; + case QUARTZ: + award.put(MineshaftItem.QUARTZ, (long) Math.ceil(Math.random() * QUARTZ_SPAWN_AMOUNT)); + award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 5l)); + break; + case SKULL: + award.put(MineshaftItem.SKULL, (long) Math.ceil(Math.random() * SKULL_SPAWN_AMOUNT)); + award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 10l)); + break; + case NETHERITE: + award.put(MineshaftItem.NETHERITE, (long) Math.ceil(Math.random() * NETHERITE_SPAWN_AMOUNT)); award.put(MineshaftItem.XP, (long) Math.ceil(Math.random() * XP_SPAWN_AMOUNT * 10l)); break; default: break; } + return bot.multiply(award, getPickaxeFortuneCurve(member)); + } + + public double getEfficiencyCurve(Member m) { + return 1 + Math.pow(0.5, bot.getPickaxes().getPickaxeEfficiency(m) / 2); - return award; } + private double getPickaxeFortuneCurve(Member m) { + int fortune = bot.getPickaxes().getPickaxeFortune(m); + return fortune + Math.pow(1.2, fortune + 1); + } + + } |
