Skip to content
This repository was archived by the owner on Jun 3, 2024. It is now read-only.

Commit f76e5db

Browse files
authored
Impl ServerTickEvent and RenderTickEvent (#158)
* Impl TickEvent.ServerTickEvent with FAPI Lifecycle Events V1 * Impl TickEvent.RenderTickEvent * Add ServerTick and RenderTick events to BasicEventHooks * Fix style * Shift hookRenderTickEnd to match Forge * Fix style after merge conflict resolution * Reduce ordinal on hookRenderTickEvent with slice
1 parent 5cb31ac commit f76e5db

File tree

5 files changed

+66
-6
lines changed

5 files changed

+66
-6
lines changed

patchwork-events-lifecycle/src/main/java/net/minecraftforge/event/TickEvent.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ public enum Phase {
4545
START, END;
4646
}
4747

48-
/* TODO public static class ServerTickEvent extends TickEvent {
48+
public static class ServerTickEvent extends TickEvent {
4949
public ServerTickEvent(Phase phase) {
5050
super(Type.SERVER, LogicalSide.SERVER, phase);
5151
}
52-
}*/
52+
}
5353

5454
public static class ClientTickEvent extends TickEvent {
5555
public ClientTickEvent(Phase phase) {
@@ -77,12 +77,12 @@ public PlayerTickEvent(Phase phase, PlayerEntity player) {
7777
}
7878
}
7979

80-
/* TODO public static class RenderTickEvent extends TickEvent {
80+
public static class RenderTickEvent extends TickEvent {
8181
public final float renderTickTime;
8282

8383
public RenderTickEvent(Phase phase, float renderTickTime) {
8484
super(Type.RENDER, LogicalSide.CLIENT, phase);
8585
this.renderTickTime = renderTickTime;
8686
}
87-
}*/
87+
}
8888
}

patchwork-events-lifecycle/src/main/java/net/patchworkmc/impl/event/lifecycle/LifecycleEvents.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import net.fabricmc.api.ModInitializer;
4343
import net.fabricmc.fabric.api.event.server.ServerStartCallback;
4444
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
45+
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
4546

4647
public class LifecycleEvents implements ModInitializer {
4748
private static Runnable loadCompleteCallback;
@@ -57,6 +58,15 @@ public static void fireClientTickEvent(TickEvent.Phase phase) {
5758
MinecraftForge.EVENT_BUS.post(new TickEvent.ClientTickEvent(phase));
5859
}
5960

61+
public static void fireRenderTickEvent(TickEvent.Phase phase, float renderTickTime) {
62+
// TODO - Call net.minecraftforge.client.model.animation.Animation#setClientPartialTickTime on start phase
63+
MinecraftForge.EVENT_BUS.post(new TickEvent.RenderTickEvent(phase, renderTickTime));
64+
}
65+
66+
public static void fireServerTickEvent(TickEvent.Phase phase) {
67+
MinecraftForge.EVENT_BUS.post(new TickEvent.ServerTickEvent(phase));
68+
}
69+
6070
public static void firePlayerTickEvent(TickEvent.Phase phase, PlayerEntity player) {
6171
MinecraftForge.EVENT_BUS.post(new TickEvent.PlayerTickEvent(phase, player));
6272
}
@@ -126,5 +136,8 @@ public void onInitialize() {
126136
throw new UnsupportedOperationException("A mod tried to set the server's motd during handling FMLServerStartedEvent, this isn't implemented yet.");
127137
}
128138
});
139+
140+
ServerTickEvents.START_SERVER_TICK.register(server -> fireServerTickEvent(TickEvent.Phase.START));
141+
ServerTickEvents.END_SERVER_TICK.register(server -> fireServerTickEvent(TickEvent.Phase.END));
129142
}
130143
}

patchwork-events-lifecycle/src/main/java/net/patchworkmc/mixin/event/lifecycle/MixinMinecraftClient.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@
1919

2020
package net.patchworkmc.mixin.event.lifecycle;
2121

22+
import org.spongepowered.asm.mixin.Final;
2223
import org.spongepowered.asm.mixin.Mixin;
24+
import org.spongepowered.asm.mixin.Shadow;
2325
import org.spongepowered.asm.mixin.injection.At;
2426
import org.spongepowered.asm.mixin.injection.Inject;
27+
import org.spongepowered.asm.mixin.injection.Slice;
2528
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2629
import org.objectweb.asm.Opcodes;
2730
import net.minecraftforge.event.TickEvent;
2831

2932
import net.minecraft.client.MinecraftClient;
33+
import net.minecraft.client.render.RenderTickCounter;
3034

3135
import net.patchworkmc.impl.event.lifecycle.LifecycleEvents;
3236

@@ -51,4 +55,33 @@ private void hookClientTickEnd(CallbackInfo info) {
5155
private void hookClientInit(CallbackInfo ci) {
5256
LifecycleEvents.handleLoadComplete();
5357
}
58+
59+
@Shadow
60+
@Final
61+
private RenderTickCounter renderTickCounter;
62+
63+
// Note: for some reason, ordinal does not consider ldc, which means ldc is completely useless here.
64+
// It's kept here for the sake of reference/readability only.
65+
@Inject(method = "render", at = @At(
66+
value = "INVOKE_STRING",
67+
target = "net/minecraft/util/profiler/DisableableProfiler.swap(Ljava/lang/String;)V",
68+
args = "ldc=gameRenderer",
69+
ordinal = 1))
70+
private void hookRenderTickStart(CallbackInfo ci) {
71+
LifecycleEvents.fireRenderTickEvent(TickEvent.Phase.START, this.renderTickCounter.tickDelta);
72+
}
73+
74+
@Inject(method = "render",
75+
slice = @Slice(from = @At(
76+
value = "INVOKE_STRING",
77+
target = "net/minecraft/util/profiler/DisableableProfiler.swap(Ljava/lang/String;)V",
78+
args = "ldc=toasts")),
79+
at = @At(
80+
value = "INVOKE",
81+
target = "net/minecraft/util/profiler/DisableableProfiler.pop()V",
82+
shift = At.Shift.AFTER,
83+
ordinal = 0))
84+
private void hookRenderTickEnd(CallbackInfo ci) {
85+
LifecycleEvents.fireRenderTickEvent(TickEvent.Phase.END, this.renderTickCounter.tickDelta);
86+
}
5487
}

patchwork-events-lifecycle/src/main/resources/fabric.mod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
],
1515
"depends": {
1616
"fabricloader": ">=0.8.4",
17+
"fabric": ">=0.15.0",
1718
"patchwork-fml": "*"
1819
},
1920
"entrypoints": {

patchwork-god-classes/src/main/java/net/minecraftforge/fml/hooks/BasicEventHooks.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,19 @@ public static void onPostClientTick() {
9191
LifecycleEvents.fireClientTickEvent(TickEvent.Phase.END);
9292
}
9393

94-
// TODO: onPreServerTick
95-
// TODO: onPostServerTick
94+
public static void onPreServerTick() {
95+
LifecycleEvents.fireServerTickEvent(TickEvent.Phase.START);
96+
}
97+
98+
public static void onPostServerTick() {
99+
LifecycleEvents.fireServerTickEvent(TickEvent.Phase.END);
100+
}
101+
102+
public static void onRenderTickStart(float timer) {
103+
LifecycleEvents.fireRenderTickEvent(TickEvent.Phase.START, timer);
104+
}
105+
106+
public static void onRenderTickEnd(float timer) {
107+
LifecycleEvents.fireRenderTickEvent(TickEvent.Phase.END, timer);
108+
}
96109
}

0 commit comments

Comments
 (0)