geforkt von Mirrors/Paper
57dd397155
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 Bukkit Changes: b999860d SPIGOT-2304: Add LootGenerateEvent CraftBukkit Changes:77fd87e4
SPIGOT-2304: Implement LootGenerateEventa1a705ee
SPIGOT-5566: Doused campfires & fires should call EntityChangeBlockEvent41712edd
SPIGOT-5707: PersistentDataHolder not Persistent on API dropped Item
86 Zeilen
4.0 KiB
Diff
86 Zeilen
4.0 KiB
Diff
From 63f51a54c6865db3e11678f2dd51eda1e4cf9e81 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 538c2169cd..2893f75bdf 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;
|
|
@@ -56,6 +57,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)) {
|
|
@@ -177,7 +184,7 @@ public class EntityEnderman extends EntityMonster {
|
|
if (this.world.isDay() && this.ticksLived >= this.bA + 600) {
|
|
float f = this.aI();
|
|
|
|
- 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.eq();
|
|
}
|
|
@@ -277,17 +284,19 @@ public class EntityEnderman extends EntityMonster {
|
|
} else if (!(damagesource instanceof EntityDamageSourceIndirect) && damagesource != DamageSource.FIREWORKS) {
|
|
boolean flag = super.damageEntity(damagesource, f);
|
|
|
|
- if (!this.world.p_() && damagesource.ignoresArmor() && this.random.nextInt(10) != 0) {
|
|
+ if (!this.world.p_() && damagesource.ignoresArmor() && this.random.nextInt(10) != 0 && this.tryEscape(damagesource == DamageSource.DROWN ? EndermanEscapeEvent.Reason.DROWN : EndermanEscapeEvent.Reason.CRITICAL_HIT)) { // Paper
|
|
this.eq();
|
|
}
|
|
|
|
return flag;
|
|
} else {
|
|
+ if (this.tryEscape(EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
|
|
for (int i = 0; i < 64; ++i) {
|
|
if (this.eq()) {
|
|
return true;
|
|
}
|
|
}
|
|
+ } // Paper end
|
|
|
|
return false;
|
|
}
|
|
@@ -422,7 +431,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;
|
|
@@ -481,7 +490,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.eq();
|
|
}
|
|
|
|
--
|
|
2.26.2
|
|
|