Skip to content

Commit 4978472

Browse files
authored
[PlaybackController] Fix restartandplay not working (#274)
- Update PlaybackControllerServer to work with packets and not only with commands - [Savestates] Seperate temporary savestates into it's own handler - [Events] Added EventPlaybackServer
2 parents df99ffd + d5ac9cc commit 4978472

File tree

12 files changed

+259
-148
lines changed

12 files changed

+259
-148
lines changed

src/main/java/com/minecrafttas/tasmod/TASmod.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public void onServerInit(MinecraftServer server) {
157157
savestateHandlerServer = new SavestateHandlerServer(server, LOGGER);
158158
PacketHandlerRegistry.register(savestateHandlerServer);
159159
PacketHandlerRegistry.register(savestateHandlerServer.getPlayerHandler());
160+
EventListenerRegistry.register(savestateHandlerServer.getSavestateTemporaryHandler());
160161

161162
if (!server.isDedicatedServer()) {
162163
TASmod.tickratechanger.ticksPerSecond = 0F;
@@ -187,6 +188,8 @@ public void onServerStop(MinecraftServer mcserver) {
187188
if (savestateHandlerServer != null) {
188189
PacketHandlerRegistry.unregister(savestateHandlerServer); // Unregistering the savestatehandler, as a new instance is registered in onServerStart()
189190
PacketHandlerRegistry.unregister(savestateHandlerServer.getPlayerHandler());
191+
PacketHandlerRegistry.unregister(savestateHandlerServer);
192+
EventListenerRegistry.unregister(savestateHandlerServer.getSavestateTemporaryHandler());
190193

191194
savestateHandlerServer = null;
192195
}
Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
package com.minecrafttas.tasmod.commands;
22

33
import com.minecrafttas.tasmod.TASmod;
4-
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
5-
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate;
6-
import com.minecrafttas.tasmod.registries.TASmodPackets;
7-
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateCallback;
8-
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateFlags;
9-
import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException;
104

115
import net.minecraft.command.CommandBase;
126
import net.minecraft.command.CommandException;
137
import net.minecraft.command.ICommandSender;
148
import net.minecraft.server.MinecraftServer;
15-
import net.minecraft.util.text.TextComponentString;
16-
import net.minecraft.util.text.TextFormatting;
179

1810
public class CommandFullPlay extends CommandBase {
1911

@@ -29,33 +21,6 @@ public String getUsage(ICommandSender sender) {
2921

3022
@Override
3123
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
32-
33-
SavestateCallback cb = (paths) -> {
34-
try {
35-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_SCREEN));
36-
} catch (Exception e) {
37-
TASmod.LOGGER.catching(e);
38-
}
39-
};
40-
41-
try {
42-
TASmod.savestateHandlerServer.loadState(0, cb, SavestateFlags.BLOCK_CHANGE_INDEX, SavestateFlags.BLOCK_PAUSE_TICKRATE);
43-
} catch (LoadstateException e) {
44-
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to load a savestate: " + e.getMessage()));
45-
return;
46-
} catch (Exception e) {
47-
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to load a savestate: " + e.getCause().toString()));
48-
e.printStackTrace();
49-
return;
50-
} finally {
51-
TASmod.savestateHandlerServer.resetState();
52-
}
53-
TASmod.playbackControllerServer.setServerState(TASstate.PLAYBACK);
54-
try {
55-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_FULLPLAY));
56-
} catch (Exception e) {
57-
e.printStackTrace();
58-
}
24+
TASmod.playbackControllerServer.fullPlay();
5925
}
60-
6126
}
Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
package com.minecrafttas.tasmod.commands;
22

33
import com.minecrafttas.tasmod.TASmod;
4-
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
5-
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate;
6-
import com.minecrafttas.tasmod.registries.TASmodPackets;
7-
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateCallback;
8-
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateFlags;
9-
import com.minecrafttas.tasmod.savestates.exceptions.SavestateException;
104

115
import net.minecraft.command.CommandBase;
126
import net.minecraft.command.CommandException;
137
import net.minecraft.command.ICommandSender;
148
import net.minecraft.server.MinecraftServer;
15-
import net.minecraft.util.text.TextComponentString;
16-
import net.minecraft.util.text.TextFormatting;
179

1810
public class CommandFullRecord extends CommandBase {
1911

@@ -29,28 +21,6 @@ public String getUsage(ICommandSender sender) {
2921

3022
@Override
3123
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
32-
33-
SavestateCallback cb = (paths) -> {
34-
try {
35-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_SCREEN));
36-
} catch (Exception e) {
37-
TASmod.LOGGER.catching(e);
38-
}
39-
};
40-
41-
try {
42-
TASmod.savestateHandlerServer.saveState(0, cb, SavestateFlags.BLOCK_PAUSE_TICKRATE);
43-
} catch (SavestateException e) {
44-
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to create a savestate: " + e.getMessage()));
45-
return;
46-
} finally {
47-
TASmod.savestateHandlerServer.resetState();
48-
}
49-
TASmod.playbackControllerServer.setServerState(TASstate.RECORDING);
50-
try {
51-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_FULLRECORD));
52-
} catch (Exception e) {
53-
e.printStackTrace();
54-
}
24+
TASmod.playbackControllerServer.fullRecord();
5525
}
5626
}

src/main/java/com/minecrafttas/tasmod/commands/CommandPlay.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4242
return;
4343
}
4444
if (args.length <= 1) {
45-
boolean loadTempSavestate = true;
46-
if (args.length == 1 && "nosave".equals(args[0])) {
47-
loadTempSavestate = false;
48-
}
49-
TASmod.playbackControllerServer.togglePlayback(loadTempSavestate);
45+
boolean noSave = args.length == 1 && "nosave".equals(args[0]);
46+
TASmod.savestateHandlerServer.getSavestateTemporaryHandler().setNoSave(noSave);
47+
48+
TASmod.playbackControllerServer.togglePlayback();
5049
} else if (args.length > 2) {
5150
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Too many arguments. " + getUsage(sender)));
5251
}

src/main/java/com/minecrafttas/tasmod/commands/CommandRecord.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,9 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4242
return;
4343
}
4444
if (args.length <= 1) {
45-
boolean saveTempSavestate = true;
46-
if (args.length == 1 && "nosave".equals(args[0])) {
47-
saveTempSavestate = false;
48-
}
49-
TASmod.playbackControllerServer.toggleRecording(saveTempSavestate);
45+
boolean noSave = args.length == 1 && "nosave".equals(args[0]);
46+
TASmod.savestateHandlerServer.getSavestateTemporaryHandler().setNoSave(noSave);
47+
TASmod.playbackControllerServer.toggleRecording();
5048
} else if (args.length > 1) {
5149
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Too many arguments. " + getUsage(sender)));
5250
}

src/main/java/com/minecrafttas/tasmod/commands/CommandRestartAndPlay.java

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66
import java.util.List;
77

88
import com.minecrafttas.tasmod.TASmod;
9-
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
10-
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate;
11-
import com.minecrafttas.tasmod.registries.TASmodPackets;
12-
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateFlags;
13-
import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException;
149

1510
import net.minecraft.client.Minecraft;
1611
import net.minecraft.command.CommandBase;
@@ -39,31 +34,7 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
3934
if (args.length < 1) {
4035
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filename, " + getUsage(sender)));
4136
} else {
42-
String name = "";
43-
String spacer = " ";
44-
for (int i = 0; i < args.length; i++) {
45-
if (i == args.length - 1) {
46-
spacer = "";
47-
}
48-
name = name.concat(args[i] + spacer);
49-
}
50-
try {
51-
TASmod.savestateHandlerServer.loadState(0, null, SavestateFlags.BLOCK_PAUSE_TICKRATE);
52-
} catch (LoadstateException e) {
53-
TASmod.LOGGER.catching(e);
54-
if (e.getMessage() != null) {
55-
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Could not load the initial savestate: " + e.getMessage()));
56-
}
57-
TASmod.savestateHandlerServer.resetState();
58-
TASmod.tickratechanger.pauseGame(false);
59-
return;
60-
}
61-
TASmod.playbackControllerServer.setServerState(TASstate.PLAYBACK);
62-
try {
63-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_RESTARTANDPLAY).writeString(args[0]));
64-
} catch (Exception e) {
65-
e.printStackTrace();
66-
}
37+
TASmod.playbackControllerServer.restartAndPlay(String.join(" ", args));
6738
}
6839
} else {
6940
sender.sendMessage(new TextComponentString(TextFormatting.RED + "You have no permission to use this command"));
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.minecrafttas.tasmod.events;
2+
3+
import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase;
4+
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate;
5+
import com.minecrafttas.tasmod.playback.PlaybackControllerServer;
6+
7+
public interface EventPlaybackServer {
8+
9+
/**
10+
* Fired when {@link PlaybackControllerServer#setTASStateServer(TASstate)} is called
11+
*/
12+
@FunctionalInterface
13+
public interface EventControllerStateChange extends EventBase {
14+
/**
15+
* Fired when {@link PlaybackControllerServer#setTASStateServer(TASstate)} is called
16+
* @param newstate The new state that the playback controller is about to be set
17+
* @param oldstate The current state that is about to be replaced by newstate
18+
*/
19+
public void onControllerStateChange(TASstate newstate, TASstate oldstate);
20+
}
21+
22+
/**
23+
* Fired when a recording is cleared in {@link PlaybackControllerServer#clearInputs()}
24+
*/
25+
@FunctionalInterface
26+
public interface EventRecordClear extends EventBase {
27+
28+
/**
29+
* Fired when a recording is cleared in {@link PlaybackControllerServer#clearInputs()}
30+
*/
31+
public void onRecordingClear();
32+
}
33+
}

src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_SAVE;
1010
import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_STATE;
1111

12+
import java.io.IOException;
1213
import java.io.Serializable;
1314
import java.nio.ByteBuffer;
1415
import java.nio.file.Path;
@@ -1014,15 +1015,15 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws
10141015
break;
10151016

10161017
case PLAYBACK_RESTARTANDPLAY:
1017-
final String finalname = ByteBufferBuilder.readString(buf);
1018+
String tasFilename = ByteBufferBuilder.readString(buf);
10181019

10191020
try {
10201021
Thread.sleep(100L);
10211022
} catch (InterruptedException e) {
10221023
e.printStackTrace();
10231024
}
10241025
Minecraft.getMinecraft().addScheduledTask(() -> {
1025-
TASmodClient.config.set(TASmodConfig.FileToOpen, finalname);
1026+
TASmodClient.config.set(TASmodConfig.FileToOpen, tasFilename);
10261027
System.exit(0);
10271028
});
10281029
break;
@@ -1077,5 +1078,13 @@ public void onClientInit(Minecraft mc) {
10771078
} else {
10781079
TASmodClient.config.reset(TASmodConfig.FileToOpen);
10791080
}
1081+
1082+
try {
1083+
TASmodClient.controller.setInputs(PlaybackSerialiser.loadFromFile(tasFileDirectory.resolve(fileOnStart + fileEnding)));
1084+
} catch (PlaybackLoadException | IOException e) {
1085+
logger.catching(e);
1086+
}
1087+
1088+
setTASState(TASstate.PLAYBACK);
10801089
}
10811090
}

0 commit comments

Comments
 (0)