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 @@
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:
|