3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-15 11:00:06 +01:00
Paper/Spigot-Server-Patches/0687-Add-worldborder-events.patch
2021-03-04 21:13:24 +01:00

123 Zeilen
5.5 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/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();