| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748 |
- #!/bin/bash
- # LinuxGSM command_mods_install.sh module
- # Author: Daniel Gibbs
- # Contributors: https://linuxgsm.com/contrib
- # Website: https://linuxgsm.com
- # Description: Core modules for mods list/install/update/remove
- moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
- # Files and Directories.
- modsdir="${lgsmdir}/mods"
- modstmpdir="${modsdir}/tmp"
- extractdest="${modstmpdir}/extract"
- modsinstalledlist="installed-mods.txt"
- modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}"
- ## Installation.
- # Download management.
- fn_mod_install_files() {
- fn_fetch_file "${modurl}" "" "" "" "${modstmpdir}" "${modfilename}"
- # Check if variable is valid checking if file has been downloaded and exists.
- if [ ! -f "${modstmpdir}/${modfilename}" ]; then
- fn_print_failure "An issue occurred downloading ${modprettyname}"
- fn_script_log_fail "An issue occurred downloading ${modprettyname}"
- core_exit.sh
- fi
- if [ ! -d "${extractdest}" ]; then
- mkdir -p "${extractdest}"
- fi
- fn_dl_extract "${modstmpdir}" "${modfilename}" "${extractdest}"
- }
- # Convert mod files to lowercase if needed.
- fn_mod_lowercase() {
- # Checking lowercase settings from mods array definition
- if [ "${modlowercase}" == "LowercaseOn" ]; then
- echo -en "converting ${modprettyname} files to lowercase..."
- fn_sleep_time
- fn_script_log_info "Converting ${modprettyname} files to lowercase"
- # Total files and directories for the mod, to output to the user
- fileswc=$(find "${extractdest}" | wc -l)
- # Total uppercase files and directories for the mod, to output to the user
- filesupperwc=$(find "${extractdest}" -name '*[[:upper:]]*' | wc -l)
- fn_script_log_info "Found ${filesupperwc} uppercase files out of ${fileswc}, converting"
- echo -en "Found ${filesupperwc} uppercase files out of ${fileswc}, converting..."
- # Convert files and directories starting from the deepest to prevent issues (-depth argument)
- while read -r src; do
- # We have to convert only the last file from the path, otherwise we will fail to convert anything if a parent dir has any uppercase
- # therefore, we have to separate the end of the filename to only lowercase it rather than the whole line
- # Gather parent dir, filename lowercase filename, and set lowercase destination name
- latestparentdir=$(dirname "${src}")
- latestfilelc=$(basename "${src}" | tr '[:upper:]' '[:lower:]')
- dst="${latestparentdir}/${latestfilelc}"
- # Only convert if destination does not already exist for some reason
- if [ ! -e "${dst}" ]; then
- # Finally we can rename the file
- mv "${src}" "${dst}"
- # Exit if it fails for any reason
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- core_exit.sh
- fi
- fi
- done < <(find "${extractdest}" -depth -name '*[[:upper:]]*')
- fn_print_ok_eol_nl
- fi
- }
- # Create ${modcommand}-files.txt containing the full extracted file/directory list.
- fn_mod_create_filelist() {
- echo -en "building ${modcommand}-files.txt..."
- fn_sleep_time
- # ${modsdir}/${modcommand}-files.txt.
- find "${extractdest}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Building ${modsdir}/${modcommand}-files.txt"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Building ${modsdir}/${modcommand}-files.txt"
- fi
- # Adding removed files if needed.
- if [ -f "${modsdir}/.removedfiles.tmp" ]; then
- cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt"
- fi
- }
- # Copy the mod into serverfiles.
- fn_mod_copy_destination() {
- echo -en "copying ${modprettyname} to ${modinstalldir}..."
- fn_sleep_time
- cp -Rf "${extractdest}/." "${modinstalldir}/"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Copying ${modprettyname} to ${modinstalldir}"
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}"
- fi
- }
- # Add the mod to the installed-mods.txt.
- fn_mod_add_list() {
- if [ -z "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then
- echo -e "${modcommand}" >> "${modsinstalledlistfullpath}"
- fn_script_log_info "${modcommand} added to ${modsinstalledlist}"
- fi
- }
- # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt.
- fn_mod_tidy_files_list() {
- # Check file list validity.
- fn_check_mod_files_list
- # Output to the user
- echo -en "tidy up ${modcommand}-files.txt..."
- fn_sleep_time
- fn_script_log_info "Tidy up ${modcommand}-files.txt"
- # Lines/files to remove from file list (end with ";" separator).
- removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64;"
- # Loop through files to remove from file list,
- # generate elements to remove from list.
- removefromlistamount=$(echo -e "${removefromlist}" | awk -F ';' '{ print NF }')
- # Test all subvalue of "removefromlist" using the ";" separator.
- for ((filesindex = 1; filesindex < removefromlistamount; filesindex++)); do
- # Put current file into test variable.
- removefilevar=$(echo -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')
- # Delete line(s) matching exactly.
- sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt"
- # Exit on error.
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt"
- core_exit.sh
- break
- fi
- done
- fn_print_ok_eol_nl
- # Sourcemod fix
- # Remove metamod from sourcemod fileslist.
- if [ "${modcommand}" == "sourcemod" ]; then
- # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt.
- sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt"
- fi
- # Remove common paths from deletion list (Add your sourcemod mod here)
- if [ "${modcommand}" == "gokz" ] || [ "${modcommand}" == "ttt" ] || [ "${modcommand}" == "steamworks" ] || [ "${modcommand}" == "get5" ]; then
- sed -i "/^addons\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/configs$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/extensions$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/logs$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/plugins$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/plugins\/disabled$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/translations$/d" "${modsdir}/${modcommand}-files.txt"
- # Don't delete directories of translations like 'fr', 'sv', 'de', etc
- sed -i "/^addons\/sourcemod\/translations\/[A-Za-z0-9_]*$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^cfg\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^maps$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materialss$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materials\/models$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materials\/models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materials\/darkness$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materials\/decals$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^materials\/overlays$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^models$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^sound$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^sound\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
- fi
- # Remove paths of specific mods from deletion list
- if [ "${modcommand}" == "gokz" ]; then
- sed -i "/^addons\/sourcemod\/scripting\/include\/smjansson.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/GlobalAPI-Core.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/sourcebanspp.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/autoexecconfig.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/colorvariables.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/movementapi.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/movement.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/dhooks.inc$/d" "${modsdir}/${modcommand}-files.txt"
- sed -i "/^addons\/sourcemod\/scripting\/include\/updater.inc$/d" "${modsdir}/${modcommand}-files.txt"
- fi
- }
- ## Information Gathering.
- # Get details of a mod any (relevant and unique, such as full mod name or install command) value.
- fn_mod_get_info() {
- # Variable to know when job is done.
- modinfocommand="0"
- # Find entry in global array.
- for ((index = 0; index < ${#mods_global_array[@]}; index++)); do
- # When entry is found.
- if [ "${mods_global_array[index]}" == "${currentmod}" ]; then
- # Go back to the previous "MOD" separator.
- for ((index_search = index; index_search >= 0; index_search--)); do
- # When "MOD" is found.
- if [ "${mods_global_array[index_search]}" == "MOD" ]; then
- # Get info.
- index=${index_search}
- fn_mods_define
- modinfocommand="1"
- break
- fi
- done
- fi
- # Exit the loop if job is done.
- if [ "${modinfocommand}" == "1" ]; then
- break
- fi
- done
- # What happens if mod is not found.
- if [ "${modinfocommand}" == "0" ]; then
- fn_script_log_error "Could not find information for ${currentmod}"
- fn_print_error_nl "Could not find information for ${currentmod}"
- core_exit.sh
- fi
- }
- # Define all variables for a mod at once when index is set to a separator.
- fn_mods_define() {
- if [ -z "$index" ]; then
- fn_script_log_fail "index variable not set. Please report an issue."
- fn_print_error "index variable not set. Please report an issue."
- echo -e "* https://github.com/GameServerManagers/LinuxGSM/issues"
- core_exit.sh
- fi
- modcommand="${mods_global_array[index + 1]}"
- modprettyname="${mods_global_array[index + 2]}"
- modurl="${mods_global_array[index + 3]}"
- modfilename="${mods_global_array[index + 4]}"
- modsubdirs="${mods_global_array[index + 5]}"
- modlowercase="${mods_global_array[index + 6]}"
- modinstalldir="${mods_global_array[index + 7]}"
- modkeepfiles="${mods_global_array[index + 8]}"
- modengines="${mods_global_array[index + 9]}"
- modgames="${mods_global_array[index + 10]}"
- modexcludegames="${mods_global_array[index + 11]}"
- modsite="${mods_global_array[index + 12]}"
- moddescription="${mods_global_array[index + 13]}"
- }
- # Builds list of installed mods.
- # using installed-mods.txt grabbing mod info from mods_list.sh.
- fn_mods_installed_list() {
- fn_mods_count_installed
- # Set/reset variables.
- installedmodsline="1"
- installedmodslist=()
- modprettynamemaxlength="0"
- modsitemaxlength="0"
- moddescriptionmaxlength="0"
- modcommandmaxlength="0"
- # Loop through every line of the installed mods list ${modsinstalledlistfullpath}.
- while [ "${installedmodsline}" -le "${installedmodscount}" ]; do
- currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")
- # Get mod info to make sure mod exists.
- fn_mod_get_info
- # Add the mod to available commands.
- installedmodslist+=("${modcommand}")
- # Increment line check.
- ((installedmodsline++))
- done
- if [ "${installedmodscount}" ]; then
- fn_script_log_info "${installedmodscount} addons/mods are currently installed"
- fi
- }
- # Loops through mods_global_array to define available mods & provide available commands for mods installation.
- fn_mods_available() {
- # First, reset variables.
- compatiblemodslist=()
- availablemodscommands=()
- # Find compatible games.
- # Find separators through the global array.
- for ((index = "0"; index <= ${#mods_global_array[@]}; index++)); do
- # If current value is a separator; then.
- if [ "${mods_global_array[index]}" == "${modseparator}" ]; then
- # Set mod variables.
- fn_mods_define
- # Test if game is compatible.
- fn_mod_compatible_test
- # If game is compatible.
- if [ "${modcompatibility}" == "1" ]; then
- # Put it into an array to prepare user output.
- compatiblemodslist+=("${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}")
- # Keep available commands in an array to make life easier.
- availablemodscommands+=("${modcommand}")
- fi
- fi
- done
- }
- ## Mod compatibility check.
- # Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable.
- fn_compatible_mod_games() {
- # Reset test value.
- modcompatiblegame="0"
- # If value is set to GAMES (ignore).
- if [ "${modgames}" != "GAMES" ]; then
- # How many games we need to test.
- gamesamount=$(echo -e "${modgames}" | awk -F ';' '{ print NF }')
- # Test all subvalue of "modgames" using the ";" separator.
- for ((gamevarindex = 1; gamevarindex < gamesamount; gamevarindex++)); do
- # Put current game name into modtest variable.
- gamemodtest=$(echo -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
- # If game name matches.
- if [ "${gamemodtest}" == "${gamename}" ]; then
- # Mod is compatible.
- modcompatiblegame="1"
- fi
- done
- fi
- }
- # Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable.
- fn_compatible_mod_engines() {
- # Reset test value.
- modcompatibleengine="0"
- # If value is set to ENGINES (ignore).
- if [ "${modengines}" != "ENGINES" ]; then
- # How many engines we need to test.
- enginesamount=$(echo -e "${modengines}" | awk -F ';' '{ print NF }')
- # Test all subvalue of "modengines" using the ";" separator.
- for ((gamevarindex = 1; gamevarindex < enginesamount; gamevarindex++)); do
- # Put current engine name into modtest variable.
- enginemodtest=$(echo -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
- # If engine name matches.
- if [ "${enginemodtest}" == "${engine}" ]; then
- # Mod is compatible.
- modcompatibleengine="1"
- fi
- done
- fi
- }
- # Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable.
- fn_not_compatible_mod_games() {
- # Reset test value.
- modeincompatiblegame="0"
- # If value is set to NOTGAMES (ignore).
- if [ "${modexcludegames}" != "NOTGAMES" ]; then
- # How many engines we need to test.
- excludegamesamount=$(echo -e "${modexcludegames}" | awk -F ';' '{ print NF }')
- # Test all subvalue of "modexcludegames" using the ";" separator.
- for ((gamevarindex = 1; gamevarindex < excludegamesamount; gamevarindex++)); do
- # Put current engine name into modtest variable.
- excludegamemodtest=$(echo -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
- # If engine name matches.
- if [ "${excludegamemodtest}" == "${gamename}" ]; then
- # Mod is compatible.
- modeincompatiblegame="1"
- fi
- done
- fi
- }
- # Sums up if a mod is compatible or not with modcompatibility=0/1.
- fn_mod_compatible_test() {
- # Test game and engine compatibility.
- fn_compatible_mod_games
- fn_compatible_mod_engines
- fn_not_compatible_mod_games
- if [ "${modeincompatiblegame}" == "1" ]; then
- modcompatibility="0"
- elif [ "${modcompatibleengine}" == "1" ] || [ "${modcompatiblegame}" == "1" ]; then
- modcompatibility="1"
- else
- modcompatibility="0"
- fi
- }
- ## Directory management.
- # Create mods files and directories if it doesn't exist.
- fn_create_mods_dir() {
- # Create lgsm data modsdir.
- if [ ! -d "${modsdir}" ]; then
- echo -en "creating LinuxGSM mods data directory ${modsdir}..."
- mkdir -p "${modsdir}"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Creating mod download dir ${modsdir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating mod download dir ${modsdir}"
- fi
- fi
- # Create mod install directory.
- if [ ! -d "${modinstalldir}" ]; then
- echo -en "creating mods install directory ${modinstalldir}..."
- mkdir -p "${modinstalldir}"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Creating mod install directory ${modinstalldir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating mod install directory ${modinstalldir}"
- fi
- fi
- # Create ${datadir}/${modsinstalledlist}.
- if [ ! -f "${modsinstalledlistfullpath}" ]; then
- touch "${modsinstalledlistfullpath}"
- fn_script_log_info "Created ${modsinstalledlistfullpath}"
- fi
- }
- # Create tmp download mod directory.
- fn_mods_create_tmp_dir() {
- if [ ! -d "${modstmpdir}" ]; then
- mkdir -p "${modstmpdir}"
- exitcode=$?
- echo -en "creating mod download directory ${modstmpdir}..."
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Creating mod download directory ${modstmpdir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Creating mod download directory ${modstmpdir}"
- fi
- fi
- }
- # Remove the tmp mod download directory when finished.
- fn_mods_clear_tmp_dir() {
- if [ -d "${modstmpdir}" ]; then
- echo -en "clearing mod download directory ${modstmpdir}..."
- rm -rf "${modstmpdir:?}"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_print_fail_eol_nl
- fn_script_log_fail "Clearing mod download directory ${modstmpdir}"
- core_exit.sh
- else
- fn_print_ok_eol_nl
- fn_script_log_pass "Clearing mod download directory ${modstmpdir}"
- fi
- fi
- # Clear temp file list as well.
- if [ -f "${modsdir}/.removedfiles.tmp" ]; then
- rm -f "${modsdir:?}/.removedfiles.tmp"
- fi
- }
- # Counts how many mods were installed.
- fn_mods_count_installed() {
- if [ -f "${modsinstalledlistfullpath}" ]; then
- installedmodscount=$(wc -l < "${modsinstalledlistfullpath}")
- else
- installedmodscount=0
- fi
- }
- # Exits if no mods were installed.
- fn_mods_check_installed() {
- # Count installed mods.
- fn_mods_count_installed
- # If no mods are found.
- if [ "${installedmodscount}" -eq 0 ]; then
- echo -e ""
- fn_print_failure_nl "No installed mods or addons were found"
- echo -e " * Install mods using LinuxGSM first with: ./${selfname} mods-install"
- fn_script_log_error "No installed mods or addons were found."
- core_exit.sh
- fi
- }
- # Checks that mod files list exists and isn't empty.
- fn_check_mod_files_list() {
- # File list must exist and be valid before any operation on it.
- if [ -f "${modsdir}/${modcommand}-files.txt" ]; then
- # How many lines is the file list.
- modsfilelistsize=$(wc -l < "${modsdir}/${modcommand}-files.txt")
- # If file list is empty.
- if [ "${modsfilelistsize}" -eq 0 ]; then
- fn_print_failure "${modcommand}-files.txt is empty"
- echo -e "* Unable to remove ${modprettyname}"
- fn_script_log_fail "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}."
- core_exit.sh
- fi
- else
- fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist"
- fn_script_log_fail "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}."
- core_exit.sh
- fi
- }
- fn_mod_exist() {
- modreq=$1
- # requires one parameter, the mod
- if [ -f "${modsdir}/${modreq}-files.txt" ]; then
- # how many lines is the file list
- modsfilelistsize=$(wc -l < "${modsdir}/${modreq}-files.txt")
- # if file list is empty
- if [ "${modsfilelistsize}" -eq 0 ]; then
- fn_mod_required_fail_exist "${modreq}"
- fi
- else
- fn_mod_required_fail_exist "${modreq}"
- fi
- }
- fn_mod_required_fail_exist() {
- modreq=$1
- # requires one parameter, the mod
- fn_script_log_fail "${modreq}-files.txt is empty: unable to find ${modreq} installed"
- echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..."
- fn_print_fail_eol_nl
- core_exit.sh
- }
- fn_mod_liblist_gam_filenames() {
- # clear variables just in case
- moddll=""
- modso=""
- moddylib=""
- # default libraries
- case ${gamename} in
- "Counter-Strike 1.6")
- moddll="mp.dll"
- modso="cs.so"
- moddylib="cs.dylib"
- ;;
- "Day of Defeat")
- moddll="dod.dll"
- modso="dod.so"
- moddylib="dod.dylib"
- ;;
- "Team Fortress Classic")
- moddll="tfc.dll"
- modso="tfc.so"
- moddylib="tfc.dylib"
- ;;
- "Natural Selection")
- moddll="ns.dll"
- modso="ns_i386.so"
- moddylib=""
- ;;
- "The Specialists")
- moddll="mp.dll"
- modso="ts_i386.so"
- moddylib=""
- ;;
- "Half-Life: Deathmatch")
- moddll="hl.dll"
- modso="hl.so"
- moddylib="hl.dylib"
- ;;
- esac
- }
- # modifiers for liblist.gam to add/remote metamod binaries
- fn_mod_install_liblist_gam_file() {
- fn_mod_liblist_gam_filenames
- if [ -f "${modinstalldir}/liblist.gam" ]; then
- # modify the liblist.gam file to initialize Metamod
- logentry="sed replace (dlls\\${moddll}) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll in liblist.gam..."
- rpldll="s/dlls\\\\${moddll}/addons\/metamod\/dlls\/metamod.dll/g"
- sed -i $rpldll "${modinstalldir}/liblist.gam"
- grep -q "addons/metamod/dlls/metamod.dll" "${modinstalldir}/liblist.gam"
- exitcode=$?
- # if replacement back didn't happen, error out.
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- # modify the liblist.gam file to initialize metamod
- logentry="sed replace (dlls\\${modso}) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll_linux in liblist.gam..."
- rplso="s/dlls\/${modso}/addons\/metamod\/dlls\/metamod.so/g"
- sed -i $rplso "${modinstalldir}/liblist.gam"
- grep -q "addons/metamod/dlls/metamod.so" "${modinstalldir}/liblist.gam"
- exitcode=$?
- # if replacement back didn't happen, error out
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- # mac os needs to be checked not all mods support mac os
- if [ -n "${moddylib}" ]; then
- # modify the liblist.gam file to initialize metamod
- logentry="sed replace (dlls\\${moddylib}) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll_osx in liblist.gam..."
- rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g"
- sed -i $rpldylib "${modinstalldir}/liblist.gam"
- grep -q "addons/metamod/dlls/metamod.dylib" "${modinstalldir}/liblist.gam"
- exitcode=$?
- # if replacement back didn't happen, error out.
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- fi
- fi
- }
- fn_mod_remove_liblist_gam_file() {
- fn_mod_liblist_gam_filenames
- if [ -f "${modinstalldir}/liblist.gam" ]; then
- # modify the liblist.gam file back to defaults
- logentry="sed replace (addons/metamod/dlls/metamod.dll) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll in liblist.gam..."
- rpldll="s/addons\/metamod\/dlls\/metamod.dll/dlls\\\\${moddll}/g"
- sed -i $rpldll "${modinstalldir}/liblist.gam"
- grep -q "${moddll}" "${modinstalldir}/liblist.gam"
- exitcode=$?
- # if replacement back didn't happen, error out.
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- # modify the liblist.gam file back to defaults
- logentry="sed replace (addons/metamod/dlls/metamod.so) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll_linux in liblist.gam..."
- rplso="s/addons\/metamod\/dlls\/metamod.so/dlls\/${modso}/g"
- sed -i $rplso "${modinstalldir}/liblist.gam"
- grep -q "${modso}" "${modinstalldir}/liblist.gam"
- exitcode=$?
- # if replacement back didn't happen, error out
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- # mac os needs to be checked not all mods support mac os
- if [ -n "${moddylib}" ]; then
- # modify the liblist.gam file back to defaults
- logentry="sed replace (addons/metamod/dlls/metamod.dylib) ${modinstalldir}/liblist.gam"
- echo -en "modifying gamedll_osx in liblist.gam..."
- rpldylib="s/addons\/metamod\/dlls\/metamod.dylib/dlls\/${moddylib}/g"
- sed -i $rpldylib "${modinstalldir}/liblist.gam"
- grep -q "${moddylib}" "${modinstalldir}/liblist.gam"
- # if replacement back didn't happen, error out.
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- fi
- fi
- }
- fn_mod_install_amxmodx_file() {
- # does plugins.ini exist?
- if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
- # since it does exist, is the entry already in plugins.ini
- logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) inserted into ${modinstalldir}/addons/metamod/plugins.ini"
- echo -en "adding amxmodx_mm_i386.so in plugins.ini..."
- if ! grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"; then
- # file exists but the entry does not, let's add it
- if ! echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini"; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- fi
- else
- # create new file and add the mod to it
- if ! echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini"; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- core_exit.sh
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- fi
- }
- fn_mod_remove_amxmodx_file() {
- if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
- # since it does exist, is the entry already in plugins.ini
- logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) removed from ${modinstalldir}/addons/metamod/plugins.ini"
- echo -en "removing amxmodx_mm_i386.so in plugins.ini..."
- # is it found? If so remove it and clean up
- if grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"; then
- # delete the line we inserted
- sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' "${modinstalldir}/addons/metamod/plugins.ini"
- # remove empty lines
- sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini"
- exitcode=$?
- if [ "${exitcode}" -ne 0 ]; then
- fn_script_log_fail "${logentry}"
- fn_print_fail_eol_nl
- else
- fn_script_log_pass "${logentry}"
- fn_print_ok_eol_nl
- fi
- # if file is empty, remove it.
- if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
- rm -f "${modinstalldir}/addons/metamod/plugins.ini"
- fn_script_log_pass "file removed ${modinstalldir}/addons/metamod/plugins.ini because it was empty"
- fi
- fi
- fi
- }
- ## Database initialisation.
- mods_list.sh
- fn_mods_available
|