summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/PlayerHealths.java
diff options
context:
space:
mode:
authordavidovski <david@davidovski.xyz>2025-10-19 16:16:05 +0100
committerdavidovski <david@davidovski.xyz>2025-10-19 16:16:05 +0100
commitfff63aaea786a5f1c59bbf99c999a2aa7bb810e5 (patch)
treeb8c55be02d1e1f8575f5434a254d1593ede63432 /src/main/java/net/uomc/mineshaft/PlayerHealths.java
parentda9ece80133a33aff456d30854adc095b8f303ab (diff)
Add farm, sleep and trade
Diffstat (limited to 'src/main/java/net/uomc/mineshaft/PlayerHealths.java')
-rw-r--r--src/main/java/net/uomc/mineshaft/PlayerHealths.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/main/java/net/uomc/mineshaft/PlayerHealths.java b/src/main/java/net/uomc/mineshaft/PlayerHealths.java
new file mode 100644
index 0000000..395f71a
--- /dev/null
+++ b/src/main/java/net/uomc/mineshaft/PlayerHealths.java
@@ -0,0 +1,164 @@
+package net.uomc.mineshaft;
+
+import java.io.File;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import com.mouldycheerio.dbot.commands.CommandDetails;
+import com.mouldycheerio.dbot.util.DatabaseUtils;
+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";
+ private static final String HP_EMOJI = "<:hp:1428837195329962115>";
+ private String healthDb;
+ private Mineshaft bot;
+
+ private static final long MAX_HP = 20;
+
+ public PlayerHealths(Mineshaft bot) {
+
+ this.bot = bot;
+ healthDb = (new File(bot.getDatadir(), "players.db")).getPath();
+ initDB();
+
+ bot.getCommandController().addCommand(CommandDetails.from("hp,health"), (e, b, args) -> {
+ Member member = PeelingUtils.getSingleMentionFromArgs(e);
+ 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) {
+ try {
+ DatabaseUtils.putInKVtable(healthDb, HP_TABLE, member.getId() + ":" + member.getGuild().getId(), value);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private long getHP(String member, String guild) {
+ try {
+ return DatabaseUtils.getInKVtable(healthDb, HP_TABLE, member + ":" + guild);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return MAX_HP;
+ }
+
+ public long getHP(Member member) {
+ return getHP(member.getId(), member.getGuild().getId());
+ }
+
+ public String getHPString(Member member) {
+ return getHPString(getHP(member));
+ }
+
+ public static String getHPString(long hp) {
+ return "**" + hp + HP_EMOJI + "**";
+ }
+
+ public long damage(MessageReceivedEvent event, Member member, long amount, String reason) {
+ long hp = getHP(member);
+ hp -= amount;
+ if (hp <= 0) {
+ killPlayer(event, member, reason);
+ setHP(member, MAX_HP);
+ } else {
+ setHP(member, hp);
+ }
+ return hp;
+ }
+
+ public long damageAndDropIfKill(MessageReceivedEvent event, Member member, long amount, String reason, Map<MineshaftItem, Long> items) {
+ long hp = getHP(member);
+ hp -= amount;
+ if (hp <= 0) {
+ killPlayerAndDrop(event, member, reason, items);
+ setHP(member, MAX_HP);
+ } else {
+ setHP(member, hp);
+ }
+ return hp;
+ }
+
+ public long damageAndDropIfKill(Message message, Member member, long amount, String reason, Map<MineshaftItem, Long> items) {
+ long hp = getHP(member);
+ hp -= amount;
+ if (hp <= 0) {
+ killPlayerAndDrop(message, member, reason, items);
+ setHP(member, MAX_HP);
+ } else {
+ setHP(member, hp);
+ }
+ return hp;
+ }
+
+ public long damage(Message message, Member member, long amount, String reason) {
+ long hp = getHP(member);
+ hp -= amount;
+ if (hp <= 0) {
+ killPlayer(message, member, reason);
+ setHP(member, MAX_HP);
+ } else {
+ setHP(member, hp);
+ }
+ return hp;
+ }
+
+ private void initDB() {
+ try {
+ DatabaseUtils.createSimpleKVtable(healthDb, HP_TABLE);
+ } catch (SQLException e) {
+ }
+ }
+
+ public void killPlayerAndDrop(Message message, Member member, String deathMessage, Map<MineshaftItem, Long> items) {
+
+ Map<MineshaftItem, Long> drops = DropUtil.getDeathDrops(bot, member);
+ 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<MineshaftItem, Long> items) {
+ killPlayerAndDrop((Message) null, member, deathMessage, items);
+ }
+
+ public void killPlayer(MessageReceivedEvent event, Member member, String deathMessage ) {
+ killPlayerAndDrop(event, member, deathMessage, new HashMap<>());
+ }
+ public void killPlayer(Message message, Member member, String deathMessage ) {
+ killPlayerAndDrop(message, member, deathMessage, new HashMap<>());
+ }
+
+ private String getDeathTitle(Member member, String deathMessage) {
+ String title = member.getEffectiveName() + " has died!";
+ if (EmojiManager.containsEmoji(deathMessage)) {
+ title = EmojiParser.extractEmojis(deathMessage).getFirst();
+ }
+ return title;
+ }
+}