improve leashing logic
This commit is contained in:
parent
b07490f9b4
commit
2a05cc4bc8
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user