From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Mon, 4 Jan 2021 22:40:34 -0800 Subject: [PATCH] Add worldborder events diff --git a/src/main/java/net/minecraft/server/WorldBorder.java b/src/main/java/net/minecraft/server/WorldBorder.java index f011869880fedae4b69e505491e8bdbc5f51dfba..6e82c1d1b272a95144bfc78d34b630c24466fa3e 100644 --- a/src/main/java/net/minecraft/server/WorldBorder.java +++ b/src/main/java/net/minecraft/server/WorldBorder.java @@ -4,6 +4,9 @@ import com.google.common.collect.Lists; import com.mojang.serialization.DynamicLike; import java.util.Iterator; import java.util.List; +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 { @@ -92,15 +95,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 } } @@ -118,25 +125,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 } } @@ -424,11 +449,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; @@ -483,6 +508,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); } @@ -504,6 +530,7 @@ public class WorldBorder { double e(); + default long getLerpTimeRemaining() { return g(); } // Paper - OBFHELPER long g(); double h();