--- a/net/minecraft/world/level/gameevent/GameEventDispatcher.java
+++ b/net/minecraft/world/level/gameevent/GameEventDispatcher.java
@@ -22,6 +_,15 @@
     public void post(Holder<GameEvent> gameEvent, Vec3 pos, GameEvent.Context context) {
         int notificationRadius = gameEvent.value().notificationRadius();
         BlockPos blockPos = BlockPos.containing(pos);
+        // CraftBukkit start
+        org.bukkit.event.world.GenericGameEvent apiEvent = new org.bukkit.event.world.GenericGameEvent(
+            org.bukkit.craftbukkit.CraftGameEvent.minecraftToBukkit(gameEvent.value()), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(blockPos, this.level),
+            (context.sourceEntity() == null) ? null : context.sourceEntity().getBukkitEntity(), notificationRadius, !org.bukkit.Bukkit.isPrimaryThread());
+        if (!apiEvent.callEvent()) {
+            return;
+        }
+        notificationRadius = apiEvent.getRadius();
+        // CraftBukkit end
         int sectionPosCoord = SectionPos.blockToSectionCoord(blockPos.getX() - notificationRadius);
         int sectionPosCoord1 = SectionPos.blockToSectionCoord(blockPos.getY() - notificationRadius);
         int sectionPosCoord2 = SectionPos.blockToSectionCoord(blockPos.getZ() - notificationRadius);
@@ -40,7 +_,7 @@
 
         for (int i = sectionPosCoord; i <= sectionPosCoord3; i++) {
             for (int i1 = sectionPosCoord2; i1 <= sectionPosCoord5; i1++) {
-                ChunkAccess chunkNow = this.level.getChunkSource().getChunkNow(i, i1);
+                ChunkAccess chunkNow = this.level.getChunkIfLoadedImmediately(i, i1); // Paper - Use getChunkIfLoadedImmediately
                 if (chunkNow != null) {
                     for (int i2 = sectionPosCoord1; i2 <= sectionPosCoord4; i2++) {
                         flag |= chunkNow.getListenerRegistry(i2).visitInRangeListeners(gameEvent, pos, context, listenerVisitor);
