--- a/net/minecraft/world/item/MaceItem.java
+++ b/net/minecraft/world/item/MaceItem.java
@@ -61,7 +_,13 @@
 
     @Override
     public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
-        if (canSmashAttack(attacker)) {
+        // Paper start - Add EntityAttemptSmashAttackEvent
+        final boolean canSmashAttack = canSmashAttack(attacker);
+        io.papermc.paper.event.entity.EntityAttemptSmashAttackEvent event = new io.papermc.paper.event.entity.EntityAttemptSmashAttackEvent(attacker.getBukkitLivingEntity(), target.getBukkitLivingEntity(), stack.asBukkitCopy(), canSmashAttack);
+        event.callEvent();
+        final org.bukkit.event.Event.Result result = event.getResult();
+        if (result == org.bukkit.event.Event.Result.ALLOW || (canSmashAttack && result == org.bukkit.event.Event.Result.DEFAULT)) {
+        // Paper end - Add EntityAttemptSmashAttackEvent
             ServerLevel serverLevel = (ServerLevel)attacker.level();
             attacker.setDeltaMovement(attacker.getDeltaMovement().with(Direction.Axis.Y, 0.01F));
             if (attacker instanceof ServerPlayer serverPlayer) {
@@ -139,7 +_,7 @@
             double knockbackPower = getKnockbackPower(attacker, livingEntity, vec3);
             Vec3 vec31 = vec3.normalize().scale(knockbackPower);
             if (knockbackPower > 0.0) {
-                livingEntity.push(vec31.x, 0.7F, vec31.z);
+                livingEntity.push(vec31.x, 0.7F, vec31.z, attacker); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
                 if (livingEntity instanceof ServerPlayer serverPlayer) {
                     serverPlayer.connection.send(new ClientboundSetEntityMotionPacket(serverPlayer));
                 }
