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