From 8cc6e401696885960f77e1451c2bcab221224fd7 Mon Sep 17 00:00:00 2001 From: yabo083 Date: Mon, 2 Mar 2026 14:57:58 +0800 Subject: [PATCH 1/2] Make replaymod restrict payload optional --- src/main/java/com/replaymod/recording/ReplayModRecording.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/replaymod/recording/ReplayModRecording.java b/src/main/java/com/replaymod/recording/ReplayModRecording.java index 44b573a..9774c6a 100644 --- a/src/main/java/com/replaymod/recording/ReplayModRecording.java +++ b/src/main/java/com/replaymod/recording/ReplayModRecording.java @@ -73,7 +73,7 @@ public void run() { @SubscribeEvent static void registerNetwork(RegisterPayloadHandlersEvent event) { - final PayloadRegistrar registrar = event.registrar("1"); + final PayloadRegistrar registrar = event.registrar("1").optional(); registrar.commonToClient(Restrictions.ID, Restrictions.CODEC, (payload, context) -> {}); } From af47b53c6b9ae78dc0a587cafec6fc5089b33610 Mon Sep 17 00:00:00 2001 From: yabo083 Date: Mon, 2 Mar 2026 14:59:50 +0800 Subject: [PATCH 2/2] Include render-related improvements --- src/main/java/com/replaymod/render/Setting.java | 2 ++ .../replaymod/render/rendering/VideoRenderer.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/replaymod/render/Setting.java b/src/main/java/com/replaymod/render/Setting.java index c8a5803..685f624 100644 --- a/src/main/java/com/replaymod/render/Setting.java +++ b/src/main/java/com/replaymod/render/Setting.java @@ -9,4 +9,6 @@ public final class Setting { new SettingsRegistry.SettingKeys<>("advanced", "skipPostRenderGui", null, false); public static final SettingsRegistry.SettingKey FRAME_TIME_FROM_WORLD_TIME = new SettingsRegistry.SettingKeys<>("render", "frameTimeFromWorldTime", null, false); + public static final SettingsRegistry.SettingKey SKIN_PRELOAD_DELAY = + new SettingsRegistry.SettingKeys<>("render", "skinPreloadDelay", null, 3); } diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index b67faff..c0dc76a 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -12,6 +12,7 @@ import com.replaymod.render.PNGWriter; import com.replaymod.render.RenderSettings; import com.replaymod.render.ReplayModRender; +import com.replaymod.render.Setting; import com.replaymod.render.FFmpegWriter; import com.replaymod.render.blend.BlendState; import com.replaymod.render.capturer.RenderInfo; @@ -196,18 +197,26 @@ public boolean renderVideo() throws Throwable { ReplayTimer timer = (ReplayTimer) ((MinecraftAccessor) mc).getTimer(); - // Play up to one second before starting to render + // Play up to several seconds before starting to render // This is necessary in order to ensure that all entities have at least two position packets // and their first position in the recording is correct. + // Additionally, this gives time for player skins to load from the network. // Note that it is impossible to also get the interpolation between their latest position // and the one in the recording correct as there's no reliable way to tell when the server ticks // or when we should be done with the interpolation of the entity + int preloadDelaySeconds = 3; // Default value, try to read from config + try { + preloadDelaySeconds = ReplayModRender.instance.getCore().getSettingsRegistry().get(Setting.SKIN_PRELOAD_DELAY); + } catch (Exception e) { + LOGGER.warn("Failed to load skin preload delay setting, using default value of 3 seconds", e); + } + int preloadDelayMs = preloadDelaySeconds * 1000; Optional optionalVideoStartTime = timeline.getValue(TimestampProperty.PROPERTY, 0); if (optionalVideoStartTime.isPresent()) { int videoStart = optionalVideoStartTime.get(); - if (videoStart > 1000) { - int replayTime = videoStart - 1000; + if (videoStart > preloadDelayMs) { + int replayTime = videoStart - preloadDelayMs; //#if MC>=11200 timer.tickDelta = 0; ((TimerAccessor) timer).setTickLength(DEFAULT_MS_PER_TICK);