From cc12ed7be1cbd17f17a79c0a1a8a0651efd4cf64 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Fri, 15 May 2015 18:22:43 +0200 Subject: [PATCH] Prevent SOE when replaying sessions recorded on faster machines --- .../replaymod/replay/ReplaySender.java | 19 ++++++++++++------- src/main/resources/META-INF/replaymod_at.cfg | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index fbb6420a..8876530f 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -1,6 +1,7 @@ package eu.crushedpixel.replaymod.replay; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.ListenableFutureTask; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.events.RecordingHandler; @@ -30,6 +31,7 @@ import java.io.IOException; import java.net.URL; import java.util.Arrays; import java.util.List; +import java.util.concurrent.Callable; /** * Sends replay packets to netty channels. @@ -302,13 +304,15 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } - mc.addScheduledTask(new Runnable() { - + new Callable() { @Override - public void run() { - if (mc.theWorld == null) { - mc.addScheduledTask(this); - return; + @SuppressWarnings("unchecked") + public Void call() { + if (mc.theWorld == null || !mc.isCallingFromMinecraftThread()) { + synchronized(mc.scheduledTasks) { + mc.scheduledTasks.add(ListenableFutureTask.create(this)); + } + return null; } CameraEntity cent = ReplayHandler.getCameraEntity(); @@ -318,8 +322,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } cent.moveAbsolute(ppl.func_148932_c(), ppl.func_148928_d(), ppl.func_148933_e()); ReplayHandler.setCameraEntity(cent); + return null; } - }); + }.call(); } return asyncMode ? processPacketAsync(p) : processPacketSync(p); diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index eb0a898c..208deadb 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -7,6 +7,7 @@ public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer public net.minecraft.client.Minecraft field_71423_H # systemTime public net.minecraft.client.Minecraft field_71429_W # leftClickCounter public net.minecraft.client.Minecraft field_71445_n # isGamePaused +public net.minecraft.client.Minecraft field_152351_aB # scheduledTasks public net.minecraft.client.Minecraft func_71386_F()L # getSystemTime public net.minecraft.client.Minecraft func_71383_b(I)V # updateDebugProfilerName