From afacf4adc84da21b52f47406630bb64bd8eddb5e Mon Sep 17 00:00:00 2001 From: PretzelJohn <58197328+PretzelJohn@users.noreply.github.com> Date: Fri, 21 Jan 2022 20:56:44 -0500 Subject: [PATCH] Version 1.5.1: * Add toggleable Shopkeepers support * Made Citizens support toggleable To-do: * Add enchantments, data, etc. to ingredients and result * Add config editor GUI in-game --- README.md | 8 +++++++ pom.xml | 2 +- .../dev/villagertradelimiter/lib/Util.java | 22 +++++++++---------- .../listeners/InventoryListener.java | 5 ++--- .../listeners/PlayerListener.java | 9 ++++---- .../listeners/VillagerListener.java | 6 ++--- .../settings/Settings.java | 11 ++++++++++ .../wrappers/PlayerWrapper.java | 3 --- src/main/resources/config.yml | 4 ++++ src/main/resources/plugin.yml | 2 +- 10 files changed, 46 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index ce66cd4..33bdd1e 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,14 @@ database.useSSL: If your MySQL database can use SSL connections, set this to true! + + IgnoreCitizens: + Whether to ignore Citizens NPCs from the Citizens plugin. If set to true, Citizens NPCs won't be affected by this plugin. + + + IgnoreShopkeepers: + Whether to ignore Shopkeepers NPCs from the Shopkeepers plugin. If set to true, Shopkeepers NPCs won't be affected by this plugin. + DisableTrading: Whether to disable all villager trading for all worlds, some worlds, or no worlds.
Options: diff --git a/pom.xml b/pom.xml index 56b0d7f..b2afef7 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.pretzel.dev VillagerTradeLimiter - 1.5.0 + 1.5.1 1.8 diff --git a/src/com/pretzel/dev/villagertradelimiter/lib/Util.java b/src/com/pretzel/dev/villagertradelimiter/lib/Util.java index 1d99b39..5d54a4e 100644 --- a/src/com/pretzel/dev/villagertradelimiter/lib/Util.java +++ b/src/com/pretzel/dev/villagertradelimiter/lib/Util.java @@ -8,8 +8,8 @@ import java.io.FileWriter; import java.io.Reader; import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; import net.md_5.bungee.api.ChatColor; @@ -66,21 +66,21 @@ public class Util { } /** - * Checks whether a player is a Citizens NPC or not - * @param player The player to check - * @return True if the player is an NPC, false otherwise + * Checks whether an entity is a Citizens NPC or not + * @param entity The entity to check + * @return True if the entity is an NPC, false otherwise */ - public static boolean isNPC(Player player) { - return player.hasMetadata("NPC"); + public static boolean isNPC(Entity entity) { + return entity.hasMetadata("NPC"); } /** - * Returns whether a villager is a Citizens NPC or not - * @param villager The villager to check - * @return True if the villager is an NPC, false otherwise + * Returns whether an entity is a shopkeeper NPC or not + * @param entity The villager to check + * @return True if the villager is a shopkeeper, false otherwise */ - public static boolean isNPC(Villager villager) { - return villager.hasMetadata("NPC"); + public static boolean isShopkeeper(Entity entity) { + return entity.hasMetadata("shopkeeper"); } /** diff --git a/src/com/pretzel/dev/villagertradelimiter/listeners/InventoryListener.java b/src/com/pretzel/dev/villagertradelimiter/listeners/InventoryListener.java index 80d666c..4aaa4ba 100644 --- a/src/com/pretzel/dev/villagertradelimiter/listeners/InventoryListener.java +++ b/src/com/pretzel/dev/villagertradelimiter/listeners/InventoryListener.java @@ -3,7 +3,6 @@ package com.pretzel.dev.villagertradelimiter.listeners; import com.pretzel.dev.villagertradelimiter.VillagerTradeLimiter; import com.pretzel.dev.villagertradelimiter.data.Cooldown; import com.pretzel.dev.villagertradelimiter.data.PlayerData; -import com.pretzel.dev.villagertradelimiter.lib.Util; import com.pretzel.dev.villagertradelimiter.settings.Settings; import com.pretzel.dev.villagertradelimiter.wrappers.VillagerWrapper; import org.bukkit.Bukkit; @@ -44,7 +43,7 @@ public class InventoryListener implements Listener { if(!(event.getInventory().getHolder() instanceof Villager)) return; if(!(event.getPlayer() instanceof Player)) return; final Player player = (Player)event.getPlayer(); - if(Util.isNPC(player)) return; + if(settings.shouldSkipNPC(player) || settings.shouldSkipNPC((Villager)event.getInventory().getHolder())) return; //Skips NPCs //Reset the villager's NBT data when a player is finished trading final PlayerData playerData = instance.getPlayerData().get(player.getUniqueId()); @@ -64,7 +63,7 @@ public class InventoryListener implements Listener { if(!(event.getWhoClicked() instanceof Player)) return; if(event.getRawSlot() != 2) return; final Player player = (Player)event.getWhoClicked(); - if(Util.isNPC(player)) return; + if(settings.shouldSkipNPC(player) || settings.shouldSkipNPC((Villager)event.getInventory().getHolder())) return; //Skips NPCs //Get the items involved in the trade final ItemStack result = event.getCurrentItem(); diff --git a/src/com/pretzel/dev/villagertradelimiter/listeners/PlayerListener.java b/src/com/pretzel/dev/villagertradelimiter/listeners/PlayerListener.java index ef3cd49..3c1df16 100644 --- a/src/com/pretzel/dev/villagertradelimiter/listeners/PlayerListener.java +++ b/src/com/pretzel/dev/villagertradelimiter/listeners/PlayerListener.java @@ -3,7 +3,6 @@ package com.pretzel.dev.villagertradelimiter.listeners; import com.pretzel.dev.villagertradelimiter.VillagerTradeLimiter; import com.pretzel.dev.villagertradelimiter.data.Cooldown; import com.pretzel.dev.villagertradelimiter.data.PlayerData; -import com.pretzel.dev.villagertradelimiter.lib.Util; import com.pretzel.dev.villagertradelimiter.settings.Settings; import com.pretzel.dev.villagertradelimiter.wrappers.*; import org.bukkit.OfflinePlayer; @@ -37,8 +36,9 @@ public class PlayerListener implements Listener { @EventHandler public void onPlayerBeginTrading(final PlayerInteractEntityEvent event) { if(!(event.getRightClicked() instanceof Villager)) return; + final Player player = event.getPlayer(); final Villager villager = (Villager)event.getRightClicked(); - if(Util.isNPC(villager)) return; //Skips NPCs + if(settings.shouldSkipNPC(event.getPlayer()) || settings.shouldSkipNPC(villager)) return; //Skips NPCs if(villager.getProfession() == Villager.Profession.NONE || villager.getProfession() == Villager.Profession.NITWIT) return; //Skips non-trading villagers if(villager.getRecipeCount() == 0) return; //Skips non-trading villagers @@ -63,13 +63,13 @@ public class PlayerListener implements Listener { //Cancel the original event, and open the adjusted trade view event.setCancelled(true); - final Player player = event.getPlayer(); if(!instance.getPlayerData().containsKey(player.getUniqueId())) { instance.getPlayerData().put(player.getUniqueId(), new PlayerData()); } if(!instance.getPlayerData().containsKey(villager.getUniqueId())) { instance.getPlayerData().put(villager.getUniqueId(), new PlayerData()); } + this.see(villager, player, player); } @@ -83,7 +83,8 @@ public class PlayerListener implements Listener { //Wraps the villager and player into wrapper classes final VillagerWrapper villagerWrapper = new VillagerWrapper(villager); final PlayerWrapper otherWrapper = new PlayerWrapper(other); - if(Util.isNPC(villager) || Util.isNPC(player) || otherWrapper.isNPC()) return; //Skips NPCs + final Player otherPlayer = otherWrapper.getPlayer(); + if(settings.shouldSkipNPC(player) || settings.shouldSkipNPC(villager) || otherPlayer == null || settings.shouldSkipNPC(otherPlayer)) return; //Skips NPCs final PlayerData playerData = instance.getPlayerData().get(other.getUniqueId()); if(playerData != null) playerData.setTradingVillager(villagerWrapper); diff --git a/src/com/pretzel/dev/villagertradelimiter/listeners/VillagerListener.java b/src/com/pretzel/dev/villagertradelimiter/listeners/VillagerListener.java index 1b6da07..b4952c3 100644 --- a/src/com/pretzel/dev/villagertradelimiter/listeners/VillagerListener.java +++ b/src/com/pretzel/dev/villagertradelimiter/listeners/VillagerListener.java @@ -3,7 +3,6 @@ package com.pretzel.dev.villagertradelimiter.listeners; import com.pretzel.dev.villagertradelimiter.VillagerTradeLimiter; import com.pretzel.dev.villagertradelimiter.data.Cooldown; import com.pretzel.dev.villagertradelimiter.data.PlayerData; -import com.pretzel.dev.villagertradelimiter.lib.Util; import com.pretzel.dev.villagertradelimiter.settings.Settings; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; @@ -33,7 +32,8 @@ public class VillagerListener implements Listener { @EventHandler public void onVillagerRestock(final VillagerReplenishTradeEvent event) { if(!(event.getEntity() instanceof Villager)) return; - if(Util.isNPC((Villager) event.getEntity())) return; + final Villager villager = (Villager)event.getEntity(); + if(settings.shouldSkipNPC(villager)) return; //Skips NPCs //Get the items involved in the restock final MerchantRecipe recipe = event.getRecipe(); @@ -43,7 +43,7 @@ public class VillagerListener implements Listener { final String type = settings.getType(result, ingredient1, ingredient2); //Get the villager's data container - final UUID uuid = event.getEntity().getUniqueId(); + final UUID uuid = villager.getUniqueId(); final PlayerData villagerData = instance.getPlayerData().get(uuid); if(villagerData == null) return; diff --git a/src/com/pretzel/dev/villagertradelimiter/settings/Settings.java b/src/com/pretzel/dev/villagertradelimiter/settings/Settings.java index b3a27f2..3072205 100644 --- a/src/com/pretzel/dev/villagertradelimiter/settings/Settings.java +++ b/src/com/pretzel/dev/villagertradelimiter/settings/Settings.java @@ -8,6 +8,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentWrapper; +import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.EnchantmentStorageMeta; @@ -17,6 +18,16 @@ public class Settings { /** @param instance The instance of VillagerTradeLimiter.java */ public Settings(final VillagerTradeLimiter instance) { this.instance = instance; } + /** + * @param entity The entity to check the NPC status of + * @return True if the entity is an NPC and config is set to ignore NPCs + */ + public boolean shouldSkipNPC(final Entity entity) { + if(entity == null) return true; + if(instance.getCfg().getBoolean("IgnoreCitizens", true) && Util.isNPC(entity)) return true; + return instance.getCfg().getBoolean("IgnoreShopkeepers", true) && Util.isShopkeeper(entity); + } + /** * @param recipe The wrapped recipe to fetch any overrides for * @param key The key where the fetched value is stored in config.yml (e.g, DisableTrading) diff --git a/src/com/pretzel/dev/villagertradelimiter/wrappers/PlayerWrapper.java b/src/com/pretzel/dev/villagertradelimiter/wrappers/PlayerWrapper.java index 2d2c52b..b13d9d8 100644 --- a/src/com/pretzel/dev/villagertradelimiter/wrappers/PlayerWrapper.java +++ b/src/com/pretzel/dev/villagertradelimiter/wrappers/PlayerWrapper.java @@ -12,9 +12,6 @@ public class PlayerWrapper { /** @param player The offline player that this wrapper wraps */ public PlayerWrapper(final OfflinePlayer player) { this.player = player; } - /** @return Whether this player is an NPC or not */ - public boolean isNPC() { return (player.isOnline() && Util.isNPC((Player)player)); } - /** * @param isOld Whether the server is older than 1.16 or not. Minecraft changed how UUID's are represented in 1.16 * @return A string representation of the player's UUID, for use when matching the player's UUID to a gossip's target UUID diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a3a67ed..fb8fb12 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -19,6 +19,10 @@ database: encoding: utf8 useSSL: false +# Ignore Citizens NPCs, and/or Shopkeepers NPCs if true +IgnoreCitizens: true +IgnoreShopkeepers: true + # Add world names for worlds that you want to completely disable ALL villager trading. Set to [] to disable this feature. DisableTrading: - world_nether diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a68935b..d2a1ee6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: VillagerTradeLimiter author: PretzelJohn main: com.pretzel.dev.villagertradelimiter.VillagerTradeLimiter -version: 1.5.0 +version: 1.5.1 api-version: 1.14 commands: