improve nametag logic

This commit is contained in:
xGinko 2023-09-29 12:06:30 +02:00
parent d6044564b1
commit 38639979d6

View File

@ -21,10 +21,10 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional;
public class OptimizeByNametag implements VillagerOptimizerModule, Listener { public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
@ -74,11 +74,13 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!player.hasPermission(Permissions.Optimize.NAMETAG.get())) return; if (!player.hasPermission(Permissions.Optimize.NAMETAG.get())) return;
this.getNameTag( ItemStack usedItem = player.getInventory().getItem(event.getHand());
player.getInventory().getItemInMainHand(), if (!usedItem.getType().equals(Material.NAME_TAG)) return;
player.getInventory().getItemInOffHand() ItemMeta meta = usedItem.getItemMeta();
).ifPresent(nametagItem -> { if (!meta.hasDisplayName()) return;
Component newVillagerName = nametagItem.getItemMeta().displayName();
// Get component name first, so we can manually name the villager when canceling the event to avoid item consumption.
Component newVillagerName = meta.displayName();
assert newVillagerName != null; // Legitimate since we checked for hasDisplayName() assert newVillagerName != null; // Legitimate since we checked for hasDisplayName()
Villager villager = (Villager) event.getRightClicked(); Villager villager = (Villager) event.getRightClicked();
@ -87,10 +89,10 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
villager.customName(newVillagerName); villager.customName(newVillagerName);
} }
final String nameTag = PlainTextComponentSerializer.plainText().serialize(newVillagerName); final String name = PlainTextComponentSerializer.plainText().serialize(newVillagerName);
WrappedVillager wVillager = villagerCache.getOrAdd(villager); WrappedVillager wVillager = villagerCache.getOrAdd(villager);
if (nametags.contains(nameTag.toLowerCase())) { if (nametags.contains(name.toLowerCase())) {
if (wVillager.canOptimize(cooldown) || player.hasPermission(Permissions.Bypass.NAMETAG_COOLDOWN.get())) { if (wVillager.canOptimize(cooldown) || player.hasPermission(Permissions.Bypass.NAMETAG_COOLDOWN.get())) {
wVillager.setOptimization(OptimizationType.NAMETAG); wVillager.setOptimization(OptimizationType.NAMETAG);
wVillager.saveOptimizeTime(); wVillager.saveOptimizeTime();
@ -98,7 +100,7 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
if (shouldNotifyPlayer) if (shouldNotifyPlayer)
VillagerOptimizer.getLang(player.locale()).nametag_optimize_success.forEach(player::sendMessage); VillagerOptimizer.getLang(player.locale()).nametag_optimize_success.forEach(player::sendMessage);
if (shouldLog) if (shouldLog)
VillagerOptimizer.getLog().info(player.getName() + " optimized a villager using nametag: '" + nameTag + "'"); VillagerOptimizer.getLog().info(player.getName() + " optimized a villager using nametag: '" + name + "'");
} else { } else {
event.setCancelled(true); event.setCancelled(true);
villager.shakeHead(); villager.shakeHead();
@ -114,17 +116,8 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
if (shouldNotifyPlayer) if (shouldNotifyPlayer)
VillagerOptimizer.getLang(player.locale()).nametag_unoptimize_success.forEach(player::sendMessage); VillagerOptimizer.getLang(player.locale()).nametag_unoptimize_success.forEach(player::sendMessage);
if (shouldLog) if (shouldLog)
VillagerOptimizer.getLog().info(event.getPlayer().getName() + " disabled optimizations for a villager using nametag: '" + nameTag + "'"); VillagerOptimizer.getLog().info(event.getPlayer().getName() + " disabled optimizations for a villager using nametag: '" + name + "'");
} }
} }
});
}
private Optional<ItemStack> getNameTag(ItemStack mainHand, ItemStack offHand) {
if (mainHand.getType().equals(Material.NAME_TAG) && mainHand.getItemMeta().hasDisplayName())
return Optional.of(mainHand);
if (offHand.getType().equals(Material.NAME_TAG) && offHand.getItemMeta().hasDisplayName())
return Optional.of(offHand);
return Optional.empty();
} }
} }