Skip to content

Commit 042312a

Browse files
committed
add rule: optimizePlayerConnect
1 parent 79fbc6f commit 042312a

File tree

6 files changed

+80
-3
lines changed

6 files changed

+80
-3
lines changed

src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,10 @@ public class OptCarpetSettings {
125125
category = {RuleCategory.FEATURE, RuleCategory.CLIENT}
126126
)
127127
public static boolean unescapeChatMessage = false;
128+
129+
@Rule(
130+
desc = "Handle player connect in a new thread to reduce the lag.",
131+
category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL}
132+
)
133+
public static boolean optimizePlayerConnect = false;
128134
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.github.optijava.opt_carpet_addition.mixins.async;
2+
3+
import io.github.optijava.opt_carpet_addition.utils.threading.Threading;
4+
import net.minecraft.server.MinecraftServer;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
9+
10+
@Mixin(MinecraftServer.class)
11+
public class MinecraftServer_Mixin {
12+
13+
@Inject(
14+
method = "shutdown()V",
15+
at = @At("HEAD")
16+
)
17+
public void injectShutdown(CallbackInfo ci) {
18+
Threading.THREAD_POOL.shutdown();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.github.optijava.opt_carpet_addition.mixins.async.optimizePlayerConnect;
2+
3+
import io.github.optijava.opt_carpet_addition.OptCarpetAddition;
4+
import io.github.optijava.opt_carpet_addition.OptCarpetSettings;
5+
import io.github.optijava.opt_carpet_addition.utils.threading.Threading;
6+
import net.minecraft.server.network.ServerLoginNetworkHandler;
7+
import net.minecraft.server.network.ServerPlayerEntity;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
@Mixin(ServerLoginNetworkHandler.class)
14+
public abstract class ServerLoginNetworkHandler_Mixin {
15+
16+
/**
17+
* 此优化灵感来源于模组 Very Many Player
18+
* <p>
19+
* Mixin ServerLoginNetworkHandler.addToServer(Lnet/minecraft/server/network/ServerPlayerEntity;)V
20+
*
21+
* @author OptiJava
22+
* @reason rule: optimizePlayerConnect
23+
*/
24+
@Inject(
25+
method = "addToServer(Lnet/minecraft/server/network/ServerPlayerEntity;)V",
26+
at = @At("HEAD"),
27+
cancellable = true
28+
)
29+
public void injectAddToServer(ServerPlayerEntity player, CallbackInfo ci) {
30+
if (OptCarpetSettings.optimizePlayerConnect) {
31+
Threading.THREAD_POOL.submit(() -> {
32+
OptCarpetAddition.LOGGER.info("PlayerConnectThread started.");
33+
((ServerLoginNetworkHandler) (Object) this).server.getPlayerManager().onPlayerConnect(((ServerLoginNetworkHandler) (Object) this).connection, player);
34+
});
35+
ci.cancel();
36+
}
37+
}
38+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.github.optijava.opt_carpet_addition.utils.threading;
2+
3+
import java.util.concurrent.ExecutorService;
4+
import java.util.concurrent.SynchronousQueue;
5+
import java.util.concurrent.ThreadPoolExecutor;
6+
import java.util.concurrent.TimeUnit;
7+
8+
public class Threading {
9+
public static final ExecutorService THREAD_POOL = new ThreadPoolExecutor(1, 3, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
10+
11+
}

src/main/resources/opt-carpet-addition.accesswidener

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ accessWidener v1 named
22
accessible class net/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal
33
accessible class net/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal
44
mutable field net/minecraft/network/packet/c2s/play/ChatMessageC2SPacket chatMessage Ljava/lang/String;
5-
accessible field net/minecraft/network/packet/c2s/play/ChatMessageC2SPacket chatMessage Ljava/lang/String;
5+
accessible field net/minecraft/network/packet/c2s/play/ChatMessageC2SPacket chatMessage Ljava/lang/String;
6+
accessible field net/minecraft/server/network/ServerLoginNetworkHandler server Lnet/minecraft/server/MinecraftServer;

src/main/resources/opt-carpet-addition.mixins.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
"package": "io.github.optijava.opt_carpet_addition.mixins",
55
"compatibilityLevel": "JAVA_16",
66
"mixins": [
7-
"disabledLayEggs.ChickenEntity_Mixin",
7+
"async.optimizePlayerConnect.ServerLoginNetworkHandler_Mixin",
88
"disabledEnderManPickupGoal.EnderManEntity_Mixin",
99
"disabledEnderManPlaceBlockGoal.EndermanEntity_Mixin",
10-
"disabledNetherPortalSpawn.NetherPortalBlock_Mixin",
1110
"disabledEntityTick.ServerWorld_Mixin",
11+
"disabledLayEggs.ChickenEntity_Mixin",
12+
"disabledNetherPortalSpawn.NetherPortalBlock_Mixin",
1213
"disabledUpdateSuppressionErrorStackTrace.ThreadExecutor_Mixin"
1314
],
1415
"client": [

0 commit comments

Comments
 (0)