From c1cfb0c856c5912cffa15bdc499100f1e01a4332 Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Sat, 20 Jul 2024 22:32:25 +0200
Subject: [PATCH 1/2] added Fleischerchest

---
 .../java/eu/mhsl/craftattack/spawn/Main.java  |  4 +++-
 .../fleischerchest/Fleischerchest.java        | 24 +++++++++++++++++++
 .../FleischerchestCraftItemListener.java      | 18 ++++++++++++++
 3 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/Fleischerchest.java
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java

diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
index 1558e88..f6a9248 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
@@ -4,6 +4,7 @@ import eu.mhsl.craftattack.spawn.aggregates.displayName.DisplayName;
 import eu.mhsl.craftattack.spawn.api.HttpServer;
 import eu.mhsl.craftattack.spawn.appliance.Appliance;
 import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker;
+import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest;
 import eu.mhsl.craftattack.spawn.appliances.kick.Kick;
 import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages;
 import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed;
@@ -55,7 +56,8 @@ public final class Main extends JavaPlugin {
                 new PanicBan(),
                 new Outlawed(),
                 new DisplayName(),
-                new Debug()
+                new Debug(),
+                new Fleischerchest()
         );
 
         Bukkit.getLogger().info("Loading appliances...");
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/Fleischerchest.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/Fleischerchest.java
new file mode 100644
index 0000000..8e0356b
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/Fleischerchest.java
@@ -0,0 +1,24 @@
+package eu.mhsl.craftattack.spawn.appliances.fleischerchest;
+
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.TextColor;
+import org.bukkit.event.Listener;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class Fleischerchest extends Appliance {
+    public void renameItem(ItemStack item) {
+        ItemMeta meta = item.getItemMeta();
+        meta.displayName(Component.text("Fleischerchest").color(TextColor.color(235, 20, 28)));
+        item.setItemMeta(meta);
+    }
+
+    @Override
+    protected @NotNull List<Listener> eventHandlers() {
+        return List.of(new FleischerchestCraftItemListener());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java
new file mode 100644
index 0000000..964bb90
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java
@@ -0,0 +1,18 @@
+package eu.mhsl.craftattack.spawn.appliances.fleischerchest;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
+import org.bukkit.Material;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.inventory.PrepareItemCraftEvent;
+import org.bukkit.inventory.ItemStack;
+
+public class FleischerchestCraftItemListener extends ApplianceListener<Fleischerchest> {
+    @EventHandler
+    public void onPrepareItemCraft(PrepareItemCraftEvent event) {
+        ItemStack result = event.getInventory().getResult();
+        if(result == null) return;
+        if(result.getType() == Material.RED_SHULKER_BOX) {
+            getAppliance().renameItem(event.getInventory().getResult());
+        }
+    }
+}

From 10918e284e5d87cd9e789996ed0d198611ee6ff0 Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Mon, 22 Jul 2024 19:39:35 +0200
Subject: [PATCH 2/2] added custom advancements appliance

---
 .../java/eu/mhsl/craftattack/spawn/Main.java  |  4 +++-
 .../CustomAdvancements.java                   | 22 +++++++++++++++++++
 ...ustomAdvancementsDamageEntityListener.java | 20 +++++++++++++++++
 3 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java

diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
index f6a9248..e8b8aee 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
@@ -4,6 +4,7 @@ import eu.mhsl.craftattack.spawn.aggregates.displayName.DisplayName;
 import eu.mhsl.craftattack.spawn.api.HttpServer;
 import eu.mhsl.craftattack.spawn.appliance.Appliance;
 import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker;
+import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements;
 import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest;
 import eu.mhsl.craftattack.spawn.appliances.kick.Kick;
 import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages;
@@ -57,7 +58,8 @@ public final class Main extends JavaPlugin {
                 new Outlawed(),
                 new DisplayName(),
                 new Debug(),
-                new Fleischerchest()
+                new Fleischerchest(),
+                new CustomAdvancements()
         );
 
         Bukkit.getLogger().info("Loading appliances...");
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java
new file mode 100644
index 0000000..861013c
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java
@@ -0,0 +1,22 @@
+package eu.mhsl.craftattack.spawn.appliances.customAdvancements;
+
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import org.bukkit.Bukkit;
+import org.bukkit.NamespacedKey;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+import java.util.Objects;
+
+public class CustomAdvancements extends Appliance {
+    public void grantAdvancement(String advancementName, Player player) {
+        player.getAdvancementProgress(Objects.requireNonNull(Bukkit.getAdvancement(Objects.requireNonNull(NamespacedKey.fromString("custom_advancements:craftattack/" + advancementName))))).awardCriteria("criteria");
+    }
+
+    @Override
+    protected @NotNull List<Listener> eventHandlers() {
+        return List.of(new CustomAdvancementsDamageEntityListener());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java
new file mode 100644
index 0000000..0b890ef
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java
@@ -0,0 +1,20 @@
+package eu.mhsl.craftattack.spawn.appliances.customAdvancements;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+
+public class CustomAdvancementsDamageEntityListener extends ApplianceListener<CustomAdvancements> {
+    @EventHandler
+    public void onEntityDamageEntity(EntityDamageByEntityEvent event) {
+        Entity damaged = event.getEntity();
+        if(!(damaged instanceof Player)) return;
+        Entity damager = event.getDamager();
+        if(!(damager instanceof Player)) return;
+        if(damaged.hasPermission("admin")) {
+            getAppliance().grantAdvancement("search_trouble", (Player) damager);
+        }
+    }
+}