80 lines
3.4 KiB
Java
80 lines
3.4 KiB
Java
package me.xginko.villageroptimizer.modules;
|
|
|
|
import me.xginko.villageroptimizer.VillagerOptimizer;
|
|
import me.xginko.villageroptimizer.CachedVillagers;
|
|
import me.xginko.villageroptimizer.config.Config;
|
|
import me.xginko.villageroptimizer.enums.Permissions;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.entity.Villager;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.HandlerList;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
import org.bukkit.event.inventory.InventoryType;
|
|
import org.bukkit.event.inventory.TradeSelectEvent;
|
|
|
|
public class PreventUnoptimizedTrading implements VillagerOptimizerModule, Listener {
|
|
|
|
private final CachedVillagers cachedVillagers;
|
|
private final boolean notifyPlayer;
|
|
|
|
protected PreventUnoptimizedTrading() {
|
|
shouldEnable();
|
|
this.cachedVillagers = VillagerOptimizer.getCachedVillagers();
|
|
Config config = VillagerOptimizer.getConfiguration();
|
|
config.addComment("gameplay.prevent-trading-with-unoptimized.enable", """
|
|
Will prevent players from selecting and using trades of unoptimized villagers.\s
|
|
Use this if you have a lot of villagers and therefore want to force your players to optimize them.\s
|
|
Inventories can still be opened so players can move villagers around.""");
|
|
this.notifyPlayer = config.getBoolean("gameplay.prevent-trading-with-unoptimized.notify-player", true,
|
|
"Sends players a message when they try to trade with an unoptimized villager.");
|
|
}
|
|
|
|
@Override
|
|
public void enable() {
|
|
VillagerOptimizer plugin = VillagerOptimizer.getInstance();
|
|
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
|
}
|
|
|
|
@Override
|
|
public void disable() {
|
|
HandlerList.unregisterAll(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldEnable() {
|
|
return VillagerOptimizer.getConfiguration().getBoolean("gameplay.prevent-trading-with-unoptimized.enable", false);
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
|
private void onTradeOpen(TradeSelectEvent event) {
|
|
Player player = (Player) event.getWhoClicked();
|
|
if (player.hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return;
|
|
if (
|
|
event.getInventory().getType().equals(InventoryType.MERCHANT)
|
|
&& event.getInventory().getHolder() instanceof Villager villager
|
|
&& !cachedVillagers.getOrAdd(villager).isOptimized()
|
|
) {
|
|
event.setCancelled(true);
|
|
if (notifyPlayer)
|
|
VillagerOptimizer.getLang(player.locale()).optimize_for_trading.forEach(player::sendMessage);
|
|
}
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
|
private void onInventoryClick(InventoryClickEvent event) {
|
|
Player player = (Player) event.getWhoClicked();
|
|
if (player.hasPermission(Permissions.Bypass.TRADE_PREVENTION.get())) return;
|
|
if (
|
|
event.getInventory().getType().equals(InventoryType.MERCHANT)
|
|
&& event.getInventory().getHolder() instanceof Villager villager
|
|
&& !cachedVillagers.getOrAdd(villager).isOptimized()
|
|
) {
|
|
event.setCancelled(true);
|
|
if (notifyPlayer)
|
|
VillagerOptimizer.getLang(player.locale()).optimize_for_trading.forEach(player::sendMessage);
|
|
}
|
|
}
|
|
}
|