Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
18caec8
Create FastNetworkManager.java
kalibrieren Aug 26, 2026
e8aeec2
Update AsyncEntityTracker.java
kalibrieren Aug 26, 2026
f1ccf97
Update EntityPlayer.java
kalibrieren Aug 26, 2026
59d716e
Update EntityTrackerEntry.java
kalibrieren Aug 26, 2026
a847144
Update NetworkManager.java
kalibrieren Aug 26, 2026
35b815a
Update NetworkManager.java
kalibrieren Aug 26, 2026
ae169a7
Update PlayerConnection.java
kalibrieren Aug 26, 2026
b20da40
Update PlayerInteractManager.java
kalibrieren Aug 26, 2026
fbdf4ae
Update PlayerList.java
kalibrieren Aug 26, 2026
6bed73c
Update CraftPlayer.java
kalibrieren Aug 26, 2026
6c56d71
Update README.md
kalibrieren Aug 26, 2026
2c91377
Update WindSpigotConfig.java
kalibrieren Aug 26, 2026
b48e82f
Update FastNetworkManager.java
kalibrieren Aug 26, 2026
0892587
Update NetworkManager.java
kalibrieren Aug 26, 2026
26c55b2
Update PlayerConnection.java
kalibrieren Aug 26, 2026
66845f0
Update WindSpigotConfig.java
kalibrieren Aug 26, 2026
0f3fe98
Update CannonTrackerEntry.java
kalibrieren Aug 26, 2026
f33e9c9
Update EntityPlayer.java
kalibrieren Aug 26, 2026
79bf2b5
Update EntityTrackerEntry.java
kalibrieren Aug 26, 2026
7734d3e
Merge branch 'master' into add-fastnetworkmanager
kalibrieren Aug 27, 2026
dac73a4
cleanup
kalibrieren Aug 28, 2026
4433b3d
cleanup
kalibrieren Aug 28, 2026
728d136
Update README.md
kalibrieren Aug 28, 2026
9d371b4
Update NetworkManager.java
kalibrieren Aug 28, 2026
117b0bc
Update WorldTicker.java
kalibrieren Aug 28, 2026
a96120a
Update NetworkManager.java
kalibrieren Aug 28, 2026
8e370e2
Delete WindSpigot-Server/src/main/java/com/windpvp/windspigot/async/t…
kalibrieren Aug 28, 2026
211e375
Delete WindSpigot-Server/src/main/java/com/windpvp/windspigot/async/t…
kalibrieren Aug 28, 2026
bf55bff
Update WindSpigot.java
kalibrieren Aug 28, 2026
f35ab1b
Update NetworkManager.java
kalibrieren Aug 28, 2026
e73d659
Update README.md
kalibrieren Aug 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ See the patches list below.
[Nacho-0049] Option to disable Enchantment table ticking

<--> by Rastrian
[Nacho-????] Async knockback and hit detection packets
[Nacho-????] Multithreaded entity tracking
[Nacho-????] Ticking fixes, tile optimization, and optional fast math
[Nacho-????] Many more config options
Expand Down Expand Up @@ -172,15 +171,11 @@ See the patches list below.
[IonSpigot-0037] Fast Cannon Entity Tracker

[InsanePaper-269] Cache Chunk Coordinations
[InsanePaper-390] Heavily optimize Tuinity controlled flush patch

[Akarin-0001] Avoid double I/O operation on load player file by tsao chi
[Akarin-0010] Save Json list asynchronously

[Tuinity-????] Skip updating entity tracker without players
[Tuinity-0017] Allow controlled flushing for network manager by Spottedleaf
[Tuinity-0018] Consolidate flush calls for entity tracker packets
[Tuinity-0052] Optimise non-flush packet sending

[SportPaper-0027] Fix head rotation packet spam
[SportPaper-0043] Get blocks in Chunk API
Expand Down Expand Up @@ -231,6 +226,8 @@ See the patches list below.
[FalchusSpigot-????] Fix view distance lookup
[FalchusSpigot-????] Only send Dragon/Wither Death sounds to same world
[FalchusSpigot-????] Improve NetworkManager
[FalchusSpigot-????] Add FastNetworkManager
[FalchusSpigot-????] Async knockback

[DashSpigot-0033] Fix SPIGOT-1746: Tile entities may not always tick
[DashSpigot-0011] Fix MC-94186: Dragon egg falling in lazy chunks
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.falchus.spigot.optimizations;

import com.windpvp.windspigot.config.WindSpigotConfig;
import com.google.common.collect.Queues;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import net.minecraft.server.NetworkManager;
import net.minecraft.server.Packet;

import java.util.ArrayList;
import java.util.Queue;

public class FastNetworkManager {

private final NetworkManager networkManager;
private final Queue<Packet<?>>[] queues = new Queue[WindSpigotConfig.threadSize];

public FastNetworkManager(NetworkManager networkManager) {
this.networkManager = networkManager;
for (int i = 0; i < queues.length; i++) {
queues[i] = Queues.newConcurrentLinkedQueue();
}
}

public void writePacketLazily(Packet<?> packet, boolean flush) {
Channel channel = networkManager.channel;
if (channel == null || !channel.isActive()) return;

channel.eventLoop().execute(() -> {
ChannelFuture future = channel.write(packet);
future.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
if (flush) {
channel.flush();
}
});
}

public void writePacketLazily(Packet<?> packet) {
writePacketLazily(packet, false);
}

public void queuePacket(Packet<?> packet, int trackerThread) {
if (packet != null) {
queues[trackerThread].add(packet);
}
}

public void flushQueuedPackets() {
Channel channel = networkManager.channel;
if (channel == null || !channel.isActive()) return;

ArrayList<Packet<?>> writing = new ArrayList<>();
Packet<?> packet;
for (int i = 0; i < queues.length; i++) {
Queue<Packet<?>> current = queues[i];
queues[i] = Queues.newConcurrentLinkedQueue();
while ((packet = current.poll()) != null) {
writing.add(packet);
}
}
if (writing.isEmpty()) return;

channel.eventLoop().execute(() -> {
for (Packet<?> p : writing) {
ChannelFuture future = channel.write(p);
future.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
}
channel.flush();
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.windpvp.windspigot.async.AsyncUtil;
import com.windpvp.windspigot.async.pathsearch.SearchHandler;
import com.windpvp.windspigot.async.thread.CombatThread;
import com.windpvp.windspigot.commands.KnockbackCommand;
import com.windpvp.windspigot.commands.MobAICommand;
import com.windpvp.windspigot.commands.PingCommand;
Expand All @@ -37,8 +36,6 @@ public class WindSpigot {
private static final Logger DEBUG_LOGGER = LogManager.getLogger();
private static WindSpigot INSTANCE;

private CombatThread knockbackThread;

private final Executor statisticsExecutor = Executors
.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("WindSpigot Statistics Thread")
.build());
Expand All @@ -57,9 +54,6 @@ private WindSpigot() {
new SearchHandler();
}

if (WindSpigotConfig.asyncKnockback) {
knockbackThread = new CombatThread("Knockback Thread");
}
if (WindSpigotConfig.asyncTnt) {
AsyncExplosions.initExecutor(WindSpigotConfig.fixedPoolSize);
}
Expand Down Expand Up @@ -141,10 +135,6 @@ public static void init() {
public StatisticsClient getClient() {
return this.client;
}

public CombatThread getKnockbackThread() {
return knockbackThread;
}

public static void debug(String msg) {
if (WindSpigotConfig.debugMode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void updatePlayers() {

AsyncUtil.run(() -> {
for (int index = finalOffset; index < c.size(); index += WindSpigotConfig.trackingThreads) {
((IndexedLinkedHashSet<EntityTrackerEntry>) c).get(index).update();
((IndexedLinkedHashSet<EntityTrackerEntry>) c).get(index).update(finalOffset);
}
worldServer.ticker.getLatch().decrement();

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -590,5 +590,16 @@ private static void tabSpam() {
tabSpamIncrement = getInt("settings.disconnect-spam.increment", 5);
tabSpamLimit = getInt("settings.disconnect-spam.limit", 750);
}


// FalchusSpigot start
public static int threadSize;
private static void threadSize() {
threadSize = getInt("thread-size", 3);
if (threadSize == -1) {
threadSize = Math.max(1, Runtime.getRuntime().availableProcessors() - 1);
} else {
threadSize = Math.max(1, threadSize);
}
}
// FalchusSpigot end
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.windpvp.windspigot.world;

import java.util.List;

import com.windpvp.windspigot.async.ResettableLatch;
import com.windpvp.windspigot.async.entitytracker.AsyncEntityTracker;
import com.windpvp.windspigot.config.WindSpigotConfig;
Expand Down Expand Up @@ -73,24 +71,7 @@ public void run() {
// this.methodProfiler.a("tracker");
if (MinecraftServer.getServer().getPlayerList().getPlayerCount() != 0) // Tuinity
{
// Tuinity start - controlled flush for entity tracker packets
List<NetworkManager> disabledFlushes = new java.util.ArrayList<>(
MinecraftServer.getServer().getPlayerList().getPlayerCount());
for (EntityPlayer player : MinecraftServer.getServer().getPlayerList().players) {
PlayerConnection connection = player.playerConnection;
if (connection != null) {
connection.networkManager.disableAutomaticFlush();
disabledFlushes.add(connection.networkManager);
}
}
try {
worldserver.getTracker().updatePlayers();
} finally {
for (NetworkManager networkManager : disabledFlushes) {
networkManager.enableAutomaticFlush();
}
}
// Tuinity end - controlled flush for entity tracker packets
worldserver.getTracker().updatePlayers();
}

worldserver.timings.tracker.stopTiming(); // Spigot
Expand All @@ -103,4 +84,4 @@ public ResettableLatch getLatch() {
return latch;
}

}
}
Loading
Loading