diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 8e47ae748..261a13f46 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -60,6 +60,7 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -83,10 +84,12 @@ import net.ess3.provider.providers.BukkitMaterialTagProvider; import net.ess3.provider.providers.BukkitSpawnerBlockProvider; import net.ess3.provider.providers.FixedHeightWorldInfoProvider; import net.ess3.provider.providers.FlatSpawnEggProvider; +import net.ess3.provider.providers.LegacyDamageEventProvider; import net.ess3.provider.providers.LegacyItemUnbreakableProvider; import net.ess3.provider.providers.LegacyPlayerLocaleProvider; import net.ess3.provider.providers.LegacyPotionMetaProvider; import net.ess3.provider.providers.LegacySpawnEggProvider; +import net.ess3.provider.providers.ModernDamageEventProvider; import net.ess3.provider.providers.ModernDataWorldInfoProvider; import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; @@ -193,6 +196,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient WorldInfoProvider worldInfoProvider; private transient PlayerLocaleProvider playerLocaleProvider; private transient SignDataProvider signDataProvider; + private transient DamageEventProvider damageEventProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -475,6 +479,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { playerLocaleProvider = new LegacyPlayerLocaleProvider(); } + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_4_R01)) { + damageEventProvider = new ModernDamageEventProvider(); + } else { + damageEventProvider = new LegacyDamageEventProvider(); + } + execTimer.mark("Init(Providers)"); reload(); @@ -1405,6 +1415,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return playerLocaleProvider; } + @Override + public DamageEventProvider getDamageEventProvider() { + return damageEventProvider; + } + @Override public SignDataProvider getSignDataProvider() { return signDataProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index f0b627133..9aea053e8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -10,6 +10,7 @@ import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; import net.ess3.nms.refl.providers.ReflOnlineModeProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -183,5 +184,7 @@ public interface IEssentials extends Plugin { PlayerLocaleProvider getPlayerLocaleProvider(); + DamageEventProvider getDamageEventProvider(); + PluginCommand getPluginCommand(String cmd); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java index 6bb19b4bb..d2a76cbfa 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java @@ -29,8 +29,7 @@ public class Commandkill extends EssentialsLoopCommand { if (sender.isPlayer() && user.isAuthorized("essentials.kill.exempt") && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { throw new PlayerExemptException("killExempt", matchPlayer.getDisplayName()); } - final EntityDamageEvent ede = new EntityDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); if (ede.isCancelled() && sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { return; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index 53b170f67..c81d92c8e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -14,8 +14,7 @@ public class Commandsuicide extends EssentialsCommand { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final EntityDamageEvent ede = new EntityDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); ede.getEntity().setLastDamageCause(ede); user.getBase().setHealth(0); user.sendTl("suicideMessage"); diff --git a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java new file mode 100644 index 000000000..74487c25d --- /dev/null +++ b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java @@ -0,0 +1,19 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public class LegacyDamageEventProvider implements DamageEventProvider { + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "Legacy Damage Event Provider"; + } +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java new file mode 100644 index 000000000..4eb229bf2 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java @@ -0,0 +1,8 @@ +package net.ess3.provider; + +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public interface DamageEventProvider extends Provider { + EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage); +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java new file mode 100644 index 000000000..77ba5cb9b --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java @@ -0,0 +1,24 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +@SuppressWarnings("UnstableApiUsage") +public class ModernDamageEventProvider implements DamageEventProvider { + private final DamageSource MAGIC_SOURCE = DamageSource.builder(DamageType.MAGIC).build(); + + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, MAGIC_SOURCE, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "1.20.4+ Damage Event Provider"; + } +}