Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/main/java/cam72cam/mod/MinecraftClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,20 @@
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.util.math.RayTraceResult;
import org.jetbrains.annotations.ApiStatus;

/** Static Minecraft Client props, don't touch server side */
public class MinecraftClient {
/** Minecraft is loaded and has a loaded world */
private static boolean clientReady;

public static boolean isReady() {
return Minecraft.getMinecraft().player != null;
return clientReady;
}

@ApiStatus.Internal
public static void setReady(boolean newState) {
clientReady = newState;
}

private static Player playerCache;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cam72cam.mod.mixin.fix.client_player_handling;

import cam72cam.mod.MinecraftClient;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.WorldClient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

/**
* Manually track loading state to avoid race condition on {@link MinecraftClient#isReady()} and actual player spawn
*/
@Mixin(Minecraft.class)
public class MixinMinecraft {
@Inject(method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/multiplayer/WorldClient;spawnEntity(Lnet/minecraft/entity/Entity;)Z"))
public void markReadyWhenLoaded(WorldClient worldClientIn, String loadingMessage, CallbackInfo ci) {
MinecraftClient.setReady(true);
}

@Inject(method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/storage/ISaveFormat;flushCache()V"))
public void markNotReadyWhenUnloaded(WorldClient worldClientIn, String loadingMessage, CallbackInfo ci) {
MinecraftClient.setReady(false);
}

@Inject(method = "setDimensionAndSpawnPlayer", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/multiplayer/WorldClient;spawnEntity(Lnet/minecraft/entity/Entity;)Z"))
public void markReadyWhenLoaded(int dimension, CallbackInfo ci) {
MinecraftClient.setReady(true);
}

@Inject(method = "setDimensionAndSpawnPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;getEntityId()I"))
public void markNotReadyWhenTransfer(int dimension, CallbackInfo ci) {
MinecraftClient.setReady(false);
}
}
1 change: 1 addition & 0 deletions src/main/resources/mixins.fix.universalmodcore.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@
"multi_release.MixinJarDiscoverer"
],
"client": [
"client_player_handling.MixinMinecraft"
]
}