Files
Purpur/patches/server/0082-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch
William Blake Galbreath dd928e3864 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
8d036cea Expose the internal current tick
0c715390 [PATCH] bounding box check for hanging entities (#2664)
527073aa Update config version
0d3b35c3 Rename baby zombie movement config option
2019-10-31 13:51:33 -05:00

106 lines
5.5 KiB
Diff

From 742dc7ca52fff8d0a9e487673250662f954e0caa Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 03:53:54 -0500
Subject: [PATCH] Add back EntityCreatePortalEvent for EnderDragon
---
.../minecraft/server/EnderDragonBattle.java | 57 ++++++++++++++++---
1 file changed, 49 insertions(+), 8 deletions(-)
diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java
index c7470d2852..97bb59369f 100644
--- a/src/main/java/net/minecraft/server/EnderDragonBattle.java
+++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java
@@ -21,8 +21,8 @@ public class EnderDragonBattle {
private static final Logger LOGGER = LogManager.getLogger();
private static final Predicate<Entity> b = IEntitySelector.a.and(IEntitySelector.a(0.0D, 128.0D, 0.0D, 192.0D));
public final BossBattleServer bossBattle;
- private final WorldServer d;
- private final List<Integer> e;
+ private final WorldServer d; public WorldServer getWorld() { return d; } // Purpur - OBFHELPER
+ private final List<Integer> e; public List<Integer> getGateways() { return e; } // Purpur - OBFHELPER
private final ShapeDetector f;
private int g;
private int h;
@@ -354,8 +354,8 @@ public class EnderDragonBattle {
if (entityenderdragon.getUniqueID().equals(this.m)) {
this.bossBattle.setProgress(0.0F);
this.bossBattle.setVisible(false);
- this.a(true);
- this.n();
+ spawnExitPortal(entityenderdragon); // Purpur
+ spawnGateway(entityenderdragon); // Purpur
if (net.pl3x.purpur.PurpurConfig.enderDragonAlwaysDropsEggBlock || !this.l) { // Purpur - always place dragon egg
this.d.setTypeUpdate(this.d.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING, WorldGenEndTrophy.a), Blocks.DRAGON_EGG.getBlockData());
}
@@ -366,21 +366,62 @@ public class EnderDragonBattle {
}
- private void n() {
- if (!this.e.isEmpty()) {
- int i = (Integer) this.e.remove(this.e.size() - 1);
+ // Purpur start
+ private void spawnGateway(EntityEnderDragon dragon) { n(dragon); } // Purpur - OBFHELPER
+ private void n(EntityEnderDragon entityenderdragon) {
+ if (!getGateways().isEmpty()) {
+ int i = getGateways().remove(getGateways().size() - 1);
+ // Purpur end
int j = MathHelper.floor(96.0D * Math.cos(2.0D * (-3.141592653589793D + 0.15707963267948966D * (double) i)));
int k = MathHelper.floor(96.0D * Math.sin(2.0D * (-3.141592653589793D + 0.15707963267948966D * (double) i)));
- this.a(new BlockPosition(j, 75, k));
+ // Purpur start
+ getWorld().captureBlockStates = true;
+ generateGateway(new BlockPosition(j, 75, k));
+ getWorld().captureBlockStates = false;
+ if (getWorld().capturedBlockStates.size() > 0) {
+ org.bukkit.event.entity.EntityCreatePortalEvent event = new org.bukkit.event.entity.EntityCreatePortalEvent(entityenderdragon.getBukkitLivingEntity(), getWorld().capturedBlockStates.stream().map(state -> org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(getWorld(), state.getPosition())).collect(java.util.stream.Collectors.toList()), org.bukkit.PortalType.END_GATEWAY);
+ if (!event.callEvent()) {
+ // put the gateway back into queue
+ getGateways().add(i);
+ // revert captured blocks
+ for (org.bukkit.craftbukkit.block.CraftBlockState state : getWorld().capturedBlockStates) {
+ state.update(true, false);
+ }
+ }
+ }
+ getWorld().capturedTileEntities.clear();
+ getWorld().capturedBlockStates.clear();
+ // Purpur end
}
}
+ private void generateGateway(BlockPosition blockPosition) { a(blockPosition); } // Purpur - OBFHELPER
private void a(BlockPosition blockposition) {
this.d.triggerEffect(3000, blockposition, 0);
WorldGenerator.END_GATEWAY.generate(this.d, this.d.getChunkProvider().getChunkGenerator(), new Random(), blockposition, WorldGenEndGatewayConfiguration.a());
}
+ // Purpur start
+ private void spawnExitPortal(EntityEnderDragon dragon) {
+ getWorld().captureBlockStates = true;
+ generateExitPortal(true);
+ getWorld().captureBlockStates = false;
+ if (getWorld().capturedBlockStates.size() > 0) {
+ org.bukkit.event.entity.EntityCreatePortalEvent event = new org.bukkit.event.entity.EntityCreatePortalEvent(dragon.getBukkitLivingEntity(), getWorld().capturedBlockStates.stream().map(state -> org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(getWorld(), state.getPosition())).collect(java.util.stream.Collectors.toList()), org.bukkit.PortalType.ENDER);
+ if (!event.callEvent()) {
+ // revert captured blocks
+ for (org.bukkit.craftbukkit.block.CraftBlockState state : getWorld().capturedBlockStates) {
+ state.update(true);
+ }
+ }
+ }
+ getWorld().capturedTileEntities.clear();
+ getWorld().capturedBlockStates.clear();
+ }
+ // Purpur end
+
+ private void generateExitPortal(boolean active) { a(active); } // Purpur - OBFHELPER
private void a(boolean flag) {
WorldGenEndTrophy worldgenendtrophy = new WorldGenEndTrophy(flag);
--
2.24.0.rc1