mirror of
https://github.com/GameServerManagers/LinuxGSM.git
synced 2025-01-09 12:37:33 +08:00
750 lines
26 KiB
Bash
Executable File
750 lines
26 KiB
Bash
Executable File
#!/bin/bash
|
|
# LinuxGSM command_mods_install.sh module
|
|
# Author: Daniel Gibbs
|
|
# Contributors: http://linuxgsm.com/contrib
|
|
# Website: https://linuxgsm.com
|
|
# Description: Core functions for mods list/install/update/remove
|
|
|
|
functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
|
|
|
|
# Files and Directories.
|
|
modsdir="${lgsmdir}/mods"
|
|
modstmpdir="${modsdir}/tmp"
|
|
extractdir="${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_fatal "An issue occurred downloading ${modprettyname}"
|
|
core_exit.sh
|
|
fi
|
|
if [ ! -d "${extractdir}" ]; then
|
|
mkdir -p "${extractdir}"
|
|
fi
|
|
fn_dl_extract "${modstmpdir}" "${modfilename}" "${extractdir}"
|
|
}
|
|
|
|
# Convert mod files to lowercase if needed.
|
|
fn_mod_lowercase(){
|
|
if [ "${modlowercase}" == "LowercaseOn" ]; then
|
|
|
|
echo -en "converting ${modprettyname} files to lowercase..."
|
|
fn_sleep_time
|
|
fn_script_log_info "Converting ${modprettyname} files to lowercase"
|
|
fileswc=$(find "${extractdir}" -depth | wc -l)
|
|
echo -en "\r"
|
|
while read -r src; do
|
|
dst=$(dirname "${src}$(/)basename" "${src}" | tr '[:upper:]' '[:lower:]')
|
|
if [ "${src}" != "${dst}" ]
|
|
then
|
|
[ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo -e "${src} was not renamed"
|
|
local exitcode=$?
|
|
((renamedwc++))
|
|
fi
|
|
echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." $'\r'
|
|
((totalfileswc++))
|
|
done < <(find "${extractdir}" -depth)
|
|
echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..."
|
|
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
core_exit.sh
|
|
else
|
|
fn_print_ok_eol_nl
|
|
fi
|
|
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 "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt"
|
|
local exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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 "${extractdir}/." "${modinstalldir}/"
|
|
local exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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.
|
|
local exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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=index; index <= ${#mods_global_array[@]}; index--)); do
|
|
# When "MOD" is found.
|
|
if [ "${mods_global_array[index]}" == "MOD" ]; then
|
|
# Get info.
|
|
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_fatal "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 grabing 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}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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 lgsm/data/${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}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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 -fr "${modstmpdir:?}"
|
|
exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_print_fail_eol_nl
|
|
fn_script_log_fatal "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_fatal "${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_fatal "${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_fatal "${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
|
|
}
|
|
|
|
# modifers 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}" != 0 ]; then
|
|
fn_script_log_fatal "${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}" != 0 ]; then
|
|
fn_script_log_fatal "${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}" != 0 ]; then
|
|
fn_script_log_fatal "${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}" != 0 ]; then
|
|
fn_script_log_fatal "${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}" != 0 ]; then
|
|
fn_script_log_fatal "${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}" != 0 ]; then
|
|
fn_script_log_fatal "${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..."
|
|
grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
|
|
exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
# file exists but the entry does not, let's add it
|
|
echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini"
|
|
exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_script_log_fatal "${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
|
|
echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini"
|
|
exitcode=$?
|
|
if [ "${exitcode}" != 0 ]; then
|
|
fn_script_log_fatal "${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..."
|
|
grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
|
|
# iIs it found? If so remove it and clean up
|
|
exitcode=$?
|
|
if [ "${exitcode}" == 0 ]; 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}" != 0 ]; then
|
|
fn_script_log_fatal "${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 "${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
|