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,57 +74,50 @@ 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();
assert newVillagerName != null; // Legitimate since we checked for hasDisplayName()
Villager villager = (Villager) event.getRightClicked();
if (!consumeNametag) { // Get component name first, so we can manually name the villager when canceling the event to avoid item consumption.
event.setCancelled(true); Component newVillagerName = meta.displayName();
villager.customName(newVillagerName); assert newVillagerName != null; // Legitimate since we checked for hasDisplayName()
} Villager villager = (Villager) event.getRightClicked();
final String nameTag = PlainTextComponentSerializer.plainText().serialize(newVillagerName); if (!consumeNametag) {
WrappedVillager wVillager = villagerCache.getOrAdd(villager); event.setCancelled(true);
villager.customName(newVillagerName);
}
if (nametags.contains(nameTag.toLowerCase())) { final String name = PlainTextComponentSerializer.plainText().serialize(newVillagerName);
if (wVillager.canOptimize(cooldown) || player.hasPermission(Permissions.Bypass.NAMETAG_COOLDOWN.get())) { WrappedVillager wVillager = villagerCache.getOrAdd(villager);
wVillager.setOptimization(OptimizationType.NAMETAG);
wVillager.saveOptimizeTime();
if (shouldNotifyPlayer) if (nametags.contains(name.toLowerCase())) {
VillagerOptimizer.getLang(player.locale()).nametag_optimize_success.forEach(player::sendMessage); if (wVillager.canOptimize(cooldown) || player.hasPermission(Permissions.Bypass.NAMETAG_COOLDOWN.get())) {
if (shouldLog) wVillager.setOptimization(OptimizationType.NAMETAG);
VillagerOptimizer.getLog().info(player.getName() + " optimized a villager using nametag: '" + nameTag + "'"); wVillager.saveOptimizeTime();
} else {
event.setCancelled(true); if (shouldNotifyPlayer)
villager.shakeHead(); VillagerOptimizer.getLang(player.locale()).nametag_optimize_success.forEach(player::sendMessage);
if (shouldNotifyPlayer) { if (shouldLog)
final String time = CommonUtil.formatTime(wVillager.getOptimizeCooldownMillis(cooldown)); VillagerOptimizer.getLog().info(player.getName() + " optimized a villager using nametag: '" + name + "'");
VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
.replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(time).build())));
}
}
} else { } else {
if (wVillager.isOptimized()) { event.setCancelled(true);
wVillager.setOptimization(OptimizationType.NONE); villager.shakeHead();
if (shouldNotifyPlayer) if (shouldNotifyPlayer) {
VillagerOptimizer.getLang(player.locale()).nametag_unoptimize_success.forEach(player::sendMessage); final String time = CommonUtil.formatTime(wVillager.getOptimizeCooldownMillis(cooldown));
if (shouldLog) VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line
VillagerOptimizer.getLog().info(event.getPlayer().getName() + " disabled optimizations for a villager using nametag: '" + nameTag + "'"); .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(time).build())));
} }
} }
}); } else {
} if (wVillager.isOptimized()) {
wVillager.setOptimization(OptimizationType.NONE);
private Optional<ItemStack> getNameTag(ItemStack mainHand, ItemStack offHand) { if (shouldNotifyPlayer)
if (mainHand.getType().equals(Material.NAME_TAG) && mainHand.getItemMeta().hasDisplayName()) VillagerOptimizer.getLang(player.locale()).nametag_unoptimize_success.forEach(player::sendMessage);
return Optional.of(mainHand); if (shouldLog)
if (offHand.getType().equals(Material.NAME_TAG) && offHand.getItemMeta().hasDisplayName()) VillagerOptimizer.getLog().info(event.getPlayer().getName() + " disabled optimizations for a villager using nametag: '" + name + "'");
return Optional.of(offHand); }
return Optional.empty(); }
} }
} }