Skip to content

Commit f989fef

Browse files
committed
Lag generation.
1 parent 660071b commit f989fef

File tree

9 files changed

+142
-0
lines changed

9 files changed

+142
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package noobanidus.mods.laggenerator.common.mixins;
2+
3+
import net.minecraft.server.MinecraftServer;
4+
import net.minecraft.world.level.GameRules;
5+
import org.apache.commons.lang3.NotImplementedException;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.gen.Invoker;
8+
9+
import java.util.function.BiConsumer;
10+
11+
@Mixin(GameRules.IntegerValue.class)
12+
public interface AccessorMixinGameRules$IntegerValue {
13+
@Invoker("create")
14+
static GameRules.Type<GameRules.IntegerValue> LagGenerator$invokeCreate(
15+
int defaultValue, int min, int max, BiConsumer<MinecraftServer, GameRules.IntegerValue> changeListener
16+
) {
17+
throw new NotImplementedException();
18+
}
19+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package noobanidus.mods.laggenerator.common.mixins;
2+
3+
import net.minecraft.world.level.GameRules;
4+
import org.apache.commons.lang3.NotImplementedException;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.gen.Invoker;
7+
8+
@Mixin(GameRules.class)
9+
public interface AccessorMixinGameRules {
10+
@Invoker("register")
11+
static <T extends GameRules.Value<T>> GameRules.Key<T> LagGenerator$invokeRegister(String name, GameRules.Category category, GameRules.Type<T> p_type) {
12+
throw new NotImplementedException();
13+
}
14+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package noobanidus.mods.laggenerator.common.mixins;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import net.minecraft.util.profiling.ProfilerFiller;
6+
import net.minecraft.world.entity.Entity;
7+
import net.minecraft.world.level.Level;
8+
import noobanidus.mods.laggenerator.common.rules.LagGameRules;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
12+
@Mixin(Entity.class)
13+
public class MixinEntity {
14+
@WrapOperation(method="baseTick", at=@At(value="INVOKE", target="Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V"))
15+
private void LagGenerator$EntityTickLag(ProfilerFiller instance, String section, Operation<Void> original) {
16+
original.call(instance, section);
17+
Level level = ((Entity) (Object) this).level();
18+
if (level == null || level.isClientSide() || level.getServer() == null) {
19+
return;
20+
}
21+
int entityTickLag = LagGameRules.getValue(level.getServer(), LagGameRules.ENTITY_TICK_LAG);
22+
if (entityTickLag > 0) {
23+
try {
24+
Thread.sleep(entityTickLag);
25+
} catch (InterruptedException ignore) {
26+
}
27+
}
28+
}
29+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package noobanidus.mods.laggenerator.common.mixins;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import net.minecraft.server.MinecraftServer;
6+
import net.minecraft.server.ServerTickRateManager;
7+
import net.minecraft.util.profiling.ProfilerFiller;
8+
import noobanidus.mods.laggenerator.common.rules.LagGameRules;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
12+
@Mixin(MinecraftServer.class)
13+
public class MixinMinecraftServer {
14+
@WrapOperation(method = "tickServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/ServerTickRateManager;tick()V"))
15+
private void LagGenerator$PreServerTickLag(ServerTickRateManager instance, Operation<Void> original) {
16+
original.call(instance);
17+
int preTickLag = LagGameRules.getValue((MinecraftServer) (Object) this, LagGameRules.SERVER_PRE_TICK_LAG);
18+
if (preTickLag > 0) {
19+
try {
20+
Thread.sleep(preTickLag);
21+
} catch (InterruptedException ignore) {
22+
}
23+
}
24+
}
25+
26+
@WrapOperation(method = "tickServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;pop()V", ordinal = 1))
27+
private void LagGenerator$PostServerTickLag(ProfilerFiller instance, Operation<Void> original) {
28+
original.call(instance);
29+
int postTickLag = LagGameRules.getValue((MinecraftServer) (Object) this, LagGameRules.SERVER_POST_TICK_LAG);
30+
if (postTickLag > 0) {
31+
try {
32+
Thread.sleep(postTickLag);
33+
} catch (InterruptedException ignore) {
34+
}
35+
}
36+
}
37+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package noobanidus.mods.laggenerator.common.rules;
2+
3+
import net.minecraft.server.MinecraftServer;
4+
import net.minecraft.world.level.GameRules;
5+
import noobanidus.mods.laggenerator.common.mixins.AccessorMixinGameRules;
6+
import noobanidus.mods.laggenerator.common.mixins.AccessorMixinGameRules$IntegerValue;
7+
8+
public class LagGameRules {
9+
public static GameRules.Key<GameRules.IntegerValue> SERVER_PRE_TICK_LAG;
10+
public static GameRules.Key<GameRules.IntegerValue> SERVER_POST_TICK_LAG;
11+
public static GameRules.Key<GameRules.IntegerValue> ENTITY_TICK_LAG;
12+
13+
public static int getValue (MinecraftServer server, GameRules.Key<GameRules.IntegerValue> key) {
14+
return server.getGameRules().getRule(key).get();
15+
}
16+
17+
public static void init () {
18+
SERVER_PRE_TICK_LAG = AccessorMixinGameRules.LagGenerator$invokeRegister("lag_generator_serverPreTickLag", GameRules.Category.UPDATES, AccessorMixinGameRules$IntegerValue.LagGenerator$invokeCreate(80, 0, Integer.MAX_VALUE, (a, b) -> {}));
19+
SERVER_POST_TICK_LAG = AccessorMixinGameRules.LagGenerator$invokeRegister("lag_generator_serverPostTickLag", GameRules.Category.UPDATES, AccessorMixinGameRules$IntegerValue.LagGenerator$invokeCreate(80, 0, Integer.MAX_VALUE, (a, b) -> {}));
20+
ENTITY_TICK_LAG = AccessorMixinGameRules.LagGenerator$invokeRegister("lag_generator_entityTickLag", GameRules.Category.UPDATES, AccessorMixinGameRules$IntegerValue.LagGenerator$invokeCreate(80, 0, Integer.MAX_VALUE, (a, b) -> {}));
21+
}
22+
}

common/src/main/resources/laggenerator-common.mixins.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
"package": "noobanidus.mods.laggenerator.common.mixins",
44
"compatibilityLevel": "JAVA_17",
55
"mixins": [
6+
"AccessorMixinGameRules",
7+
"AccessorMixinGameRules$IntegerValue",
8+
"MixinEntity",
9+
"MixinMinecraftServer"
610
],
711
"client": [
812
],
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package noobanidus.mods.laggenerator.fabric;
22

33
import net.fabricmc.api.ModInitializer;
4+
import noobanidus.mods.laggenerator.common.rules.LagGameRules;
45

56
public class LagGenerator implements ModInitializer {
67
@Override
78
public void onInitialize() {
9+
LagGameRules.init();
810
}
911
}

neoforge/src/main/java/noobanidus/mods/laggenerator/neoforge/LagGenerator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.neoforged.bus.api.IEventBus;
44
import net.neoforged.fml.ModContainer;
55
import net.neoforged.fml.common.Mod;
6+
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
67

78
@Mod(value = "laggenerator")
89
public class LagGenerator {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package noobanidus.mods.laggenerator.neoforge.event;
2+
3+
import net.neoforged.bus.api.SubscribeEvent;
4+
import net.neoforged.fml.common.EventBusSubscriber;
5+
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
6+
import noobanidus.mods.laggenerator.common.rules.LagGameRules;
7+
8+
@EventBusSubscriber(modid = "laggenerator", bus= EventBusSubscriber.Bus.MOD)
9+
public class CommonSetup {
10+
@SubscribeEvent
11+
public static void onCommonSetup(FMLCommonSetupEvent event) {
12+
event.enqueueWork(LagGameRules::init);
13+
}
14+
}

0 commit comments

Comments
 (0)