Skip to content

Commit

Permalink
[PlaybackSerialiser] Added implementation to Beta1Flavor
Browse files Browse the repository at this point in the history
- [Commands] Added flavor argument to save and load
- [Commands] Added TabCompletionUtils for fetching list of tasfiles and flavors from the client
  • Loading branch information
ScribbleTAS committed Jun 28, 2024
1 parent 2da7c94 commit a2fdbb5
Show file tree
Hide file tree
Showing 9 changed files with 223 additions and 93 deletions.
4 changes: 4 additions & 0 deletions src/main/java/com/minecrafttas/tasmod/TASmod.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.minecrafttas.tasmod.commands.CommandSaveTAS;
import com.minecrafttas.tasmod.commands.CommandSavestate;
import com.minecrafttas.tasmod.commands.CommandTickrate;
import com.minecrafttas.tasmod.commands.TabCompletionUtils;
import com.minecrafttas.tasmod.ktrng.KillTheRNGHandler;
import com.minecrafttas.tasmod.networking.TASmodPackets;
import com.minecrafttas.tasmod.playback.PlaybackControllerServer;
Expand Down Expand Up @@ -71,6 +72,8 @@ public class TASmod implements ModInitializer, EventServerInit, EventServerStop{

public static final StartpositionMetadataExtension startPositionMetadataExtension = new StartpositionMetadataExtension();

public static final TabCompletionUtils tabCompletionUtils = new TabCompletionUtils();

@Override
public void onInitialize() {

Expand Down Expand Up @@ -100,6 +103,7 @@ public void onInitialize() {
PacketHandlerRegistry.register(ktrngHandler);
PacketHandlerRegistry.register(playbackControllerServer);
PacketHandlerRegistry.register(startPositionMetadataExtension);
PacketHandlerRegistry.register(tabCompletionUtils);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.minecrafttas.tasmod.commands;

public class CommandFileCommand {

}
69 changes: 39 additions & 30 deletions src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package com.minecrafttas.tasmod.commands;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;

import com.minecrafttas.tasmod.TASmod;
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
import com.minecrafttas.tasmod.networking.TASmodPackets;

import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
Expand All @@ -28,7 +25,7 @@ public String getName() {

@Override
public String getUsage(ICommandSender sender) {
return "/load <filename>";
return "/load <filename> [flavor]";
}

@Override
Expand All @@ -38,17 +35,18 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
if (sender.canUseCommand(2, "load")) {
if (args.length < 1) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filename, " + getUsage(sender)));
} else {
String name = "";
String spacer = " ";
for (int i = 0; i < args.length; i++) {
if (i == args.length - 1) {
spacer="";
}
name=name.concat(args[i]+spacer);
} else if(args.length == 1) {
String filename = args[0];
try {
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(filename).writeString(""));
} catch (Exception e) {
e.printStackTrace();
}
} else if (args.length == 2) {
String filename = args[0];
String flavorname = args[1];
try {
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(name));
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(filename).writeString(flavorname));
} catch (Exception e) {
e.printStackTrace();
}
Expand All @@ -63,28 +61,39 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
List<String> tab;
if (args.length == 1) {
tab = getFilenames();
try {
tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName());
} catch (TimeoutException e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
} catch (Exception e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
}

if (tab.isEmpty()) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "No files in directory"));
return super.getTabCompletions(server, sender, args, targetPos);
}
return getListOfStringsMatchingLastWord(args, tab);

} else if (args.length == 2) {
try {
tab = TASmod.tabCompletionUtils.getFlavorList(getCommandSenderAsPlayer(sender).getName());
} catch (TimeoutException e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the flavor list after 2 seconds, something went wrong"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
} catch (Exception e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
}
return getListOfStringsMatchingLastWord(args, tab);

} else
return super.getTabCompletions(server, sender, args, targetPos);
}

public List<String> getFilenames() {
List<String> tab = new ArrayList<String>();
File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles");
File[] listOfFiles = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".mctas");
}
});
for (int i = 0; i < listOfFiles.length; i++) {
tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", ""));
}
return tab;
}
}
76 changes: 42 additions & 34 deletions src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package com.minecrafttas.tasmod.commands;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;

import com.google.common.collect.ImmutableList;
import com.minecrafttas.tasmod.TASmod;
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
import com.minecrafttas.tasmod.networking.TASmodPackets;

import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
Expand All @@ -31,7 +28,7 @@ public String getName() {

@Override
public String getUsage(ICommandSender sender) {
return "/save <filename>";
return "/save <filename> [flavor]";
}

@Override
Expand All @@ -41,22 +38,23 @@ public List<String> getAliases() {

@Override
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "This feature does not work at the moment!"));

if (sender instanceof EntityPlayer) {
if (sender.canUseCommand(2, "save")) {
if (args.length < 1) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filename, " + getUsage(sender)));
} else {
String name = "";
String spacer = " ";
for (int i = 0; i < args.length; i++) {
if (i == args.length - 1) {
spacer = "";
}
name = name.concat(args[i] + spacer);
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Command must contain a filename " + getUsage(sender)));
} else if (args.length == 1) {
String filename = args[0];
try {
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(filename).writeString(""));
} catch (Exception e) {
e.printStackTrace();
}
} else if (args.length == 2) {
String filename = args[0];
String flavorname = args[1];
try {
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(name));
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(filename).writeString(flavorname));
} catch (Exception e) {
e.printStackTrace();
}
Expand All @@ -69,38 +67,48 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args

@Override
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
List<String> tab;
List<String> tab = null;
if (args.length == 1) {
if (!check) {
sender.sendMessage(new TextComponentString(TextFormatting.BOLD + "" + TextFormatting.RED + "WARNING!" + TextFormatting.RESET + TextFormatting.RED + " Existing filenames will be overwritten! /fail to abort the recording if you accidentally started one"));
check = true;
}
tab = getFilenames();
try {
tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName());
} catch (TimeoutException e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
} catch (Exception e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
}

if (tab.isEmpty()) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "No files in directory"));
return super.getTabCompletions(server, sender, args, targetPos);
}
return getListOfStringsMatchingLastWord(args, tab);

} else if (args.length == 2) {
try {
tab = TASmod.tabCompletionUtils.getFlavorList(getCommandSenderAsPlayer(sender).getName());
} catch (TimeoutException e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the flavor list after 2 seconds, something went wrong"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
} catch (Exception e) {
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions"));
TASmod.LOGGER.catching(e);
return super.getTabCompletions(server, sender, args, targetPos);
}
return getListOfStringsMatchingLastWord(args, tab);

} else
return super.getTabCompletions(server, sender, args, targetPos);
}

public List<String> getFilenames() {
List<String> tab = new ArrayList<String>();
File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles");

File[] listOfFiles = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".mctas");
}
});
for (int i = 0; i < listOfFiles.length; i++) {
tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", ""));
}
return tab;
}

@Override
public int getRequiredPermissionLevel() {
return 2;
Expand Down
110 changes: 110 additions & 0 deletions src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.minecrafttas.tasmod.commands;

import java.io.File;
import java.io.FileFilter;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException;
import com.minecrafttas.mctcommon.server.exception.WrongSideException;
import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler;
import com.minecrafttas.mctcommon.server.interfaces.PacketID;
import static com.minecrafttas.tasmod.networking.TASmodPackets.*;
import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler;
import com.minecrafttas.tasmod.TASmod;
import com.minecrafttas.tasmod.TASmodClient;
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
import com.minecrafttas.tasmod.networking.TASmodPackets;
import com.minecrafttas.tasmod.util.TASmodRegistry;

import net.minecraft.client.Minecraft;

public class TabCompletionUtils implements ServerPacketHandler, ClientPacketHandler{

private volatile CompletableFuture<List<String>> fileList = null;
private volatile CompletableFuture<List<String>> flavorList = null;

@Override
public PacketID[] getAcceptedPacketIDs() {
return new PacketID[] { COMMAND_TASFILELIST, COMMAND_FLAVORLIST };
}

//======== SERVER SIDE

@Override
public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception {
TASmodPackets packet = (TASmodPackets) id;
switch (packet) {
case COMMAND_TASFILELIST:
String filenames = TASmodBufferBuilder.readString(buf);
fileList.complete(Arrays.asList(filenames.split("/")));
break;
case COMMAND_FLAVORLIST:
String flavornames = TASmodBufferBuilder.readString(buf);
flavorList.complete(Arrays.asList(flavornames.split("/")));
default:
break;
}
}

public List<String> getTASFileList(String playername) throws InterruptedException, ExecutionException, TimeoutException {
fileList = new CompletableFuture<>();
try {
TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_TASFILELIST));
} catch (Exception e) {
e.printStackTrace();
}
return fileList.get(2,TimeUnit.SECONDS);
}

public List<String> getFlavorList(String playername) throws InterruptedException, ExecutionException, TimeoutException {
flavorList = new CompletableFuture<>();
try {
TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FLAVORLIST));
} catch (Exception e) {
e.printStackTrace();
}
return flavorList.get(2,TimeUnit.SECONDS);
}

//======== CLIENT SIDE

@Override
public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception {
TASmodPackets packet = (TASmodPackets) id;
switch (packet) {
case COMMAND_TASFILELIST:
String filenames = String.join("/", getFilenames());
TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_TASFILELIST).writeString(filenames));
break;

case COMMAND_FLAVORLIST:
String flavornames = String.join("/", TASmodRegistry.SERIALISER_FLAVOR.getFlavorNames());
TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FLAVORLIST).writeString(flavornames));
default:
break;
}
}

private List<String> getFilenames() {
List<String> tab = new ArrayList<String>();
File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles");

File[] listOfFiles = folder.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".mctas");
}
});
for (int i = 0; i < listOfFiles.length; i++) {
tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", ""));
}
return tab;
}
}
Loading

0 comments on commit a2fdbb5

Please sign in to comment.