From e47794ab0708a03303e6e96697da28b058f00438 Mon Sep 17 00:00:00 2001 From: xGinko Date: Mon, 11 Sep 2023 18:47:32 +0200 Subject: [PATCH] fixes from first testrun --- pom.xml | 1 - .../villageroptimizer/VillagerOptimizer.java | 27 +++++----- .../optimizevillagers/OptVillagersRadius.java | 16 +++--- .../UnOptVillagersRadius.java | 2 +- .../VillagerOptimizerCmd.java | 4 +- .../subcommands/VersionSubCmd.java | 16 +++--- .../villageroptimizer/config/Config.java | 7 +++ .../modules/BlockOptimization.java | 4 +- .../modules/LevelVillagers.java | 19 ++++--- .../modules/NametagOptimization.java | 14 ++--- .../modules/PreventUnoptimizedTrading.java | 15 +++--- .../modules/PreventVillagerDamage.java | 54 +++++++++++++++++-- .../modules/PreventVillagerTargetting.java | 3 +- .../modules/RestockTrades.java | 14 ++--- .../modules/VillagerChunkLimit.java | 16 +++--- .../modules/WorkstationOptimization.java | 17 +++--- src/main/resources/plugin.yml | 2 +- 17 files changed, 144 insertions(+), 87 deletions(-) diff --git a/pom.xml b/pom.xml index cccf81c..464aac1 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,6 @@ false - true diff --git a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java index 678adb5..b1ad851 100644 --- a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java +++ b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java @@ -10,7 +10,6 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -38,25 +37,25 @@ public final class VillagerOptimizer extends JavaPlugin { public void onEnable() { instance = this; logger = getLogger(); - ConsoleCommandSender console = getServer().getConsoleSender(); - console.sendMessage(Component.text( + getServer().getConsoleSender().sendMessage(Component.text( """ \s - _ __ _ __ __ ____ __ _ _ \s - | | / /(_)/ // /____ _ ____ _ ___ _____ / __ \\ ____ / /_ (_)____ ___ (_)____ ___ _____ - | | / // // // // __ `// __ `// _ \\ / ___// / / // __ \\ / __// // __ `__ \\ / //_ / / _ \\ / ___/ - | |/ // // // // /_/ // /_/ // __// / / /_/ // /_/ // /_ / // / / / / // / / /_/ __// / \s - |___//_//_//_/ \\__,_/ \\__, / \\___//_/ \\____// .___/ \\__//_//_/ /_/ /_//_/ /___/\\___//_/ \s - /____/ /_/ by xGinko \s - """ + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + ┃ _ __ _ __ __ ____ __ _ _ ┃\s + ┃ | | / /(_)/ // /____ _ ____ _ ___ _____ / __ \\ ____ / /_ (_)____ ___ (_)____ ___ _____ ┃\s + ┃ | | / // // // // __ `// __ `// _ \\ / ___// / / // __ \\ / __// // __ `__ \\ / //_ / / _ \\ / ___/ ┃\s + ┃ | |/ // // // // /_/ // /_/ // __// / / /_/ // /_/ // /_ / // / / / / // / / /_/ __// / ┃\s + ┃ |___//_//_//_/ \\__,_/ \\__, / \\___//_/ \\____// .___/ \\__//_//_/ /_/ /_//_/ /___/\\___//_/ ┃\s + ┃ /____/ /_/ by xGinko ┃\s + ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛""" ).color(TextColor.color(102,255,230)).decorate(TextDecoration.BOLD)); - console.sendMessage(Component.text("Loading Translations...").color(TextColor.color(102,255,230))); + logger.info("Loading Translations..."); reloadLang(); - console.sendMessage(Component.text("Loading Config...").color(TextColor.color(102,255,230))); + logger.info("Loading Config..."); reloadConfiguration(); - console.sendMessage(Component.text("Registering Commands...").color(TextColor.color(102,255,230))); + logger.info("Registering Commands..."); VillagerOptimizerCommand.reloadCommands(); - console.sendMessage(Component.text("Done.").color(TextColor.color(102,255,230))); + logger.info("Done."); } public static VillagerOptimizer getInstance() { 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 d3e5098..a080317 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java @@ -43,7 +43,7 @@ public class OptVillagersRadius implements VillagerOptimizerCommand, TabComplete public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (sender.hasPermission(Permissions.Commands.OPTIMIZE_RADIUS.get())) { if (!(sender instanceof Player player)) { - sender.sendMessage(Component.text("This command can only be executed as a player.") + sender.sendMessage(Component.text("This command can only be executed by a player.") .color(NamedTextColor.RED).decorate(TextDecoration.BOLD)); return true; } @@ -77,12 +77,14 @@ public class OptVillagersRadius implements VillagerOptimizerCommand, TabComplete } } - final String success = Integer.toString(successCount); - final String radius = Integer.toString(specifiedRadius); - VillagerOptimizer.getLang(player.locale()).command_optimize_success.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%amount%").replacement(success).build()) - .replaceText(TextReplacementConfig.builder().matchLiteral("%radius%").replacement(radius).build()) - )); + if (successCount > 0) { + final String success = Integer.toString(successCount); + final String radius = Integer.toString(specifiedRadius); + VillagerOptimizer.getLang(player.locale()).command_optimize_success.forEach(line -> player.sendMessage(line + .replaceText(TextReplacementConfig.builder().matchLiteral("%amount%").replacement(success).build()) + .replaceText(TextReplacementConfig.builder().matchLiteral("%radius%").replacement(radius).build()) + )); + } if (failCount > 0) { final String alreadyOptimized = Integer.toString(failCount); VillagerOptimizer.getLang(player.locale()).command_optimize_fail.forEach(line -> player.sendMessage(line 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 6b3ded9..6dae70d 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java @@ -34,7 +34,7 @@ public class UnOptVillagersRadius implements VillagerOptimizerCommand { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (sender.hasPermission(Permissions.Commands.UNOPTIMIZE_RADIUS.get())) { if (!(sender instanceof Player player)) { - sender.sendMessage(Component.text("This command can only be executed as a player.") + sender.sendMessage(Component.text("This command can only be executed by a player.") .color(NamedTextColor.RED).decorate(TextDecoration.BOLD)); return true; } 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 b75a23a..5383c8f 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java @@ -63,12 +63,12 @@ public class VillagerOptimizerCmd implements TabCompleter, VillagerOptimizerComm subCommands.forEach(subCommand -> sender.sendMessage( subCommand.getSyntax().append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)).append(subCommand.getDescription()))); sender.sendMessage( - Component.text("/optimizevillagers ").color(NamedTextColor.BLUE) + Component.text("/optimizevillagers ").color(NamedTextColor.BLUE) .append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)) .append(Component.text("Optimize villagers in a radius").color(NamedTextColor.GRAY)) ); sender.sendMessage( - Component.text("/unoptmizevillagers").color(NamedTextColor.BLUE) + Component.text("/unoptmizevillagers ").color(NamedTextColor.BLUE) .append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)) .append(Component.text("Unoptimize villagers in a radius").color(NamedTextColor.GRAY)) ); diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java index 85194b8..a9ebc97 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java @@ -22,19 +22,23 @@ public class VersionSubCmd extends SubCommand { } @Override public TextComponent getSyntax() { - return Component.text("/villageroptimizer version").color(NamedTextColor.GOLD); + return Component.text("/villageroptimizer version").color(NamedTextColor.BLUE); } @Override public void perform(CommandSender sender, String[] args) { if (sender.hasPermission(Permissions.Commands.VERSION.get())) { - PluginMeta pluginMeta = VillagerOptimizer.getInstance().getPluginMeta(); + final PluginMeta pluginMeta = VillagerOptimizer.getInstance().getPluginMeta(); sender.sendMessage( Component.newline() - .append(Component.text(pluginMeta.getName()+" "+pluginMeta.getVersion()).color(NamedTextColor.BLUE).decorate(TextDecoration.BOLD) - .append(Component.text(" by ").color(NamedTextColor.GRAY)) - .append(Component.text(pluginMeta.getAuthors().get(0)).color(NamedTextColor.WHITE)) - .clickEvent(ClickEvent.openUrl(pluginMeta.getWebsite()))) + .append(Component.text(pluginMeta.getName()+" "+pluginMeta.getVersion()) + .color(NamedTextColor.BLUE).decorate(TextDecoration.BOLD) + .clickEvent(ClickEvent.openUrl(pluginMeta.getWebsite()))) + .append(Component.text(" by ") + .color(NamedTextColor.GRAY)) + .append(Component.text(pluginMeta.getAuthors().get(0)) + .color(NamedTextColor.WHITE) + .clickEvent(ClickEvent.openUrl("https://github.com/xGinko"))) .append(Component.newline()) ); } else { diff --git a/src/main/java/me/xginko/villageroptimizer/config/Config.java b/src/main/java/me/xginko/villageroptimizer/config/Config.java index 5dc8e6d..c5892db 100644 --- a/src/main/java/me/xginko/villageroptimizer/config/Config.java +++ b/src/main/java/me/xginko/villageroptimizer/config/Config.java @@ -50,6 +50,13 @@ public class Config { config.addDefault("config-version", 1.00); createTitledSection("General", "general"); createTitledSection("Optimization", "optimization"); + config.addDefault("optimization.villager-chunk-limit.enable", false); + config.addDefault("optimization.prevent-trading-with-unoptimized.enable", false); + config.addDefault("optimization.methods.by-nametag.enable", true); + config.addDefault("optimization.behavior.villager-leveling.enable", true); + config.addDefault("optimization.behavior.trade-restocking.enable", true); + config.addDefault("optimization.behavior.prevent-targeting.enable", true); + config.addDefault("optimization.behavior.prevent-damage.enable", true); } public void createTitledSection(String title, String path) { diff --git a/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java index 03587ac..2ac5973 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java @@ -37,6 +37,7 @@ public class BlockOptimization implements VillagerOptimizerModule, Listener { private final long cooldown; protected BlockOptimization() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); config.addComment("optimization.methods.by-specific-block.enable", """ @@ -61,7 +62,8 @@ public class BlockOptimization implements VillagerOptimizerModule, Listener { """) * 1000L; this.maxVillagers = config.getInt("optimization.methods.by-specific-block.max-villagers-per-block", 3, "How many villagers can be optimized at once by placing a block under them."); - this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-specific-block.notify-player", true); + this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-specific-block.notify-player", true, + "Sends players a message when they successfully optimized a villager."); this.shouldLog = config.getBoolean("optimization.methods.by-specific-block.log", false); } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java index 45b9999..a357941 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java @@ -25,18 +25,17 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { private final long cooldown; public LevelVillagers() { + shouldEnable(); this.plugin = VillagerOptimizer.getInstance(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); - config.addComment("optimization.villager-leveling.enable", """ - This is needed to allow optimized villagers to level up. s\ - Temporarily enables the villagers AI to allow it to level up and then disables it again. - """); - this.cooldown = config.getInt("optimization.villager-leveling.level-check-cooldown-seconds", 5, """ - Cooldown in seconds until the level of a villager will be checked and updated again. \s - Recommended to leave as is. - """) * 1000L; - this.shouldNotify = config.getBoolean("optimization.villager-leveling.notify-player", true, + config.addComment("optimization.behavior.villager-leveling.enable", """ + This is needed to allow optimized villagers to level up.\s + Temporarily enables the villagers AI to allow it to level up and then disables it again."""); + this.cooldown = config.getInt("optimization.behavior.villager-leveling.level-check-cooldown-seconds", 5, """ + Cooldown in seconds until the level of a villager will be checked and updated again.\s + Recommended to leave as is.""") * 1000L; + this.shouldNotify = config.getBoolean("optimization.behavior.villager-leveling.notify-player", true, "Tell players to wait when a villager is leveling up."); } @@ -53,7 +52,7 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("optimization.villager-leveling.enable", true); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.villager-leveling.enable", true); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java index 2546c12..552d1f0 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java @@ -32,21 +32,21 @@ public class NametagOptimization implements VillagerOptimizerModule, Listener { private final long cooldown; protected NametagOptimization() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); config.addComment("optimization.methods.by-nametag.enable", """ Enable optimization by naming villagers to one of the names configured below.\s - Nametag optimized villagers will be unoptimized again when they are renamed to something else. - """); + Nametag optimized villagers will be unoptimized again when they are renamed to something else."""); this.nametags.addAll(config.getList("optimization.methods.by-nametag.names", List.of("Optimize", "DisableAI"), "Names are case insensitive, capital letters won't matter.").stream().map(String::toLowerCase).toList()); this.consumeNametag = config.getBoolean("optimization.methods.by-nametag.nametags-get-consumed", true, "Enable or disable consumption of the used nametag item."); - this.cooldown = config.getInt("optimization.methods.by-workstation.optimize-cooldown-seconds", 600, """ - Cooldown in seconds until a villager can be optimized again using a nametag. \s - Here for configuration freedom. Recommended to leave as is to not enable any exploitable behavior. - """) * 1000L; - this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-nametag.notify-player", true); + this.cooldown = config.getInt("optimization.methods.by-nametag.optimize-cooldown-seconds", 600, """ + Cooldown in seconds until a villager can be optimized again using a nametag.\s + Here for configuration freedom. Recommended to leave as is to not enable any exploitable behavior.""") * 1000L; + this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-nametag.notify-player", true, + "Sends players a message when they successfully optimized a villager."); this.shouldLog = config.getBoolean("optimization.methods.by-nametag.log", false); } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/PreventUnoptimizedTrading.java b/src/main/java/me/xginko/villageroptimizer/modules/PreventUnoptimizedTrading.java index ee6edc0..f4efa34 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/PreventUnoptimizedTrading.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/PreventUnoptimizedTrading.java @@ -20,14 +20,15 @@ public class PreventUnoptimizedTrading implements VillagerOptimizerModule, Liste private final boolean notifyPlayer; protected PreventUnoptimizedTrading() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); - config.addComment("optimization.prevent-trading-with-unoptimized-villagers.enable", """ - Will prevent players from selecting and using trades of unoptimized villagers. s\ - Use this if you have a lot of villagers and therefore want to force your players to optimize them. s\ - Inventories can still be opened so players can move villagers around. - """); - this.notifyPlayer = config.getBoolean("optimization.prevent-trading-with-unoptimized-villagers.notify-player", true); + config.addComment("optimization.prevent-trading-with-unoptimized.enable", """ + Will prevent players from selecting and using trades of unoptimized villagers.\s + Use this if you have a lot of villagers and therefore want to force your players to optimize them.\s + Inventories can still be opened so players can move villagers around."""); + this.notifyPlayer = config.getBoolean("optimization.prevent-trading-with-unoptimized.notify-player", true, + "Sends players a message when they try to trade with an unoptimized villager."); } @Override @@ -43,7 +44,7 @@ public class PreventUnoptimizedTrading implements VillagerOptimizerModule, Liste @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("optimization.prevent-trading-with-unoptimized-villagers.enable", false); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.prevent-trading-with-unoptimized.enable", false); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerDamage.java b/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerDamage.java index 759b695..6860ecc 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerDamage.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerDamage.java @@ -3,20 +3,39 @@ package me.xginko.villageroptimizer.modules; import io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent; import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.cache.VillagerManager; +import me.xginko.villageroptimizer.config.Config; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mob; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageByBlockEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; public class PreventVillagerDamage implements VillagerOptimizerModule, Listener { private final VillagerManager villagerManager; + private final boolean block, player, mob, other, push; protected PreventVillagerDamage() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); + Config config = VillagerOptimizer.getConfiguration(); + config.addComment("optimization.behavior.prevent-damage.enable", + "Configure what kind of damage you want to cancel for optimized villagers here."); + this.block = config.getBoolean("optimization.behavior.prevent-damage.block", false, + "Prevents damage from blocks like lava, tnt, respawn anchors, etc."); + this.player = config.getBoolean("optimization.behavior.prevent-damage.player", false, + "Prevents damage from getting hit by players."); + this.mob = config.getBoolean("optimization.behavior.prevent-damage.mob", true, + "Prevents damage from hostile mobs."); + this.other = config.getBoolean("optimization.behavior.prevent-damage.other", true, + "Prevents damage from all other entities."); + this.push = config.getBoolean("optimization.behavior.prevent-damage.prevent-push-from-attack", true, + "Prevents optimized villagers from getting pushed by an attacking entity"); } @Override @@ -32,13 +51,37 @@ public class PreventVillagerDamage implements VillagerOptimizerModule, Listener @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.optimized-villagers-dont-take-damage", true); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.prevent-damage.enable", true); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onDamageReceive(EntityDamageEvent event) { + private void onDamageReceive(EntityDamageByEntityEvent event) { if ( - !event.getEntityType().equals(EntityType.VILLAGER) + event.getEntityType().equals(EntityType.VILLAGER) + && villagerManager.getOrAdd((Villager) event.getEntity()).isOptimized() + ) { + Entity damager = event.getDamager(); + if (damager.getType().equals(EntityType.PLAYER)) { + if (player) event.setCancelled(true); + return; + } + + if (damager instanceof Mob) { + if (mob) event.setCancelled(true); + return; + } + + if (other) { + event.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + private void onDamageReceive(EntityDamageByBlockEvent event) { + if ( + block + && event.getEntityType().equals(EntityType.VILLAGER) && villagerManager.getOrAdd((Villager) event.getEntity()).isOptimized() ) { event.setCancelled(true); @@ -48,7 +91,8 @@ public class PreventVillagerDamage implements VillagerOptimizerModule, Listener @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) private void onPushByEntityAttack(EntityPushedByEntityAttackEvent event) { if ( - !event.getEntityType().equals(EntityType.VILLAGER) + push + && event.getEntityType().equals(EntityType.VILLAGER) && villagerManager.getOrAdd((Villager) event.getEntity()).isOptimized() ) { event.setCancelled(true); diff --git a/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerTargetting.java b/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerTargetting.java index cf9763b..f47c6af 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerTargetting.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/PreventVillagerTargetting.java @@ -35,7 +35,8 @@ public class PreventVillagerTargetting implements VillagerOptimizerModule, Liste @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.optimized-villagers-dont-get-targeted", true); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.prevent-targeting.enable", true, + "Prevents hostile entities from targeting optimized villagers."); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java index b370b7f..051f8e1 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java @@ -23,17 +23,17 @@ public class RestockTrades implements VillagerOptimizerModule, Listener { private final boolean shouldLog, notifyPlayer; protected RestockTrades() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); - config.addComment("optimization.trade-restocking.enable", """ + config.addComment("optimization.behavior.trade-restocking.enable", """ This is for automatic restocking of trades for optimized villagers. Optimized Villagers\s - Don't have enough AI to do trade restocks themselves, so this needs to always be enabled. - """); - this.restock_delay_millis = config.getInt("optimization.trade-restocking.delay-in-ticks", 1000, + Don't have enough AI to do trade restocks themselves, so this needs to always be enabled."""); + this.restock_delay_millis = config.getInt("optimization.behavior.trade-restocking.delay-in-ticks", 1000, "1 second = 20 ticks. There are 24.000 ticks in a single minecraft day.") * 50L; - this.shouldLog = config.getBoolean("optimization.trade-restocking.log", false); - this.notifyPlayer = config.getBoolean("optimization.trade-restocking.notify-player", true, + this.notifyPlayer = config.getBoolean("optimization.behavior.trade-restocking.notify-player", true, "Sends the player a message when the trades were restocked on a clicked villager."); + this.shouldLog = config.getBoolean("optimization.behavior.trade-restocking.log", false); } @Override @@ -49,7 +49,7 @@ public class RestockTrades implements VillagerOptimizerModule, Listener { @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("optimization.trade-restocking.enable", true); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.behavior.trade-restocking.enable", true); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java index 8fd65e8..411174b 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java @@ -36,10 +36,11 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { this.plugin = VillagerOptimizer.getInstance(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); - this.maxVillagersPerChunk = config.getInt("villager-chunk-limit.max-villagers-per-chunk", 25); - this.logIsEnabled = config.getBoolean("villager-chunk-limit.log-removals", false); - this.checkPeriod = config.getInt("villager-chunk-limit.check-period-in-ticks", 600, "check all chunks every x ticks."); - config.getList("villager-chunk-limit.removal-priority", List.of( + this.maxVillagersPerChunk = config.getInt("optimization.villager-chunk-limit.max-villagers-per-chunk", 25); + this.logIsEnabled = config.getBoolean("optimization.villager-chunk-limit.log-removals", false); + this.checkPeriod = config.getInt("optimization.villager-chunk-limit.check-period-in-ticks", 600, + "Check all loaded chunks every X ticks. 1 second = 20 ticks"); + config.getList("optimization.villager-chunk-limit.removal-priority", List.of( "NONE", "NITWIT", "SHEPHERD", "FISHERMAN", "BUTCHER", "CARTOGRAPHER", "LEATHERWORKER", "FLETCHER", "MASON", "FARMER", "ARMORER", "TOOLSMITH", "WEAPONSMITH", "CLERIC", "LIBRARIAN" ), @@ -50,7 +51,8 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { Villager.Profession profession = Villager.Profession.valueOf(configuredProfession); this.removalPriority.add(profession); } catch (IllegalArgumentException e) { - LogUtils.moduleLog(Level.WARNING, "villager-chunk-limit", "Villager profession '"+configuredProfession+"' not recognized. Make sure you're using the correct profession enums."); + LogUtils.moduleLog(Level.WARNING, "optimization.villager-chunk-limit", + "Villager profession '"+configuredProfession+"' not recognized. Make sure you're using the correct profession enums."); } }); } @@ -63,7 +65,7 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { @Override public boolean shouldEnable() { - return VillagerOptimizer.getConfiguration().getBoolean("villager-chunk-limit.enable", false); + return VillagerOptimizer.getConfiguration().getBoolean("optimization.villager-chunk-limit.enable", false); } @Override @@ -116,7 +118,7 @@ public class VillagerChunkLimit implements VillagerOptimizerModule, Listener { for (int i = 0; i < amount_over_the_limit; i++) { Villager villager = villagers_in_chunk.get(i); villager.remove(); - if (logIsEnabled) LogUtils.moduleLog(Level.INFO, "villager-chunk-limit", + if (logIsEnabled) LogUtils.moduleLog(Level.INFO, "optimization.villager-chunk-limit", "Removed villager of profession type '"+villager.getProfession()+"' at "+villager.getLocation()); } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java index f3bd4c6..9ea4b25 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java @@ -35,12 +35,12 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene private final double search_radius; protected WorkstationOptimization() { + shouldEnable(); this.villagerManager = VillagerOptimizer.getVillagerManager(); Config config = VillagerOptimizer.getConfiguration(); config.addComment("optimization.methods.by-workstation.enable", """ When enabled, villagers near a configured radius to a workstation specific to your config\s - will be optimized. - """); + will be optimized."""); config.getList("optimization.methods.by-workstation.workstation-materials", List.of( "COMPOSTER", "SMOKER", "BARREL", "LOOM", "BLAST_FURNACE", "BREWING_STAND", "CAULDRON", "FLETCHING_TABLE", "CARTOGRAPHY_TABLE", "LECTERN", "SMITHING_TABLE", "STONECUTTER", "GRINDSTONE" @@ -55,13 +55,12 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene }); this.search_radius = config.getDouble("optimization.methods.by-workstation.search-radius-in-blocks", 4.0, """ The radius in blocks a villager can be away from the player when he places a workstation.\s - The closest unoptimized villager to the player will be optimized. - """); + The closest unoptimized villager to the player will be optimized."""); this.cooldown = config.getInt("optimization.methods.by-workstation.optimize-cooldown-seconds", 600, """ Cooldown in seconds until a villager can be optimized again using this method.\s - Here for configuration freedom. Recommended to leave as is to not enable any exploitable behavior. - """) * 1000L; - this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-workstation.notify-player", true); + Here for configuration freedom. Recommended to leave as is to not enable any exploitable behavior.""") * 1000L; + this.shouldNotifyPlayer = config.getBoolean("optimization.methods.by-workstation.notify-player", true, + "Sends players a message when they successfully optimized a villager."); this.shouldLog = config.getBoolean("optimization.methods.by-workstation.log", false); } @@ -115,7 +114,7 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene if (shouldNotifyPlayer) { final String villagerType = closestOptimizableVillager.villager().getProfession().toString().toLowerCase(); final String workstation = placed.getType().toString().toLowerCase(); - VillagerOptimizer.getLang(player.locale()).workstation_unoptimize_success.forEach(line -> player.sendMessage(line + VillagerOptimizer.getLang(player.locale()).workstation_optimize_success.forEach(line -> player.sendMessage(line .replaceText(TextReplacementConfig.builder().matchLiteral("%villagertype%").replacement(villagerType).build()) .replaceText(TextReplacementConfig.builder().matchLiteral("%workstation%").replacement(workstation).build()) )); @@ -147,8 +146,6 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene for (Entity entity : workstationLoc.getNearbyEntities(search_radius, search_radius, search_radius)) { if (!entity.getType().equals(EntityType.VILLAGER)) continue; Villager villager = (Villager) entity; - final Villager.Profession profession = villager.getProfession(); - if (profession.equals(Villager.Profession.NONE) || profession.equals(Villager.Profession.NITWIT)) continue; WrappedVillager wVillager = villagerManager.getOrAdd(villager); final double distance = entity.getLocation().distance(workstationLoc); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2f6b041..d6221c3 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -18,7 +18,7 @@ commands: description: Optmize villagers in a radius around you aliases: - optvils - unoptmizevillagers: + unoptimizevillagers: usage: /unoptimizevillagers description: Unoptmize villagers in a radius around you aliases: