lgsm local mirror
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

755 lines
27 KiB

#!/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 = 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_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 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}" -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
}
# 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}" -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..."
grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
exitcode=$?
if [ "${exitcode}" -ne 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}" -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
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}" -ne 0 ]; 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..."
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}" -eq 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}" -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