4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
75 Zeilen
4.4 KiB
Diff
75 Zeilen
4.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 30 Apr 2018 13:15:55 -0400
|
|
Subject: [PATCH] EndermanEscapeEvent
|
|
|
|
Fires an event anytime an enderman intends to teleport away from the player
|
|
|
|
You may cancel this, enabling ranged attacks to damage the enderman for example.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
|
index a18765fe0be5a83ee2da3638aa5107e9345f19b6..29e53aebd1dc22d5dd2753cc7acbea425cb0054e 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
|
@@ -109,6 +109,12 @@ public class EnderMan extends Monster implements NeutralMob {
|
|
this.setGoalTarget(target, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private boolean tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason reason) {
|
|
+ return new com.destroystokyo.paper.event.entity.EndermanEscapeEvent((org.bukkit.craftbukkit.entity.CraftEnderman) this.getBukkitEntity(), reason).callEvent();
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public boolean setGoalTarget(LivingEntity entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) {
|
|
if (!super.setGoalTarget(entityliving, reason, fireEvent)) {
|
|
@@ -262,7 +268,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
|
if (this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) {
|
|
float f = this.getBrightness();
|
|
|
|
- if (f > 0.5F && this.level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
|
|
+ if (f > 0.5F && this.level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper
|
|
this.setTarget((LivingEntity) null);
|
|
this.teleport();
|
|
}
|
|
@@ -360,17 +366,19 @@ public class EnderMan extends Monster implements NeutralMob {
|
|
if (this.isInvulnerableTo(source)) {
|
|
return false;
|
|
} else if (source instanceof IndirectEntityDamageSource) {
|
|
+ if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
|
|
for (int i = 0; i < 64; ++i) {
|
|
if (this.teleport()) {
|
|
return true;
|
|
}
|
|
}
|
|
+ } // Paper end
|
|
|
|
return false;
|
|
} else {
|
|
boolean flag = super.hurt(source, amount);
|
|
|
|
- if (!this.level.isClientSide() && !(source.getEntity() instanceof LivingEntity) && this.random.nextInt(10) != 0) {
|
|
+ if (!this.level.isClientSide() && !(source.getEntity() instanceof LivingEntity) && this.random.nextInt(10) != 0 && this.tryEscape(source == DamageSource.DROWN ? com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.DROWN : com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - use to be critical hits as else, but mojang removed critical hits in 1.16.2 due to MC-185684
|
|
this.teleport();
|
|
}
|
|
|
|
@@ -516,7 +524,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
|
|
|
private static class EndermanLookForPlayerGoal extends NearestAttackableTargetGoal<Player> {
|
|
|
|
- private final EnderMan enderman;
|
|
+ private final EnderMan enderman; public final EnderMan getEnderman() { return this.enderman; } // Paper - OBFHELPER
|
|
private Player pendingTarget;
|
|
private int aggroTime;
|
|
private int teleportTime;
|
|
@@ -579,7 +587,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
|
} else {
|
|
if (this.target != null && !this.enderman.isPassenger()) {
|
|
if (this.enderman.isLookingAtMe((Player) this.target)) {
|
|
- if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D) {
|
|
+ if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D && this.getEnderman().tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.STARE)) { // Paper
|
|
this.enderman.teleport();
|
|
}
|
|
|