From 9b962c8ff067e0bd4a3adfc506c796bf7c4026a4 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Tue, 28 Jun 2022 05:09:23 +0100 Subject: [PATCH] Fire ChunkWatchEvents after sending packets (#8747) --- .../server/level/ChunkMap.java.patch | 22 ++++-- .../event/ForgeEventFactory.java | 13 ++-- .../event/world/ChunkWatchEvent.java | 67 +++++++++++-------- 3 files changed, 60 insertions(+), 42 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch b/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch index 57f031ac91..fc1b97d52c 100644 --- a/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ChunkMap.java.patch @@ -31,14 +31,14 @@ this.m_63502_(chunkpos, compoundtag); this.m_140229_(chunkpos, chunkstatus.m_62494_()); return true; -@@ -848,6 +_,7 @@ +@@ -862,6 +_,7 @@ - protected void m_183754_(ServerPlayer p_183755_, ChunkPos p_183756_, MutableObject p_183757_, boolean p_183758_, boolean p_183759_) { - if (p_183755_.f_19853_ == this.f_140133_) { -+ net.minecraftforge.event.ForgeEventFactory.fireChunkWatch(p_183758_, p_183759_, p_183755_, p_183756_, this.f_140133_); - if (p_183759_ && !p_183758_) { - ChunkHolder chunkholder = this.m_140327_(p_183756_.m_45588_()); - if (chunkholder != null) { + if (!p_183759_ && p_183758_) { + p_183755_.m_9088_(p_183756_); ++ net.minecraftforge.event.ForgeEventFactory.fireChunkUnWatch(p_183755_, p_183756_, this.f_140133_); + } + + } @@ -1104,7 +_,7 @@ } @@ -48,3 +48,11 @@ EntityType entitytype = p_140200_.m_6095_(); int i = entitytype.m_20681_() * 16; if (i != 0) { +@@ -1230,6 +_,7 @@ + } + } + ++ net.minecraftforge.event.ForgeEventFactory.fireChunkWatch(p_183761_, p_183763_, this.f_140133_); + } + + protected PoiManager m_140424_() { diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 74ee440895..5808abd62e 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -22,6 +22,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.Container; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownEnderpearl; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.portal.PortalShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.item.TooltipFlag; @@ -625,18 +626,14 @@ public class ForgeEventFactory return event.getResult() != Result.DENY; } - public static void fireChunkWatch(boolean watch, ServerPlayer entity, ChunkPos chunkpos, ServerLevel level) + public static void fireChunkWatch(ServerPlayer entity, LevelChunk chunk, ServerLevel level) { - if (watch) - MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.Watch(entity, chunkpos, level)); - else - MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.UnWatch(entity, chunkpos, level)); + MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.Watch(entity, chunk, level)); } - public static void fireChunkWatch(boolean wasLoaded, boolean load, ServerPlayer entity, ChunkPos chunkpos, ServerLevel level) + public static void fireChunkUnWatch(ServerPlayer entity, ChunkPos chunkpos, ServerLevel level) { - if (wasLoaded != load) - fireChunkWatch(load, entity, chunkpos, level); + MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.UnWatch(entity, chunkpos, level)); } public static boolean onPistonMovePre(Level level, BlockPos pos, Direction direction, boolean extending) diff --git a/src/main/java/net/minecraftforge/event/world/ChunkWatchEvent.java b/src/main/java/net/minecraftforge/event/world/ChunkWatchEvent.java index 050a4027cb..c9cf5c97c2 100644 --- a/src/main/java/net/minecraftforge/event/world/ChunkWatchEvent.java +++ b/src/main/java/net/minecraftforge/event/world/ChunkWatchEvent.java @@ -8,22 +8,25 @@ package net.minecraftforge.event.world; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.ChunkPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.Event; +import org.apache.commons.lang3.mutable.MutableObject; /** - * ChunkWatchEvent is fired when an event involving a chunk being watched occurs.
+ * ChunkWatchEvent is fired when an event involving a chunk being watched occurs. + *

* If a method utilizes this {@link Event} as its parameter, the method will - * receive every child event of this class.
- *
+ * receive every child event of this class. + *

* {@link #pos} contains the ChunkPos of the Chunk this event is affecting.
* {@link #world} contains the World of the Chunk this event is affecting.
- * {@link #player} contains the EntityPlayer that is involved with this chunk being watched.
- *
+ * {@link #player} contains the {@link ServerPlayer} that is involved with this chunk being watched. + *

* The {@link #player}'s world may not be the same as the world of the chunk - * when the player is teleporting to another dimension.
- *
- * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
+ * when the player is teleporting to another dimension. + *

+ * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. **/ public class ChunkWatchEvent extends Event { @@ -54,31 +57,41 @@ public class ChunkWatchEvent extends Event } /** - * ChunkWatchEvent.Watch is fired when an EntityPlayer begins watching a chunk.
- * This event is fired when a chunk is added to the watched chunks of an EntityPlayer in - * {@code net.minecraft.server.level.ChunkMap#updateChunkTracking(ServerPlayer, ChunkPos, Packet[], boolean, boolean)}.
- *
- * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}.
- *
- * This event does not have a result. {@link HasResult}
- *
- * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
+ * ChunkWatchEvent.Watch is fired when a {@link ServerPlayer} begins watching a chunk. + *

+ * This event is fired when a chunk is added to the watched chunks of a {@link ServerPlayer} + * and the chunk's data is sent to the client (see + * {@code net.minecraft.server.level.ChunkMap#playerLoadedChunk(ServerPlayer, MutableObject, LevelChunk)}). + *

+ * This event may be used to send additional chunk-related data to the client. + *

+ * This event is not {@link net.minecraftforge.eventbus.api.Cancelable} and + * {@link HasResult does not have a result}. **/ public static class Watch extends ChunkWatchEvent { - public Watch(ServerPlayer player, ChunkPos pos, ServerLevel world) {super(player, pos, world);} + private final LevelChunk chunk; + + public Watch(ServerPlayer player, LevelChunk chunk, ServerLevel world) + { + super(player, chunk.getPos(), world); + this.chunk = chunk; + } + + public LevelChunk getChunk() + { + return this.chunk; + } } /** - * ChunkWatchEvent.UnWatch is fired when an EntityPlayer stops watching a chunk.
- * This event is fired when a chunk is removed from the watched chunks of an EntityPlayer in - * {@code net.minecraft.server.level.ChunkMap#updateChunkTracking(ServerPlayer, ChunkPos, Packet[], boolean, boolean)}.
- *
- * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}.
- *
- * This event does not have a result. {@link HasResult}
- *
- * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
+ * ChunkWatchEvent.UnWatch is fired when a {@link ServerPlayer} stops watching a chunk. + *

+ * This event is fired when a chunk is removed from the watched chunks of an {@link ServerPlayer} + * in {@code net.minecraft.server.level.ChunkMap#updateChunkTracking(ServerPlayer, ChunkPos, Packet[], boolean, boolean)}. + *

+ * This event is not {@link net.minecraftforge.eventbus.api.Cancelable} and + * {@link HasResult does not have a result}. **/ public static class UnWatch extends ChunkWatchEvent {