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.config.Config;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.models.ExpiringSet;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
@ -14,23 +13,16 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
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 java.time.Duration;
import java.util.UUID;
public class EnableLeashingVillagers implements VillagerOptimizerModule, Listener {
private final VillagerCache villagerCache;
private final ExpiringSet<UUID> villagersThatShouldntOpenTradeView;
private final boolean only_optimized;
public EnableLeashingVillagers() {
shouldEnable();
this.villagerCache = VillagerOptimizer.getCache();
this.villagersThatShouldntOpenTradeView = new ExpiringSet<>(Duration.ofSeconds(1));
Config config = VillagerOptimizer.getConfiguration();
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.""");
@ -61,26 +53,22 @@ public class EnableLeashingVillagers implements VillagerOptimizerModule, Listene
final Player player = event.getPlayer();
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();
if (villager.isLeashed()) {
// If leash holder clicked leashed villager, unleash.
try {
if (villager.getLeashHolder().getUniqueId().equals(player.getUniqueId())) {
if (villager.getLeashHolder().getUniqueId().equals(player.getUniqueId()))
villager.setLeashHolder(null);
villagersThatShouldntOpenTradeView.add(villager.getUniqueId());
}
} 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.
} catch (IllegalStateException ignored) {} // Shouldn't throw because we checked LivingEntity#isLeashed()
// Otherwise do nothing. There should only ever be one leash holder
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;
try {
leashEvent = new PlayerLeashEntityEvent(villager, player, player, event.getHand());
@ -88,26 +76,10 @@ public class EnableLeashingVillagers implements VillagerOptimizerModule, Listene
leashEvent = new PlayerLeashEntityEvent(villager, player, player);
}
// If canceled by any plugin, do nothing.
// If canceled by any plugin, do nothing
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
// 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);
}
// Legitimate to not use entities from the event object since they are final in PlayerLeashEntityEvent
VillagerOptimizer.getFoliaLib().getImpl().runAtEntity(villager, leash -> villager.setLeashHolder(player));
}
}

View File

@ -47,7 +47,7 @@ public class RenameOptimizedVillagers implements VillagerOptimizerModule, Listen
@Override
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)