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() {
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.""");
}

View File

@ -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<EntityDamageEvent.DamageCause> 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);

View File

@ -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);
}
}

View File

@ -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.");
}
}

View File

@ -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.""");
}

View File

@ -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<EntityDamageEvent.DamageCause> 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);

View File

@ -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);
}
}

View File

@ -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.");
}
}