summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/DropUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/DropUtil.java')
-rw-r--r--src/main/java/net/uomc/mineshaft/DropUtil.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/main/java/net/uomc/mineshaft/DropUtil.java b/src/main/java/net/uomc/mineshaft/DropUtil.java
new file mode 100644
index 0000000..dce4a16
--- /dev/null
+++ b/src/main/java/net/uomc/mineshaft/DropUtil.java
@@ -0,0 +1,136 @@
+package net.uomc.mineshaft;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import com.mouldycheerio.dbot.util.EventWaiter;
+import com.mouldycheerio.dbot.util.PeelingUtils;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.Message;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+
+public class DropUtil {
+ private static final String FOLLOWING_STRING = "The following items have dropped:";
+ private static final int TO_PICK = 3;
+ private static final double MAX_AMOUNT_PERCENT = 0.35;
+ private static final long DROP_DURATION_SECONDS = 90;
+ public static final String LOOT_STRING = "loot";
+
+ public static Map<MineshaftItem, Long> getDeathDrops(Mineshaft bot, Member member) {
+ Map<MineshaftItem, Long> drop = new HashMap<>();
+
+ Map<MineshaftItem, Long> inventory = bot.getInventory(member);
+
+ int items = TO_PICK;
+ if (bot.getItem(member, MineshaftItem.XP) > 0) {
+ drop.put(MineshaftItem.XP,
+ (long) Math.ceil(bot.getItem(member, MineshaftItem.XP) * (Math.random() * MAX_AMOUNT_PERCENT)));
+ items--;
+ }
+
+ int random = new Random().nextInt();
+ inventory.entrySet().stream().filter(e -> e.getValue() > 0 && e.getKey() != MineshaftItem.XP)
+ .sorted(Comparator.comparingInt(o -> System.identityHashCode(o) ^ random))
+ .limit(items).collect(Collectors.toList()).forEach(e -> {
+ drop.put(e.getKey(),
+ (long) Math.ceil(e.getValue() * (Math.random() * MAX_AMOUNT_PERCENT)));
+ });
+
+ return drop;
+ }
+
+ public static void spawnDropEdit(Mineshaft bot, Message message, MessageEmbed embed, Map<MineshaftItem, Long> items) {
+ message.editMessageEmbeds(embed).setContent("").queue(m -> {
+ waitForPickUp(bot, embed, items, m);
+ });
+ }
+
+ private static void waitForPickUp(Mineshaft bot, MessageEmbed embed,
+ Map<MineshaftItem, Long> items, Message m) {
+ EventWaiter eventWaiter = new EventWaiter();
+ m.getChannel().getJDA().addEventListener(eventWaiter);
+
+ eventWaiter.waitForEvent(MessageReceivedEvent.class,
+ e -> {
+ if (!e.getMessage().getContentRaw().equalsIgnoreCase(LOOT_STRING))
+ return false;
+
+ return true;
+ }, e -> {
+ bot.addItems(e.getMember(), items);
+ EmbedBuilder em = new EmbedBuilder(embed);
+ String desc = embed.getDescription().split(FOLLOWING_STRING)[0];
+ em.setDescription( desc + "\n" + e.getMember().getAsMention() + " claimed the loot!\n**"
+ + bot.createItemList(items, "+%s") + "**");
+ m.editMessageEmbeds(em.build()).queue();
+ cleanupDrop(m.getChannel(), m);
+ }, DROP_DURATION_SECONDS, TimeUnit.SECONDS, () -> {
+ m.delete().queue();
+ cleanupDrop(m.getChannel(), m);
+ });
+ }
+
+ public static void spawnDrop(Mineshaft bot, MessageChannel channel, MessageEmbed embed,
+ Map<MineshaftItem, Long> items) {
+ channel.sendMessageEmbeds(embed).queue(m -> {
+ waitForPickUp(bot, embed, items, m);
+ });
+ }
+
+ public static MessageEmbed getNoDropEmbed(Mineshaft bot, String reason, String title) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle(title);
+ eb.getDescriptionBuilder().append(reason);
+ eb.getDescriptionBuilder().append("\nThey dropped nothing...");
+ eb.setColor(bot.color);
+ return eb.build();
+ }
+
+ public static MessageEmbed getDropEmbed(Mineshaft bot, Map<MineshaftItem, Long> items, MessageEmbed embed) {
+ EmbedBuilder eb = new EmbedBuilder(embed);
+ if (!bot.isEmpty(items)) {
+ eb.getDescriptionBuilder().append("\n" + FOLLOWING_STRING + "\n\n");
+ eb.getDescriptionBuilder().append(bot.createItemList(items));
+ eb.getDescriptionBuilder().append("\nSay `" + LOOT_STRING + "` to loot these items.\nHurry you only have "
+ + PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l) + " to collect them!");
+ }
+ return eb.build();
+ }
+
+ public static MessageEmbed getDropEmbed(Mineshaft bot, Map<MineshaftItem, Long> items, String description,
+ String title) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle(title);
+ eb.getDescriptionBuilder().append(description);
+ if (!bot.isEmpty(items)) {
+ eb.getDescriptionBuilder().append("\n" + FOLLOWING_STRING + "\n\n");
+ eb.getDescriptionBuilder().append(bot.createItemList(items));
+ eb.getDescriptionBuilder().append("\n\nSay `" + LOOT_STRING + "` to loot these items.\nHurry you only have "
+ + PeelingUtils.formatTimeRelativeFromNow(DROP_DURATION_SECONDS * 1000l) + " to collect them!");
+ }
+ eb.setColor(bot.color);
+ return eb.build();
+ }
+
+ public static void cleanupDrop(MessageChannel channel, Message message) {
+ channel.getHistoryAfter(message, 100).queueAfter(1, TimeUnit.SECONDS, h -> {
+ ArrayList<Message> msgs = new ArrayList<Message>();
+ h.getRetrievedHistory().forEach(m -> {
+ if (m.getContentRaw().equalsIgnoreCase(LOOT_STRING)) {
+ msgs.add(m);
+ }
+ });
+ PeelingUtils.bulkDelte(channel, msgs);
+ });
+ ;
+ }
+}