PaperMC/Spigot-Server-Patches/0685-Add-worldborder-events.patch
Josh Roy be13705177
Updated Upstream (CraftBukkit) (#5484)
Upstream has released updates that appear 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:
6b8cd9a7 SPIGOT-6207: forcibly drop the items of a converted zombie villager
2021-04-12 02:03:08 +01:00

122 lines
5.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Mon, 4 Jan 2021 22:40:34 -0800
Subject: [PATCH] Add worldborder events
diff --git a/src/main/java/net/minecraft/world/level/border/WorldBorder.java b/src/main/java/net/minecraft/world/level/border/WorldBorder.java
index bedaa9dd6390e81df5872c2dd6e202a038367bf6..3c25021835d6d8fd112fc89636616bfd744e7f1a 100644
--- a/src/main/java/net/minecraft/world/level/border/WorldBorder.java
+++ b/src/main/java/net/minecraft/world/level/border/WorldBorder.java
@@ -14,6 +14,9 @@ import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.shapes.OperatorBoolean;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.VoxelShapes;
+import io.papermc.paper.event.world.border.WorldBorderBoundsChangeFinishEvent; // Paper
+import io.papermc.paper.event.world.border.WorldBorderCenterChangeEvent; // Paper
+import io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent; // Paper
public class WorldBorder {
@@ -102,15 +105,19 @@ public class WorldBorder {
}
public void setCenter(double d0, double d1) {
- this.g = d0;
- this.h = d1;
+ // Paper start
+ WorldBorderCenterChangeEvent event = new WorldBorderCenterChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), new org.bukkit.Location(world.getWorld(), this.getCenterX(), 0, this.getCenterZ()), new org.bukkit.Location(world.getWorld(), d0, 0, d1));
+ if (!event.callEvent()) return;
+ this.g = event.getNewCenter().getX();
+ this.h = event.getNewCenter().getZ();
+ // Paper end
this.j.k();
Iterator iterator = this.l().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
- iworldborderlistener.a(this, d0, d1);
+ iworldborderlistener.a(this, event.getNewCenter().getX(), event.getNewCenter().getZ()); // Paper
}
}
@@ -128,25 +135,43 @@ public class WorldBorder {
}
public void setSize(double d0) {
- this.j = new WorldBorder.d(d0);
+ // Paper start
+ WorldBorderBoundsChangeEvent event = new WorldBorderBoundsChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), WorldBorderBoundsChangeEvent.Type.INSTANT_MOVE, getSize(), d0, 0);
+ if (!event.callEvent()) return;
+ if (event.getType() == WorldBorderBoundsChangeEvent.Type.STARTED_MOVE && event.getDuration() > 0) { // If changed to a timed transition
+ transitionSizeBetween(event.getOldSize(), event.getNewSize(), event.getDuration());
+ return;
+ }
+ this.j = new WorldBorder.d(event.getNewSize());
+ // Paper end
Iterator iterator = this.l().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
- iworldborderlistener.a(this, d0);
+ iworldborderlistener.a(this, event.getNewSize()); // Paper
}
}
public void transitionSizeBetween(double d0, double d1, long i) {
- this.j = (WorldBorder.a) (d0 == d1 ? new WorldBorder.d(d1) : new WorldBorder.b(d0, d1, i));
+ // Paper start
+ WorldBorderBoundsChangeEvent.Type type;
+ if (d0 == d1) { // new size = old size
+ type = WorldBorderBoundsChangeEvent.Type.INSTANT_MOVE; // Use INSTANT_MOVE because below it creates a Static border if they are equal.
+ } else {
+ type = WorldBorderBoundsChangeEvent.Type.STARTED_MOVE;
+ }
+ WorldBorderBoundsChangeEvent event = new WorldBorderBoundsChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), type, d0, d1, i);
+ if (!event.callEvent()) return;
+ this.j = (WorldBorder.a) (d0 == event.getNewSize() ? new WorldBorder.d(event.getNewSize()) : new WorldBorder.b(d0, event.getNewSize(), event.getDuration()));
+ // Paper end
Iterator iterator = this.l().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
- iworldborderlistener.a(this, d0, d1, i);
+ iworldborderlistener.a(this, d0, event.getNewSize(), event.getDuration()); // Paper
}
}
@@ -434,11 +459,11 @@ public class WorldBorder {
class b implements WorldBorder.a {
- private final double b;
- private final double c;
+ private final double b; public final double getOldSize() { return this.b; } // Paper - OBFHELPER
+ private final double c; public final double getNewSize() { return this.c; } // Paper - OBFHELPER
private final long d;
private final long e;
- private final double f;
+ private final double f; public final double getDuration() { return this.f; } // Paper - OBFHELPER
private b(double d0, double d1, long i) {
this.b = d0;
@@ -493,6 +518,7 @@ public class WorldBorder {
@Override
public WorldBorder.a l() {
+ if (this.getLerpTimeRemaining() <= 0L) new WorldBorderBoundsChangeFinishEvent(world.getWorld(), world.getWorld().getWorldBorder(), getOldSize(), getNewSize(), getDuration()).callEvent(); // Paper
return (WorldBorder.a) (this.g() <= 0L ? WorldBorder.this.new d(this.c) : this);
}
@@ -514,6 +540,7 @@ public class WorldBorder {
double e();
+ default long getLerpTimeRemaining() { return g(); } // Paper - OBFHELPER
long g();
double h();