diff --git a/pom.xml b/pom.xml
index dfdc86a..e9202bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
xyz.etztech
QoL
- 1.15
+ 1.16
jar
@@ -62,6 +62,12 @@
0.1-SNAPSHOT
provided
+
+ com.nisovin.shopkeepers
+ ShopkeepersAPI
+ 2.13.3
+ provided
+
@@ -97,6 +103,10 @@
sonatype-snapshots
https://oss.sonatype.org/content/repositories/snapshots
+
+ shopkeepers-repo
+ https://nexus.lichtspiele.org/repository/releases/
+
diff --git a/src/main/java/xyz/etztech/qol/QoL.java b/src/main/java/xyz/etztech/qol/QoL.java
index 1d53475..1b0b3f3 100644
--- a/src/main/java/xyz/etztech/qol/QoL.java
+++ b/src/main/java/xyz/etztech/qol/QoL.java
@@ -1,5 +1,6 @@
package xyz.etztech.qol;
+import com.nisovin.shopkeepers.api.ShopkeepersPlugin;
import github.scarsz.discordsrv.DiscordSRV;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.Bukkit;
@@ -8,7 +9,6 @@ import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.scheduler.BukkitRunnable;
import org.dynmap.DynmapAPI;
import org.dynmap.markers.Marker;
import org.dynmap.markers.MarkerAPI;
@@ -91,10 +91,17 @@ public class QoL extends JavaPlugin {
}
}
+ // DiscordSRV Hook
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) {
new DiscordSRVListener(this);
}
+ // Shopkeepers Hook
+ if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers")) {
+ new HeadShopListener(this);
+ log("Hooked in Shopkeepers for the head shop");
+ }
+
if( isEnabled() ) {
// Add listeners
diff --git a/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java b/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java
new file mode 100644
index 0000000..88b6b1a
--- /dev/null
+++ b/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java
@@ -0,0 +1,68 @@
+package xyz.etztech.qol.listeners;
+
+import com.nisovin.shopkeepers.api.ShopkeepersPlugin;
+import com.nisovin.shopkeepers.api.shopkeeper.ShopkeeperRegistry;
+import com.nisovin.shopkeepers.api.shopkeeper.admin.regular.RegularAdminShopkeeper;
+import com.nisovin.shopkeepers.api.shopkeeper.offers.TradeOffer;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.SkullMeta;
+import xyz.etztech.qol.QoL;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class HeadShopListener implements Listener{
+
+ private final QoL plugin;
+ private final ShopkeepersPlugin shopkeepersAPI;
+
+ public HeadShopListener(QoL plugin) {
+ this.plugin = plugin;
+ plugin.getServer().getPluginManager().registerEvents(this, plugin);
+
+ this.shopkeepersAPI = ShopkeepersPlugin.getInstance();
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent event) {
+ final Player player = event.getPlayer();
+
+ if (shopkeepersAPI != null && player.hasPermission("qol.head_shop")) {
+ int shopKeeperID = plugin.getConfig().getInt("head_shop.id", -1);
+
+ if (shopKeeperID != -1) {
+ ShopkeeperRegistry shopkeeperRegistry = shopkeepersAPI.getShopkeeperRegistry();
+ RegularAdminShopkeeper donorHeadShop = (RegularAdminShopkeeper) shopkeeperRegistry.getShopkeeperById(shopKeeperID);
+
+ if (donorHeadShop != null) {
+ // Remove the head if it already exists. This is done to refresh the skin of the head.
+ List extends TradeOffer> tradeOffers = new ArrayList<>(donorHeadShop.getOffers());
+ tradeOffers.removeIf(tradeOffer -> {
+ SkullMeta itemOfferMeta = (SkullMeta)tradeOffer.getResultItem().getItemMeta();
+ return itemOfferMeta.getOwningPlayer().getUniqueId() == player.getUniqueId();
+ });
+
+ donorHeadShop.setOffers(tradeOffers);
+
+ // Add the head to the shop
+ int diamondPrice = plugin.getConfig().getInt("head_shop.price", 2);
+ ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD);
+ SkullMeta skullMeta = (SkullMeta) playerHead.getItemMeta();
+
+ skullMeta.setOwningPlayer(player);
+ skullMeta.setDisplayName(player.getDisplayName());
+ playerHead.setItemMeta(skullMeta);
+
+ TradeOffer donorHeadTrade = TradeOffer.create(playerHead, new ItemStack(Material.DIAMOND, diamondPrice), null);
+
+ donorHeadShop.addOffer(donorHeadTrade);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java
index 5b12cd5..5083eaa 100644
--- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java
+++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java
@@ -2,13 +2,10 @@ package xyz.etztech.qol.listeners;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
-import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerLoginEvent;
-import org.dynmap.markers.Marker;
import xyz.etztech.qol.QoL;
import xyz.etztech.qol.commands.CheckupCommand;
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 4c297df..6f949ef 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -116,3 +116,11 @@ dynmap:
defaults:
map: "surface"
zoom: 5
+
+# Shopkeepers Player Head Shop
+head_shop:
+ # Shopkeeper Shop ID, set to -1 to disable
+ id: -1
+ # Diamond price of a head in the shop, default is 2 diamonds
+ price: 2
+
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index da07701..0f5958b 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,7 +4,8 @@ description: ${description}
author: ${author}
website: ${url}
main: ${mainClass}
-softdepend: [spark, dynmap, DiscordSRV]
+softdepend: [spark, dynmap, DiscordSRV, Shopkeepers]
+api-version: 1.13
commands:
qol:
description: Base command
@@ -132,3 +133,6 @@ permissions:
qol.discordignore:
description: Ability to use the use the discordignore command
default: op
+ qol.head_shop:
+ description: Controls if a player's head should be added to the head shop
+ default: op