diff options
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/DropUtil.java')
| -rw-r--r-- | src/main/java/net/uomc/mineshaft/DropUtil.java | 136 |
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); + }); + ; + } +} |
