Просмотр исходного кода

feat(mods): metamod/amxmodx for goldsrc engines (#3104)

tkrn 5 лет назад
Родитель
Сommit
097bb991ab

+ 23 - 0
lgsm/functions/command_mods_install.sh

@@ -95,6 +95,18 @@ if [ -f "${modsinstalledlistfullpath}" ]; then
 fi
 
 ## Installation.
+# If amxmodx check if metamod exists first
+if [ "${modcommand}" == "amxmodx" ]; then
+	fn_mod_exist "metamod"
+fi
+
+if [ "${modcommand}" == "amxmodxcs"  ] ||
+   [ "${modcommand}" == "amxmodxdod" ] ||
+   [ "${modcommand}" == "amxmodxtfc" ] ||
+   [ "${modcommand}" == "amxmodxns"  ] ||
+   [ "${modcommand}" == "amxmodxts"  ]; then
+	fn_mod_exist "amxmodx"
+fi
 
 fn_create_mods_dir
 fn_mods_clear_tmp_dir
@@ -106,6 +118,17 @@ fn_mod_copy_destination
 fn_mod_add_list
 fn_mod_tidy_files_list
 fn_mods_clear_tmp_dir
+
+# Create/modify existing liblist.gam file for Metamod
+if [ "${modcommand}" == "metamod" ]; then
+	fn_mod_install_liblist_gam_file
+fi
+
+# Create/modify plugins.ini file for Metamod
+if [ "${modcommand}" == "amxmodx" ]; then
+	fn_mod_install_amxmodx_file
+fi
+
 echo -e "${modprettyname} installed"
 fn_script_log_pass "${modprettyname} installed."
 

+ 25 - 6
lgsm/functions/command_mods_remove.sh

@@ -37,7 +37,7 @@ while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do
 	read -r usermodselect
 	# Exit if user says exit or abort.
 	if [ "${usermodselect}" == "exit" ]||[ "${usermodselect}" == "abort" ]; then
-			core_exit.sh
+		core_exit.sh
 	# Supplementary output upon invalid user input.
 	elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then
 		fn_print_error2_nl "${usermodselect} is not a valid addon/mod."
@@ -82,17 +82,25 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do
 	echo -e "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..."
 	((modfileline++))
 done
-if [ "${exitcode}" != 0 ]; then
-	fn_print_fail_eol_nl
-	core_exit.sh
+
+# Added logic not to fail since removing game specific mods (amxmodxcs) removes files that will
+# not be found when removing the base (amxmodx) mod
+if [ "${modcommand}" != "amxmodx" ]; then
+	if [ "${exitcode}" != 0 ]; then
+		fn_print_fail_eol_nl
+		core_exit.sh
+	else
+		fn_print_ok_eol_nl
+	fi
 else
 	fn_print_ok_eol_nl
 fi
+
 # Remove file list.
 echo -en "removing ${modcommand}-files.txt..."
 fn_sleep_time
 rm -rf "${modsdir:?}/${modcommand}-files.txt"
-local exitcode=$?
+exitcode=$?
 if [ "${exitcode}" != 0 ]; then
 	fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt"
 	fn_print_fail_eol_nl
@@ -107,7 +115,7 @@ echo -en "removing ${modcommand} from ${modsinstalledlist}..."
 fn_sleep_time
 
 sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}"
-local exitcode=$?
+exitcode=$?
 if [ "${exitcode}" != 0 ]; then
 	fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}"
 	fn_print_fail_eol_nl
@@ -127,6 +135,17 @@ if [ "${engine}" == "unity3d" ]&&[[ "${modprettyname}" == *"Oxide"* ]]; then
 	fn_firstcommand_reset
 	unset exitbypass
 fi
+
+# Remove/modify existing liblist.gam file for Metamod
+if [ "${modcommand}" == "metamod" ]; then
+	fn_mod_remove_liblist_gam_file
+fi
+
+# Remove/modify plugins.ini file for AMX Mod X
+if [ "${modcommand}" == "amxmodx" ]; then
+	fn_mod_remove_amxmodx_file
+fi
+
 echo -e "${modprettyname} removed"
 fn_script_log "${modprettyname} removed"
 

+ 1 - 1
lgsm/functions/core_getopt.sh

@@ -125,7 +125,7 @@ if [ "${shortname}" == "squad" ]; then
 fi
 
 ## Mods commands.
-if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]; then
+if [ "${engine}" == "source" ]||[ "${shortname}" == "rust" ]||[ "${shortname}" == "hq" ]||[ "${shortname}" == "sdtd" ]||[ "${shortname}" == "cs" ]||[ "${shortname}" == "dod" ]||[ "${shortname}" == "tfc" ]||[ "${shortname}" == "ns" ]||[ "${shortname}" == "ts" ]||[ "${shortname}" == "hldm" ]; then
 	currentopt+=( "${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}" )
 fi
 

+ 248 - 0
lgsm/functions/mods_core.sh

@@ -495,6 +495,254 @@ fn_check_mod_files_list(){
 	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

+ 73 - 13
lgsm/functions/mods_list.sh

@@ -12,17 +12,59 @@ functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 # Get a proper URL for mods that don't provide a good one (optional)
 fn_script_log_info "Retrieving latest mods URLs"
-# Metamod
-metamodmversion="1.10"
-metamodscrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodmversion}/mmsource-latest-linux"
-metamodlatestfile=$(wget "${metamodscrapeurl}" -q -O -)
-metamoddownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodmversion}"
+
+# Metamod (Half-life 1 Classic Engine)
+metamodversion="1.21.1-am"
+metamodlatestfile="metamod-${metamodversion}.zip"
+metamoddownloadurl="https://www.amxmodx.org/release/${metamodlatestfile}"
 metamodurl="${metamoddownloadurl}"
+# AMX Mod X: Base
+amxxbaseversion="1.8.2"
+amxxbasemod="base"
+amxxbaselatestfile="amxmodx-${amxxbaseversion}-${amxxbasemod}-linux.tar.gz"
+amxxbasedownloadurl="https://www.amxmodx.org/release/${amxxbaselatestfile}"
+amxxbaseurl="${amxxbasedownloadurl}"
+# AMX Mod X: Counter-Strike
+amxxcsversion="1.8.2"
+amxxcsmod="cstrike"
+amxxcslatestfile="amxmodx-${amxxbaseversion}-${amxxcsmod}-linux.tar.gz"
+amxxcsdownloadurl="https://www.amxmodx.org/release/${amxxcslatestfile}"
+amxxcsurl="${amxxcsdownloadurl}"
+# AMX Mod X: Day of Defeat
+amxxdodversion="1.8.2"
+amxxdodmod="dod"
+amxxdodlatestfile="amxmodx-${amxxdodversion}-${amxxdodmod}-linux.tar.gz"
+amxxdoddownloadurl="https://www.amxmodx.org/release/${amxxdodlatestfile}"
+amxxdodurl="${amxxdoddownloadurl}"
+# AMX Mod X: Team Fortress Classic
+amxxtfcversion="1.8.2"
+amxxtfcmod="tfc"
+amxxtfclatestfile="amxmodx-${amxxtfcversion}-${amxxtfcmod}-linux.tar.gz"
+amxxtfcdownloadurl="https://www.amxmodx.org/release/${amxxtfclatestfile}"
+amxxtfcurl="${amxxtfcdownloadurl}"
+# AMX Mod X: Natural Selection
+amxxnsversion="1.8.2"
+amxxnsmod="ns"
+amxxnslatestfile="amxmodx-${amxxnsversion}-${amxxnsmod}-linux.tar.gz"
+amxxnsdownloadurl="https://www.amxmodx.org/release/${amxxnslatestfile}"
+amxxnsurl="${amxxnsdownloadurl}"
+# AMX Mod X: The Specialists
+amxxtsversion="1.8.2"
+amxxtsmod="ts"
+amxxtslatestfile="amxmodx-${amxxtsversion}-${amxxtsmod}-linux.tar.gz"
+amxxtsdownloadurl="https://www.amxmodx.org/release/${amxxtslatestfile}"
+amxxtsurl="${amxxtsdownloadurl}"
+# Metamod:Source
+metamodsourceversion="1.10"
+metamodsourcescrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodsourceversion}/mmsource-latest-linux"
+metamodsourcelatestfile=$(wget "${metamodsourcescrapeurl}" -q -O -)
+metamodsourcedownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodsourceversion}"
+metamodsourceurl="${metamodsourcedownloadurl}"
 # Sourcemod
-sourcemodmversion="1.10"
-sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodmversion}/sourcemod-latest-linux"
+sourcemodversion="1.10"
+sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodversion}/sourcemod-latest-linux"
 sourcemodlatestfile=$(wget "${sourcemodscrapeurl}" -q -O -)
-sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodmversion}"
+sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodversion}"
 sourcemodurl="${sourcemoddownloadurl}"
 # Steamworks
 steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks"
@@ -67,15 +109,34 @@ modseparator="MOD"
 # [12]	| "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install
 # [13]	| "Short Description" a description showed to the user upon installation/removal
 
+# Half-life 1 Engine Mods
+mod_info_metamod=( MOD "metamod" "Metamod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/plugins.ini;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://github.com/alliedmodders/metamod-hl1" "Plugins Framework" )
+mod_info_base_amxx=( MOD "amxmodx" "AMX Mod X: Base" "${amxxbaseurl}" "${amxxbaselatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod)" )
+
+# CS 1.6 (HL1) Engine Mods
+mod_info_cs_amxx=( MOD "amxmodxcs" "AMX Mod X: Counter-Strike" "${amxxcsurl}" "${amxxcslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" )
+
+# DOD (HL1) Engine Mods
+mod_info_dod_amxx=( MOD "amxmodxdod" "AMX Mod X: Day of Defeat" "${amxxdodurl}" "${amxxdodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Day of Defeat;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" )
+
+# TFC (HL1) Engine Mods
+mod_info_tfc_amxx=( MOD "amxmodxtfc" "AMX Mod X: Team Fortress Classic" "${amxxtfcurl}" "${amxxtfclatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Team Fortress Classic;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" )
+
+# NS (Natural Selection) (HL1) Engine Mods
+mod_info_ns_amxx=( MOD "amxmodxns" "AMX Mod X: Natural Selection" "${amxxnsurl}" "${amxxnslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Natural Selection;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" )
+
+# TS (The Specialists) (HL1) Engine Mods
+mod_info_ts_amxx=( MOD "amxmodxts" "AMX Mod X: The Specialists" "${amxxtsurl}" "${amxxtslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "The Specialists;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)" )
+
 # Source mods
-mod_info_metamod=( MOD "metamod" "MetaMod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" )
-mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires MetaMod)" )
+mod_info_metamodsource=( MOD "metamodsource" "Metamod: Source" "${metamodsourceurl}" "${metamodsourcelatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework" )
+mod_info_sourcemod=( MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires Metamod: Source)" )
 mod_info_steamworks=( MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn" )
 mod_info_stripper=( MOD "stripper" "Stripper Source" "http://www.bailopan.net/stripper/snapshots/1.2/stripper-1.2.2-git129-linux.tar.gz" "stripper-1.2.2-git129-linux.tar.gz" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)")
 
 # CS:GO Mods
 mod_info_gokz=( MOD "gokz" "GOKZ" "https://bitbucket.org/kztimerglobalteam/gokz/downloads/GOKZ-latest.zip" "gokz-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://bitbucket.org/kztimerglobalteam/gokz/src/master/" "Implements the KZ game mode (requires SourceMod and MetaMod)" )
-mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodmversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" )
+mod_info_ttt=( MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)" )
 mod_info_get5=( MOD "get5" "Get 5" "${get5url}" "${get5latestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/get5" "Plugin for competitive matches/scrims (requires SourceMod and MetaMod)" )
 mod_info_pug=( MOD "pug" "PUG" "${csgopuglatestlink}" "${csgopuglatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-pug-setup" "plugin for setting up private pug/10man games" )
 
@@ -93,11 +154,10 @@ mod_info_wiremodextras=( MOD "wiremod-extras" "Wiremod Extras" "https://github.c
 mod_info_darkrp=( MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/gamemodes" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode" )
 mod_info_darkrpmodification=( MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings" )
 
-
 # Oxidemod
 mod_info_rustoxide=( MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" "Oxide.Rust-linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "https://umod.org/games/rust" "Allows for the use of plugins" )
 mod_info_hwoxide=( MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlink}" "Oxide.Hurtworld.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "https://umod.org/games/hurtworld" "Allows for the use of plugins" )
 mod_info_sdtdoxide=( MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "Allows for the use of plugins" )
 
 # REQUIRED: Set all mods info into the global array
-mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_stripper[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" )
+mods_global_array=( "${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_pug[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" )