From b6ffbf7168efef4e5b1ce8d71232b82d48cb56fb Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 6 Aug 2021 21:21:12 -0600 Subject: [PATCH 1/8] Added Head Shop + Integrates with ShopKeepers + On login, users with the `qol.head_shop` perm have their head added to the shop, if not already added + The shop id and the price to charge are both configurable --- pom.xml | 12 ++++- src/main/java/xyz/etztech/qol/QoL.java | 14 ++++++ .../etztech/qol/listeners/JoinListener.java | 50 ++++++++++++++++++- src/main/resources/config.yml | 8 +++ src/main/resources/plugin.yml | 6 ++- 5 files changed, 87 insertions(+), 3 deletions(-) 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..10d61f7 100644 --- a/src/main/java/xyz/etztech/qol/QoL.java +++ b/src/main/java/xyz/etztech/qol/QoL.java @@ -1,5 +1,7 @@ package xyz.etztech.qol; +import com.nisovin.shopkeepers.api.ShopkeepersAPI; +import com.nisovin.shopkeepers.api.ShopkeepersPlugin; import github.scarsz.discordsrv.DiscordSRV; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.Bukkit; @@ -38,6 +40,7 @@ public class QoL extends JavaPlugin { private MarkerSet playerMarkerSet = null; private boolean qolMarkerLayerShow = false; private String qolMarkerSetLabel = null; + private ShopkeepersPlugin shopkeepersAPI = null; public static FileConfiguration config; private Logger log = Logger.getLogger( "Minecraft" ); @@ -95,6 +98,13 @@ public class QoL extends JavaPlugin { new DiscordSRVListener(this); } + + try { + shopkeepersAPI = ShopkeepersPlugin.getInstance(); + log("Hooked in Shopkeepers for the Donor Shop"); + } + catch (Exception ignored) {} + if( isEnabled() ) { // Add listeners @@ -346,5 +356,9 @@ public class QoL extends JavaPlugin { public Spark getSpark() { return spark; } + + public ShopkeepersPlugin getShopkeepersAPI() { + return shopkeepersAPI; + } } diff --git a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java index 5b12cd5..104af5f 100644 --- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java @@ -1,13 +1,25 @@ package xyz.etztech.qol.listeners; +import com.nisovin.shopkeepers.api.ShopkeepersAPI; +import com.nisovin.shopkeepers.api.ShopkeepersPlugin; +import com.nisovin.shopkeepers.api.shopkeeper.Shopkeeper; +import com.nisovin.shopkeepers.api.shopkeeper.ShopkeeperRegistry; +import com.nisovin.shopkeepers.api.shopkeeper.admin.regular.RegularAdminShopkeeper; +import com.nisovin.shopkeepers.api.shopkeeper.offers.PriceOffer; +import com.nisovin.shopkeepers.api.shopkeeper.offers.TradeOffer; +import com.nisovin.shopkeepers.api.shopobjects.ShopObject; +import com.nisovin.shopkeepers.api.storage.ShopkeeperStorage; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; 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.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; import org.dynmap.markers.Marker; import xyz.etztech.qol.QoL; import xyz.etztech.qol.commands.CheckupCommand; @@ -58,7 +70,43 @@ public class JoinListener implements Listener { } } - CheckupCommand.join(player); + ShopkeepersPlugin shopkeepersAPI = plugin.getShopkeepersAPI(); + 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) { + + boolean donorFound = false; + for (TradeOffer tradeOffer: donorHeadShop.getOffers()) { + if (tradeOffer.getResultItem().getItemMeta().getDisplayName().equals(player.getDisplayName())) { + donorFound = true; + break; + } + } + + if (!donorFound) { + 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); + } + } + + } + + CheckupCommand.join(player); + + } } } 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 -- 2.41.0 From fe38a3978dde880040fbf3f57fc2c5eac778afdf Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 6 Aug 2021 21:27:57 -0600 Subject: [PATCH 2/8] Check if Shopkeepers is present before trying to enable it --- src/main/java/xyz/etztech/qol/QoL.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/xyz/etztech/qol/QoL.java b/src/main/java/xyz/etztech/qol/QoL.java index 10d61f7..9a93714 100644 --- a/src/main/java/xyz/etztech/qol/QoL.java +++ b/src/main/java/xyz/etztech/qol/QoL.java @@ -94,16 +94,16 @@ public class QoL extends JavaPlugin { } } + // DiscordSRV Hook if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) { new DiscordSRVListener(this); } - - try { + // Shopkeepers Hook + if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers")) { shopkeepersAPI = ShopkeepersPlugin.getInstance(); - log("Hooked in Shopkeepers for the Donor Shop"); + log("Hooked in Shopkeepers for the head shop"); } - catch (Exception ignored) {} if( isEnabled() ) { -- 2.41.0 From 1b5c8625de64504153526e54ea071a6635d49dca Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 6 Aug 2021 21:33:40 -0600 Subject: [PATCH 3/8] Use UUID instead of display name to determine if a player is in the shop --- src/main/java/xyz/etztech/qol/listeners/JoinListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java index 104af5f..8fccdcf 100644 --- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java @@ -82,7 +82,8 @@ public class JoinListener implements Listener { boolean donorFound = false; for (TradeOffer tradeOffer: donorHeadShop.getOffers()) { - if (tradeOffer.getResultItem().getItemMeta().getDisplayName().equals(player.getDisplayName())) { + SkullMeta itemOfferMeta = (SkullMeta)tradeOffer.getResultItem().getItemMeta(); + if (itemOfferMeta.getOwningPlayer().getUniqueId() == player.getUniqueId()) { donorFound = true; break; } -- 2.41.0 From e66969f039d2aeb029b8793d851879fc55556721 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 6 Aug 2021 22:36:33 -0600 Subject: [PATCH 4/8] Refresh player head on login + Cleaned up imports --- .../etztech/qol/listeners/JoinListener.java | 43 ++++++++----------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java index 8fccdcf..4aaeede 100644 --- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java @@ -1,26 +1,18 @@ package xyz.etztech.qol.listeners; -import com.nisovin.shopkeepers.api.ShopkeepersAPI; import com.nisovin.shopkeepers.api.ShopkeepersPlugin; -import com.nisovin.shopkeepers.api.shopkeeper.Shopkeeper; import com.nisovin.shopkeepers.api.shopkeeper.ShopkeeperRegistry; import com.nisovin.shopkeepers.api.shopkeeper.admin.regular.RegularAdminShopkeeper; -import com.nisovin.shopkeepers.api.shopkeeper.offers.PriceOffer; import com.nisovin.shopkeepers.api.shopkeeper.offers.TradeOffer; -import com.nisovin.shopkeepers.api.shopobjects.ShopObject; -import com.nisovin.shopkeepers.api.storage.ShopkeeperStorage; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; -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.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; -import org.dynmap.markers.Marker; import xyz.etztech.qol.QoL; import xyz.etztech.qol.commands.CheckupCommand; @@ -79,28 +71,27 @@ public class JoinListener implements Listener { RegularAdminShopkeeper donorHeadShop = (RegularAdminShopkeeper) shopkeeperRegistry.getShopkeeperById(shopKeeperID); if (donorHeadShop != null) { - - boolean donorFound = false; - for (TradeOffer tradeOffer: donorHeadShop.getOffers()) { + // Remove the head if it already exists. This is done to refresh the skin of the head. + List tradeOffers = new ArrayList<>(donorHeadShop.getOffers()); + tradeOffers.removeIf(tradeOffer -> { SkullMeta itemOfferMeta = (SkullMeta)tradeOffer.getResultItem().getItemMeta(); - if (itemOfferMeta.getOwningPlayer().getUniqueId() == player.getUniqueId()) { - donorFound = true; - break; - } - } + return itemOfferMeta.getOwningPlayer().getUniqueId() == player.getUniqueId(); + }); - if (!donorFound) { - int diamondPrice = plugin.getConfig().getInt("head_shop.price", 2); - ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD); - SkullMeta skullMeta = (SkullMeta) playerHead.getItemMeta(); + donorHeadShop.setOffers(tradeOffers); - skullMeta.setOwningPlayer(player); - skullMeta.setDisplayName(player.getDisplayName()); - playerHead.setItemMeta(skullMeta); + // 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(); - TradeOffer donorHeadTrade = TradeOffer.create(playerHead, new ItemStack(Material.DIAMOND, diamondPrice), null); - donorHeadShop.addOffer(donorHeadTrade); - } + skullMeta.setOwningPlayer(player); + skullMeta.setDisplayName(player.getDisplayName()); + playerHead.setItemMeta(skullMeta); + + TradeOffer donorHeadTrade = TradeOffer.create(playerHead, new ItemStack(Material.DIAMOND, diamondPrice), null); + + donorHeadShop.addOffer(donorHeadTrade); } } -- 2.41.0 From a673eadd2ed4d953a96818e46a861480e69fedff Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Sun, 8 Aug 2021 16:16:22 -0600 Subject: [PATCH 5/8] Move checkup command join outside shopkeeper check --- src/main/java/xyz/etztech/qol/listeners/JoinListener.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java index 4aaeede..8b1c5e5 100644 --- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java @@ -93,12 +93,9 @@ public class JoinListener implements Listener { donorHeadShop.addOffer(donorHeadTrade); } - - } - - CheckupCommand.join(player); - } + } + CheckupCommand.join(player); } } -- 2.41.0 From 006a3a2c0dd1c75ba30d2e8825fdf782b5ba93c8 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Mon, 9 Aug 2021 19:19:28 -0600 Subject: [PATCH 6/8] Moved head shop logic to its own listener --- src/main/java/xyz/etztech/qol/QoL.java | 3 + .../qol/listeners/HeadShopListener.java | 66 +++++++++++++++++++ .../etztech/qol/listeners/JoinListener.java | 40 ----------- 3 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java diff --git a/src/main/java/xyz/etztech/qol/QoL.java b/src/main/java/xyz/etztech/qol/QoL.java index 9a93714..e7867fb 100644 --- a/src/main/java/xyz/etztech/qol/QoL.java +++ b/src/main/java/xyz/etztech/qol/QoL.java @@ -102,6 +102,9 @@ public class QoL extends JavaPlugin { // Shopkeepers Hook if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers")) { shopkeepersAPI = ShopkeepersPlugin.getInstance(); + + new HeadShopListener(this); + log("Hooked in Shopkeepers for the head shop"); } 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..524db30 --- /dev/null +++ b/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java @@ -0,0 +1,66 @@ +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 QoL plugin; + + public HeadShopListener(QoL plugin) { + this.plugin = plugin; + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + final Player player = event.getPlayer(); + + ShopkeepersPlugin shopkeepersAPI = plugin.getShopkeepersAPI(); + 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 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 8b1c5e5..5083eaa 100644 --- a/src/main/java/xyz/etztech/qol/listeners/JoinListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/JoinListener.java @@ -1,18 +1,11 @@ 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.Bukkit; import org.bukkit.ChatColor; -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 xyz.etztech.qol.commands.CheckupCommand; @@ -62,39 +55,6 @@ public class JoinListener implements Listener { } } - ShopkeepersPlugin shopkeepersAPI = plugin.getShopkeepersAPI(); - 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 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); - } - } - } CheckupCommand.join(player); } -- 2.41.0 From e036627fb1e88c361a2638d7b0438f5cc85efd20 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Mon, 9 Aug 2021 19:27:11 -0600 Subject: [PATCH 7/8] Moved ShopkeepersAPI reference to listener --- src/main/java/xyz/etztech/qol/QoL.java | 10 ---------- .../xyz/etztech/qol/listeners/HeadShopListener.java | 6 ++++-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/xyz/etztech/qol/QoL.java b/src/main/java/xyz/etztech/qol/QoL.java index e7867fb..1b0b3f3 100644 --- a/src/main/java/xyz/etztech/qol/QoL.java +++ b/src/main/java/xyz/etztech/qol/QoL.java @@ -1,6 +1,5 @@ package xyz.etztech.qol; -import com.nisovin.shopkeepers.api.ShopkeepersAPI; import com.nisovin.shopkeepers.api.ShopkeepersPlugin; import github.scarsz.discordsrv.DiscordSRV; import net.md_5.bungee.api.chat.BaseComponent; @@ -10,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; @@ -40,7 +38,6 @@ public class QoL extends JavaPlugin { private MarkerSet playerMarkerSet = null; private boolean qolMarkerLayerShow = false; private String qolMarkerSetLabel = null; - private ShopkeepersPlugin shopkeepersAPI = null; public static FileConfiguration config; private Logger log = Logger.getLogger( "Minecraft" ); @@ -101,10 +98,7 @@ public class QoL extends JavaPlugin { // Shopkeepers Hook if (Bukkit.getPluginManager().isPluginEnabled("Shopkeepers")) { - shopkeepersAPI = ShopkeepersPlugin.getInstance(); - new HeadShopListener(this); - log("Hooked in Shopkeepers for the head shop"); } @@ -359,9 +353,5 @@ public class QoL extends JavaPlugin { public Spark getSpark() { return spark; } - - public ShopkeepersPlugin getShopkeepersAPI() { - return shopkeepersAPI; - } } diff --git a/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java b/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java index 524db30..88b6b1a 100644 --- a/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java @@ -18,18 +18,20 @@ import java.util.List; public class HeadShopListener implements Listener{ - private QoL plugin; + 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(); - ShopkeepersPlugin shopkeepersAPI = plugin.getShopkeepersAPI(); if (shopkeepersAPI != null && player.hasPermission("qol.head_shop")) { int shopKeeperID = plugin.getConfig().getInt("head_shop.id", -1); -- 2.41.0 From 0c08c268543a99e6d67e6469903ca10509c01def Mon Sep 17 00:00:00 2001 From: ZeroHD Date: Tue, 10 Aug 2021 01:32:17 +0000 Subject: [PATCH 8/8] Added Head Shop (#18) Moved ShopkeepersAPI reference to listener Moved head shop logic to its own listener Move checkup command join outside shopkeeper check Refresh player head on login + Cleaned up imports Use UUID instead of display name to determine if a player is in the shop Check if Shopkeepers is present before trying to enable it Added Head Shop + Integrates with ShopKeepers + On login, users with the `qol.head_shop` perm have their head added to the shop, if not already added + The shop id and the price to charge are both configurable Co-authored-by: Joey Hines Reviewed-on: https://git.canopymc.net/Canopy/QoL/pulls/18 Reviewed-by: Etzelia Co-Authored-By: ZeroHD Co-Committed-By: ZeroHD --- pom.xml | 12 +++- src/main/java/xyz/etztech/qol/QoL.java | 9 ++- .../qol/listeners/HeadShopListener.java | 68 +++++++++++++++++++ .../etztech/qol/listeners/JoinListener.java | 3 - src/main/resources/config.yml | 8 +++ src/main/resources/plugin.yml | 6 +- 6 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/main/java/xyz/etztech/qol/listeners/HeadShopListener.java 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 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 -- 2.41.0