68 Commits
v1.5 ... v1.10

Author SHA1 Message Date
709cb6dbae Bump version number 2021-10-11 10:26:31 -04:00
810f21415e Must be beautiful! 2021-10-11 10:25:25 -04:00
3e982b3303 Fix syntax 2021-10-11 10:10:20 -04:00
cfeb3a841f Update contributors 2021-10-11 09:36:14 -04:00
60af93add3 Update README.md 2021-10-11 09:35:57 -04:00
b64eaf88c5 Add referral code 2021-10-11 09:28:15 -04:00
e8d96c45a0 Fix previous sanity check 2021-10-10 22:16:02 -04:00
d8826f608c Add sanity check 2021-10-10 22:12:28 -04:00
07a99d3aa1 Add show directories to command line arguments 2021-10-10 22:06:00 -04:00
b4791a0b7d Formatting 2021-09-24 10:11:10 -04:00
e43a59ce7b Add moar referral codes! 2021-09-20 15:43:26 -04:00
fc98118ac5 List directories used by the helper and game 2021-09-19 23:13:46 -04:00
4fd9fec8f7 Fix version number (don't ask) 2021-09-18 16:33:06 -04:00
130704107b Bump version 2021-09-18 16:31:37 -04:00
15cad464e3 Remove extraneous / from path 2021-09-18 16:22:50 -04:00
cabfd03c29 Bump version number 2021-09-18 15:52:41 -04:00
33170fae78 Add better cancel button labels
Closes #22
2021-09-18 15:51:57 -04:00
b701ea5e3d Fix gzip error for non-gzip archives 2021-09-18 15:27:51 -04:00
05d75ec82f Ignore sha512sum files when creating download list 2021-09-18 15:17:39 -04:00
2f97a8eb2d Revert "ignoring .sha512sum files in runner release pages" and "solving trying to download the .sha512sum as archive"
Reverts commits c07e673 and 675621c.
2021-09-18 15:14:40 -04:00
cb3fc5d0d7 Reorganize version checker 2021-09-18 13:10:44 -04:00
c42d459ef2 Minor syntax, formatting, and organizational tweaks 2021-09-18 12:57:22 -04:00
675621c4c3 solving trying to download the .sha512sum as archive 2021-07-28 11:08:28 +02:00
c07e673c0d ignoring .sha512sum files in runner release pages 2021-07-27 20:32:07 +02:00
b85df29d6d Revert "ignoring .sha512sum files in runner release pages"
This reverts commit 7f3d84a8bc.
2021-07-27 20:31:02 +02:00
7f3d84a8bc ignoring .sha512sum files in runner release pages 2021-07-27 20:29:02 +02:00
6533cf98bd Merge pull request #20 from Wrzlprnft/patch-1
fix locale causing memory preflight check to fail
2021-07-20 08:49:37 +02:00
c7c8cd1ecd fix locale causing memory preflight check to fail
if the locale uses a decimal `,` instead of `.`, the memory preflight check fails
fix provided by @gort818
2021-07-19 16:01:38 +02:00
e0d149494d added script version check and glibc version check for /dev/null 2021-06-15 15:34:40 +02:00
9800420d73 added GloriousEggrolls lutris-Builds - thanks to Eutyches 2021-06-08 17:09:25 +02:00
eae146ce02 added support for the new directory structure in 3.13 and check for sudo 2021-04-25 15:11:04 +02:00
b4248fb264 Additional referral code 2021-03-21 14:51:53 -04:00
d5dbec7b3f Refactor directory handling 2021-03-13 12:21:46 -05:00
d4e8298743 Refactor directory paths
Preparation for upcoming changes to the game's directory structure
2021-03-13 09:59:28 -05:00
8ee730bf35 More referral codes! 2021-02-27 12:55:48 -05:00
b6eea7b224 Fix the fix 2021-02-20 18:07:08 -05:00
c9c3c07866 Fix formatting 2021-02-20 18:06:49 -05:00
2e883423d3 Spacing 2021-02-20 18:05:02 -05:00
12a3a51eb4 Add preflight check section comments 2021-02-20 18:04:34 -05:00
aec6ffbfc0 Fix floating point math 2021-02-20 18:01:13 -05:00
96b15262f5 You saw nothing.
*jedi mind wipe*
2021-02-16 14:49:45 -05:00
9986f62566 Merge pull request #16 from the-sane/avx
Add preflight check for AVX
2021-02-16 14:48:06 -05:00
a2397c28f0 Add preflight check for AVX 2021-02-16 14:23:14 -05:00
e8891b42e6 Add referral code 2021-02-12 19:34:12 -05:00
52f602498e Update README.md 2021-01-31 14:15:18 -05:00
9279c68d69 Update README.md 2021-01-31 14:14:07 -05:00
45e5f586dd Update README.md 2021-01-31 14:12:19 -05:00
9d532f3ac5 Update README.md 2021-01-31 14:11:03 -05:00
ce7031e873 Update README.md 2021-01-31 14:10:00 -05:00
8492cdc3a2 Update README.md 2021-01-31 14:09:28 -05:00
b22e84887e Improve argument handling 2021-01-31 11:33:31 -05:00
bfc2822a35 Rename variable for clarity 2021-01-31 11:11:38 -05:00
dfe15f8e78 Improve command line argument processing 2021-01-31 11:10:23 -05:00
8a27a77579 Merge pull request #15 from gort818/master
Add short options to arguments
2021-01-31 09:46:31 -05:00
28edb3393e Add short options to arguments 2021-01-30 20:01:06 -08:00
978e0adc92 Remove unused variable 2021-01-30 15:00:20 -05:00
1ae2d6e4b4 zsh compatibility 2021-01-30 14:45:38 -05:00
ae7c407b19 Add referral code 2021-01-30 14:37:41 -05:00
5caea10a6b Add more contributors <3 2021-01-30 14:35:54 -05:00
c6b56ac98b Update README.md 2021-01-30 14:35:30 -05:00
407db0bbcf Rename function 2021-01-30 14:32:41 -05:00
70f282d012 Add command line arguments 2021-01-30 14:32:16 -05:00
0018591192 Merge pull request #13 from victort/argumentative
added --help, help verbage, and structure for future argument handling.
2021-01-30 13:49:41 -05:00
e3d6e4db68 Merge pull request #14 from gort818/master
Remove superfluous if/then statments for XDG base dirs
2021-01-30 13:47:54 -05:00
ca2ce556aa Re-add comment 2021-01-30 13:45:35 -05:00
8e922ae0ef Remove superfluous if/then statments for XDG base dits 2021-01-28 21:26:17 -08:00
1d4ff8375e subtraction of abstraction 2021-01-28 17:50:58 -08:00
8bd3a165de added --help, help verbage, and structure for future argument handling. 2021-01-28 17:11:03 -08:00
2 changed files with 309 additions and 79 deletions

View File

@ -1,13 +1,15 @@
# LUG-Helper # LUG-Helper
**Star Citizen's Linux Users Group Helper Script** **Star Citizen's Linux Users Group Helper Script**
https://robertsspaceindustries.com/orgs/LUG https://robertsspaceindustries.com/orgs/LUG
*Greetings, fellow Penguin!* ### *Greetings, fellow Penguin!*
_**This script is designed to help you manage and optimize Star Citizen on Linux.**_
This script is designed to help you manage and optimize Star Citizen on Linux. Zenity menus are used for a GUI experience with a fallback to terminal-based menus where Zenity is unavailable.
Command line arguments are available for quickly launching functions from the terminal.
Zenity menus are used for a GUI experience with a fallback to terminal-based menus where Zenity is unavailable. The game directory paths provided by the user on first run are saved in *$XDG_CONFIG_HOME/starcitizen-lug/*. Keybinds are backed up to *$XDG_CONFIG_HOME/starcitizen-lug/keybinds/* Configuration is saved in *$XDG_CONFIG_HOME/starcitizen-lug/*.
Keybinds are backed up to *$XDG_CONFIG_HOME/starcitizen-lug/keybinds/*
## Options: ## Options:
@ -21,7 +23,7 @@ Zenity menus are used for a GUI experience with a fallback to terminal-based men
`Manage Lutris Runners` `Manage Lutris Runners`
- Quickly install and delete Lutris wine runners - Quickly install and delete Lutris wine runners
`User Folder Maintenance and Troubleshooting` `Maintenance and Troubleshooting`
- `Switch the helper between LIVE and PTU` - `Switch the helper between LIVE and PTU`
- Toggle between targeting LIVE or PTU for all of the above options. Defaults to LIVE on each run. - Toggle between targeting LIVE or PTU for all of the above options. Defaults to LIVE on each run.
@ -32,12 +34,15 @@ Zenity menus are used for a GUI experience with a fallback to terminal-based men
- To re-import your keybinds from within the game, select them from the list: - To re-import your keybinds from within the game, select them from the list:
- *Options->Keybindings->Control Profiles* - *Options->Keybindings->Control Profiles*
- `Delete my shaders only` - `Delete my shaders folder only`
- Sometimes all you need to do between major version updates is delete your shaders directory. - Sometimes all you need to do between major version updates is delete your shaders directory.
- `Delete my DXVK cache` - `Delete my DXVK cache`
- A troubleshooting step that sometimes helps fix various issues and crashes. - A troubleshooting step that sometimes helps fix various issues and crashes.
- `Display Helper and Star Citizen directories`
- Show all the directories currently in use by both the Helper and Star Citizen.
- `Reset Helper configs` - `Reset Helper configs`
- Delete the configs saved by the helper in *$XDG_CONFIG_HOME/starcitizen-lug/* - Delete the configs saved by the helper in *$XDG_CONFIG_HOME/starcitizen-lug/*
@ -58,4 +63,7 @@ Arch Linux: https://aur.archlinux.org/packages/lug-helper/
## Contributors: ## Contributors:
- https://github.com/Termuellinator - https://github.com/Termuellinator
- https://github.com/pstn - https://github.com/pstn
- https://github.com/gort818
- https://github.com/victort
- https://github.com/Wrzlprnft
- Runner Downloader inspired by https://github.com/richardtatum/sc-runner-updater - Runner Downloader inspired by https://github.com/richardtatum/sc-runner-updater

View File

@ -41,10 +41,19 @@
# Author: https://github.com/the-sane # Author: https://github.com/the-sane
# Contributor: https://github.com/Termuellinator # Contributor: https://github.com/Termuellinator
# Contributor: https://github.com/pstn # Contributor: https://github.com/pstn
# Contributor: https://github.com/gort818
# Contributor: https://github.com/victort
# Contributor: https://github.com/Wrzlprnft
# Runner Downloader inspired by: # Runner Downloader inspired by:
# https://github.com/richardtatum/sc-runner-updater # https://github.com/richardtatum/sc-runner-updater
############################################################################ ############################################################################
# Check if script is run as root
if [ "$(id -u)" -eq 0 ]; then
echo "This script is not supposed to be run as root!"
exit 1
fi
# Check for dependencies # Check for dependencies
if [ ! -x "$(command -v curl)" ]; then if [ ! -x "$(command -v curl)" ]; then
# Print to stderr and also try warning the user through notify-send # Print to stderr and also try warning the user through notify-send
@ -61,19 +70,10 @@ fi
wine_conf="winedir.conf" wine_conf="winedir.conf"
game_conf="gamedir.conf" game_conf="gamedir.conf"
backup_conf="backupdir.conf"
# Use XDG base directories if defined # Use XDG base directories if defined
if [ -z "$XDG_CONFIG_HOME" ]; then conf_dir="${XDG_CONFIG_HOME:-$HOME/.config}"
conf_dir="$HOME/.config" data_dir="${XDG_DATA_HOME:-$HOME/.local/share}"
else
conf_dir="$XDG_CONFIG_HOME"
fi
if [ -z "$XDG_DATA_HOME" ]; then
data_dir="$HOME/.local/share"
else
data_dir="$XDG_DATA_HOME"
fi
# .config subdirectory # .config subdirectory
conf_subdir="starcitizen-lug" conf_subdir="starcitizen-lug"
@ -82,12 +82,20 @@ conf_subdir="starcitizen-lug"
tmp_dir="$(mktemp -d --suffix=".lughelper")" tmp_dir="$(mktemp -d --suffix=".lughelper")"
trap 'rm -r "$tmp_dir"' EXIT trap 'rm -r "$tmp_dir"' EXIT
# The game's user subdirectory name ######## Game Directories ##################################################
user_subdir_name="USER"
# The location within the USER directory to which the game exports keybinds
keybinds_export_path="Controls/Mappings"
dxvk_cache_file="StarCitizen.dxvk-cache" # The game's base directory name
sc_base_dir="StarCitizen"
# The default install location within a WINE prefix:
install_path="drive_c/Program Files/Roberts Space Industries/$sc_base_dir"
# The names of the live/ptu directories
live_dir="LIVE"
ptu_dir="PTU"
# Remaining directory paths are set at the end of the getdirs() function
############################################################################
# Lutris wine runners directory # Lutris wine runners directory
runners_dir="$data_dir/lutris/runners/wine" runners_dir="$data_dir/lutris/runners/wine"
@ -99,6 +107,8 @@ runners_dir="$data_dir/lutris/runners/wine"
runner_sources=( runner_sources=(
"RawFox" "https://api.github.com/repos/rawfoxDE/raw-wine/releases" "RawFox" "https://api.github.com/repos/rawfoxDE/raw-wine/releases"
"Molotov/Snatella" "https://api.github.com/repos/snatella/wine-runner-sc/releases" "Molotov/Snatella" "https://api.github.com/repos/snatella/wine-runner-sc/releases"
"/dev/null" "https://api.github.com/repos/gort818/wine-sc-lug/releases"
"GloriousEggroll" "https://api.github.com/repos/GloriousEggroll/wine-ge-custom/releases"
) )
# Set a maximum number of runner versions to display from each url # Set a maximum number of runner versions to display from each url
max_runners=20 max_runners=20
@ -117,6 +127,11 @@ else
lug_logo="info" lug_logo="info"
fi fi
# Github repo and script version info
repo="the-sane/lug-helper"
releases_url="https://github.com/the-sane/lug-helper/releases"
current_version="v1.10"
############################################################################ ############################################################################
############################################################################ ############################################################################
@ -164,7 +179,7 @@ message() {
fi fi
# Use zenity messages if available # Use zenity messages if available
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
case "$1" in case "$1" in
"info") "info")
# info message # info message
@ -249,6 +264,7 @@ message() {
# This text will be displayed above the menu options. # This text will be displayed above the menu options.
# Zenity supports Pango Markup for text formatting. # Zenity supports Pango Markup for text formatting.
# - The integer "menu_height" specifies the height of the zenity menu. # - The integer "menu_height" specifies the height of the zenity menu.
# - The string "cancel_label" should contain the text of the cancel button.
# #
# The final element in each array is expected to be a quit option. # The final element in each array is expected to be a quit option.
# #
@ -270,10 +286,12 @@ menu() {
debug_print exit "Script error: The string 'menu_text_terminal' was not set\nbefore calling the menu function. Aborting." debug_print exit "Script error: The string 'menu_text_terminal' was not set\nbefore calling the menu function. Aborting."
elif [ -z "$menu_height" ]; then elif [ -z "$menu_height" ]; then
debug_print exit "Script error: The string 'menu_height' was not set\nbefore calling the menu function. Aborting." debug_print exit "Script error: The string 'menu_height' was not set\nbefore calling the menu function. Aborting."
elif [ -z "$cancel_label" ]; then
debug_print exit "Script error: The string 'menu_height' was not set\nbefore calling the menu function. Aborting."
fi fi
# Use Zenity if it is available # Use Zenity if it is available
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
# Format the options array for Zenity by adding # Format the options array for Zenity by adding
# TRUE or FALSE to indicate default selections # TRUE or FALSE to indicate default selections
# ie: "TRUE" "List item 1" "FALSE" "List item 2" "FALSE" "List item 3" # ie: "TRUE" "List item 1" "FALSE" "List item 2" "FALSE" "List item 3"
@ -289,7 +307,7 @@ menu() {
done done
# Display the zenity radio button menu # Display the zenity radio button menu
choice="$(zenity --list --radiolist --width="480" --height="$menu_height" --text="$menu_text_zenity" --title="Star Citizen LUG Helper" --hide-header --window-icon=$lug_logo --column="" --column="Option" "${zen_options[@]}" 2>/dev/null)" choice="$(zenity --list --radiolist --width="480" --height="$menu_height" --text="$menu_text_zenity" --title="Star Citizen LUG Helper" --hide-header --cancel-label "$cancel_label" --window-icon=$lug_logo --column="" --column="Option" "${zen_options[@]}" 2>/dev/null)"
# Loop through the options array to match the chosen option # Loop through the options array to match the chosen option
matched="false" matched="false"
@ -367,7 +385,7 @@ getdirs() {
fi fi
if [ -f "$conf_dir/$conf_subdir/$game_conf" ]; then if [ -f "$conf_dir/$conf_subdir/$game_conf" ]; then
game_path="$(cat "$conf_dir/$conf_subdir/$game_conf")" game_path="$(cat "$conf_dir/$conf_subdir/$game_conf")"
if [ ! -d "$game_path" ] || [ "$(basename "$game_path")" != "StarCitizen" ]; then if [ ! -d "$game_path" ] || [ "$(basename "$game_path")" != "$sc_base_dir" ]; then
debug_print continue "Unexpected game path found in config file, ignoring." debug_print continue "Unexpected game path found in config file, ignoring."
game_path="" game_path=""
fi fi
@ -377,7 +395,7 @@ getdirs() {
# ask the user to provide them # ask the user to provide them
if [ -z "$wine_prefix" ] || [ -z "$game_path" ]; then if [ -z "$wine_prefix" ] || [ -z "$game_path" ]; then
message info "At the next screen, please select your Star Citizen WINE prefix.\nIt will be remembered for future use." message info "At the next screen, please select your Star Citizen WINE prefix.\nIt will be remembered for future use."
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
# Using Zenity file selection menus # Using Zenity file selection menus
# Get the wine prefix directory # Get the wine prefix directory
if [ -z "$wine_prefix" ]; then if [ -z "$wine_prefix" ]; then
@ -394,15 +412,15 @@ getdirs() {
# Get the game path # Get the game path
if [ -z "$game_path" ]; then if [ -z "$game_path" ]; then
if [ -d "$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" ] && if [ -d "$wine_prefix/$install_path" ] &&
message question "Is this your Star Citizen game directory?\n\n$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen"; then message question "Is this your Star Citizen game directory?\n\n$wine_prefix/$install_path"; then
game_path="$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" game_path="$wine_prefix/$install_path"
else else
while game_path="$(zenity --file-selection --directory --title="Select your Star Citizen directory" --filename="$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" 2>/dev/null)"; do while game_path="$(zenity --file-selection --directory --title="Select your Star Citizen directory" --filename="$wine_prefix/$install_path" 2>/dev/null)"; do
if [ "$?" -eq -1 ]; then if [ "$?" -eq -1 ]; then
message warning "An unexpected error has occurred. The Helper is unable to proceed." message warning "An unexpected error has occurred. The Helper is unable to proceed."
return 1 return 1
elif [ "$(basename "$game_path")" != "StarCitizen" ]; then elif [ "$(basename "$game_path")" != "$sc_base_dir" ]; then
message warning "You must select the Star Citizen base game directory.\n\nFor Example: prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" message warning "You must select the Star Citizen base game directory.\n\nFor Example: prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen"
else else
# All good or cancel # All good or cancel
@ -435,17 +453,17 @@ getdirs() {
# Get the game path # Get the game path
if [ -z "$game_path" ]; then if [ -z "$game_path" ]; then
if [ -d "$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" ] && if [ -d "$wine_prefix/$install_path" ] &&
message question "Is this your Star Citizen game directory?\n\n$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen"; then message question "Is this your Star Citizen game directory?\n\n$wine_prefix/$install_path"; then
game_path="$wine_prefix/drive_c/Program Files/Roberts Space Industries/StarCitizen" game_path="$wine_prefix/$install_path"
else else
printf "\nEnter the full path to your Star Citizen installation directory (case sensitive)\n" printf "\nEnter the full path to your Star Citizen installation directory (case sensitive)\n"
printf "ie. /home/USER/Games/star-citizen/drive_c/Program Files/Roberts Space Industries/StarCitizen\n" printf "ie. /home/USER/Games/star-citizen/drive_c/Program Files/Roberts Space Industries/StarCitizen\n"
while read -rp ": " game_path; do while read -rp ": " game_path; do
if [ ! -d "$game_path" ]; then if [ ! -d "$game_path" ]; then
printf "That directory is invalid or does not exist. Please try again.\n\n" printf "That directory is invalid or does not exist. Please try again.\n\n"
elif [ "$(basename "$game_path")" != "StarCitizen" ]; then elif [ "$(basename "$game_path")" != "$sc_base_dir" ]; then
printf "You must enter the full path to the directory named 'StarCitizen'\n\n" printf "You must enter the full path to the directory named '$sc_base_dir'\n\n"
else else
break break
fi fi
@ -459,12 +477,52 @@ getdirs() {
echo "$game_path" > "$conf_dir/$conf_subdir/$game_conf" echo "$game_path" > "$conf_dir/$conf_subdir/$game_conf"
fi fi
# Set some remaining directory paths ######## Set remaining directory paths #####################################
user_dir="$game_path/$live_or_ptu/$user_subdir_name" # $live_or_ptu is set in the set_version() function
keybinds_dir="$user_dir/$keybinds_export_path" ############################################################################
# The game's user directory
user_dir="$game_path/$live_or_ptu/USER/Client/0"
# The location within the USER directory to which the game exports keybinds
keybinds_dir="$user_dir/Controls/Mappings"
# Shaders directory
shaders_dir="$user_dir/shaders"
# dxvk cache file
dxvk_cache="$game_path/$live_or_ptu/StarCitizen.dxvk-cache"
# Where to store backed up keybinds
backup_path="$conf_dir/$conf_subdir" backup_path="$conf_dir/$conf_subdir"
} }
# Display all directories currently used by this helper and Star Citizen
display_dirs() {
# Helper configs and keybinds
if [ -d "$conf_dir/$conf_subdir" ]; then
dirs_list+=("\n\nHelper configuration:\n$conf_dir/$conf_subdir\n\nKeybind backups:\n$conf_dir/$conf_subdir/keybinds")
fi
# Wine prefix
if [ -f "$conf_dir/$conf_subdir/$wine_conf" ]; then
dirs_list+="\n\nWine prefix:\n$(cat "$conf_dir/$conf_subdir/$wine_conf")"
fi
# Star Citizen installation
if [ -f "$conf_dir/$conf_subdir/$game_conf" ]; then
dirs_list+="\n\nStar Citizen game directory:\n$(cat "$conf_dir/$conf_subdir/$game_conf")"
fi
# Lutris runners
if [ -d "$runners_dir" ]; then
dirs_list+="\n\nLutris Runners:\n$runners_dir"
fi
# Formatting
message_heading="These directories are currently being used by this Helper and Star Citizen"
if [ "$use_zenity" -eq 1 ]; then
message_heading="<b>$message_heading</b>"
fi
message info "$message_heading\n${dirs_list[@]}"
}
# Save exported keybinds, wipe the USER directory, and restore keybinds # Save exported keybinds, wipe the USER directory, and restore keybinds
sanitize() { sanitize() {
# Prompt user to back up the current keybinds in the game # Prompt user to back up the current keybinds in the game
@ -518,6 +576,7 @@ sanitize() {
fi fi
} }
#--------------------- begin preflight check functions -----------------------#
#------------------------- begin mapcount functions --------------------------# #------------------------- begin mapcount functions --------------------------#
# Check if setting vm.max_map_count was successful # Check if setting vm.max_map_count was successful
@ -644,17 +703,27 @@ filelimit_check() {
#------------------------- end filelimit functions ---------------------------# #------------------------- end filelimit functions ---------------------------#
# Check total system memory # Check total system memory
memory_check() { memory_check() {
memtotal="$(awk '/MemTotal/ {printf "%.1f \n", $2/1024/1024}' /proc/meminfo)" memtotal="$(LC_NUMERIC=C awk '/MemTotal/ {printf "%.1f \n", $2/1024/1024}' /proc/meminfo)"
if awk 'BEGIN {exit !("$memtotal" < 15)}'; then if [ ${memtotal%.*} -ge "15" ]; then
preflight_pass+=("Your system has $memtotal GB of memory.") preflight_pass+=("Your system has $memtotal GB of memory.")
else else
preflight_fail+=("Your system has $memtotal GB of memory.\nWe recommend at least 16 GB to avoid crashes.") preflight_fail+=("Your system has $memtotal GB of memory.\nWe recommend at least 16 GB to avoid crashes.")
fi fi
} }
# Check CPU for the required AVX extension
avx_check() {
if grep -q "avx" /proc/cpuinfo; then
preflight_pass+=("Your CPU supports the necessary AVX instruction set.")
else
preflight_fail+=("Your CPU does not appear to support AVX instructions.\nThis requirement was added to Star Citizen in version 3.11")
fi
}
#------------------------- end preflight check functions ---------------------#
# Delete the shaders directory # Delete the shaders directory
rm_shaders() { rm_shaders() {
# Get/Set directory paths # Get/Set directory paths
@ -664,8 +733,6 @@ rm_shaders() {
return 0 return 0
fi fi
shaders_dir="$user_dir/shaders"
# Sanity check # Sanity check
if [ ! -d "$shaders_dir" ]; then if [ ! -d "$shaders_dir" ]; then
message warning "Shaders directory not found. There is nothing to delete!\n\n$shaders_dir" message warning "Shaders directory not found. There is nothing to delete!\n\n$shaders_dir"
@ -681,7 +748,7 @@ rm_shaders() {
} }
# Delete DXVK cache # Delete DXVK cache
rm_vidcache() { rm_dxvkcache() {
# Get/Set directory paths # Get/Set directory paths
getdirs getdirs
if [ "$?" -eq 1 ]; then if [ "$?" -eq 1 ]; then
@ -690,8 +757,6 @@ rm_vidcache() {
return 0 return 0
fi fi
dxvk_cache="$game_path/$live_or_ptu/$dxvk_cache_file"
# Sanity check # Sanity check
if [ ! -f "$dxvk_cache" ]; then if [ ! -f "$dxvk_cache" ]; then
message warning "Unable to find the DXVK cache file. There is nothing to delete!\n\n$dxvk_cache" message warning "Unable to find the DXVK cache file. There is nothing to delete!\n\n$dxvk_cache"
@ -764,11 +829,14 @@ runner_select_delete() {
menu_actions+=(":") # no-op menu_actions+=(":") # no-op
# Calculate the total height the menu should be # Calculate the total height the menu should be
menu_height="$(("$menu_option_height" * "${#menu_options[@]}" + "$menu_text_height"))" menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
if [ "$menu_height" -gt "400" ]; then if [ "$menu_height" -gt "400" ]; then
menu_height="400" menu_height="400"
fi fi
# Set the label for the cancel button
cancel_label="Go Back"
# Call the menu function. It will use the options as configured above # Call the menu function. It will use the options as configured above
menu menu
} }
@ -796,6 +864,9 @@ runner_install() {
*.tgz) *.tgz)
runner_name="$(basename "$runner_file" .tgz)" runner_name="$(basename "$runner_file" .tgz)"
;; ;;
*.tar.xz)
runner_name="$(basename "$runner_file" .tar.xz)"
;;
*) *)
debug_print exit "Unknown archive filetype in runner_install function. Aborting." debug_print exit "Unknown archive filetype in runner_install function. Aborting."
;; ;;
@ -818,7 +889,7 @@ runner_install() {
# Download the runner to the tmp directory # Download the runner to the tmp directory
debug_print continue "Downloading $runner_dl_url into $tmp_dir/$runner_file..." debug_print continue "Downloading $runner_dl_url into $tmp_dir/$runner_file..."
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
# Format the curl progress bar for zenity # Format the curl progress bar for zenity
mkfifo "$tmp_dir/lugpipe" mkfifo "$tmp_dir/lugpipe"
cd "$tmp_dir" && curl -#LO "$runner_dl_url" > "$tmp_dir/lugpipe" 2>&1 & curlpid="$!" cd "$tmp_dir" && curl -#LO "$runner_dl_url" > "$tmp_dir/lugpipe" 2>&1 & curlpid="$!"
@ -850,31 +921,31 @@ runner_install() {
# Get the path of the first item listed in the archive # Get the path of the first item listed in the archive
# This should either be a subdirectory or the path ./ # This should either be a subdirectory or the path ./
# depending on how the archive was created # depending on how the archive was created
first_filepath="$(stdbuf -oL tar -tzf "$tmp_dir/$runner_file" | head -n 1)" first_filepath="$(stdbuf -oL tar -tf "$tmp_dir/$runner_file" | head -n 1)"
# Extract the runner # Extract the runner
case "$first_filepath" in case "$first_filepath" in
# If the files in the archive begin with ./ there is no subdirectory # If the files in the archive begin with ./ there is no subdirectory
./*) ./*)
debug_print continue "Installing runner into $runners_dir/$runner_name..." debug_print continue "Installing runner into $runners_dir/$runner_name..."
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar # Use Zenity progress bar
mkdir -p "$runners_dir/$runner_name" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name" | \ mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name" | \
zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null
else else
mkdir -p "$runners_dir/$runner_name" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name" mkdir -p "$runners_dir/$runner_name" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir/$runner_name"
fi fi
lutris_needs_restart="true" lutris_needs_restart="true"
;; ;;
*) *)
# Runners with a subdirectory in the archive # Runners with a subdirectory in the archive
debug_print continue "Installing runner into $runners_dir..." debug_print continue "Installing runner into $runners_dir..."
if [ "$has_zen" -eq 1 ]; then if [ "$use_zenity" -eq 1 ]; then
# Use Zenity progress bar # Use Zenity progress bar
mkdir -p "$runners_dir" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir" | \ mkdir -p "$runners_dir" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir" | \
zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null zenity --progress --pulsate --no-cancel --auto-close --title="Star Citizen LUG Helper" --text="Installing runner...\n" 2>/dev/null
else else
mkdir -p "$runners_dir" && tar -xzf "$tmp_dir/$runner_file" -C "$runners_dir" mkdir -p "$runners_dir" && tar -xf "$tmp_dir/$runner_file" -C "$runners_dir"
fi fi
lutris_needs_restart="true" lutris_needs_restart="true"
;; ;;
@ -893,7 +964,8 @@ runner_select_install() {
debug_print exit "Script error: The runner_select_install function expects a numerical argument. Aborting." debug_print exit "Script error: The runner_select_install function expects a numerical argument. Aborting."
fi fi
# Store the url from the selected contributor # Store info from the selected contributor
contributor_name="${runner_sources[$1]}"
contributor_url="${runner_sources[$1+1]}" contributor_url="${runner_sources[$1+1]}"
# Check the provided contributor url to make sure we know how to handle it # Check the provided contributor url to make sure we know how to handle it
@ -908,11 +980,22 @@ runner_select_install() {
;; ;;
esac esac
# Check GlibC version against the requirements of the selected runner
if [ "$contributor_name" = "/dev/null" ]; then
required_glibc="2.33"
system_glibc="$(ldd --version | awk '/ldd/{print $NF}')"
if [ "$(bc <<< "$required_glibc > $system_glibc")" = "1" ]; then
message warning "Your glibc version is incompatible with the selected runner.\n\nSystem glibc: v$system_glibc\nMinimum required glibc: v$required_glibc"
return 1
fi
fi
# Fetch a list of runner versions from the selected contributor # Fetch a list of runner versions from the selected contributor
# To add new sources, handle them here, in the if statement # To add new sources, handle them here, in the if statement
# just above, and the runner_install function above # just above, and the runner_install function above
if [ "$runner_url_type" = "github" ]; then if [ "$runner_url_type" = "github" ]; then
runner_versions=($(curl -s "$contributor_url" | awk '/browser_download_url/ {print $2}' | xargs basename -a)) runner_versions=($(curl -s "$contributor_url" | awk '/browser_download_url/ {print $2}' | grep -vE "*.sha512sum" | xargs basename -a))
else else
debug_print exit "Script error: Unknown api/url format in runner_sources array. Aborting." debug_print exit "Script error: Unknown api/url format in runner_sources array. Aborting."
fi fi
@ -944,6 +1027,9 @@ runner_select_install() {
*.tgz) *.tgz)
runner_name="$(basename "${runner_versions[i]}" .tgz)" runner_name="$(basename "${runner_versions[i]}" .tgz)"
;; ;;
*.tar.xz)
runner_name="$(basename "${runner_versions[i]}" .tar.xz)"
;;
*) *)
debug_print exit "Unknown archive filetype in runner_select_install function. Aborting." debug_print exit "Unknown archive filetype in runner_select_install function. Aborting."
;; ;;
@ -963,11 +1049,14 @@ runner_select_install() {
menu_actions+=(":") # no-op menu_actions+=(":") # no-op
# Calculate the total height the menu should be # Calculate the total height the menu should be
menu_height="$(("$menu_option_height" * "${#menu_options[@]}" + "$menu_text_height"))" menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
if [ "$menu_height" -gt "400" ]; then if [ "$menu_height" -gt "400" ]; then
menu_height="400" menu_height="400"
fi fi
# Set the label for the cancel button
cancel_label="Go Back"
# Call the menu function. It will use the options as configured above # Call the menu function. It will use the options as configured above
menu menu
} }
@ -1013,7 +1102,10 @@ runner_manage() {
menu_actions+=("runner_select_delete" "menu_loop_done") menu_actions+=("runner_select_delete" "menu_loop_done")
# Calculate the total height the menu should be # Calculate the total height the menu should be
menu_height="$(("$menu_option_height" * "${#menu_options[@]}" + "$menu_text_height"))" menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
# Set the label for the cancel button
cancel_label="Go Back"
# Call the menu function. It will use the options as configured above # Call the menu function. It will use the options as configured above
menu menu
@ -1038,6 +1130,7 @@ preflight_check() {
# Call the optimization functions to perform the checks # Call the optimization functions to perform the checks
memory_check memory_check
avx_check
mapcount_check mapcount_check
filelimit_check filelimit_check
@ -1072,7 +1165,13 @@ preflight_check() {
# Display the results of the preflight check # Display the results of the preflight check
if [ -z "$preflight_fail_string" ]; then if [ -z "$preflight_fail_string" ]; then
message info "Preflight Check Complete\n\nYour system is optimized for Star Citizen!\n\n$preflight_pass_string" # Formatting
message_heading="Preflight Check Complete"
if [ "$use_zenity" -eq 1 ]; then
message_heading="<b>$message_heading</b>"
fi
message info "$message_heading\n\nYour system is optimized for Star Citizen!\n\n$preflight_pass_string"
else else
if [ -z "$preflight_action_funcs" ]; then if [ -z "$preflight_action_funcs" ]; then
message warning "$preflight_pass_string$preflight_fail_string" message warning "$preflight_pass_string$preflight_fail_string"
@ -1141,16 +1240,20 @@ maintenance_menu() {
sanitize_msg="Delete my Star Citizen USER folder and preserve my keybinds" sanitize_msg="Delete my Star Citizen USER folder and preserve my keybinds"
shaders_msg="Delete my shaders folder only (Do this after each game update)" shaders_msg="Delete my shaders folder only (Do this after each game update)"
vidcache_msg="Delete my DXVK cache" vidcache_msg="Delete my DXVK cache"
dirs_msg="Display Helper and Star Citizen directories"
reset_msg="Reset Helper configs" reset_msg="Reset Helper configs"
quit_msg="Return to the main menu" quit_msg="Return to the main menu"
# Set the options to be displayed in the menu # Set the options to be displayed in the menu
menu_options=("$version_msg" "$sanitize_msg" "$shaders_msg" "$vidcache_msg" "$reset_msg" "$quit_msg") menu_options=("$version_msg" "$sanitize_msg" "$shaders_msg" "$vidcache_msg" "$dirs_msg" "$reset_msg" "$quit_msg")
# Set the corresponding functions to be called for each of the options # Set the corresponding functions to be called for each of the options
menu_actions=("set_version" "sanitize" "rm_shaders" "rm_vidcache" "reset_helper" "menu_loop_done") menu_actions=("set_version" "sanitize" "rm_shaders" "rm_dxvkcache" "display_dirs" "reset_helper" "menu_loop_done")
# Calculate the total height the menu should be # Calculate the total height the menu should be
menu_height="$(("$menu_option_height" * "${#menu_options[@]}" + "$menu_text_height"))" menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
# Set the label for the cancel button
cancel_label="Go Back"
# Call the menu function. It will use the options as configured above # Call the menu function. It will use the options as configured above
menu menu
@ -1160,7 +1263,7 @@ maintenance_menu() {
# Get a random Penguin's Star Citizen referral code # Get a random Penguin's Star Citizen referral code
referral_randomizer() { referral_randomizer() {
# Populate the referral codes array # Populate the referral codes array
referral_codes=("STAR-4TZD-6KMM" "STAR-4XM2-VM99" "STAR-2NPY-FCR2" "STAR-T9Z9-7W6P" "STAR-VLBF-W2QR" "STAR-BYR6-YHMF" "STAR-3X2H-VZMX" "STAR-BRWN-FB9T" "STAR-FG6Y-N4Q4" "STAR-VLD6-VZRG" "STAR-T9KF-LV77" "STAR-4XHB-R7RF" "STAR-9NVF-MRN7" "STAR-3Q4W-9TC3" "STAR-3SBK-7QTT" "STAR-XFBT-9TTK" "STAR-F3H9-YPHN" "STAR-BYK6-RCCL" "STAR-XCKH-W6T7" "STAR-H292-39WK" "STAR-ZRT5-PJB7" "STAR-GMBP-SH9Y") referral_codes=("STAR-4TZD-6KMM" "STAR-4XM2-VM99" "STAR-2NPY-FCR2" "STAR-T9Z9-7W6P" "STAR-VLBF-W2QR" "STAR-BYR6-YHMF" "STAR-3X2H-VZMX" "STAR-BRWN-FB9T" "STAR-FG6Y-N4Q4" "STAR-VLD6-VZRG" "STAR-T9KF-LV77" "STAR-4XHB-R7RF" "STAR-9NVF-MRN7" "STAR-3Q4W-9TC3" "STAR-3SBK-7QTT" "STAR-XFBT-9TTK" "STAR-F3H9-YPHN" "STAR-BYK6-RCCL" "STAR-XCKH-W6T7" "STAR-H292-39WK" "STAR-ZRT5-PJB7" "STAR-GMBP-SH9Y" "STAR-PLWB-LMFY" "STAR-TNZN-H4ZT" "STAR-T5G5-L2GJ" "STAR-6TPV-7QH2" "STAR-THHD-TV3Y" "STAR-7ZFS-PK2L" "STAR-SRQN-43TB" "STAR-9TDG-D4H9" "STAR-BPH3-THJC" "STAR-HL3M-R5KC" "STAR-GBS5-LTVB" "STAR-CJ3Y-KZZ4" "STAR-5GRM-7HBY" "STAR-G2GX-Y2QJ" "STAR-YWY3-H4XX" "STAR-6VGM-PTKC" "STAR-T6MZ-QFHX" "STAR-T2K6-LXFW" "STAR-XN25-9CJJ" "STAR-47V3-4QGB")
# Pick a random array element. Scale a floating point number for # Pick a random array element. Scale a floating point number for
# a more random distribution than simply calling RANDOM # a more random distribution than simply calling RANDOM
random_code="${referral_codes[$(awk '{srand($2); print int(rand()*$1)}' <<< "${#referral_codes[@]} $RANDOM")]}" random_code="${referral_codes[$(awk '{srand($2); print int(rand()*$1)}' <<< "${#referral_codes[@]} $RANDOM")]}"
@ -1170,15 +1273,15 @@ referral_randomizer() {
# Toggle between the LIVE and PTU game directories for all Helper functions # Toggle between the LIVE and PTU game directories for all Helper functions
set_version() { set_version() {
if [ "$live_or_ptu" = "LIVE" ]; then if [ "$live_or_ptu" = "$live_dir" ]; then
live_or_ptu="PTU" live_or_ptu="$ptu_dir"
message info "The Helper will now target your Star Citizen PTU installation." message info "The Helper will now target your Star Citizen PTU installation."
elif [ "$live_or_ptu" = "PTU" ]; then elif [ "$live_or_ptu" = "$ptu_dir" ]; then
live_or_ptu="LIVE" live_or_ptu="$live_dir"
message info "The Helper will now target your Star Citizen LIVE installation." message info "The Helper will now target your Star Citizen LIVE installation."
else else
debug_print continue "Unexpected game version provided. Defaulting to the LIVE installation." debug_print continue "Unexpected game version provided. Defaulting to the LIVE installation."
live_or_ptu="LIVE" live_or_ptu="$live_dir"
fi fi
} }
@ -1192,6 +1295,19 @@ reset_helper() {
fi fi
} }
# Get the latest release version of a repo. Expects "user/repo_name" as input
# Credits for this go to https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c
get_latest_release() {
# Sanity check
if [ "$#" -lt 1 ]; then
debug_print exit "Script error: The get_latest_release function expects one argument. Aborting."
fi
curl --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
grep '"tag_name":' | # Get tag line
sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
}
quit() { quit() {
exit 0 exit 0
} }
@ -1202,15 +1318,118 @@ quit() {
############################################################################ ############################################################################
# Check if Zenity is available # Check if Zenity is available
has_zen=0 use_zenity=0
if [ -x "$(command -v zenity)" ]; then if [ -x "$(command -v zenity)" ]; then
has_zen=1 use_zenity=1
fi fi
# Set some defaults # Set some defaults
live_or_ptu="LIVE" live_or_ptu="$live_dir"
lutris_needs_restart="false" lutris_needs_restart="false"
# Check if a newer verison of the script is available
latest_version="$(get_latest_release "$repo")"
if [ "$latest_version" != "$current_version" ]; then
if [ "$use_zenity" -eq 1 ]; then
releases_url_formatted="<a href='$releases_url'>$releases_url</a>"
else
releases_url_formatted="$releases_url"
fi
message info "The latest version of the LUG Helper is $latest_version\nYou are using $current_version\n\nYou can download new releases here:\n$releases_url_formatted"
fi
# If invoked with command line arguments, process them and exit
if [ "$#" -gt 0 ]; then
while [ "$#" -gt 0 ]
do
# Victor_Tramp expects the spanish inquisition.
case "$1" in
--help | -h )
printf "Star Citizen Linux Users Group Helper Script
Usage: lug-helper <options>
-p, --preflight-check Run system optimization checks
-m, --manage-runners Install or remove Lutris runners
-u, --delete-user-folder Delete Star Citizen USER folder, preserving keybinds
-s, --delete-shaders Delete Star Citizen shaders directory
-c, --delete-dxvk-cache Delete Star Citizen dxvk cache file
-t, --target=[live|ptu] Target LIVE or PTU (default live)
-g, --use-gui=[yes|no] Use Zenity GUI if available (default yes)
-r, --get-referral Get a random LUG member's Star Citizen referral code
-d, --show-directories Show all Star Citizen and LUG Helper directories
-x, --reset-helper Delete saved lug-helper configs
"
exit 0
;;
--preflight-check | -p )
cargs+=("preflight_check")
;;
--manage-runners | -m )
cargs+=("runner_manage")
;;
--delete-user-folder | -u )
cargs+=("sanitize")
;;
--delete-shaders | -s )
cargs+=("rm_shaders")
;;
--delete-dxvk-cache | -c )
cargs+=("rm_dxvkcache")
;;
--target=* | -t=* )
live_or_ptu="$(echo "$1" | cut -d'=' -f2)"
if [ "$live_or_ptu" = "live" ] || [ "$live_or_ptu" = "LIVE" ]; then
live_or_ptu="$live_dir"
elif [ "$live_or_ptu" = "ptu" ] || [ "$live_or_ptu" = "PTU" ]; then
live_or_ptu="$ptu_dir"
else
printf "$0: Invalid option '$1'\n"
exit 0
fi
;;
--use-gui=* | -g=* )
# If zenity is unavailable, it has already been set to 0
# and this setting has no effect
if [ -x "$(command -v zenity)" ]; then
use_zenity="$(echo "$1" | cut -d'=' -f2)"
if [ "$use_zenity" = "yes" ] || [ "$use_zenity" = "YES" ] || [ "$use_zenity" = "1" ]; then
use_zenity=1
elif [ "$use_zenity" = "no" ] || [ "$use_zenity" = "NO" ] || [ "$use_zenity" = "0" ]; then
use_zenity=0
else
printf "$0: Invalid option '$1'\n"
exit 0
fi
fi
;;
--get-referral | -r )
cargs+=("referral_randomizer")
;;
--show-directories | -d )
cargs+=("display_dirs")
;;
--reset-helper | -x )
cargs+=("reset_helper")
;;
* )
printf "$0: Invalid option '$1'\n"
exit 0
;;
esac
# Shift forward to the next argument and loop again
shift
done
# Call the requested functions and exit
if [ "${#cargs[@]}" -gt 0 ]; then
for (( i=0; i<"${#cargs[@]}"; i++ )); do
${cargs[i]}
done
exit 0
fi
fi
# Loop the main menu until the user selects quit # Loop the main menu until the user selects quit
while true; do while true; do
# Configure the menu # Configure the menu
@ -1221,7 +1440,7 @@ while true; do
# Configure the menu options # Configure the menu options
preflight_msg="Preflight Check (System Optimization)" preflight_msg="Preflight Check (System Optimization)"
runners_msg="Manage Lutris Runners" runners_msg="Manage Lutris Runners"
maintenance_msg="User Folder Maintenance and Troubleshooting" maintenance_msg="Maintenance and Troubleshooting"
randomizer_msg="Get a random Penguin's Star Citizen referral code" randomizer_msg="Get a random Penguin's Star Citizen referral code"
quit_msg="Quit" quit_msg="Quit"
@ -1231,7 +1450,10 @@ while true; do
menu_actions=("preflight_check" "runner_manage" "maintenance_menu" "referral_randomizer" "quit") menu_actions=("preflight_check" "runner_manage" "maintenance_menu" "referral_randomizer" "quit")
# Calculate the total height the menu should be # Calculate the total height the menu should be
menu_height="$(("$menu_option_height" * "${#menu_options[@]}" + "$menu_text_height"))" menu_height="$(($menu_option_height * ${#menu_options[@]} + $menu_text_height))"
# Set the label for the cancel button
cancel_label="Quit"
# Call the menu function. It will use the options as configured above # Call the menu function. It will use the options as configured above
menu menu