mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-23 13:03:05 +02:00
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:a339310c
#755: Fix NPE when calling getInventory() for virtual EnderChests2577f9bf
Increase outdated build delay1dabfdc8
#754: Fix pre-1.16 serialized SkullMeta being broken on 1.16+, losing textures
83 lines
4.3 KiB
Diff
83 lines
4.3 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/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java
|
|
index eea2534be648bec49749bd8f55e36658dccdba57..f20283585464d54c4c5da294cf19261c2d258c97 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 implements IEntityAngerable {
|
|
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)) {
|
|
@@ -208,7 +215,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
|
|
if (this.world.isDay() && this.ticksLived >= this.bs + 600) {
|
|
float f = this.aQ();
|
|
|
|
- if (f > 0.5F && this.world.e(this.getChunkCoordinates()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
|
|
+ if (f > 0.5F && this.world.e(this.getChunkCoordinates()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper
|
|
this.setGoalTarget((EntityLiving) null);
|
|
this.eL();
|
|
}
|
|
@@ -306,17 +313,19 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
|
|
if (this.isInvulnerable(damagesource)) {
|
|
return false;
|
|
} else if (damagesource instanceof EntityDamageSourceIndirect) {
|
|
+ if (this.tryEscape(EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
|
|
for (int i = 0; i < 64; ++i) {
|
|
if (this.eL()) {
|
|
return true;
|
|
}
|
|
}
|
|
+ } // Paper end
|
|
|
|
return false;
|
|
} else {
|
|
boolean flag = super.damageEntity(damagesource, f);
|
|
|
|
- if (!this.world.s_() && !(damagesource.getEntity() instanceof EntityLiving) && this.random.nextInt(10) != 0) {
|
|
+ if (!this.world.s_() && !(damagesource.getEntity() instanceof EntityLiving) && this.random.nextInt(10) != 0 && this.tryEscape(damagesource == DamageSource.DROWN ? EndermanEscapeEvent.Reason.DROWN : 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.eL();
|
|
}
|
|
|
|
@@ -461,7 +470,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
|
|
|
|
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;
|
|
@@ -524,7 +533,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
|
|
} else {
|
|
if (this.c != null && !this.i.isPassenger()) {
|
|
if (this.i.g((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)) { // Paper
|
|
this.i.eL();
|
|
}
|
|
|