geforkt von Mirrors/Paper
2f782a6652
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes:17543ecf
SPIGOT-5035: Error Using Virtual Merchant GUI0fc6922b
SPIGOT-5028: Villager#setVillagerExperience() doesn't workbdbdbe44
SPIGOT-5024: Fox error - Unknown target reason
86 Zeilen
3.9 KiB
Diff
86 Zeilen
3.9 KiB
Diff
From 166a976886347571447e32ad5e7b42e3dc3e6e37 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/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
index 9d7c16dbfc..93f66181bf 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
@@ -2,6 +2,7 @@ package net.minecraft.server;
|
|
|
|
import java.util.EnumSet;
|
|
import java.util.Optional;
|
|
+import com.destroystokyo.paper.event.entity.EndermanEscapeEvent; // Paper
|
|
import java.util.Random;
|
|
import java.util.UUID;
|
|
import java.util.function.Predicate;
|
|
@@ -55,6 +56,12 @@ public class EntityEnderman extends EntityMonster {
|
|
setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private boolean tryEscape(EndermanEscapeEvent.Reason reason) {
|
|
+ return new EndermanEscapeEvent((org.bukkit.craftbukkit.entity.CraftEnderman) this.getBukkitEntity(), reason).callEvent();
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public boolean setGoalTarget(EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) {
|
|
if (!super.setGoalTarget(entityliving, reason, fireEvent)) {
|
|
@@ -174,7 +181,7 @@ public class EntityEnderman extends EntityMonster {
|
|
if (this.world.J() && this.ticksLived >= this.bC + 600) {
|
|
float f = this.aE();
|
|
|
|
- if (f > 0.5F && this.world.f(new BlockPosition(this)) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
|
|
+ if (f > 0.5F && this.world.f(new BlockPosition(this)) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper
|
|
this.setGoalTarget((EntityLiving) null);
|
|
this.dW();
|
|
}
|
|
@@ -266,17 +273,19 @@ public class EntityEnderman extends EntityMonster {
|
|
} else if (!(damagesource instanceof EntityDamageSourceIndirect) && damagesource != DamageSource.FIREWORKS) {
|
|
boolean flag = super.damageEntity(damagesource, f);
|
|
|
|
- if (damagesource.ignoresArmor() && this.random.nextInt(10) != 0) {
|
|
+ if (damagesource.ignoresArmor() && this.random.nextInt(10) != 0 && this.tryEscape(damagesource == DamageSource.DROWN ? EndermanEscapeEvent.Reason.DROWN : EndermanEscapeEvent.Reason.CRITICAL_HIT)) { // Paper
|
|
this.dW();
|
|
}
|
|
|
|
return flag;
|
|
} else {
|
|
+ if (this.tryEscape(EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
|
|
for (int i = 0; i < 64; ++i) {
|
|
if (this.dW()) {
|
|
return true;
|
|
}
|
|
}
|
|
+ } // Paper end
|
|
|
|
return false;
|
|
}
|
|
@@ -398,7 +407,7 @@ public class EntityEnderman extends EntityMonster {
|
|
|
|
static class PathfinderGoalPlayerWhoLookedAtTarget extends PathfinderGoalNearestAttackableTarget<EntityHuman> {
|
|
|
|
- private final EntityEnderman i;
|
|
+ private final EntityEnderman i; public final EntityEnderman getEnderman() { return this.i; } // Paper - OBFHELPER
|
|
private EntityHuman j;
|
|
private int k;
|
|
private int l;
|
|
@@ -456,7 +465,7 @@ public class EntityEnderman extends EntityMonster {
|
|
} else {
|
|
if (this.c != null && !this.i.isPassenger()) {
|
|
if (this.i.f((EntityHuman) this.c)) {
|
|
- if (this.c.h((Entity) this.i) < 16.0D) {
|
|
+ if (this.c.h((Entity) this.i) < 16.0D && this.getEnderman().tryEscape(EndermanEscapeEvent.Reason.STARE)) {
|
|
this.i.dW();
|
|
}
|
|
|
|
--
|
|
2.21.0
|
|
|