diff --git a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java index d5e7b02..31b431c 100644 --- a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java +++ b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java @@ -23,7 +23,7 @@ public class MakeVillagersSpawnAdult implements VillagerOptimizerModule, Listene public boolean shouldEnable() { return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """ Spawned villagers will immediately be adults.\s - This is to save some more performance as players don't have to keep unoptimized\s + This is to save some more resources as players don't have to keep unoptimized\s villagers loaded because they have to wait for them to turn into adults before they can\s optimize them."""); } diff --git a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java index e03d468..045228c 100644 --- a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java +++ b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java @@ -4,20 +4,21 @@ import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; -import org.bukkit.entity.Entity; +import me.xginko.villageroptimizer.utils.LogUtil; 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.Listener; -import org.bukkit.event.entity.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.Arrays; +import java.util.HashSet; public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener { private final VillagerCache villagerCache; - private final boolean block, player, mob, other; + private final HashSet damage_causes_to_cancel = new HashSet<>(); public PreventOptimizedDamage() { shouldEnable(); @@ -25,14 +26,18 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener Config config = VillagerOptimizer.getConfiguration(); config.addComment("gameplay.prevent-damage-to-optimized.enable", "Configure what kind of damage you want to cancel for optimized villagers here."); - this.block = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.block", false, - "Prevents damage from blocks like lava, tnt, respawn anchors, etc."); - this.player = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.player", false, - "Prevents damage from getting hit by players."); - this.mob = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.mob", true, - "Prevents damage from hostile mobs."); - this.other = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.other", true, - "Prevents damage from all other entities."); + config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel", + Arrays.stream(EntityDamageEvent.DamageCause.values()).map(Enum::name).toList(), """ + These are all current entries in the game. Remove what you do not want blocked. Remember sometimes players need to dispose of villagers. + Refer to https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html for correct names and a description.\s""" + ).forEach(configuredDamageCause -> { + try { + EntityDamageEvent.DamageCause damageCause = EntityDamageEvent.DamageCause.valueOf(configuredDamageCause); + this.damage_causes_to_cancel.add(damageCause); + } catch (IllegalArgumentException e) { + LogUtil.damageCauseNotRecognized("prevent-damage-to-optimized", configuredDamageCause); + } + }); } @Override @@ -47,33 +52,10 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onDamageByEntity(EntityDamageByEntityEvent event) { + private void onDamageByEntity(EntityDamageEvent event) { if ( event.getEntityType().equals(EntityType.VILLAGER) - && villagerCache.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 onDamageByBlock(EntityDamageByBlockEvent event) { - if ( - block - && event.getEntityType().equals(EntityType.VILLAGER) + && damage_causes_to_cancel.contains(event.getCause()) && villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() ) { event.setCancelled(true); diff --git a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java index ce8ab71..dad057a 100644 --- a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java +++ b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java @@ -12,7 +12,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; +import org.bukkit.event.entity.EntityTargetEvent; public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener { @@ -35,7 +35,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onTarget(EntityTargetLivingEntityEvent event) { + private void onTarget(EntityTargetEvent event) { // Yes, instanceof checks would look way more beautiful here but checking type is much faster Entity target = event.getTarget(); if ( @@ -43,6 +43,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste && target.getType().equals(EntityType.VILLAGER) && villagerCache.getOrAdd((Villager) target).isOptimized() ) { + event.setTarget(null); event.setCancelled(true); } } diff --git a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java index b0bd059..38929e1 100644 --- a/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java +++ b/VillagerOptimizer-1.16.5/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java @@ -11,18 +11,16 @@ public class LogUtil { } public static void materialNotRecognized(String path, String material) { - moduleLog(Level.WARNING, path, "Material '" + material + "' not recognized. Please use correct Spigot Material enums for your Minecraft version!"); + moduleLog(Level.WARNING, path, "Material '" + material + "' not recognized. Please use correct Material enums from: " + + "https://jd.papermc.io/paper/1.20/org/bukkit/Material.html"); + } + + public static void damageCauseNotRecognized(String path, String cause) { + moduleLog(Level.WARNING, path, "DamageCause '" + cause + "' not recognized. Please use correct DamageCause enums from: " + + "https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html"); } public static void entityTypeNotRecognized(String path, String entityType) { moduleLog(Level.WARNING, path, "EntityType '" + entityType + "' not recognized. Please use correct Spigot EntityType enums for your Minecraft version!"); } - - public static void enchantmentNotRecognized(String path, String enchantment) { - moduleLog(Level.WARNING, path, "Enchantment '" + enchantment + "' not recognized. Please use correct Spigot Enchantment enums for your Minecraft version!"); - } - - public static void integerNotRecognized(String path, String element) { - moduleLog(Level.WARNING, path, "The configured amount for "+element+" is not an integer."); - } } \ No newline at end of file diff --git a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java index fd5eabb..94b5d25 100644 --- a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java +++ b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/MakeVillagersSpawnAdult.java @@ -29,7 +29,7 @@ public class MakeVillagersSpawnAdult implements VillagerOptimizerModule, Listene public boolean shouldEnable() { return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """ Spawned villagers will immediately be adults.\s - This is to save some more performance as players don't have to keep unoptimized\s + This is to save some more resources as players don't have to keep unoptimized\s villagers loaded because they have to wait for them to turn into adults before they can\s optimize them."""); } diff --git a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java index 8a8fd8b..73f5040 100644 --- a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java +++ b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedDamage.java @@ -1,25 +1,27 @@ package me.xginko.villageroptimizer.modules.gameplay; import io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent; -import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerCache; +import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; -import org.bukkit.entity.Entity; +import me.xginko.villageroptimizer.utils.LogUtil; 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.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.Arrays; +import java.util.HashSet; public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener { private final VillagerCache villagerCache; - private final boolean block, player, mob, other, push; + private final HashSet damage_causes_to_cancel = new HashSet<>(); + private final boolean push; public PreventOptimizedDamage() { shouldEnable(); @@ -29,14 +31,18 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener "Configure what kind of damage you want to cancel for optimized villagers here."); this.push = config.getBoolean("gameplay.prevent-damage-to-optimized.prevent-push-from-attack", true, "Prevents optimized villagers from getting pushed by an attacking entity"); - this.block = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.block", false, - "Prevents damage from blocks like lava, tnt, respawn anchors, etc."); - this.player = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.player", false, - "Prevents damage from getting hit by players."); - this.mob = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.mob", true, - "Prevents damage from hostile mobs."); - this.other = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.other", true, - "Prevents damage from all other entities."); + config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel", + Arrays.stream(EntityDamageEvent.DamageCause.values()).map(Enum::name).toList(), """ + These are all current entries in the game. Remove what you do not need blocked. Remember sometimes players need to dispose of villagers. + Refer to https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html for correct names and a description.\s""" + ).forEach(configuredDamageCause -> { + try { + EntityDamageEvent.DamageCause damageCause = EntityDamageEvent.DamageCause.valueOf(configuredDamageCause); + this.damage_causes_to_cancel.add(damageCause); + } catch (IllegalArgumentException e) { + LogUtil.damageCauseNotRecognized("prevent-damage-to-optimized", configuredDamageCause); + } + }); } @Override @@ -56,33 +62,10 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onDamageByEntity(EntityDamageByEntityEvent event) { + private void onDamageByEntity(EntityDamageEvent event) { if ( event.getEntityType().equals(EntityType.VILLAGER) - && villagerCache.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 onDamageByBlock(EntityDamageByBlockEvent event) { - if ( - block - && event.getEntityType().equals(EntityType.VILLAGER) + && damage_causes_to_cancel.contains(event.getCause()) && villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() ) { event.setCancelled(true); diff --git a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java index 5d0410c..1bd2387 100644 --- a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java +++ b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventOptimizedTargeting.java @@ -1,8 +1,8 @@ package me.xginko.villageroptimizer.modules.gameplay; import com.destroystokyo.paper.event.entity.EntityPathfindEvent; -import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerCache; +import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -13,7 +13,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; +import org.bukkit.event.entity.EntityTargetEvent; public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener { @@ -41,7 +41,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - private void onTarget(EntityTargetLivingEntityEvent event) { + private void onTarget(EntityTargetEvent event) { // Yes, instanceof checks would look way more beautiful here but checking type is much faster Entity target = event.getTarget(); if ( @@ -49,6 +49,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste && target.getType().equals(EntityType.VILLAGER) && villagerCache.getOrAdd((Villager) target).isOptimized() ) { + event.setTarget(null); event.setCancelled(true); } } diff --git a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java index b0bd059..38929e1 100644 --- a/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java +++ b/VillagerOptimizer-1.20.2/src/main/java/me/xginko/villageroptimizer/utils/LogUtil.java @@ -11,18 +11,16 @@ public class LogUtil { } public static void materialNotRecognized(String path, String material) { - moduleLog(Level.WARNING, path, "Material '" + material + "' not recognized. Please use correct Spigot Material enums for your Minecraft version!"); + moduleLog(Level.WARNING, path, "Material '" + material + "' not recognized. Please use correct Material enums from: " + + "https://jd.papermc.io/paper/1.20/org/bukkit/Material.html"); + } + + public static void damageCauseNotRecognized(String path, String cause) { + moduleLog(Level.WARNING, path, "DamageCause '" + cause + "' not recognized. Please use correct DamageCause enums from: " + + "https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html"); } public static void entityTypeNotRecognized(String path, String entityType) { moduleLog(Level.WARNING, path, "EntityType '" + entityType + "' not recognized. Please use correct Spigot EntityType enums for your Minecraft version!"); } - - public static void enchantmentNotRecognized(String path, String enchantment) { - moduleLog(Level.WARNING, path, "Enchantment '" + enchantment + "' not recognized. Please use correct Spigot Enchantment enums for your Minecraft version!"); - } - - public static void integerNotRecognized(String path, String element) { - moduleLog(Level.WARNING, path, "The configured amount for "+element+" is not an integer."); - } } \ No newline at end of file