mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-30 04:19:13 +00:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@1fcc4162 Implement FeatureHooks#isChunkSent for Moonrise chunk system PaperMC/Paper@e4d7178a Implement WaypointTransmitter#isChunkVisible PaperMC/Paper@8980ead7 Directly walk text component after converting from JSON PaperMC/Paper@5613ed6d Provide env environment variable and copy spigots sys prop for overriding default repository PaperMC/Paper@62b7f86d Avoid and discourage use of Maven Central as a CDN (#12689) PaperMC/Paper@f5534cb7 [ci/skip] Run generators (#12691) PaperMC/Paper@4781d28b Re-add Log4j Javadocs (#12693) PaperMC/Paper@74fbcce5 Check type of Material in get/set stats (#12607) PaperMC/Paper@4b3f967e Improve Fix MC-44654 (#12703) PaperMC/Paper@a7dd2635 Enable spigot obfuscation support (#12695) PaperMC/Paper@6a51c44e Cleanup Primed TNT Fix (#12704) PaperMC/Paper@839c6a18 Fix #11169 (#12706) PaperMC/Paper@c77d5f99 Fix MC-297591 PaperMC/Paper@219f86ee Implement chunk unload delay config option PaperMC/Paper@e4eb69b8 Do not allow ticket level decreases to be processed asynchronously PaperMC/Paper@71b0c768 Adds support for vanilla negative explosions (#12705) PaperMC/Paper@3750927a [ci/skip] Fix PermissionManager#clearPermissions() docs bad wording (#12657) PaperMC/Paper@d61a51e8 Add ItemType#getBurnDuration() (#12604) PaperMC/Paper@29fc8532 Allow empty paths in namespaced keys (#12687) PaperMC/Paper@4419afb9 fix: Safely handle nanosecond overflow in ClickCallback (#12686) PaperMC/Paper@56528821 Add `isProxyEnabled` method to ServerConfiguration (#12664) PaperMC/Paper@c0dda0ea Add `isForceDefaultGameMode` method (#12673) PaperMC/Paper@e714de63 Fix excess slot updates PaperMC/Paper@6d0821d2 [ci/skip] Fix docs for Spawner class and cleanup (#12710) PaperMC/Paper@cceffe3d Release ItemType and BlockType (#12708) PaperMC/Paper@186e9e33 Relocate CommandMap#registerServerAliases() call to after lifecycle events have been run (#12601) PaperMC/Paper@5edcf6dd Cleanup/command dispatching (#12713) Purpur Changes: PurpurMC/Purpur@baa196f5 Updated Upstream (Paper) PurpurMC/Purpur@fdd1e980 Updated Upstream (Paper) PurpurMC/Purpur@439f15db Updated Upstream (Paper) PurpurMC/Purpur@46a28b93 [ci/skip] update version in README PurpurMC/Purpur@162bd288 Updated Upstream (Paper) PurpurMC/Purpur@afcdf9bb Updated Upstream (Paper)
118 lines
6.8 KiB
Diff
118 lines
6.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: peaches94 <peachescu94@gmail.com>
|
|
Date: Sat, 2 Jul 2022 00:35:56 -0500
|
|
Subject: [PATCH] Multithreaded Tracker
|
|
|
|
Original license: GPL v3
|
|
Original project: https://github.com/Bloom-host/Petal
|
|
|
|
Original license: GPL v3
|
|
Original project: https://github.com/TECHNOVE/Airplane-Experimental
|
|
|
|
Co-authored-by: Paul Sauve <paul@technove.co>
|
|
Co-authored-by: Kevin Raneri <kevin.raneri@gmail.com>
|
|
Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
|
|
|
|
This patch refactored from original multithreaded tracker (Petal version),
|
|
and is derived from the Airplane fork by Paul Sauve, the tree is like:
|
|
Airplane -> Pufferfish? -> Petal -> Leaf
|
|
|
|
We made much of tracking logic asynchronously, and fixed visible issue
|
|
for the case of some NPC plugins which using real entity type, e.g. Citizens.
|
|
|
|
But it is still recommending to use those packet based, virtual entity
|
|
based NPC plugins, e.g. ZNPC Plus, Adyeshach, Fancy NPC, etc.
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
index 379c2dc1853e45a96dda9b13bf28b7e08f65658a..361f4de9cdf0f7505628a2fed2a3f5366031e04b 100644
|
|
--- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
+++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
@@ -42,6 +42,12 @@ class PaperEventManager {
|
|
if (event.isAsynchronous() && this.server.isPrimaryThread()) {
|
|
throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously.");
|
|
} else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) {
|
|
+ // Leaf start - Multithreaded tracker
|
|
+ if (org.dreeam.leaf.config.modules.async.MultithreadedTracker.enabled) {
|
|
+ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(event::callEvent);
|
|
+ return;
|
|
+ }
|
|
+ // Leaf end - Multithreaded tracker
|
|
throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously.");
|
|
}
|
|
// Leaves start - skip photographer
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
index e60440562720c61f4a5e9abb771420eed3df852b..74722575f8d835dc1571972de37d0a4bd50d52e2 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
@@ -768,7 +768,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId());
|
|
|
|
if (entityTracker != null) {
|
|
- for (ServerPlayerConnection connection : entityTracker.seenBy) {
|
|
+ for (ServerPlayerConnection connection : entityTracker.seenBy()) { // Leaf - Multithreaded tracker
|
|
players.add(connection.getPlayer().getBukkitEntity());
|
|
}
|
|
}
|
|
@@ -1099,7 +1099,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
return;
|
|
}
|
|
|
|
- for (final ServerPlayerConnection connection : entityTracker.seenBy) {
|
|
+ for (final ServerPlayerConnection connection : entityTracker.seenBy()) { // Leaf - Multithreaded tracker
|
|
this.getHandle().resendPossiblyDesyncedEntityData(connection.getPlayer());
|
|
}
|
|
}
|
|
@@ -1246,7 +1246,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
}
|
|
|
|
Set<org.bukkit.entity.Player> set = new java.util.HashSet<>(tracker.seenBy.size());
|
|
- for (net.minecraft.server.network.ServerPlayerConnection connection : tracker.seenBy) {
|
|
+ for (net.minecraft.server.network.ServerPlayerConnection connection : tracker.seenBy()) { // Leaf - Multithreaded tracker
|
|
set.add(connection.getPlayer().getBukkitEntity().getPlayer());
|
|
}
|
|
return set;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index 5186672c20ec1b0e66d1e639f02a15a08ed4a9c4..a983f7e07377c69dfac286085b71a8a2e2f15dbf 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -2887,7 +2887,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
Iterator<AttributeInstance> iterator = collection.iterator();
|
|
while (iterator.hasNext()) {
|
|
AttributeInstance genericInstance = iterator.next();
|
|
- if (genericInstance.getAttribute() == Attributes.MAX_HEALTH) {
|
|
+ if (genericInstance != null && genericInstance.getAttribute() == Attributes.MAX_HEALTH) { // Leaf - Multithreaded tracker
|
|
iterator.remove();
|
|
break;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 98b766d115856dbf3ea11a983c1304591032f1b0..62cefed7674a6938698a57f5f89750d120461e9c 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -1798,6 +1798,26 @@ public class CraftEventFactory {
|
|
}
|
|
|
|
public static boolean handleBlockFormEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState state, int flags, @Nullable Entity entity, boolean checkSetResult) {
|
|
+ // Leaf start - Multithreaded tracker
|
|
+ if (org.dreeam.leaf.config.modules.async.MultithreadedTracker.enabled && Thread.currentThread() instanceof org.dreeam.leaf.async.tracker.MultithreadedTracker.MultithreadedTrackerThread) {
|
|
+ java.util.concurrent.CompletableFuture<Boolean> future = new java.util.concurrent.CompletableFuture<>();
|
|
+ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> {
|
|
+ boolean resultFlag = false;
|
|
+ CraftBlockState snapshot = CraftBlockStates.getBlockState(world, pos);
|
|
+ snapshot.setData(state);
|
|
+
|
|
+ BlockFormEvent event = (entity == null) ? new BlockFormEvent(snapshot.getBlock(), snapshot) : new EntityBlockFormEvent(entity.getBukkitEntity(), snapshot.getBlock(), snapshot);
|
|
+ if (event.callEvent()) {
|
|
+ boolean result = snapshot.place(flags);
|
|
+ resultFlag = !checkSetResult || result;
|
|
+ }
|
|
+
|
|
+ future.complete(resultFlag);
|
|
+ });
|
|
+
|
|
+ return future.join();
|
|
+ }
|
|
+ // Leaf end - Multithreaded tracker
|
|
CraftBlockState snapshot = CraftBlockStates.getBlockState(world, pos);
|
|
snapshot.setData(state);
|
|
|