From 990b81f0799c9403c15867b2899c466b47e0f939 Mon Sep 17 00:00:00 2001 From: youhavetrouble Date: Mon, 11 Dec 2023 23:48:41 +0100 Subject: [PATCH] requires paper now, added config, added mementos, added reload command --- pom.xml | 2 +- readme.md | 14 ++- .../BeHappyThatItHappened.java | 23 +++- .../behappythatithappened/ReloadCommand.java | 31 ++++++ .../SadMomentListener.java | 105 ++++++++++++++++-- src/main/resources/config.yml | 5 + src/main/resources/plugin.yml | 10 ++ 7 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 src/main/java/me/youhavetrouble/behappythatithappened/ReloadCommand.java create mode 100644 src/main/resources/config.yml diff --git a/pom.xml b/pom.xml index a574cd2..a3629ba 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.youhavetrouble BeHappyThatItHappened - 1.0-SNAPSHOT + 1.1 jar BeHappyThatItHappened diff --git a/readme.md b/readme.md index 139fa9f..7c83c6f 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,15 @@ ### Don't be sad it's gone, be happy that it happened. -Allows you to collect remains of your named companions. \ No newline at end of file +Allows you to collect remains of your named companions. + +#### Configuration + +You can reload the configuration with `/bhihreload` while having `bhih.reload` permission + +```yaml +named-entity: + rename-drops: true # should mob drops be renamed to the name of the mob + drop-nametag: false # should mobs drop (unusable) nametags with their name to be used as mementos +player: + drop-nametag: false # should players drop (unusable) nametags with their name to be used as mementos +``` \ No newline at end of file diff --git a/src/main/java/me/youhavetrouble/behappythatithappened/BeHappyThatItHappened.java b/src/main/java/me/youhavetrouble/behappythatithappened/BeHappyThatItHappened.java index 1a71f5a..334940c 100644 --- a/src/main/java/me/youhavetrouble/behappythatithappened/BeHappyThatItHappened.java +++ b/src/main/java/me/youhavetrouble/behappythatithappened/BeHappyThatItHappened.java @@ -1,12 +1,31 @@ package me.youhavetrouble.behappythatithappened; +import org.bukkit.command.PluginCommand; import org.bukkit.plugin.java.JavaPlugin; -public final class BeHappyThatItHappened extends JavaPlugin { +public class BeHappyThatItHappened extends JavaPlugin { + + protected boolean renameDrops = true; + protected boolean renamedMobsDropTag = false; + protected boolean playersDropTag = false; @Override public void onEnable() { - getServer().getPluginManager().registerEvents(new SadMomentListener(), this); + reloadSadness(); + getServer().getPluginManager().registerEvents(new SadMomentListener(this), this); + PluginCommand command = getCommand("bhihreload"); + if (command == null) { + getLogger().warning("You messed with the plugin.yml, didn't you?"); + return; + } + command.setExecutor(new ReloadCommand(this)); + } + + protected void reloadSadness() { + saveDefaultConfig(); + renameDrops = getConfig().getBoolean("named-entity.rename-drops", true); + renamedMobsDropTag = getConfig().getBoolean("named-entity.drop-nametag", false); + playersDropTag = getConfig().getBoolean("player.drop-nametag", false); } } diff --git a/src/main/java/me/youhavetrouble/behappythatithappened/ReloadCommand.java b/src/main/java/me/youhavetrouble/behappythatithappened/ReloadCommand.java new file mode 100644 index 0000000..10ba958 --- /dev/null +++ b/src/main/java/me/youhavetrouble/behappythatithappened/ReloadCommand.java @@ -0,0 +1,31 @@ +package me.youhavetrouble.behappythatithappened; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class ReloadCommand implements TabExecutor { + + private final BeHappyThatItHappened plugin; + + public ReloadCommand(BeHappyThatItHappened plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { + plugin.reloadSadness(); + commandSender.sendMessage("Reloaded BeHappyThatItHappened config."); + return true; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { + return new ArrayList<>(); + } +} diff --git a/src/main/java/me/youhavetrouble/behappythatithappened/SadMomentListener.java b/src/main/java/me/youhavetrouble/behappythatithappened/SadMomentListener.java index 46a4714..d9b6a3a 100644 --- a/src/main/java/me/youhavetrouble/behappythatithappened/SadMomentListener.java +++ b/src/main/java/me/youhavetrouble/behappythatithappened/SadMomentListener.java @@ -1,28 +1,117 @@ package me.youhavetrouble.behappythatithappened; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; public class SadMomentListener implements Listener { + private final ItemMeta nametagMeta = new ItemStack(Material.NAME_TAG).getItemMeta(); + private final NamespacedKey inMemoryOfKey; + private final BeHappyThatItHappened plugin; + + protected SadMomentListener(BeHappyThatItHappened plugin) { + this.plugin = plugin; + inMemoryOfKey = new NamespacedKey(plugin, "in-memory-of"); + nametagMeta.getPersistentDataContainer().set(inMemoryOfKey, PersistentDataType.STRING, ""); + } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onSadMoment(EntityDeathEvent event) { - if (event.getEntityType().equals(EntityType.PLAYER)) return; - String inMemoryOf = event.getEntity().getCustomName(); + Component inMemoryOf = event.getEntity().customName(); if (inMemoryOf == null) return; - event.getDrops().forEach(memento -> { - ItemMeta respect = memento.getItemMeta(); - if (respect.hasDisplayName()) return; - respect.setDisplayName(inMemoryOf); - memento.setItemMeta(respect); - }); + if (plugin.renameDrops) { + event.getDrops().forEach(memento -> { + ItemMeta respect = memento.getItemMeta(); + if (respect.hasDisplayName()) return; + respect.displayName(inMemoryOf); + memento.setItemMeta(respect); + }); + } + if (plugin.renamedMobsDropTag) { + event.getDrops().add(getMemento(inMemoryOf, null)); + } + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onLossMoment(PlayerDeathEvent event) { + if (!plugin.playersDropTag) return; + Player player = event.getEntity(); + ItemStack memento = getMemento(player.displayName(), event.deathMessage()); + event.getDrops().add(memento); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onDesecration(PrepareAnvilEvent event) { + ItemStack left = event.getInventory().getFirstItem(); + if (left == null) return; + if (!Material.NAME_TAG.equals(left.getType())) return; + ItemMeta meta = left.getItemMeta(); + PersistentDataContainer pdc = meta.getPersistentDataContainer(); + if (!pdc.has(inMemoryOfKey, PersistentDataType.STRING)) return; + event.setResult(null); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onDesecration(PlayerInteractEntityEvent event) { + ItemStack held = event.getPlayer().getInventory().getItemInMainHand(); + if (!Material.NAME_TAG.equals(held.getType())) return; + ItemMeta meta = held.getItemMeta(); + PersistentDataContainer pdc = meta.getPersistentDataContainer(); + if (!pdc.has(inMemoryOfKey, PersistentDataType.STRING)) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onDesecration(EntityDamageEvent event) { + if (!(event.getEntityType().equals(EntityType.DROPPED_ITEM))) return; + if (event.getCause().equals(EntityDamageEvent.DamageCause.VOID)) return; + ItemStack item = ((org.bukkit.entity.Item) event.getEntity()).getItemStack(); + if (!Material.NAME_TAG.equals(item.getType())) return; + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer pdc = meta.getPersistentDataContainer(); + if (!pdc.has(inMemoryOfKey, PersistentDataType.STRING)) return; + event.setCancelled(true); + } + + private ItemStack getMemento(Component name, Component message) { + ItemStack nametag = new ItemStack(Material.NAME_TAG); + ItemMeta meta = nametagMeta; + meta.displayName(Component.text("In memory of ").append(name) + .decoration(TextDecoration.ITALIC, false) + .color(NamedTextColor.WHITE)); + if (message != null) { + List lore = new ArrayList<>(); + lore.add(message + .decoration(TextDecoration.ITALIC, false) + .color(NamedTextColor.GRAY) + ); + meta.lore(lore); + } + nametag.setItemMeta(meta); + return nametag; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..10f6869 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,5 @@ +named-entity: + rename-drops: true + drop-nametag: false +player: + drop-nametag: false diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 24c053e..f60169c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,3 +5,13 @@ api-version: 1.18 authors: [ YouHaveTrouble ] description: Don't be sad that they're gone, be happy they happened website: youhavetrouble.me +commands: + bhihreload: + description: Reloads the plugin + usage: /bhihreload + permission: bhih.reload + permission-message: You do not have permission to use this command +permissions: + bhih.reload: + description: Allows the user to reload the plugin + default: op