package net.uomc.mineshaft; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Collections; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.util.PeelingUtils; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; 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.events.message.MessageReceivedEvent; public class PlayerHealths { private static final String HP_TABLE = "hp"; public static final String HP_EMOJI = "<:hp:1428837195329962115>"; private Mineshaft bot; public static final long MAX_HP = 20; private SavedStat healthStat; public PlayerHealths(Mineshaft bot) { this.bot = bot; healthStat = bot.getPlayerStats().getStat(HP_TABLE); healthStat.setDefaultValue(MAX_HP); bot.getCommandController().addCommand(CommandDetails.from("hp,health"), (e, b, args) -> { Member member = PeelingUtils.getSingleMentionFromArgs(e); if (e.getMember().getId().equals(b.getOwnerID())){ Optional amount = Arrays.asList(args).stream().filter(s -> PeelingUtils.isLong(s)).map(s -> Long.parseLong(s)) .findFirst(); if (!amount.isEmpty()) { setHP(member, amount.get()); } } b.sendMessage(e, member.getEffectiveName() + "'s health", (member.equals(e.getMember()) ? "Your " : member.getEffectiveName() + "'s") + " health: " + getHPString(member)); }); } public void setHP(Member member, long value) { healthStat.set(member, value); } public long getHP(Member member) { return healthStat.get(member); } public String getHPString(Member member) { return getHPString(getHP(member)); } public static String getHPString(long hp) { return "**" + hp + HP_EMOJI + "**"; } public long calculateDamage(Member member, long damage) { return calculateDamage(member, null, true, damage); } public long calculateDamage(Member member, boolean countArmour, long damage) { return calculateDamage(member, null, countArmour, damage); } public long calculateDamage(Member target, Member attacker, boolean countArmour, long damage) { return calculateDamage(target, attacker, countArmour, true, damage); } public long calculateDamage(Member target, Member attacker, boolean countArmour, boolean randomise, long damage) { long bonus = 0; if (attacker != null) { bonus = bot.getSword(attacker).getDamageBonus(); } double n = 1; if (randomise) { n = Math.random(); } return (long) (n * Math.abs(damage)) + bonus - bot.getArmour(target).getDamageReduction(); } public long damage(MessageReceivedEvent event, Member member, long amount, String reason) { return damageAndDropIfKill(event, member, amount, reason, Collections.emptyMap()); } public long damageAndDropIfKill(MessageReceivedEvent event, Member member, long amount, String reason, Map items) { long hp = getHP(member) - amount; if (hp > 0) { setHP(member, hp); return hp; } killPlayerAndDrop(event, member, reason, items); return hp; } public long damageAndDropIfKill(Message message, Member member, long amount, String reason, Map items) { long hp = getHP(member); hp -= amount; if (hp > 0) { setHP(member, hp); return hp; } killPlayerAndDrop(message, member, reason, items); return hp; } public long damage(Message message, Member member, long amount, String reason) { long hp = getHP(member) - amount; if (hp > 0) { setHP(member, hp); return hp; } killPlayer(message, member, reason); return hp; } public void killPlayerAndDrop(Message message, Member member, String deathMessage, Map items) { setHP(member, MAX_HP); Map drops = DropUtil.getDeathDrops(bot, member); if (!items.isEmpty()) drops = bot.sumItems(drops, items); bot.removeItems(member, drops); if (message != null && !message.getEmbeds().isEmpty()) { EmbedBuilder builder = new EmbedBuilder(message.getEmbeds().getFirst()); builder.appendDescription("\n" + deathMessage + "\n"); MessageEmbed embed = DropUtil.getDropEmbed(bot, drops, builder.build()); DropUtil.spawnDropEdit(bot, message, embed, drops); return; } String title = getDeathTitle(member, deathMessage); MessageEmbed embed = DropUtil.getDropEmbed(bot, drops, deathMessage, title); DropUtil.spawnDrop(bot, message.getChannel(), embed, drops); } public void killPlayerAndDrop(MessageReceivedEvent event, Member member, String deathMessage, Map items) { killPlayerAndDrop((Message) null, member, deathMessage, items); } public void killPlayer(MessageReceivedEvent event, Member member, String deathMessage ) { killPlayerAndDrop(event, member, deathMessage, Collections.emptyMap()); } public void killPlayer(Message message, Member member, String deathMessage ) { killPlayerAndDrop(message, member, deathMessage, Collections.emptyMap()); } private String getDeathTitle(Member member, String deathMessage) { String title = member.getEffectiveName() + " has died!"; if (EmojiManager.containsEmoji(deathMessage)) { title = EmojiParser.extractEmojis(deathMessage).getFirst(); } return title; } }