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.player.PlayerInteractEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
@ -74,11 +74,13 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
Player player = event.getPlayer();
if (!player.hasPermission(Permissions.Optimize.NAMETAG.get())) return;
this.getNameTag(
player.getInventory().getItemInMainHand(),
player.getInventory().getItemInOffHand()
).ifPresent(nametagItem -> {
Component newVillagerName = nametagItem.getItemMeta().displayName();
ItemStack usedItem = player.getInventory().getItem(event.getHand());
if (!usedItem.getType().equals(Material.NAME_TAG)) return;
ItemMeta meta = usedItem.getItemMeta();
if (!meta.hasDisplayName()) return;
// 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()
Villager villager = (Villager) event.getRightClicked();
@ -87,10 +89,10 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
villager.customName(newVillagerName);
}
final String nameTag = PlainTextComponentSerializer.plainText().serialize(newVillagerName);
final String name = PlainTextComponentSerializer.plainText().serialize(newVillagerName);
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())) {
wVillager.setOptimization(OptimizationType.NAMETAG);
wVillager.saveOptimizeTime();
@ -98,7 +100,7 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
if (shouldNotifyPlayer)
VillagerOptimizer.getLang(player.locale()).nametag_optimize_success.forEach(player::sendMessage);
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 {
event.setCancelled(true);
villager.shakeHead();
@ -114,17 +116,8 @@ public class OptimizeByNametag implements VillagerOptimizerModule, Listener {
if (shouldNotifyPlayer)
VillagerOptimizer.getLang(player.locale()).nametag_unoptimize_success.forEach(player::sendMessage);
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();
}
}