From 6ab9ce9bb2b17c5308244332e12df484496da9dd Mon Sep 17 00:00:00 2001 From: Quinten <67589015+QuintenQVD0@users.noreply.github.com> Date: Sat, 6 May 2023 10:36:37 +0200 Subject: [PATCH] add Swords 'n Magic and Stuff --- README.md | 1 + game_eggs/README.md | 1 + game_eggs/steamcmd_servers/README.md | 4 + .../Swords_'n_Magic_and_Stuff/README.md | 16 +++ .../Swords_'n_Magic_and_Stuff/wrapper | Bin 0 -> 17736 bytes .../Swords_'n_Magic_and_Stuff/wrapper.c | 118 ++++++++++++++++++ 6 files changed, 140 insertions(+) create mode 100644 game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/README.md create mode 100644 game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper create mode 100644 game_eggs/steamcmd_servers/Swords_'n_Magic_and_Stuff/wrapper.c 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 0000000000000000000000000000000000000000..0bce0609817198ef56276ff48409e3c9a3626013 GIT binary patch literal 17736 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 B4oLt2 literal 0 HcmV?d00001 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; +}