improve damage and target preventions

This commit is contained in:
xGinko 2023-10-06 13:24:35 +02:00
parent cb8c694f6b
commit da78a94a8d
8 changed files with 65 additions and 102 deletions

View File

@ -23,7 +23,7 @@ public class MakeVillagersSpawnAdult implements VillagerOptimizerModule, Listene
public boolean shouldEnable() { public boolean shouldEnable() {
return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """ return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """
Spawned villagers will immediately be adults.\s 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 villagers loaded because they have to wait for them to turn into adults before they can\s
optimize them."""); optimize them.""");
} }

View File

@ -4,20 +4,21 @@ import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; 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.EntityType;
import org.bukkit.entity.Mob;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import java.util.Arrays;
import java.util.HashSet;
public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener { public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener {
private final VillagerCache villagerCache; private final VillagerCache villagerCache;
private final boolean block, player, mob, other; private final HashSet<EntityDamageEvent.DamageCause> damage_causes_to_cancel = new HashSet<>();
public PreventOptimizedDamage() { public PreventOptimizedDamage() {
shouldEnable(); shouldEnable();
@ -25,14 +26,18 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener
Config config = VillagerOptimizer.getConfiguration(); Config config = VillagerOptimizer.getConfiguration();
config.addComment("gameplay.prevent-damage-to-optimized.enable", config.addComment("gameplay.prevent-damage-to-optimized.enable",
"Configure what kind of damage you want to cancel for optimized villagers here."); "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, config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel",
"Prevents damage from blocks like lava, tnt, respawn anchors, etc."); Arrays.stream(EntityDamageEvent.DamageCause.values()).map(Enum::name).toList(), """
this.player = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.player", false, These are all current entries in the game. Remove what you do not want blocked. Remember sometimes players need to dispose of villagers.
"Prevents damage from getting hit by players."); Refer to https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html for correct names and a description.\s"""
this.mob = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.mob", true, ).forEach(configuredDamageCause -> {
"Prevents damage from hostile mobs."); try {
this.other = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.other", true, EntityDamageEvent.DamageCause damageCause = EntityDamageEvent.DamageCause.valueOf(configuredDamageCause);
"Prevents damage from all other entities."); this.damage_causes_to_cancel.add(damageCause);
} catch (IllegalArgumentException e) {
LogUtil.damageCauseNotRecognized("prevent-damage-to-optimized", configuredDamageCause);
}
});
} }
@Override @Override
@ -47,33 +52,10 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onDamageByEntity(EntityDamageByEntityEvent event) { private void onDamageByEntity(EntityDamageEvent event) {
if ( if (
event.getEntityType().equals(EntityType.VILLAGER) event.getEntityType().equals(EntityType.VILLAGER)
&& villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() && damage_causes_to_cancel.contains(event.getCause())
) {
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)
&& villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() && villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized()
) { ) {
event.setCancelled(true); event.setCancelled(true);

View File

@ -12,7 +12,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.entity.EntityTargetEvent;
public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener { public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener {
@ -35,7 +35,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @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 // Yes, instanceof checks would look way more beautiful here but checking type is much faster
Entity target = event.getTarget(); Entity target = event.getTarget();
if ( if (
@ -43,6 +43,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste
&& target.getType().equals(EntityType.VILLAGER) && target.getType().equals(EntityType.VILLAGER)
&& villagerCache.getOrAdd((Villager) target).isOptimized() && villagerCache.getOrAdd((Villager) target).isOptimized()
) { ) {
event.setTarget(null);
event.setCancelled(true); event.setCancelled(true);
} }
} }

View File

@ -11,18 +11,16 @@ public class LogUtil {
} }
public static void materialNotRecognized(String path, String material) { 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) { 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!"); 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.");
}
} }

View File

@ -29,7 +29,7 @@ public class MakeVillagersSpawnAdult implements VillagerOptimizerModule, Listene
public boolean shouldEnable() { public boolean shouldEnable() {
return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """ return VillagerOptimizer.getConfiguration().getBoolean("gameplay.villagers-spawn-as-adults.enable", false, """
Spawned villagers will immediately be adults.\s 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 villagers loaded because they have to wait for them to turn into adults before they can\s
optimize them."""); optimize them.""");
} }

View File

@ -1,25 +1,27 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent; import io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; 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.EntityType;
import org.bukkit.entity.Mob;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import java.util.Arrays;
import java.util.HashSet;
public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener { public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener {
private final VillagerCache villagerCache; private final VillagerCache villagerCache;
private final boolean block, player, mob, other, push; private final HashSet<EntityDamageEvent.DamageCause> damage_causes_to_cancel = new HashSet<>();
private final boolean push;
public PreventOptimizedDamage() { public PreventOptimizedDamage() {
shouldEnable(); shouldEnable();
@ -29,14 +31,18 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener
"Configure what kind of damage you want to cancel for optimized villagers here."); "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, this.push = config.getBoolean("gameplay.prevent-damage-to-optimized.prevent-push-from-attack", true,
"Prevents optimized villagers from getting pushed by an attacking entity"); "Prevents optimized villagers from getting pushed by an attacking entity");
this.block = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.block", false, config.getList("gameplay.prevent-damage-to-optimized.damage-causes-to-cancel",
"Prevents damage from blocks like lava, tnt, respawn anchors, etc."); Arrays.stream(EntityDamageEvent.DamageCause.values()).map(Enum::name).toList(), """
this.player = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.player", false, These are all current entries in the game. Remove what you do not need blocked. Remember sometimes players need to dispose of villagers.
"Prevents damage from getting hit by players."); Refer to https://jd.papermc.io/paper/1.20/org/bukkit/event/entity/EntityDamageEvent.DamageCause.html for correct names and a description.\s"""
this.mob = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.mob", true, ).forEach(configuredDamageCause -> {
"Prevents damage from hostile mobs."); try {
this.other = config.getBoolean("gameplay.prevent-damage-to-optimized.damagers.other", true, EntityDamageEvent.DamageCause damageCause = EntityDamageEvent.DamageCause.valueOf(configuredDamageCause);
"Prevents damage from all other entities."); this.damage_causes_to_cancel.add(damageCause);
} catch (IllegalArgumentException e) {
LogUtil.damageCauseNotRecognized("prevent-damage-to-optimized", configuredDamageCause);
}
});
} }
@Override @Override
@ -56,33 +62,10 @@ public class PreventOptimizedDamage implements VillagerOptimizerModule, Listener
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
private void onDamageByEntity(EntityDamageByEntityEvent event) { private void onDamageByEntity(EntityDamageEvent event) {
if ( if (
event.getEntityType().equals(EntityType.VILLAGER) event.getEntityType().equals(EntityType.VILLAGER)
&& villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() && damage_causes_to_cancel.contains(event.getCause())
) {
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)
&& villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized() && villagerCache.getOrAdd((Villager) event.getEntity()).isOptimized()
) { ) {
event.setCancelled(true); event.setCancelled(true);

View File

@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.modules.gameplay; package me.xginko.villageroptimizer.modules.gameplay;
import com.destroystokyo.paper.event.entity.EntityPathfindEvent; import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule; import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -13,7 +13,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.entity.EntityTargetEvent;
public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener { public class PreventOptimizedTargeting implements VillagerOptimizerModule, Listener {
@ -41,7 +41,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @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 // Yes, instanceof checks would look way more beautiful here but checking type is much faster
Entity target = event.getTarget(); Entity target = event.getTarget();
if ( if (
@ -49,6 +49,7 @@ public class PreventOptimizedTargeting implements VillagerOptimizerModule, Liste
&& target.getType().equals(EntityType.VILLAGER) && target.getType().equals(EntityType.VILLAGER)
&& villagerCache.getOrAdd((Villager) target).isOptimized() && villagerCache.getOrAdd((Villager) target).isOptimized()
) { ) {
event.setTarget(null);
event.setCancelled(true); event.setCancelled(true);
} }
} }

View File

@ -11,18 +11,16 @@ public class LogUtil {
} }
public static void materialNotRecognized(String path, String material) { 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) { 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!"); 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.");
}
} }