diff --git a/src/main/java/net/minecraftforge/fml/network/NetworkEvent.java b/src/main/java/net/minecraftforge/fml/network/NetworkEvent.java index c02df5d42b..fcaadb5ace 100644 --- a/src/main/java/net/minecraftforge/fml/network/NetworkEvent.java +++ b/src/main/java/net/minecraftforge/fml/network/NetworkEvent.java @@ -21,8 +21,6 @@ package net.minecraftforge.fml.network; import javax.annotation.Nullable; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListenableFutureTask; import io.netty.util.Attribute; import io.netty.util.AttributeKey; @@ -37,6 +35,7 @@ import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.LogicalSidedProvider; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; public class NetworkEvent extends Event @@ -176,13 +175,16 @@ public class NetworkEvent extends Event return packetHandled; } - @SuppressWarnings("unchecked") - public ListenableFuture enqueueWork(Runnable runnable) { - ListenableFutureTask f = ListenableFutureTask.create(runnable, null); - - LogicalSidedProvider.WORKQUEUE. >get(getDirection().getReceptionSide()).execute(f); - - return f; + public CompletableFuture enqueueWork(Runnable runnable) { + ThreadTaskExecutor executor = LogicalSidedProvider.WORKQUEUE.get(getDirection().getReceptionSide()); + // Must check ourselves as Minecraft will sometimes delay tasks even when they are received on the client thread + // Same logic as ThreadTaskExecutor#runImmediately without the join + if (!executor.isOnExecutionThread()) { + return executor.func_213165_a(runnable); // Use the internal method so thread check isn't done twice + } else { + runnable.run(); + return CompletableFuture.completedFuture(null); + } } /** diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index a718d09cee..681a49b3c5 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -331,6 +331,9 @@ protected net.minecraft.tileentity.HopperTileEntity func_145887_i()Z # updateHop # DataFixer public net.minecraft.util.datafix.DataFixer field_188262_d # version +# ThreadTaskExecutor +public net.minecraft.util.concurrent.ThreadTaskExecutor func_213165_a(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture; # func_213165_a + # AbstractSkeletonEntity protected net.minecraft.entity.monster.AbstractSkeletonEntity func_190727_o()Lnet/minecraft/util/SoundEvent; # getStepSound - make AbstractSkeletonEntity implementable