diff --git a/README.md b/README.md index a5914b11..1015b438 100644 --- a/README.md +++ b/README.md @@ -275,6 +275,7 @@ If you are reading this it looks like you are looking to add an egg to your serv * [Stormworks: Build and Rescue](game_eggs/steamcmd_servers/stormworks) * [Subnautica: Nitrox Mod](game_eggs/steamcmd_servers/subnautica_nitrox_mod) * [Sven Co-op](game_eggs/steamcmd_servers/svencoop) +* [Swords 'n Magic and Stuff](game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff) * [The Forest](game_eggs/steamcmd_servers/the_forest) * [The Isle](game_eggs/steamcmd_servers/the_isle) * [Evrima](game_eggs/steamcmd_servers/the_isle/evrima) diff --git a/game_eggs/README.md b/game_eggs/README.md index 4f7a8eaf..b2a0a890 100644 --- a/game_eggs/README.md +++ b/game_eggs/README.md @@ -176,6 +176,7 @@ * [Stormworks: Build and Rescue](steamcmd_servers/stormworks) * [Subnautica: Nitrox Mod](steamcmd_servers/subnautica_nitrox_mod) * [Sven Co-op](steamcmd_servers/svencoop) +* [Swords 'n Magic and Stuff](steamcmd_servers/Swords_'n_Magic_and_Stuff) * [Team Fortress 2 Classic](steamcmd_servers/team_fortress_2_classic) * [The Forest](steamcmd_servers/the_forest) * [The Isle](steamcmd_servers/the_isle) diff --git a/game_eggs/steamcmd_servers/README.md b/game_eggs/steamcmd_servers/README.md index db8fada8..a2514941 100644 --- a/game_eggs/steamcmd_servers/README.md +++ b/game_eggs/steamcmd_servers/README.md @@ -215,6 +215,10 @@ This is a collection of servers that use SteamCMD to install. [Sven Co-op](svencoop) +## Swords 'n Magic and Stuff + +[Swords 'n Magic and Stuff](Swords_'n_Magic_and_Stuff) + ## Team Fortress 2 Classic [Team Fortress 2 Classic](team_fortress_2_classic) diff --git a/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/README.md b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/README.md new file mode 100644 index 00000000..71a8f2bd --- /dev/null +++ b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/README.md @@ -0,0 +1,16 @@ +# Swords 'n Magic and Stuff + +Grab your friends and set out for adventure in a world of swords, magic, and stuff. Discover tons of cool loot, uncover hidden secrets, and meet new friends and foes along the way. Make your mark and find a place to call home in this cute, multiplayer, open world RPG. + +## Console +Because there is not yet a real console this egg uses a wrapper that prints the log file to the console but it is a continue loop so it will keep sending the contents of the latest log file to the console. The console does not accept any input. + +## Server Ports + + +| Port | default | +|-----------|---------| +| Game | 7777 | +| Query | 27015 | + + diff --git a/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper new file mode 100644 index 00000000..0bce0609 Binary files /dev/null and b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper differ diff --git a/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper.c b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper.c new file mode 100644 index 00000000..21d247d3 --- /dev/null +++ b/game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void print_latest_log(const char* log_directory) { + DIR *dir; + struct dirent *entry; + time_t latest_time = 0; + char latest_file[256]; + + dir = opendir(log_directory); + if (dir == NULL) { + printf("Error opening directory %s\n", log_directory); + return; + } + + while ((entry = readdir(dir)) != NULL) { + if (strstr(entry->d_name, "SnMDedSrv-") == entry->d_name && + strstr(entry->d_name, ".log") != NULL) { + char filename[256]; + sprintf(filename, "%s/%s", log_directory, entry->d_name); + struct stat file_stat; + stat(filename, &file_stat); + if (file_stat.st_mtime > latest_time) { + latest_time = file_stat.st_mtime; + strcpy(latest_file, filename); + } + } + } + + if (latest_time == 0) { + printf("No log files found in directory %s\n", log_directory); + return; + } + + printf("\nLatest log file: %s\n", latest_file); + + int fd = open(latest_file, O_RDONLY); + if (fd < 0) { + printf("Error opening file %s\n", latest_file); + return; + } + + char buffer[4096]; + int bytes_read; + int last_line_printed = 0; // Flag to check whether we have printed the last line + do { + bytes_read = read(fd, buffer, sizeof(buffer)); + if (bytes_read > 0) { + // Check if the last character is a newline + if (buffer[bytes_read - 1] == '\n') { + fwrite(buffer, 1, bytes_read, stdout); + fflush(stdout); + } else { + // If the last character is not a newline, add one + char* temp = (char*) malloc(bytes_read + 1); + memcpy(temp, buffer, bytes_read); + temp[bytes_read] = '\n'; + fwrite(temp, 1, bytes_read + 1, stdout); + fflush(stdout); + free(temp); + } + last_line_printed = (buffer[bytes_read - 1] == '\n'); + } + } while (bytes_read > 0); + + // If the last line was not printed, print it now + if (!last_line_printed) { + printf("\n"); + } + + close(fd); +} + +int main(int argc, char** argv) { + if (argc < 2) { + printf("Usage: winewrapper wine_path wine_args exe_path exe_args\n"); + return 0; + } + + char* wine_path = argv[1]; + + pid_t pid = fork(); + if (pid == 0) { + char** wine_argv = (char**) malloc(sizeof(char*) * (argc - 1)); + wine_argv[0] = wine_path; + for (int i = 2; i < argc; i++) { + wine_argv[i - 1] = argv[i]; + } + wine_argv[argc - 1] = NULL; + execv(wine_path, wine_argv); + printf("Error launching wine process\n"); + exit(1); + } else if (pid < 0) { + printf("Error forking process\n"); + exit(1); + } + + sleep(30); + + char* log_directory = "/home/container/SNM2020/Saved/Logs"; + print_latest_log(log_directory); + + while (1) { + sleep(1); + print_latest_log(log_directory); + } + + kill(pid, SIGTERM); + + return 0; +}