From e9e2bfb48ba716c38f38799367f1499625f460c7 Mon Sep 17 00:00:00 2001 From: xGinko Date: Tue, 23 Jan 2024 09:21:10 +0100 Subject: [PATCH] minor optimizations --- pom.xml | 2 +- .../commands/VillagerOptimizerCommand.java | 11 +++++-- .../optimizevillagers/OptVillagersRadius.java | 3 +- .../UnOptVillagersRadius.java | 3 +- .../VillagerOptimizerCmd.java | 2 +- .../subcommands/ReloadSubCmd.java | 6 ++-- .../modules/VillagerChunkLimit.java | 29 +++++++++---------- .../gameplay/PreventOptimizedDamage.java | 14 +++++---- .../gameplay/PreventUnoptimizedTrading.java | 16 ++++++---- .../modules/optimization/OptimizeByBlock.java | 14 +++++---- 10 files changed, 56 insertions(+), 44 deletions(-) diff --git a/pom.xml b/pom.xml index f750332..8f24c08 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.xginko.VillagerOptimizer VillagerOptimizer - 1.1.0 + 1.1.1 jar VillagerOptimizer diff --git a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java index acfbcd8..f03380c 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java @@ -10,13 +10,21 @@ import org.bukkit.command.CommandMap; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.HashSet; +import java.util.List; public interface VillagerOptimizerCommand extends CommandExecutor { String label(); + @Override + boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args); + + List NO_TABCOMPLETES = Collections.emptyList(); + List RADIUS_TABCOMPLETES = List.of("5", "10", "25", "50"); HashSet commands = new HashSet<>(); + static void reloadCommands() { VillagerOptimizer plugin = VillagerOptimizer.getInstance(); CommandMap commandMap = plugin.getServer().getCommandMap(); @@ -29,7 +37,4 @@ public interface VillagerOptimizerCommand extends CommandExecutor { commands.forEach(command -> plugin.getCommand(command.label()).setExecutor(command)); } - - @Override - boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args); } diff --git a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java index a4514f5..b759645 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java @@ -27,7 +27,6 @@ import java.util.List; public class OptVillagersRadius implements VillagerOptimizerCommand, TabCompleter { - private final List radiusSuggestions = List.of("5", "10", "25", "50"); private final long cooldown; private final int max_radius; @@ -46,7 +45,7 @@ public class OptVillagersRadius implements VillagerOptimizerCommand, TabComplete @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return args.length == 1 ? radiusSuggestions : null; + return args.length == 1 ? RADIUS_TABCOMPLETES : NO_TABCOMPLETES; } @Override diff --git a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java index 13a603b..0289e99 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java @@ -25,7 +25,6 @@ import java.util.List; public class UnOptVillagersRadius implements VillagerOptimizerCommand, TabCompleter { - private final List radiusSuggestions = List.of("5", "10", "25", "50"); private final int max_radius; public UnOptVillagersRadius() { @@ -39,7 +38,7 @@ public class UnOptVillagersRadius implements VillagerOptimizerCommand, TabComple @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return args.length == 1 ? radiusSuggestions : null; + return args.length == 1 ? RADIUS_TABCOMPLETES : NO_TABCOMPLETES; } @Override diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java index 4d60844..7a8d727 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java @@ -33,7 +33,7 @@ public class VillagerOptimizerCmd implements TabCompleter, VillagerOptimizerComm @Override public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - return args.length == 1 ? tabCompleter : null; + return args.length == 1 ? tabCompleter : NO_TABCOMPLETES; } @Override diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java index ee9e517..92cf44a 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java @@ -29,8 +29,10 @@ public class ReloadSubCmd extends SubCommand { public void perform(CommandSender sender, String[] args) { if (sender.hasPermission(Commands.RELOAD.get())) { sender.sendMessage(Component.text("Reloading VillagerOptimizer...").color(NamedTextColor.WHITE)); - VillagerOptimizer.getInstance().reloadPlugin(); - sender.sendMessage(Component.text("Reload complete.").color(NamedTextColor.GREEN)); + VillagerOptimizer.getScheduler().runNextTick(reload -> { // Reload in sync with the server + VillagerOptimizer.getInstance().reloadPlugin(); + sender.sendMessage(Component.text("Reload complete.").color(NamedTextColor.GREEN)); + }); } else { sender.sendMessage(VillagerOptimizer.getLang(sender).no_permission); } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java index a504cdb..dda7791 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java @@ -21,18 +21,17 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.logging.Level; +import java.util.stream.Stream; public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { private final ServerImplementation scheduler; private final VillagerCache villagerCache; private WrappedTask periodic_chunk_check; - private final List non_optimized_removal_priority = new ArrayList<>(16); - private final List optimized_removal_priority = new ArrayList<>(16); + private final List non_optimized_removal_priority; + private final List optimized_removal_priority; private final long check_period; private final int non_optimized_max_per_chunk, optimized_max_per_chunk; private final boolean log_enabled, skip_unloaded_entity_chunks; @@ -53,37 +52,37 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { this.log_enabled = config.getBoolean("villager-chunk-limit.log-removals", false); this.non_optimized_max_per_chunk = config.getInt("villager-chunk-limit.unoptimized.max-per-chunk", 20, "The maximum amount of unoptimized villagers per chunk."); - config.getList("villager-chunk-limit.unoptimized.removal-priority", List.of( + this.non_optimized_removal_priority = config.getList("villager-chunk-limit.unoptimized.removal-priority", List.of( "NONE", "NITWIT", "SHEPHERD", "FISHERMAN", "BUTCHER", "CARTOGRAPHER", "LEATHERWORKER", "FLETCHER", "MASON", "FARMER", "ARMORER", "TOOLSMITH", "WEAPONSMITH", "CLERIC", "LIBRARIAN" ), """ Professions that are in the top of the list are going to be scheduled for removal first.\s Use enums from https://jd.papermc.io/paper/1.20/org/bukkit/entity/Villager.Profession.html""" - ).forEach(configuredProfession -> { + ).stream().map(configuredProfession -> { try { - Villager.Profession profession = Villager.Profession.valueOf(configuredProfession); - this.non_optimized_removal_priority.add(profession); + return Villager.Profession.valueOf(configuredProfession); } catch (IllegalArgumentException e) { LogUtil.moduleLog(Level.WARNING, "villager-chunk-limit.unoptimized", "Villager profession '"+configuredProfession+"' not recognized. " + "Make sure you're using the correct profession enums from https://jd.papermc.io/paper/1.20/org/bukkit/entity/Villager.Profession.html."); + return null; } - }); + }).filter(Objects::nonNull).toList(); this.optimized_max_per_chunk = config.getInt("villager-chunk-limit.optimized.max-per-chunk", 60, "The maximum amount of optimized villagers per chunk."); - config.getList("villager-chunk-limit.optimized.removal-priority", List.of( + this.optimized_removal_priority = config.getList("villager-chunk-limit.optimized.removal-priority", List.of( "NONE", "NITWIT", "SHEPHERD", "FISHERMAN", "BUTCHER", "CARTOGRAPHER", "LEATHERWORKER", "FLETCHER", "MASON", "FARMER", "ARMORER", "TOOLSMITH", "WEAPONSMITH", "CLERIC", "LIBRARIAN" - )).forEach(configuredProfession -> { + )).stream().map(configuredProfession -> { try { - Villager.Profession profession = Villager.Profession.valueOf(configuredProfession); - this.optimized_removal_priority.add(profession); + return Villager.Profession.valueOf(configuredProfession); } catch (IllegalArgumentException e) { LogUtil.moduleLog(Level.WARNING, "villager-chunk-limit.optimized", "Villager profession '"+configuredProfession+"' not recognized. " + "Make sure you're using the correct profession enums from https://jd.papermc.io/paper/1.20/org/bukkit/entity/Villager.Profession.html."); + return null; } - }); + }).filter(Objects::nonNull).toList(); } @Override diff --git a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java index 3d3c9ca..bf8d592 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java @@ -16,12 +16,14 @@ import org.bukkit.event.entity.EntityDamageEvent; import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener { private final VillagerCache villagerCache; - private final Set damage_causes_to_cancel = new HashSet<>(); + private final Set damage_causes_to_cancel; private final boolean cancelKnockback; public PreventOptimizedDamage() { @@ -32,19 +34,19 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener "Configure what kind of damage you want to cancel for optimized villagers here."); this.cancelKnockback = config.getBoolean("gameplay.prevent-damage-to-optimized.prevent-knockback-from-entity", true, "Prevents optimized villagers from getting knocked back by an attacking entity"); - config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel", + this.damage_causes_to_cancel = config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel", Arrays.stream(EntityDamageEvent.DamageCause.values()).map(Enum::name).sorted().toList(), """ These are all current entries in the game. Remove what you do not need blocked.\s If you want a description or need to add a previously removed type, refer to:\s https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html""" - ).forEach(configuredDamageCause -> { + ).stream().map(configuredDamageCause -> { try { - EntityDamageEvent.DamageCause damageCause = EntityDamageEvent.DamageCause.valueOf(configuredDamageCause); - this.damage_causes_to_cancel.add(damageCause); + return EntityDamageEvent.DamageCause.valueOf(configuredDamageCause); } catch (IllegalArgumentException e) { LogUtil.damageCauseNotRecognized("prevent-damage-to-optimized", configuredDamageCause); + return null; } - }); + }).filter(Objects::nonNull).collect(Collectors.toCollection(HashSet::new)); } @Override diff --git a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java index ec20b79..df03822 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java @@ -50,31 +50,35 @@ public class PreventUnoptimizedTrading implements VillagerOptimizerModule, Liste @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) private void onTradeOpen(TradeSelectEvent event) { - Player player = (Player) event.getWhoClicked(); - if (player.hasPermission(Bypass.TRADE_PREVENTION.get())) return; + if (event.getWhoClicked().hasPermission(Bypass.TRADE_PREVENTION.get())) return; + if ( event.getInventory().getType().equals(InventoryType.MERCHANT) && event.getInventory().getHolder() instanceof Villager villager && !villagerCache.getOrAdd(villager).isOptimized() ) { event.setCancelled(true); - if (notify_player) + if (notify_player) { + Player player = (Player) event.getWhoClicked(); VillagerOptimizer.getLang(player.locale()).optimize_for_trading.forEach(player::sendMessage); + } } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) private void onInventoryClick(InventoryClickEvent event) { - Player player = (Player) event.getWhoClicked(); - if (player.hasPermission(Bypass.TRADE_PREVENTION.get())) return; + if (event.getWhoClicked().hasPermission(Bypass.TRADE_PREVENTION.get())) return; + if ( event.getInventory().getType().equals(InventoryType.MERCHANT) && event.getInventory().getHolder() instanceof Villager villager && !villagerCache.getOrAdd(villager).isOptimized() ) { event.setCancelled(true); - if (notify_player) + if (notify_player) { + Player player = (Player) event.getWhoClicked(); VillagerOptimizer.getLang(player.locale()).optimize_for_trading.forEach(player::sendMessage); + } } } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java index 31bda6b..2cf3453 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java @@ -29,13 +29,15 @@ import org.bukkit.event.block.BlockPlaceEvent; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; public class OptimizeByBlock implements VillagerOptimizerModule, Listener { private final VillagerCache villagerCache; - private final Set blocks_that_disable = new HashSet<>(); + private final Set blocks_that_disable; private final long cooldown_millis; private final double search_radius; private final boolean only_while_sneaking, notify_player, log_enabled; @@ -47,17 +49,17 @@ public class OptimizeByBlock implements VillagerOptimizerModule, Listener { config.master().addComment("optimization-methods.block-optimization.enable", """ When enabled, the closest villager standing near a configured block being placed will be optimized.\s If a configured block is broken nearby, the closest villager will become unoptimized again."""); - config.getList("optimization-methods.block-optimization.materials", List.of( + this.blocks_that_disable = config.getList("optimization-methods.block-optimization.materials", List.of( "LAPIS_BLOCK", "GLOWSTONE", "IRON_BLOCK" ), "Values here need to be valid bukkit Material enums for your server version." - ).forEach(configuredMaterial -> { + ).stream().map(configuredMaterial -> { try { - Material disableBlock = Material.valueOf(configuredMaterial); - this.blocks_that_disable.add(disableBlock); + return Material.valueOf(configuredMaterial); } catch (IllegalArgumentException e) { LogUtil.materialNotRecognized("block-optimization", configuredMaterial); + return null; } - }); + }).filter(Objects::nonNull).collect(Collectors.toCollection(HashSet::new)); this.cooldown_millis = TimeUnit.SECONDS.toMillis( config.getInt("optimization-methods.block-optimization.optimize-cooldown-seconds", 600, """ Cooldown in seconds until a villager can be optimized again by using specific blocks.\s