فهرست منبع

Merge branch 'feature/ultimatebyte-0220'

Conflicts:
	lgsm/functions/command_fastdl.sh
	lgsm/functions/core_getopt.sh
Daniel Gibbs 9 سال پیش
والد
کامیت
e4c7e36e69

+ 7 - 0
BladeSymphony/bsserver

@@ -75,6 +75,13 @@ appid="228780"
 # Example: "-beta latest_experimental"
 branch=""
 
+## Github Branch Select
+# Allows for the use of different function files
+# from a different repo and/or branch.
+githubuser="GameServerManagers"
+githubrepo="LinuxGSM"
+githubbranch="master"
+
 ## LinuxGSM Server Details
 # Do not edit
 gamename="Blade Symphony"

+ 3 - 1
lgsm/functions/command_dev_detect_deps.sh

@@ -148,4 +148,6 @@ rm -f "${tmpdir}/.depdetect_ubuntu_list_uniq"
 rm -f "${tmpdir}/.depdetect_readelf"
 
 rm -f "${tmpdir}/.depdetect_unknown"
-rm -f "${tmpdir}/.depdetect_unknown_uniq"
+rm -f "${tmpdir}/.depdetect_unknown_uniq"
+
+core_exit.sh

+ 3 - 1
lgsm/functions/command_dev_detect_glibc.sh

@@ -37,4 +37,6 @@ while IFS= read -r -d $'\0' line; do
 done
 echo ""
 cat "${tmpdir}/detect_glibc.tmp"|sort|uniq|sort -r --version-sort
-rm "${tmpdir}/detect_glibc.tmp"
+rm "${tmpdir}/detect_glibc.tmp"
+
+core_exit.sh

+ 3 - 1
lgsm/functions/command_dev_detect_ldd.sh

@@ -50,4 +50,6 @@ echo "================================="
 cat "${tmpdir}/detect_ldd_not_found.tmp"
 
 rm "${tmpdir}/detect_ldd.tmp"
-rm "${tmpdir}/detect_ldd_not_found.tmp"
+rm "${tmpdir}/detect_ldd_not_found.tmp"
+
+core_exit.sh

+ 367 - 255
lgsm/functions/command_fastdl.sh

@@ -12,7 +12,9 @@ local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))"
 check.sh
 
 # Directories
-webdir="${rootdir}/public_html"
+if [ -z "${webdir}" ]; then
+	webdir="${rootdir}/public_html"
+fi
 fastdldir="${webdir}/fastdl"
 addonsdir="${systemdir}/addons"
 # Server lua autorun dir, used to autorun lua on client connect to the server
@@ -20,302 +22,412 @@ luasvautorundir="${systemdir}/lua/autorun/server"
 luafastdlfile="lgsm_cl_force_fastdl.lua"
 luafastdlfullpath="${luasvautorundir}/${luafastdlfile}"
 
-fn_check_bzip2(){
-	# Returns true if not installed
-	if [ -z "$(command -v bzip2)" ]; then
-		bzip2installed="0"
-		fn_print_info "bzip2 is not installed !"
-		fn_script_log_info "bzip2 is not installed"
-		echo -en "\n"
-		sleep 1
-		echo "We advise using it"
-		echo "For more information, see https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL#bzip2-compression"
-		sleep 2
+# Check if bzip2 is installed
+if [ -z "$(command -v bzip2)" ]; then
+	fn_print_fail "bzip2 is not installed"
+	fn_script_log_fatal "bzip2 is not installed"
+	core_exit.sh
+fi
+
+# Header
+fn_print_header
+echo "More info: https://git.io/vyk9a"
+echo ""
+
+# Prompts user for FastDL creation settings
+echo "${commandaction} setup"
+echo "================================="
+
+# Prompt for clearing old files if directory was already here
+if [ -d "${fastdldir}" ]; then
+	fn_print_warning_nl "FastDL directory already exists."
+	echo "${fastdldir}"
+	echo ""
+	if fn_prompt_yn "Overwrite existing directory?" Y; then
+		fn_script_log_info "Overwrite existing directory: YES"
 	else
-		bzip2installed="1"
+		core_exit.sh
 	fi
-}
+fi
 
-fn_fastdl_init(){
-	# User confirmation
-	fn_print_ok "Welcome to LGSM's FastDL generator"
-	sleep 1
-	echo -en "\n"
-	fn_script_log "Started FastDL creation"
-	if ! fn_prompt_yn "Continue?" Y; then
-		exit
+# Garry's Mod Specific
+if [ "${gamename}" == "Garry's Mod" ]; then
+	# Prompt for download enforcer, which is using a .lua addfile resource generator
+	if fn_prompt_yn "Force clients to download files?" Y; then
+		luaresource="on"
+		fn_script_log_info "Force clients to download files: YES"
+	else
+		luaresource="off"
+		fn_script_log_info "Force clients to download filesr: NO"
 	fi
-	fn_script_log "Initiating FastDL creation"
+fi
 
-	# Check and create directories
-	if [ ! -d "${webdir}" ]; then
-		echo ""
-		fn_print_info "Creating FastDL directories"
-		echo -en "\n"
-		sleep 1
-		fn_print_dots "Creating ${webdir} directory"
+# Clears any fastdl directory content
+fn_clear_old_fastdl(){
+	# Clearing old FastDL
+	if [ -d "${fastdldir}" ]; then
+		echo -en "clearing existing FastDL directory ${fastdldir}..."
+		rm -R "${fastdldir:?}"
+		exitcode=$?
+		if [ "${exitcode}" -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}"
+		fi
 		sleep 0.5
-		mkdir "${webdir}"
-		fn_print_ok "Created ${webdir} directory"
-		fn_script_log "FastDL created ${webdir} directory"
-		sleep 1
-		echo -en "\n"
-	fi
-	if [ ! -d "${fastdldir}" ]; then
-		# No directory, won't ask for removing old ones
-		newfastdl=1
-		fn_print_dots "Creating fastdl directory"
-		sleep 0.5
-		mkdir "${fastdldir}"
-		fn_print_ok "Created fastdl directory"
-		fn_script_log "FastDL created fastdl directory"
-		sleep 1
-		echo -en "\n"
-		clearoldfastdl="off" # Nothing to clear
-	elif  [ "$(ls -A "${fastdldir}")" ]; then
-		newfastdl=0
 	fi
 }
 
-fn_fastdl_config(){
-	# Global settings for FastDL creation
-	fn_print_info "Entering configuration"
-	fn_script_log "Configuration"
-	sleep 2
-	echo -en "\n"
-	# Prompt for clearing old files if directory was already here
-	if [ -n "${newfastdl}" ] && [ "${newfastdl}" == "0" ]; then
-		fn_print_dots
-		if fn_prompt_yn "Clear old FastDL files?" Y; then
-			clearoldfastdl="on"; fn_script_log "clearoldfastdl enabled"; fn_print_ok "Clearing Enabled"
+fn_fastdl_dirs(){
+	# Check and create directories
+	if [ ! -d "${webdir}" ]; then
+		echo -en "creating web directory ${webdir}..."
+		mkdir -p "${webdir}"
+		exitcode=$?
+		if [ ${exitcode} -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Creating web directory ${webdir}"
+			core_exit.sh
 		else
-			clearoldfastdl="off"; fn_script_log "clearoldfastdl disabled"; fn_print_ok "Clearing Disabled"
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Creating web directory ${webdir}"
 		fi
-		echo -en "\n"
+		sleep 0.5
 	fi
-	# Prompt for using bzip2 if it's installed
-	if [ ${bzip2installed} == 1 ]; then
-		fn_print_dots
-		if fn_prompt_yn "Enable file compression using bzip2?" Y; then
-			bzip2enable="on"; fn_script_log "bzip2 enabled"; fn_print_ok "bzip2 Enabled"
+	if [ ! -d "${fastdldir}" ]; then
+		echo -en "creating fastdl directory ${fastdldir}..."
+		mkdir -p "${fastdldir}"
+		exitcode=$?
+		if [ ${exitcode} -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Creating fastdl directory ${fastdldir}"
+			core_exit.sh
 		else
-			bzip2enable="off"; fn_script_log "bzip2 disabled"; fn_print_ok "bzip2 Disabled"
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Creating fastdl directory ${fastdldir}"
 		fi
-		echo -en "\n"
+		sleep 0.5
 	fi
 }
 
-fn_fastdl_gmod_config(){
-	# Prompt for download enforcer, that is using a .lua addfile resource generator
-	fn_print_dots
-	if fn_prompt_yn "Use client download enforcer?" Y; then
-		luaressource="on"; fn_script_log "DL enforcer Enabled"; fn_print_ok "Enforcer Enabled"
-	else
-		luaressource="off"; fn_script_log "DL enforcer Disabled"; fn_print_ok "Enforcer Disabled"
-	fi
-	echo -en "\n"
+# Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906
+fn_human_readable_file_size(){
+    local abbrevs=(
+        $((1 << 60)):ZB
+        $((1 << 50)):EB
+        $((1 << 40)):TB
+        $((1 << 30)):GB
+        $((1 << 20)):MB
+        $((1 << 10)):KB
+        $((1)):bytes
+    )
+
+    local bytes="${1}"
+    local precision="${2}"
+
+    if [[ "${bytes}" == "1" ]]; then
+        echo "1 byte"
+    else
+        for item in "${abbrevs[@]}"; do
+            local factor="${item%:*}"
+            local abbrev="${item#*:}"
+            if [[ "${bytes}" -ge "${factor}" ]]; then
+                local size="$(bc -l <<< "${bytes} / ${factor}")"
+                printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}"
+                break
+            fi
+        done
+    fi
 }
 
-fn_clear_old_fastdl(){
-	# Clearing old FastDL if user answered yes
-	if [ "${clearoldfastdl}" == "on" ]; then
-		fn_print_info "Clearing existing FastDL directory"
-		fn_script_log "Clearing existing FastDL directory"
+# Provides info about the fastdl directory content and prompts for confirmation
+fn_fastdl_preview(){
+	# Remove any file list
+	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
+		rm -f "${tmpdir}/fastdl_files_to_compress.txt"
+	fi
+	echo -e "analysing required files"
+	fn_script_log_info "Analysing required files"
+	# Garry's Mod
+	if [ "${gamename}" == "Garry's Mod" ]; then
+		cd "${systemdir}" || exit
+		allowed_extentions_array=( "*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav" )
+		for allowed_extention in "${allowed_extentions_array[@]}"; do
+			fileswc=0
+			tput sc
+			while read -r ext; do
+				((fileswc++))
+				tput rc; tput el
+				printf "gathering ${allowed_extention} : ${fileswc}..."
+				echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
+			done < <(find . -type f -iname ${allowed_extention})
+			if [ ${fileswc} != 0 ]; then
+				fn_print_ok_eol_nl
+			fi
+		done
+	# Source engine
+	else
+		fastdl_directories_array=( "maps" "materials" "models" "particles" "sounds" "resources" )
+		for directory in "${fastdl_directories_array[@]}"; do
+			if [ -d "${systemdir}/${directory}" ]; then
+				if [ "${directory}" == "maps" ]; then
+					local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" )
+				elif [ "${directory}" == "materials" ]; then
+					local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" )
+				elif [ "${directory}" == "models" ]; then
+					local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" )
+				elif [ "${directory}" == "particles" ]; then
+					local allowed_extentions_array=( "*.pcf" )
+				elif [ "${directory}" == "sounds" ]; then
+					local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" )
+				fi
+				for allowed_extention in "${allowed_extentions_array[@]}"; do
+					fileswc=0
+					tput sc
+					while read -r ext; do
+						((fileswc++))
+						tput rc; tput el
+						printf "gathering ${directory} ${allowed_extention} : ${fileswc}..."
+						echo "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
+					done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention})
+					tput rc; tput el
+					printf "gathering ${directory} ${allowed_extention} : ${fileswc}..."
+					if [ ${fileswc} != 0 ]; then
+						fn_print_ok_eol_nl
+					fi
+				done
+			fi
+		done
+	fi
+	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
+		echo "calculating total file size..."
 		sleep 0.5
-		rm -R "${fastdldir:?}"/*
-		fn_print_ok "Old FastDL directory cleared"
-		fn_script_log "Old FastDL directory cleared"
-		sleep 1
-		echo -en "\n"
+		totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
+		# Calculates total file size
+		while read dufile; do
+			filesize=$(stat -c %s "${dufile}")
+			filesizetotal=$(( ${filesizetotal} + ${filesize} ))
+			exitcode=$?
+			if [ "${exitcode}" != 0 ]; then
+				fn_print_fail_eol_nl
+				fn_script_log_fatal "Calculating total file size."
+				core_exit.sh
+			fi
+		done <"${tmpdir}/fastdl_files_to_compress.txt"
+	else
+		fn_print_fail_eol_nl "generating file list"
+		fn_script_log_fatal "Generating file list."
+		core_exit.sh
+	fi
+	echo "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
+	fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
+	rm "${tmpdir}/fastdl_files_to_compress.txt"
+	if ! fn_prompt_yn "Continue?" Y; then
+		fn_script_log "User exited"
+		core_exit.sh
 	fi
 }
 
-fn_gmod_fastdl(){
-	# Copy all needed files for FastDL
-	echo ""
-	fn_print_dots "Starting gathering all needed files"
-	fn_script_log "Starting gathering all needed files"
-	sleep 1
-	echo -en "\n"
-
-	# No choice to cd to the directory, as find can't then display relative directory
-	cd "${systemdir}"
-
-	# Map Files
-	fn_print_dots "Copying map files..."
-	fn_script_log "Copying map files"
-	sleep 0.5
-	find . -name '*.bsp' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.ain' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Map files copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Materials
-	fn_print_dots "Copying materials..."
-	fn_script_log "Copying materials"
-	sleep 0.5
-	find . -name '*.vtf' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.vmt' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Materials copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Models
-	fn_print_dots "Copying models..."
-	fn_script_log "Copying models"
-	sleep 1
-	find . -name '*.vtx' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.vvd' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.mdl' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.phy' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Models copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Particles
-	fn_print_dots "Copying particles..."
-	fn_script_log "Copying particles"
-	sleep 0.5
-	find . -name '*.pcf' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Particles copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Sounds
-	fn_print_dots "Copying sounds..."
-	fn_script_log "Copying sounds"
-	sleep 0.5
-	find . -name '*.wav' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.mp3' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.ogg' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Sounds copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Resources (mostly fonts)
-	fn_print_dots "Copying fonts and png..."
-	fn_script_log "Copying fonts and png"
-	sleep 1
-	find . -name '*.otf' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.ttf' | cpio --quiet -updm "${fastdldir}"
-	find . -name '*.png' | cpio --quiet -updm "${fastdldir}"
-	fn_print_ok "Fonts and png copied"
-	sleep 0.5
-	echo -en "\n"
-
-	# Going back to rootdir in order to prevent mistakes
-	cd "${rootdir}"
-
+# Builds Garry's Mod fastdl directory content
+fn_fastdl_gmod(){
+	cd "${systemdir}" || exit
+	for allowed_extention in "${allowed_extentions_array[@]}"
+	do
+		fileswc=0
+		tput sc
+		while read -r fastdlfile; do
+			((fileswc++))
+			tput rc; tput el
+			printf "copying ${allowed_extention} : ${fileswc}..."
+			cp --parents "${fastdlfile}" "${fastdldir}"
+			exitcode=$?
+			if [ ${exitcode} -ne 0 ]; then
+				fn_print_fail_eol_nl
+				fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}"
+				core_exit.sh
+			else
+				fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}"
+			fi
+		done < <(find . -type f -iname ${allowed_extention})
+		if [ ${fileswc} != 0 ]; then
+			fn_print_ok_eol_nl
+		fi
+	done
 	# Correct addons directory structure for FastDL
 	if [ -d "${fastdldir}/addons" ]; then
-		fn_print_info "Adjusting addons' file structure"
-		fn_script_log "Adjusting addon's file structure"
-		sleep 1
+		echo -en "updating addons file structure..."
 		cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}"
-	#Don't remove yet	rm -R "${fastdldir:?}/addons"
-		fn_print_ok "Adjusted addon's file structure"
+		exitcode=$?
+		if [ ${exitcode} -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Updating addons file structure"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Updating addons file structure"
+		fi
+		# Clear addons directory in fastdl
+		echo -en "clearing addons dir from fastdl dir..."
 		sleep 1
-		echo -en "\n"
+		rm -R "${fastdldir:?}/addons"
+		exitcode=$?
+		if [ ${exitcode} -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Clearing addons dir from fastdl dir"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Clearing addons dir from fastdl dir"
+		fi
 	fi
-
 	# Correct content that may be into a lua directory by mistake like some darkrpmodification addons
 	if [ -d "${fastdldir}/lua" ]; then
-		fn_print_dots "Typical DarkRP shit detected, fixing"
+		echo -en "correcting DarkRP files..."
 		sleep 2
 		cp -Rf "${fastdldir}/lua/"* "${fastdldir}"
-		fn_print_ok "Stupid DarkRP file structure fixed"
-		sleep 2
-		echo -en "\n"
+		exitcode=$?
+		if [ ${exitcode} -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Correcting DarkRP files"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Correcting DarkRP files"
+		fi
+	fi
+	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
+		totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
+		# Calculates total file size
+		while read dufile; do
+			filesize=$(du -b "${dufile}"| awk '{ print $1 }')
+			filesizetotal=$(( ${filesizetotal} + ${filesize} ))
+		done <"${tmpdir}/fastdl_files_to_compress.txt"
 	fi
 }
 
-# Generate lua file that will force download any file into the FastDL directory
-fn_lua_fastdl(){
-	# Remove lua file if luaressource is turned off and file exists
-	echo ""
-	if [ "${luaressource}" == "off" ]; then
-		if [ -f "${luafastdlfullpath}" ]; then
-			fn_print_dots "Removing download enforcer"
-			sleep 1
-			rm -R "${luafastdlfullpath:?}"
-			fn_print_ok "Removed download enforcer"
-			fn_script_log "Removed old download inforcer"
-			echo -en "\n"
-			sleep 2
+fn_fastdl_source(){
+	for directory in "${fastdl_directories_array[@]}"
+	do
+		if [ -d "${systemdir}/${directory}" ]; then
+			if [ "${directory}" == "maps" ]; then
+				local allowed_extentions_array=( "*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt" )
+			elif [ "${directory}" == "materials" ]; then
+				local allowed_extentions_array=( "*.vtf" "*.vmt" "*.vbf" )
+			elif [ "${directory}" == "models" ]; then
+				local allowed_extentions_array=( "*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" )
+			elif [ "${directory}" == "particles" ]; then
+				local allowed_extentions_array=( "*.pcf" )
+			elif [ "${directory}" == "sounds" ]; then
+				local allowed_extentions_array=( "*.wav" "*.mp3" "*.ogg" )
+			fi
+			for allowed_extention in "${allowed_extentions_array[@]}"
+			do
+				fileswc=0
+				tput sc
+				while read -r fastdlfile; do
+					((fileswc++))
+					tput rc; tput el
+					printf "copying ${directory} ${allowed_extention} : ${fileswc}..."
+					sleep 0.01
+					if [ ! -d "${fastdldir}/${directory}" ]; then
+						mkdir "${fastdldir}/${directory}"
+					fi
+					cp "${fastdlfile}" "${fastdldir}/${directory}"
+					exitcode=$?
+					if [ "${exitcode}" -ne 0 ]; then
+						fn_print_fail_eol_nl
+						fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${directory}"
+						core_exit.sh
+					else
+						fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${directory}"
+					fi
+				done < <(find "${systemdir}/${directory}" -type f -iname ${allowed_extention})
+				if [ ${fileswc} != 0 ]; then
+					fn_print_ok_eol_nl
+				fi
+			done
 		fi
+	done
+}
+
+# Builds the fastdl directory content
+fn_fastdl_build(){
+	# Copy all needed files for FastDL
+	echo -e "copying files to ${fastdldir}"
+	fn_script_log_info "Copying files to ${fastdldir}"
+	if [ "${gamename}" == "Garry's Mod" ]; then
+		fn_fastdl_gmod
+		fn_fastdl_gmod_dl_enforcer
+	else
+		fn_fastdl_source
 	fi
-	# Remove old lua file and generate a new one if user said yes
-	if [ "${luaressource}" == "on" ]; then
-		if [ -f "${luafastdlfullpath}" ]; then
-			fn_print_dots "Removing old download enforcer"
-			sleep 1
-			rm "${luafastdlfullpath}"
-			fn_print_ok "Removed old download enforcer"
-			fn_script_log "Removed old download enforcer"
-			echo -en "\n"
-			sleep 1
+}
+
+# Generate lua file that will force download any file into the FastDL directory
+fn_fastdl_gmod_dl_enforcer(){
+	# Clear old lua file
+	if [ -f "${luafastdlfullpath}" ]; then
+		echo -en "removing existing download enforcer: ${luafastdlfile}..."
+		rm "${luafastdlfullpath:?}"
+		exitcode=$?
+		if [ "${exitcode}" -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Removing existing download enforcer ${luafastdlfullpath}"
 		fi
-		fn_print_dots "Generating new download enforcer"
-		fn_script_log "Generating new download enforcer"
-		sleep 1
+	fi
+	# Generate new one if user said yes
+	if [ "${luaresource}" == "on" ]; then
+		echo -en "creating new download enforcer: ${luafastdlfile}..."
+		touch "${luafastdlfullpath}"
 		# Read all filenames and put them into a lua file at the right path
-		find "${fastdldir}" \( -type f ! -name "*.bz2" \) -printf '%P\n' | while read line; do
-			echo "resource.AddFile( "\""${line}"\"" )" >> ${luafastdlfullpath}
-		done
-		fn_print_ok "Download enforcer generated"
-		fn_script_log "Download enforcer generated"
-		echo -en "\n"
-		echo ""
-		sleep 2
+		while read line; do
+			echo "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}"
+		done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n')
+		exitcode=$?
+		if [ "${exitcode}" -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}"
+			core_exit.sh
+		else
+			fn_print_ok_eol_nl
+			fn_script_log_pass "Creating new download enforcer ${luafastdlfullpath}"
+		fi
 	fi
 }
 
+# Compresses FastDL files using bzip2
 fn_fastdl_bzip2(){
-	# Compressing using bzip2 if user said yes
-	echo ""
-	if [ ${bzip2enable} == "on" ]; then
-		fn_print_info "Have a break, this step could take a while..."
-		echo -en "\n"
-		echo ""
-		fn_print_dots "Compressing files using bzip2..."
-		fn_script_log "Compressing files using bzip2..."
-		# bzip2 all files that are not already compressed (keeping original files)
-		find "${fastdldir}" \( -type f ! -name "*.bz2" \) -exec bzip2 -qk \{\} \;
-		fn_print_ok "bzip2 compression done"
-		fn_script_log "bzip2 compression done"
-		sleep 1
-		echo -en "\n"
-	fi
-}
-
-fn_fastdl_completed(){
-	# Finished message
-	echo ""
-	fn_print_ok "Congratulations, it's done!"
-	fn_script_log "FastDL job done"
-	sleep 2
-	echo -en "\n"
-	echo ""
-	fn_print_info "Need more documentation? See https://github.com/GameServerManagers/LinuxGSM/wiki/FastDL"
-	echo -en "\n"
-	if [ "$bzip2installed" == "0" ]; then
-	echo "By the way, you'd better install bzip2 and re-run this command!"
-	fi
-	echo "Credits : UltimateByte"
+	while read -r filetocompress; do
+		echo -en "\r\033[Kcompressing ${filetocompress}..."
+		bzip2 -f "${filetocompress}"
+		exitcode=$?
+		if [ "${exitcode}" -ne 0 ]; then
+			fn_print_fail_eol_nl
+			fn_script_log_fatal "Compressing ${filetocompress}"
+			core_exit.sh
+		else
+			fn_script_log_pass "Compressing ${filetocompress}"
+		fi
+	done < <(find  "${fastdldir:?}" \( -type f ! -name "*.bz2" \))
+	fn_print_ok_eol_nl
 }
 
-# Game checking and functions running
-# Garry's Mod
-if [ "${gamename}" == "Garry's Mod" ]; then
-	fn_check_bzip2
-	fn_fastdl_init
-	fn_fastdl_config
-	fn_fastdl_gmod_config
-	fn_clear_old_fastdl
-	fn_gmod_fastdl
-	fn_lua_fastdl
-	fn_fastdl_bzip2
-	fn_fastdl_completed
-	exit
-fi
+# Run functions
+fn_fastdl_preview
+fn_clear_old_fastdl
+fn_fastdl_dirs
+fn_fastdl_build
+fn_fastdl_bzip2
+# Finished message
+echo "FastDL files are located in:"
+echo "${fastdldir}"
+echo "FastDL completed"
+fn_script_log_info "FastDL completed"
+core_exit.sh

+ 155 - 953
lgsm/functions/core_getopt.sh

@@ -6,982 +6,184 @@
 
 local function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))"
 
-fn_getopt_generic(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	v|validate)
-		command_validate.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	mi|mods-install)
-		command_mods_install.sh;;
-	mu|mods-update)
-		command_mods_update.sh;;
-	mr|mods-remove)
-		command_mods_remove.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
+### Define all commands here ###
+## User commands | Trigger commands | Description
+# Standard commands
+cmd_install=( "i;install" "command_install.sh" "Install the server." )
+cmd_auto_install=( "ai;auto-install" "fn_autoinstall" "Install the server without prompts." )
+cmd_start=( "st;start" "command_start.sh" "Start the server." )
+cmd_stop=( "sp;stop" "command_stop.sh" "Stop the server." )
+cmd_restart=( "r;restart" "command_restart.sh" "Restart the server." )
+cmd_details=( "dt;details" "command_details.sh" "Display server information." )
+cmd_postdetails=( "pd;postdetails" "command_postdetails.sh" "Post details to hastebin (removing passwords)." )
+cmd_backup=( "b;backup" "command_backup.sh" "Create backup archives of the server." )
+cmd_update_functions=( "ul;update-lgsm;uf;update-functions" "command_update_functions.sh" "Update LinuxGSM functions." )
+cmd_test_alert=( "ta;test-alert" "command_test_alert.sh" "Send a test alert." )
+cmd_monitor=( "m;monitor" "command_monitor.sh" "Check server status and restart if crashed." )
+# Console servers only
+cmd_console=( "c;console" "command_console.sh" "Access server console." )
+cmd_debug=( "d;debug" "command_debug.sh" "Start server directly in your terminal." )
+# Update servers only
+cmd_update=( "u;update" "command_update.sh" "Check and apply any updates." )
+cmd_force_update=( "fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Bypass update check and apply any updates." )
+# SteamCMD servers only
+cmd_validate=( "v;validate" "command_validate.sh" "Validate server files with SteamCMD." )
+# Server with mods-install
+cmd_mods_install=( "mi;mods-install" "command_mods_install.sh" "View and install available mods/addons." )
+cmd_mods_remove=( "mr;mods-remove" "command_mods_remove.sh" "View and remove an installed mod/addon." )
+cmd_mods_update=( "mu;mods-update" "command_mods_update.sh" "Update installed mods/addons." )
+# Server specific
+cmd_change_password=( "pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password." )
+cmd_install_default_resources=( "ir;install-default-resources" "command_install_resources_mta.sh" "Install the MTA default resources." )
+cmd_wipe=( "wi;wipe" "command_wipe.sh" "Wipe your server data." )
+cmd_map_compressor_u99=( "mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps." )
+cmd_map_compressor_u2=( "mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps." )
+cmd_install_cdkey=( "cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key." )
+cmd_install_dst_token=( "ct;cluster-token" "install_dst_token.sh" "Configure cluster token." )
+cmd_fastdl=( "fd;fastdl" "command_fastdl.sh" "Build a FastDL directory." )
+# Dev commands
+cmd_dev_debug=( "dev;developer" "command_dev_debug.sh" "Enable developer Mode." )
+cmd_dev_detect_deps=( "dd;detect-deps" "command_dev_detect_deps.sh" "Detect required dependencies." )
+cmd_dev_detect_glibc=( "dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc." )
+cmd_dev_detect_ldd=( "dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies." )
+
+### Set specific opt here ###
+
+currentopt=( "${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" )
+
+# Exclude noupdate games here
+if [ "${gamename}" != "Battlefield: 1942" ]&&[ "${engine}" != "quake" ]&&[ "${engine}" != "idtech2" ]&&[ "${engine}" != "idtech3" ]&&[ "${engine}" != "iw2.0" ]&&[ "${engine}" != "iw3.0" ]; then
+	currentopt+=( "${cmd_update[@]}" )
+	# force update for SteamCMD only
+	if [ -n "${appid}" ]; then
+		currentopt+=( "${cmd_force_update[@]}" )
 	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from SteamCMD."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}validate\t${default}v  |Validate server files with SteamCMD."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons."
-		echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons."
-		echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons."
-	} | column -s $'\t' -t
-	esac
-}
+fi
 
-fn_getopt_generic_update_no_steam(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-	} | column -s $'\t' -t
-	esac
-}
+# Validate command
+if [ -n "${appid}" ]; then
+	currentopt+=( "${cmd_validate[@]}" )
+fi
 
-fn_getopt_generic_no_update(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful infomation about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-	} | column -s $'\t' -t
-	esac
-}
+# Update LGSM
+currentopt+=( "${cmd_update_functions[@]}" )
 
-fn_getopt_teamspeak3(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	pw|change-password)
-		command_ts3_server_pass.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from teamspeak.com."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}change-password\t${default}pw |Changes TS3 serveradmin password."
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-	} | column -s $'\t' -t
-	esac
-}
+#Backup
+currentopt+=( "${cmd_backup[@]}" )
 
-fn_getopt_minecraft(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from mojang.com."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful infomation about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-	} | column -s $'\t' -t
-	esac
-}
 
-fn_getopt_mta(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ir|install-default-resources)
-		command_install_resources_mta.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from linux.mtasa.com."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from linux.mtasa.com."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful infomation about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}install-default-resources\t${default}ir |Install the MTA default resources."
-	} | column -s $'\t' -t
-	esac
-}
+# Exclude games without a console
+if [ "${gamename}" != "TeamSpeak 3" ]; then
+	currentopt+=( "${cmd_console[@]}" "${cmd_debug[@]}" )
+fi
 
-fn_getopt_mumble(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	c|console)
-		command_console.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from GitHub."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-	} | column -s $'\t' -t
-	esac
-}
+## Game server exclusive commands
 
-fn_getopt_dstserver(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	v|validate)
-		command_validate.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	ct|cluster-token)
-		install_dst_token.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from SteamCMD."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}validate\t${default}v  |Validate server files with SteamCMD."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}cluster-token\t${default}ct |Configure cluster token."
-	} | column -s $'\t' -t
-	esac
-}
+# FastDL command
+if [ "${engine}" == "source" ]; then
+	currentopt+=( "${cmd_fastdl[@]}" )
+fi
 
-fn_getopt_gmodserver(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	v|validate)
-		command_validate.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	fd|fastdl)
-		command_fastdl.sh;;
-	mi|mods-install)
-		command_mods_install.sh;;
-	mu|mods-update)
-		command_mods_update.sh;;
-	mr|mods-remove)
-		command_mods_remove.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from SteamCMD."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}validate\t${default}v  |Validate server files with SteamCMD."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}fastdl\t${default}fd |Generates or update a FastDL directory for your server."
-		echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons."
-		echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons."
-		echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons."
-	} | column -s $'\t' -t
-	esac
-}
+# TeamSpeak exclusive
+if [ "${gamename}" == "TeamSpeak 3" ]; then
+	currentopt+=( "${cmd_change_password[@]}" )
+fi
 
-fn_getopt_rustserver(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	v|validate)
-		command_validate.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	pd|postdetails)
-		command_postdetails.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	mi|mods-install)
-		command_mods_install.sh;;
-	mu|mods-update)
-		command_mods_update.sh;;
-	mr|mods-remove)
-		command_mods_remove.sh;;
-	wi|wipe)
-		command_wipe.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
+# Unreal exclusive
+if [ "${gamename}" == "Rust" ]; then
+	currentopt+=( "${cmd_wipe[@]}" )
+fi
+if [ "${engine}" == "unreal2" ]; then
+	if [ "${gamename}" == "Unreal Tournament 2004" ]; then
+		currentopt+=( "${cmd_install_cdkey[@]}" "${cmd_map_compressor_u2[@]}" )
+	else
+		currentopt+=( "${cmd_map_compressor_u2[@]}" )
 	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}u  |Checks and applies updates from SteamCMD."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}validate\t${default}v  |Validate server files with SteamCMD."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}postdetails\t${default}pd |Post stripped details to pastebin (for support)"
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}mods-install\t${default}mi |View and install available mods/addons."
-		echo -e "${blue}mods-update\t${default}mu |Update installed mods/addons."
-		echo -e "${blue}mods-remove\t${default}mr |Remove installed mods/addons."
-		echo -e "${blue}wipe\t${default}wi |Wipe your Rust server."
-	} | column -s $'\t' -t
-	esac
-}
+fi
+if [ "${engine}" == "unreal" ]; then
+	currentopt+=( "${cmd_map_compressor_u99[@]}" )
+fi
 
-fn_getopt_unreal(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	mc|map-compressor)
-		compress_ut99_maps.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps."
-	} | column -s $'\t' -t
-	esac
-}
+# DST exclusive
+if [ "${gamename}" == "Don't Starve Together" ]; then
+	currentopt+=( "${cmd_install_dst_token[@]}" )
+fi
 
+# MTA exclusive
+if [ "${gamename}" == "Multi Theft Auto" ]; then
+	currentopt+=( "${cmd_install_default_resources[@]}" )
+fi
 
-fn_getopt_unreal2(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	u|update)
-		command_update.sh;;
-	fu|force-update|update-restart)
-		forceupdate=1;
-		command_update.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	v|validate)
-		command_validate.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	mc|map-compressor)
-		compress_unreal2_maps.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
-	echo "Usage: $0 [option]"
-	echo "${gamename} - Linux Game Server Manager - Version ${version}"
-	echo "https://gameservermanagers.com/${selfname}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update\t${default}Checks and applies updates from SteamCMD."
-		echo -e "${blue}force-update\t${default}fu |Bypasses the check and applies updates from SteamCMD."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}validate\t${default}v  |Validate server files with SteamCMD."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps."
-	} | column -s $'\t' -t
-	esac
-}
+## Mods commands
+if [ "${engine}" == "source" ]||[ "${gamename}" == "Rust" ]||[ "${gamename}" == "Hurtworld" ]||[ "${gamename}" == "7 Days To Die" ]; then
+	currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" )
+fi
 
+## Installer
+currentopt+=( "${cmd_install[@]}" "${cmd_auto_install[@]}" )
 
-fn_getopt_ut2k4(){
-case "${getopt}" in
-	st|start)
-		command_start.sh;;
-	sp|stop)
-		command_stop.sh;;
-	r|restart)
-		command_restart.sh;;
-	uf|update-functions)
-		command_update_functions.sh;;
-	m|monitor)
-		command_monitor.sh;;
-	ta|test-alert)
-		command_test_alert.sh;;
-	dt|details)
-		command_details.sh;;
-	b|backup)
-		command_backup.sh;;
-	c|console)
-		command_console.sh;;
-	d|debug)
-		command_debug.sh;;
-	dev|dev-debug)
-		command_dev_debug.sh;;
-	i|install)
-		command_install.sh;;
-	ai|auto-install)
-		fn_autoinstall;;
-	cd|server-cd-key)
-		install_ut2k4_key.sh;;
-	mc|map-compressor)
-		compress_unreal2_maps.sh;;
-	dd|detect-deps)
-		command_dev_detect_deps.sh;;
-	dg|detect-glibc)
-		command_dev_detect_glibc.sh;;
-	dl|detect-ldd)
-		command_dev_detect_ldd.sh;;
-	*)
-	if [ -n "${getopt}" ]; then
-		echo -e "${red}Unknown command${default}: $0 ${getopt}"
-		exitcode=2
-	fi
+## Developer commands
+currentopt+=( "${cmd_dev_debug[@]}" )
+if [ -f ".dev-debug" ]; then
+	currentopt+=(  "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" )
+fi
+
+### Build list of available commands
+optcommands=()
+index="0"
+for ((index="0"; index < ${#currentopt[@]}; index+=3)); do
+	cmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')"
+	for ((cmdindex=1; cmdindex <= ${cmdamount}; cmdindex++)); do
+		optcommands+=( "$(echo "${currentopt[index]}"| awk -F ';' -v x=${cmdindex} '{ print $x }')" )
+	done
+done
+
+# Shows LinuxGSM usage
+fn_opt_usage(){
 	echo "Usage: $0 [option]"
+	echo -e ""
 	echo "${gamename} - Linux Game Server Manager - Version ${version}"
 	echo "https://gameservermanagers.com/${selfname}"
 	echo -e ""
 	echo -e "${lightyellow}Commands${default}"
+	# Display available commands
+	index="0"
 	{
-		echo -e "${blue}start\t${default}st |Start the server."
-		echo -e "${blue}stop\t${default}sp |Stop the server."
-		echo -e "${blue}restart\t${default}r  |Restart the server."
-		echo -e "${blue}update-functions\t${default}uf |Removes all functions so latest can be downloaded."
-		echo -e "${blue}monitor\t${default}m  |Checks that the server is running."
-		echo -e "${blue}test-alert\t${default}ta |Sends test alert."
-		echo -e "${blue}details\t${default}dt |Displays useful information about the server."
-		echo -e "${blue}backup\t${default}b  |Create archive of the server."
-		echo -e "${blue}console\t${default}c  |Console allows you to access the live view of a server."
-		echo -e "${blue}debug\t${default}d  |See the output of the server directly to your terminal."
-		echo -e "${blue}install\t${default}i  |Install the server."
-		echo -e "${blue}auto-install\t${default}ai |Install the server, without prompts."
-		echo -e "${blue}server-cd-key\t${default}cd |Add your server cd key"
-		echo -e "${blue}map-compressor\t${default}mc |Compresses all ${gamename} server maps."
+	for ((index="0"; index < ${#currentopt[@]}; index+=3)); do
+		# Hide developer commands
+		if [ "${currentopt[index+2]}" != "DEVCOMMAND" ]; then
+			echo -e "${cyan}$(echo "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index+2]}"
+		fi
+	done
 	} | column -s $'\t' -t
-	esac
+	core_exit.sh
 }
 
-# Don't Starve Together
-if [ "${gamename}" == "Don't Starve Together" ]; then
-	fn_getopt_dstserver
-# Garry's Mod
-elif [ "${gamename}" == "Garry's Mod" ]; then
-	fn_getopt_gmodserver
-# Minecraft
-elif [ "${engine}" == "lwjgl2" ]; then
-	fn_getopt_minecraft
-# Multi Theft Auto
-elif [ "${gamename}" == "Multi Theft Auto" ]; then
-	fn_getopt_mta
-# Mumble
-elif [ "${gamename}" == "Mumble" ]; then
-	fn_getopt_mumble
-# Teamspeak 3
-elif [ "${gamename}" == "TeamSpeak 3" ]; then
-	fn_getopt_teamspeak3
-elif [ "${gamename}" == "Rust" ]; then
-	fn_getopt_rustserver
-# Unreal 2 Engine
-elif [ "${engine}" == "unreal2" ]; then
-	if [ "${gamename}" == "Unreal Tournament 2004" ]; then
-		fn_getopt_ut2k4
-	else
-		fn_getopt_unreal2
-	fi
-# Unreal Engine
-elif [ "${engine}" == "unreal" ]; then
-	fn_getopt_unreal
-# Generic
-elif [ "${gamename}" == "Battlefield: 1942" ]||[ "${gamename}" == "Call of Duty" ]||[ "${gamename}" == "Call of Duty: United Offensive" ]||[ "${gamename}" == "Call of Duty 2" ]||[ "${gamename}" == "Call of Duty 4" ]||[ "${gamename}" == "Call of Duty: World at War" ]||[ "${gamename}" == "QuakeWorld" ]||[ "${gamename}" == "Quake 2" ]||[ "${gamename}" == "Quake 3: Arena" ]||[ "${gamename}" == "Wolfenstein: Enemy Territory" ]; then
-	fn_getopt_generic_no_update
-elif  [ "${gamename}" == "Factorio" ]; then
-	fn_getopt_generic_update_no_steam
-else
-	fn_getopt_generic
+### Check if user commands exist and run corresponding scripts, or display script usage
+if [ -z "${getopt}" ]; then
+	fn_opt_usage
 fi
-core_exit.sh
+# Command exists
+for i in "${optcommands[@]}"; do
+	if [ "${i}" == "${getopt}" ] ; then
+		# Seek and run command
+		index="0"
+		for ((index="0"; index < ${#currentopt[@]}; index+=3)); do
+			currcmdamount="$(echo "${currentopt[index]}"| awk -F ';' '{ print NF }')"
+			for ((currcmdindex=1; currcmdindex <= ${currcmdamount}; currcmdindex++)); do
+				if [ "$(echo "${currentopt[index]}"| awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then
+					# Run command
+					${currentopt[index+1]}
+					core_exit.sh
+					break
+				fi
+			done
+		done
+	fi
+done
+
+# If we're executing this, it means command was not found
+echo -e "${red}Unknown command${default}: $0 ${getopt}"
+exitcode=2
+fn_opt_usage
+core_exit.sh

+ 2 - 3
lgsm/functions/install_server_dir.sh

@@ -12,12 +12,11 @@ echo ""
 echo "Server Directory"
 echo "================================="
 sleep 1
-echo ""
-pwd
-echo ""
 if [ -d "${filesdir}" ]; then
 	fn_print_warning_nl "A server is already installed here."
 fi
+pwd
+echo ""
 if [ -z "${autoinstall}" ]; then
 	if ! fn_prompt_yn "Continue?" Y; then
 		exit

+ 6 - 6
lgsm/functions/mods_core.sh

@@ -42,7 +42,7 @@ fn_mod_lowercase(){
 		echo -ne "converting ${modprettyname} files to lowercase..."
 		sleep 0.5
 		fn_script_log_info "Converting ${modprettyname} files to lowercase"
-		files=$(find "${extractdir}" -depth | wc -l)
+		fileswc=$(find "${extractdir}" -depth | wc -l)
 		echo -en "\r"
 		while read -r src; do
 			dst=`dirname "${src}"`/`basename "${src}" | tr '[A-Z]' '[a-z]'`
@@ -52,10 +52,10 @@ fn_mod_lowercase(){
 				local exitcode=$?
 				((renamedwc++))
 			fi
-			echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..." $'\r'
+			echo -ne "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." $'\r'
 			((totalfileswc++))
 		done < <(find "${extractdir}" -depth)
-		echo -ne "${renamedwc} / ${totalfileswc} / $files converting ${modprettyname} files to lowercase..."
+		echo -ne "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..."
 
 		if [ ${exitcode} -ne 0 ]; then
 			fn_print_fail_eol_nl
@@ -346,7 +346,7 @@ fn_mod_compatible_test(){
 fn_create_mods_dir(){
 	# Create lgsm data modsdir
 	if [ ! -d "${modsdir}" ];then
-		echo "creating lgsm mods data directory ${modsdir}..."
+		echo -en "creating LinuxGSM mods data directory ${modsdir}..."
 		mkdir -p "${modsdir}"
 		exitcode=$?
 		if [ ${exitcode} -ne 0 ]; then
@@ -361,7 +361,7 @@ fn_create_mods_dir(){
 	fi
 	# Create mod install directory
 	if [ ! -d "${modinstalldir}" ]; then
-		echo "creating mods install directory ${modinstalldir}..."
+		echo -en "creating mods install directory ${modinstalldir}..."
 		mkdir -p "${modinstalldir}"
 		exitcode=$?
 		if [ ${exitcode} -ne 0 ]; then
@@ -438,7 +438,7 @@ fn_mods_check_installed(){
 	if [ ${installedmodscount} -eq 0 ]; then
 		echo ""
 		fn_print_failure_nl "No installed mods or addons were found"
-		echo " * Install mods using LGSM first with: ./${selfname} mods-install"
+		echo " * Install mods using LinuxGSM first with: ./${selfname} mods-install"
 		fn_script_log_error "No installed mods or addons were found."
 		core_exit.sh
 	fi