Skip to content

Commit 988b7ab

Browse files
authored
Merge pull request #1 from jojoe77777/main
Fixed preview state file updating too early, and reuse file handle for writing state changes
2 parents 2434096 + 240ca1a commit 988b7ab

6 files changed

Lines changed: 22 additions & 6 deletions

File tree

src/main/java/me/voidxwalker/worldpreview/StateOutputHelper.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import org.apache.logging.log4j.Level;
44

55
import java.io.IOException;
6+
import java.io.RandomAccessFile;
67
import java.nio.charset.StandardCharsets;
7-
import java.nio.file.Files;
88
import java.nio.file.Path;
99
import java.nio.file.Paths;
1010
import java.util.concurrent.ExecutorService;
@@ -21,6 +21,8 @@ public final class StateOutputHelper {
2121
public static boolean titleHasEverLoaded = false;
2222
private static String lastOutput = "";
2323

24+
private static RandomAccessFile stateFile;
25+
2426

2527
private StateOutputHelper() {
2628
}
@@ -44,8 +46,12 @@ public static void outputState(String string) {
4446

4547
private static void outputStateInternal(String string) {
4648
try {
47-
// Java 11+ method
48-
Files.write(OUT_PATH, string.getBytes(StandardCharsets.UTF_8));
49+
if(stateFile == null){ // opening file only once is better for performance
50+
stateFile = new RandomAccessFile(OUT_PATH.toString(), "rw");
51+
}
52+
stateFile.setLength(0); // clear existing file contents
53+
stateFile.seek(0); // move pointer back to start of file
54+
stateFile.write(string.getBytes(StandardCharsets.UTF_8));
4955
WorldPreview.log(Level.INFO, "WorldPreview State: " + string);
5056
} catch (IOException ignored) {
5157
WorldPreview.log(Level.ERROR, "Failed to write state output!");

src/main/java/me/voidxwalker/worldpreview/WorldPreview.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class WorldPreview implements ClientModInitializer {
2222
public static ClientPlayerEntity player;
2323
public static ClientWorld clientWord;
2424
public static boolean inPreview;
25+
public static boolean renderingPreview;
2526
public static BlockPos spawnPos;
2627
public static int kill=0;
2728
public static int playerSpawn;

src/main/java/me/voidxwalker/worldpreview/mixin/client/MinecraftClientMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,14 @@ private void worldpreview_outputInWorldState(CallbackInfo info) {
144144
StateOutputHelper.outputState("inworld,gamescreenopen");
145145
}
146146
}
147+
148+
@Inject(method = "render", at = @At(value = "INVOKE", target="Lnet/minecraft/client/util/Window;swapBuffers()V", shift = At.Shift.AFTER))
149+
private void worldpreview_actuallyInPreview(boolean tick, CallbackInfo ci) {
150+
if (WorldPreview.inPreview && !WorldPreview.renderingPreview) {
151+
WorldPreview.renderingPreview = true;
152+
StateOutputHelper.outputState("previewing," + StateOutputHelper.loadingProgress);
153+
WorldPreview.log(Level.INFO, "Starting Preview at (" + WorldPreview.player.getX() + ", " + (double) Math.floor(WorldPreview.player.getY()) + ", " + WorldPreview.player.getZ() + ")");
154+
}
155+
}
156+
147157
}

src/main/java/me/voidxwalker/worldpreview/mixin/client/WorldGenerationProgressLoggerMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public abstract class WorldGenerationProgressLoggerMixin {
1818
private void worldpreview_outputGenerationState(ChunkPos pos, ChunkStatus status, CallbackInfo info) {
1919
// Using the getProgressPercentage to recalculate is slightly unoptimized but prevents needing to do locals capture, making it easier to port this mixin.
2020
StateOutputHelper.loadingProgress = MathHelper.clamp(getProgressPercentage(), 0, 100);
21-
StateOutputHelper.outputState((WorldPreview.inPreview ? "previewing," : "generating,") + StateOutputHelper.loadingProgress);
21+
StateOutputHelper.outputState((WorldPreview.renderingPreview ? "previewing," : "generating,") + StateOutputHelper.loadingProgress);
2222
}
2323

2424
@Shadow

src/main/java/me/voidxwalker/worldpreview/mixin/client/render/LevelLoadingScreenMixin.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ public void worldpreview_render(MatrixStack matrices, int mouseX, int mouseY, fl
8989
WorldPreview.camera.update(WorldPreview.world, WorldPreview.player, this.client.options.perspective > 0, this.client.options.perspective == 2, 0.2F);
9090
WorldPreview.player.refreshPositionAndAngles(WorldPreview.player.getX(), WorldPreview.player.getY() - 1.5, WorldPreview.player.getZ(), 0.0F, 0.0F);
9191
WorldPreview.inPreview=true;
92-
StateOutputHelper.outputState("previewing," + StateOutputHelper.loadingProgress);
93-
WorldPreview.log(Level.INFO,"Starting Preview at ("+ WorldPreview.player.getX() + ", "+(double)Math.floor(WorldPreview.player.getY())+ ", "+ WorldPreview.player.getZ()+")");
9492
}
9593
MatrixStack matrixStack = new MatrixStack();
9694
matrixStack.peek().getModel().multiply(this.worldpreview_getBasicProjectionMatrix());

src/main/java/me/voidxwalker/worldpreview/mixin/server/MinecraftServerMixin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public void worldpreview_kill(CallbackInfo ci){
137137
@Inject(method="runServer",at=@At(value="INVOKE",target="Lnet/minecraft/server/MinecraftServer;setupServer()Z",shift = At.Shift.AFTER), cancellable = true)
138138
public void worldpreview_kill2(CallbackInfo ci){
139139
WorldPreview.inPreview=false;
140+
WorldPreview.renderingPreview=false;
140141
LockSupport.unpark(((MinecraftClientMixin)MinecraftClient.getInstance()).invokeGetThread());
141142
if(WorldPreview.kill==1){
142143
ci.cancel();

0 commit comments

Comments
 (0)