diff --git a/patches/server/0028-Leaves-Server-Utils.patch b/patches/server/0028-Leaves-Server-Utils.patch index 78b0a389..e616490d 100644 --- a/patches/server/0028-Leaves-Server-Utils.patch +++ b/patches/server/0028-Leaves-Server-Utils.patch @@ -7,7 +7,7 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 679209274fbbf8e10498ecec852b0994af2a39e7..ffb47d13563f0ff1f557dfe2ed53be7f170f12fa 100644 +index 6b7025b4cacdc2b14662d09f8da78bce04392d17..1952c66202f51bdbca52fab03710ca0d76e0312d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -425,6 +425,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S @@ -49,219 +49,3 @@ index 679209274fbbf8e10498ecec852b0994af2a39e7..ffb47d13563f0ff1f557dfe2ed53be7f + } + // Leaves end - leaves ex data } -diff --git a/src/main/java/top/leavesmc/leaves/LeavesLogger.java b/src/main/java/top/leavesmc/leaves/LeavesLogger.java -new file mode 100644 -index 0000000000000000000000000000000000000000..890b91a95719f18a75bc2c2176ef5cb9f2bf4274 ---- /dev/null -+++ b/src/main/java/top/leavesmc/leaves/LeavesLogger.java -@@ -0,0 +1,16 @@ -+package top.leavesmc.leaves; -+ -+import org.bukkit.Bukkit; -+ -+import java.util.logging.Level; -+import java.util.logging.Logger; -+ -+public class LeavesLogger extends Logger { -+ public static final LeavesLogger LOGGER = new LeavesLogger(); -+ -+ private LeavesLogger() { -+ super("Leaves", null); -+ setParent(Bukkit.getLogger()); -+ setLevel(Level.ALL); -+ } -+} -diff --git a/src/main/java/top/leavesmc/leaves/util/AsyncExecutor.java b/src/main/java/top/leavesmc/leaves/util/AsyncExecutor.java -new file mode 100644 -index 0000000000000000000000000000000000000000..0c03f3f051eff7abaacfaa8adb992811f934b9c8 ---- /dev/null -+++ b/src/main/java/top/leavesmc/leaves/util/AsyncExecutor.java -@@ -0,0 +1,76 @@ -+package top.leavesmc.leaves.util; -+ -+import com.google.common.collect.Queues; -+import top.leavesmc.leaves.LeavesLogger; -+ -+import java.util.Queue; -+import java.util.concurrent.locks.Condition; -+import java.util.concurrent.locks.Lock; -+import java.util.concurrent.locks.ReentrantLock; -+import java.util.logging.Level; -+ -+// Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) -+public class AsyncExecutor implements Runnable { -+ -+ private final Queue jobs = Queues.newArrayDeque(); -+ private final Lock mutex = new ReentrantLock(); -+ private final Condition cond = mutex.newCondition(); -+ private final Thread thread; -+ private volatile boolean killswitch = false; -+ -+ public AsyncExecutor(String threadName) { -+ this.thread = new Thread(this, threadName); -+ } -+ -+ public void start() { -+ thread.start(); -+ } -+ -+ public void kill() { -+ killswitch = true; -+ cond.signalAll(); -+ } -+ -+ public void submit(Runnable runnable) { -+ mutex.lock(); -+ try { -+ jobs.offer(runnable); -+ cond.signalAll(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+ -+ @Override -+ public void run() { -+ while (!killswitch) { -+ try { -+ Runnable runnable = takeRunnable(); -+ if (runnable != null) { -+ runnable.run(); -+ } -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (Exception e) { -+ LeavesLogger.LOGGER.log(Level.SEVERE, e, () -> "Failed to execute async job for thread " + thread.getName()); -+ } -+ } -+ } -+ -+ private Runnable takeRunnable() throws InterruptedException { -+ mutex.lock(); -+ try { -+ while (jobs.isEmpty() && !killswitch) { -+ cond.await(); -+ } -+ -+ if (jobs.isEmpty()) { -+ return null; -+ } -+ -+ return jobs.remove(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+} -diff --git a/src/main/java/top/leavesmc/leaves/util/AsyncPlayerAreaMap.java b/src/main/java/top/leavesmc/leaves/util/AsyncPlayerAreaMap.java -new file mode 100644 -index 0000000000000000000000000000000000000000..4ccc1b3b29e9d62526b2d7c56ef06db77704bf80 ---- /dev/null -+++ b/src/main/java/top/leavesmc/leaves/util/AsyncPlayerAreaMap.java -@@ -0,0 +1,32 @@ -+package top.leavesmc.leaves.util; -+ -+import com.destroystokyo.paper.util.misc.PlayerAreaMap; -+import com.destroystokyo.paper.util.misc.PooledLinkedHashSets; -+import net.minecraft.server.level.ServerPlayer; -+ -+import java.util.concurrent.ConcurrentHashMap; -+ -+// Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) -+public class AsyncPlayerAreaMap extends PlayerAreaMap { -+ -+ public AsyncPlayerAreaMap() { -+ super(); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { -+ super(pooledHashSets); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback) { -+ this(pooledHashSets, addCallback, removeCallback, null); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback, final ChangeSourceCallback changeSourceCallback) { -+ super(pooledHashSets, addCallback, removeCallback, changeSourceCallback); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+} -diff --git a/src/main/java/top/leavesmc/leaves/util/IterableWrapper.java b/src/main/java/top/leavesmc/leaves/util/IterableWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..0dc58b78c84a825ec7025534cd0fc7be9c4610ad ---- /dev/null -+++ b/src/main/java/top/leavesmc/leaves/util/IterableWrapper.java -@@ -0,0 +1,21 @@ -+package top.leavesmc.leaves.util; -+ -+import org.jetbrains.annotations.NotNull; -+ -+import java.util.Iterator; -+ -+// Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) -+public class IterableWrapper implements Iterable { -+ -+ private final Iterator iterator; -+ -+ public IterableWrapper(Iterator iterator) { -+ this.iterator = iterator; -+ } -+ -+ @NotNull -+ @Override -+ public Iterator iterator() { -+ return iterator; -+ } -+} -diff --git a/src/main/java/top/leavesmc/leaves/util/Long2ObjectOpenHashMapWrapper.java b/src/main/java/top/leavesmc/leaves/util/Long2ObjectOpenHashMapWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..b684d8f576acbc5de8d06b0ff779c257198bc32d ---- /dev/null -+++ b/src/main/java/top/leavesmc/leaves/util/Long2ObjectOpenHashMapWrapper.java -@@ -0,0 +1,41 @@ -+package top.leavesmc.leaves.util; -+ -+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -+import org.jetbrains.annotations.Nullable; -+ -+import java.util.Map; -+ -+public class Long2ObjectOpenHashMapWrapper extends Long2ObjectOpenHashMap { -+ -+ private final Map backingMap; -+ -+ public Long2ObjectOpenHashMapWrapper(Map map) { -+ backingMap = map; -+ } -+ -+ @Override -+ public V put(Long key, V value) { -+ return backingMap.put(key, value); -+ } -+ -+ @Override -+ public V get(Object key) { -+ return backingMap.get(key); -+ } -+ -+ @Override -+ public V remove(Object key) { -+ return backingMap.remove(key); -+ } -+ -+ @Nullable -+ @Override -+ public V putIfAbsent(Long key, V value) { -+ return backingMap.putIfAbsent(key, value); -+ } -+ -+ @Override -+ public int size() { -+ return backingMap.size(); -+ } -+}