improve leashing logic

This commit is contained in:
xGinko 2024-02-08 23:07:38 +01:00
parent b07490f9b4
commit 2a05cc4bc8
2 changed files with 9 additions and 37 deletions

View File

@ -4,7 +4,6 @@ import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.models.ExpiringSet;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -14,23 +13,16 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerLeashEntityEvent; import org.bukkit.event.entity.PlayerLeashEntityEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import java.time.Duration;
import java.util.UUID;
public class EnableLeashingVillagers implements VillagerOptimizerModule, Listener { public class EnableLeashingVillagers implements VillagerOptimizerModule, Listener {
private final VillagerCache villagerCache; private final VillagerCache villagerCache;
private final ExpiringSet<UUID> villagersThatShouldntOpenTradeView;
private final boolean only_optimized; private final boolean only_optimized;
public EnableLeashingVillagers() { public EnableLeashingVillagers() {
shouldEnable(); shouldEnable();
this.villagerCache = VillagerOptimizer.getCache(); this.villagerCache = VillagerOptimizer.getCache();
this.villagersThatShouldntOpenTradeView = new ExpiringSet<>(Duration.ofSeconds(1));
Config config = VillagerOptimizer.getConfiguration(); Config config = VillagerOptimizer.getConfiguration();
config.master().addComment("gameplay.villagers-can-be-leashed.enable", """ config.master().addComment("gameplay.villagers-can-be-leashed.enable", """
Enable leashing of villagers, enabling players to easily move villagers to where they want them to be."""); Enable leashing of villagers, enabling players to easily move villagers to where they want them to be.""");
@ -61,26 +53,22 @@ public class EnableLeashingVillagers implements VillagerOptimizerModule, Listene
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (!player.getInventory().getItem(event.getHand()).getType().equals(Material.LEAD)) return; if (!player.getInventory().getItem(event.getHand()).getType().equals(Material.LEAD)) return;
event.setCancelled(true); // Cancel the event, so we don't interact with the villager
Villager villager = (Villager) event.getRightClicked(); Villager villager = (Villager) event.getRightClicked();
if (villager.isLeashed()) { if (villager.isLeashed()) {
// If leash holder clicked leashed villager, unleash. // If leash holder clicked leashed villager, unleash.
try { try {
if (villager.getLeashHolder().getUniqueId().equals(player.getUniqueId())) { if (villager.getLeashHolder().getUniqueId().equals(player.getUniqueId()))
villager.setLeashHolder(null); villager.setLeashHolder(null);
villagersThatShouldntOpenTradeView.add(villager.getUniqueId()); } catch (IllegalStateException ignored) {} // Shouldn't throw because we checked LivingEntity#isLeashed()
} // Otherwise do nothing. There should only ever be one leash holder
} catch (IllegalStateException ignored) {
// This shouldn't throw because we check LivingEntity#isLeashed(), but if for some reason it does, we catch it.
}
// Otherwise do nothing. There should only ever be one leash holder.
return; return;
} }
if (only_optimized && !villagerCache.getOrAdd(villager).isOptimized()) return; if (only_optimized && !villagerCache.getOrAdd(villager).isOptimized()) return;
// Call event for compatibility with other plugins, constructing non deprecated if available. // Call event for compatibility with other plugins, constructing non deprecated if available
PlayerLeashEntityEvent leashEvent; PlayerLeashEntityEvent leashEvent;
try { try {
leashEvent = new PlayerLeashEntityEvent(villager, player, player, event.getHand()); leashEvent = new PlayerLeashEntityEvent(villager, player, player, event.getHand());
@ -88,26 +76,10 @@ public class EnableLeashingVillagers implements VillagerOptimizerModule, Listene
leashEvent = new PlayerLeashEntityEvent(villager, player, player); leashEvent = new PlayerLeashEntityEvent(villager, player, player);
} }
// If canceled by any plugin, do nothing. // If canceled by any plugin, do nothing
if (!leashEvent.callEvent()) return; if (!leashEvent.callEvent()) return;
VillagerOptimizer.getFoliaLib().getImpl().runAtEntity(villager, leash -> { // Legitimate to not use entities from the event object since they are final in PlayerLeashEntityEvent
// Legitimate to not use entities from the event object since they are final in PlayerLeashEntityEvent VillagerOptimizer.getFoliaLib().getImpl().runAtEntity(villager, leash -> villager.setLeashHolder(player));
// and can therefore never be changed by a plugin.
if (villager.setLeashHolder(player)) {
villagersThatShouldntOpenTradeView.add(villager.getUniqueId());
}
});
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onInventoryOpen(InventoryOpenEvent event) {
if (
event.getInventory().getType().equals(InventoryType.MERCHANT)
&& event.getInventory().getHolder() instanceof Villager villager
&& villagersThatShouldntOpenTradeView.contains(villager.getUniqueId())
) {
event.setCancelled(true);
}
} }
} }

View File

@ -47,7 +47,7 @@ public class RenameOptimizedVillagers implements VillagerOptimizerModule, Listen
@Override @Override
public boolean shouldEnable() { public boolean shouldEnable() {
return VillagerOptimizer.getConfiguration().getBoolean("gameplay.rename-optimized-villagers.enable", true); return VillagerOptimizer.getConfiguration().getBoolean("gameplay.rename-optimized-villagers.enable", false);
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)