mirror of
https://github.com/PaperMC/Paper.git
synced 2024-10-30 07:19:58 +01:00
afe633df08
* convert API tests to mockito * convert server tests to mockito * add co-author
136 lines
8.9 KiB
Diff
136 lines
8.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: dodison <kacpik@mapik.eu>
|
|
Date: Mon, 26 Jul 2021 17:32:36 +0200
|
|
Subject: [PATCH] Add critical damage API
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
index ed8bad446a1845befa6d5d75c40cf281fa47a9d9..8795c94e6b6474addddbb0b337a962e8fac46b2b 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
@@ -61,6 +61,19 @@ public class DamageSource {
|
|
return this;
|
|
}
|
|
// CraftBukkit end
|
|
+ // Paper start - add critical damage API
|
|
+ private boolean critical;
|
|
+ public boolean isCritical() {
|
|
+ return this.critical;
|
|
+ }
|
|
+ public DamageSource critical() {
|
|
+ return this.critical(true);
|
|
+ }
|
|
+ public DamageSource critical(boolean critical) {
|
|
+ this.critical = critical;
|
|
+ return this;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public static DamageSource fallingBlock(Entity attacker) {
|
|
return (new EntityDamageSource("fallingBlock", attacker)).damageHelmet();
|
|
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
index 9c9c7dd62a747f6d6597b01839b63840080eac82..59cead9833b7d0266a0c19fdbebd42256e4f54c4 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -1256,7 +1256,7 @@ public abstract class Player extends LivingEntity {
|
|
flag1 = true;
|
|
}
|
|
|
|
- boolean flag2 = flag && this.fallDistance > 0.0F && !this.onGround && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity;
|
|
+ boolean flag2 = flag && this.fallDistance > 0.0F && !this.onGround && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity; // Paper - Add critical damage API - conflict on change
|
|
|
|
flag2 = flag2 && !level.paperConfig().entities.behavior.disablePlayerCrits; // Paper
|
|
flag2 = flag2 && !this.isSprinting();
|
|
@@ -1296,7 +1296,7 @@ public abstract class Player extends LivingEntity {
|
|
}
|
|
|
|
Vec3 vec3d = target.getDeltaMovement();
|
|
- boolean flag5 = target.hurt(DamageSource.playerAttack(this), f);
|
|
+ boolean flag5 = target.hurt(DamageSource.playerAttack(this).critical(flag2), f); // Paper - add critical damage API
|
|
|
|
if (flag5) {
|
|
if (i > 0) {
|
|
@@ -1324,7 +1324,7 @@ public abstract class Player extends LivingEntity {
|
|
|
|
if (entityliving != this && entityliving != target && !this.isAlliedTo((Entity) entityliving) && (!(entityliving instanceof ArmorStand) || !((ArmorStand) entityliving).isMarker()) && this.distanceToSqr((Entity) entityliving) < 9.0D) {
|
|
// CraftBukkit start - Only apply knockback if the damage hits
|
|
- if (entityliving.hurt(DamageSource.playerAttack(this).sweep(), f4)) {
|
|
+ if (entityliving.hurt(DamageSource.playerAttack(this).sweep().critical(flag2), f4)) { // Paper - add critical damage API
|
|
entityliving.knockback(0.4000000059604645D, (double) Mth.sin(this.getYRot() * 0.017453292F), (double) (-Mth.cos(this.getYRot() * 0.017453292F)), this); // Paper
|
|
}
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
index f427ad266a1e00adb661b9e4bc7cfe2a7ec52caa..11e0601c08e66ff7fe4febc2c38b38fec8d48c91 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
@@ -372,6 +372,7 @@ public abstract class AbstractArrow extends Projectile {
|
|
}
|
|
}
|
|
|
|
+ if (this.isCritArrow()) damagesource = damagesource.critical(); // Paper - add critical damage API
|
|
boolean flag = entity.getType() == EntityType.ENDERMAN;
|
|
int k = entity.getRemainingFireTicks();
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 49693aa4d136701c822ab4b386ab7ed8b061a156..4143f72b8df92bee25399f90a759c8a8fb567cba 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -970,7 +970,7 @@ public class CraftEventFactory {
|
|
} else {
|
|
damageCause = DamageCause.ENTITY_EXPLOSION;
|
|
}
|
|
- event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions);
|
|
+ event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions, source.isCritical()); // Paper - add critical damage API
|
|
}
|
|
event.setCancelled(cancelled);
|
|
|
|
@@ -999,7 +999,7 @@ public class CraftEventFactory {
|
|
cause = DamageCause.SONIC_BOOM;
|
|
}
|
|
|
|
- return CraftEventFactory.callEntityDamageEvent(damager, entity, cause, modifiers, modifierFunctions, cancelled);
|
|
+ return CraftEventFactory.callEntityDamageEvent(damager, entity, cause, modifiers, modifierFunctions, cancelled, source.isCritical()); // Paper - add critical damage API
|
|
} else if (source == DamageSource.OUT_OF_WORLD) {
|
|
EntityDamageEvent event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.VOID, modifiers, modifierFunctions);
|
|
event.setCancelled(cancelled);
|
|
@@ -1069,7 +1069,7 @@ public class CraftEventFactory {
|
|
} else {
|
|
throw new IllegalStateException(String.format("Unhandled damage of %s by %s from %s", entity, damager.getHandle(), source.msgId));
|
|
}
|
|
- EntityDamageEvent event = new EntityDamageByEntityEvent(damager, entity.getBukkitEntity(), cause, modifiers, modifierFunctions);
|
|
+ EntityDamageEvent event = new EntityDamageByEntityEvent(damager, entity.getBukkitEntity(), cause, modifiers, modifierFunctions, source.isCritical()); // Paper - add critical damage API
|
|
event.setCancelled(cancelled);
|
|
CraftEventFactory.callEvent(event);
|
|
if (!event.isCancelled()) {
|
|
@@ -1114,20 +1114,28 @@ public class CraftEventFactory {
|
|
}
|
|
|
|
if (cause != null) {
|
|
- return CraftEventFactory.callEntityDamageEvent(null, entity, cause, modifiers, modifierFunctions, cancelled);
|
|
+ return CraftEventFactory.callEntityDamageEvent(null, entity, cause, modifiers, modifierFunctions, cancelled, source.isCritical()); // Paper - add critical damage API
|
|
}
|
|
|
|
throw new IllegalStateException(String.format("Unhandled damage of %s from %s", entity, source.msgId));
|
|
}
|
|
|
|
+ @Deprecated // Paper - Add critical damage API
|
|
private static EntityDamageEvent callEntityDamageEvent(Entity damager, Entity damagee, DamageCause cause, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions) {
|
|
return CraftEventFactory.callEntityDamageEvent(damager, damagee, cause, modifiers, modifierFunctions, false);
|
|
}
|
|
|
|
+ // Paper start - Add critical damage API
|
|
+ @Deprecated
|
|
private static EntityDamageEvent callEntityDamageEvent(Entity damager, Entity damagee, DamageCause cause, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions, boolean cancelled) {
|
|
+ return CraftEventFactory.callEntityDamageEvent(damager, damagee, cause, modifiers, modifierFunctions, false, false);
|
|
+ }
|
|
+
|
|
+ private static EntityDamageEvent callEntityDamageEvent(Entity damager, Entity damagee, DamageCause cause, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions, boolean cancelled, boolean critical) {
|
|
+ // Paper end
|
|
EntityDamageEvent event;
|
|
if (damager != null) {
|
|
- event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions);
|
|
+ event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions, critical); // Paper - add critical damage API
|
|
} else {
|
|
event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions);
|
|
}
|