aa52bf9e33
Mojang made some changes to priorities in 1.17 and it seems that these changes conflict with the changes made in this patch, which in some cases appears to cause excessive rescheduling of tasks. This, however, is not confirmed as such but seems to be the behavior that we're seeing to cause this issue, if mojang has adopted the changes we suggested, then a good chunk of this patch may be unneeded, but, this needs a much better look than I'm currently able to do
90 Zeilen
5.1 KiB
Diff
90 Zeilen
5.1 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 c2c54dc4bbfe469f2b8c751012b93d5e728936d6..1e1a9102e067762c9d1bd091388f108ef8170989 100644
|
|
--- a/src/main/java/net/minecraft/world/level/border/WorldBorder.java
|
|
+++ b/src/main/java/net/minecraft/world/level/border/WorldBorder.java
|
|
@@ -108,15 +108,19 @@ public class WorldBorder {
|
|
}
|
|
|
|
public void setCenter(double x, double z) {
|
|
- this.centerX = x;
|
|
- this.centerZ = z;
|
|
+ // Paper start
|
|
+ io.papermc.paper.event.world.border.WorldBorderCenterChangeEvent event = new io.papermc.paper.event.world.border.WorldBorderCenterChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), new org.bukkit.Location(world.getWorld(), this.getCenterX(), 0, this.getCenterZ()), new org.bukkit.Location(world.getWorld(), x, 0, z));
|
|
+ if (!event.callEvent()) return;
|
|
+ this.centerX = event.getNewCenter().getX();
|
|
+ this.centerZ = event.getNewCenter().getZ();
|
|
+ // Paper end
|
|
this.extent.onCenterChange();
|
|
Iterator iterator = this.getListeners().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
BorderChangeListener iworldborderlistener = (BorderChangeListener) iterator.next();
|
|
|
|
- iworldborderlistener.onBorderCenterSet(this, x, z);
|
|
+ iworldborderlistener.onBorderCenterSet(this, event.getNewCenter().getX(), event.getNewCenter().getZ()); // Paper
|
|
}
|
|
|
|
}
|
|
@@ -134,25 +138,43 @@ public class WorldBorder {
|
|
}
|
|
|
|
public void setSize(double size) {
|
|
- this.extent = new WorldBorder.StaticBorderExtent(size);
|
|
+ // Paper start
|
|
+ io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent event = new io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent.Type.INSTANT_MOVE, getSize(), size, 0);
|
|
+ if (!event.callEvent()) return;
|
|
+ if (event.getType() == io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent.Type.STARTED_MOVE && event.getDuration() > 0) { // If changed to a timed transition
|
|
+ lerpSizeBetween(event.getOldSize(), event.getNewSize(), event.getDuration());
|
|
+ return;
|
|
+ }
|
|
+ this.extent = new WorldBorder.StaticBorderExtent(event.getNewSize());
|
|
+ // Paper end
|
|
Iterator iterator = this.getListeners().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
BorderChangeListener iworldborderlistener = (BorderChangeListener) iterator.next();
|
|
|
|
- iworldborderlistener.onBorderSizeSet(this, size);
|
|
+ iworldborderlistener.onBorderSizeSet(this, event.getNewSize()); // Paper
|
|
}
|
|
|
|
}
|
|
|
|
public void lerpSizeBetween(double fromSize, double toSize, long time) {
|
|
- this.extent = (WorldBorder.BorderExtent) (fromSize == toSize ? new WorldBorder.StaticBorderExtent(toSize) : new WorldBorder.MovingBorderExtent(fromSize, toSize, time));
|
|
+ // Paper start
|
|
+ io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent.Type type;
|
|
+ if (fromSize == toSize) { // new size = old size
|
|
+ type = io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent.Type.INSTANT_MOVE; // Use INSTANT_MOVE because below it creates a Static border if they are equal.
|
|
+ } else {
|
|
+ type = io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent.Type.STARTED_MOVE;
|
|
+ }
|
|
+ io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent event = new io.papermc.paper.event.world.border.WorldBorderBoundsChangeEvent(world.getWorld(), world.getWorld().getWorldBorder(), type, fromSize, toSize, time);
|
|
+ if (!event.callEvent()) return;
|
|
+ this.extent = (WorldBorder.BorderExtent) (fromSize == event.getNewSize() ? new WorldBorder.StaticBorderExtent(event.getNewSize()) : new WorldBorder.MovingBorderExtent(fromSize, event.getNewSize(), event.getDuration()));
|
|
+ // Paper end
|
|
Iterator iterator = this.getListeners().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
BorderChangeListener iworldborderlistener = (BorderChangeListener) iterator.next();
|
|
|
|
- iworldborderlistener.onBorderSizeLerping(this, fromSize, toSize, time);
|
|
+ iworldborderlistener.onBorderSizeLerping(this, fromSize, event.getNewSize(), event.getDuration()); // Paper
|
|
}
|
|
|
|
}
|
|
@@ -457,6 +479,7 @@ public class WorldBorder {
|
|
|
|
@Override
|
|
public WorldBorder.BorderExtent update() {
|
|
+ if (this.getLerpRemainingTime() <= 0L) new io.papermc.paper.event.world.border.WorldBorderBoundsChangeFinishEvent(world.getWorld(), world.getWorld().getWorldBorder(), this.from, this.to, this.lerpDuration).callEvent(); // Paper
|
|
return (WorldBorder.BorderExtent) (this.getLerpRemainingTime() <= 0L ? WorldBorder.this.new StaticBorderExtent(this.to) : this);
|
|
}
|
|
|