mods_core.sh 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. #!/bin/bash
  2. # LinuxGSM command_mods_install.sh module
  3. # Author: Daniel Gibbs
  4. # Contributors: http://linuxgsm.com/contrib
  5. # Website: https://linuxgsm.com
  6. # Description: Core functions for mods list/install/update/remove
  7. functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
  8. # Files and Directories.
  9. modsdir="${lgsmdir}/mods"
  10. modstmpdir="${modsdir}/tmp"
  11. extractdir="${modstmpdir}/extract"
  12. modsinstalledlist="installed-mods.txt"
  13. modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}"
  14. ## Installation.
  15. # Download management.
  16. fn_mod_install_files(){
  17. fn_fetch_file "${modurl}" "" "" "" "${modstmpdir}" "${modfilename}"
  18. # Check if variable is valid checking if file has been downloaded and exists.
  19. if [ ! -f "${modstmpdir}/${modfilename}" ]; then
  20. fn_print_failure "An issue occurred downloading ${modprettyname}"
  21. fn_script_log_fatal "An issue occurred downloading ${modprettyname}"
  22. core_exit.sh
  23. fi
  24. if [ ! -d "${extractdir}" ]; then
  25. mkdir -p "${extractdir}"
  26. fi
  27. fn_dl_extract "${modstmpdir}" "${modfilename}" "${extractdir}"
  28. }
  29. # Convert mod files to lowercase if needed.
  30. fn_mod_lowercase(){
  31. if [ "${modlowercase}" == "LowercaseOn" ]; then
  32. echo -en "converting ${modprettyname} files to lowercase..."
  33. fn_sleep_time
  34. fn_script_log_info "Converting ${modprettyname} files to lowercase"
  35. fileswc=$(find "${extractdir}" -depth | wc -l)
  36. echo -en "\r"
  37. while read -r src; do
  38. dst=$(dirname "${src}$(/)basename" "${src}" | tr '[:upper:]' '[:lower:]')
  39. if [ "${src}" != "${dst}" ]
  40. then
  41. [ ! -e "${dst}" ] && mv -T "${src}" "${dst}" || echo -e "${src} was not renamed"
  42. local exitcode=$?
  43. ((renamedwc++))
  44. fi
  45. echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..." $'\r'
  46. ((totalfileswc++))
  47. done < <(find "${extractdir}" -depth)
  48. echo -en "${renamedwc} / ${totalfileswc} / ${fileswc} converting ${modprettyname} files to lowercase..."
  49. if [ "${exitcode}" != 0 ]; then
  50. fn_print_fail_eol_nl
  51. core_exit.sh
  52. else
  53. fn_print_ok_eol_nl
  54. fi
  55. fi
  56. }
  57. # Create ${modcommand}-files.txt containing the full extracted file/directory list.
  58. fn_mod_create_filelist(){
  59. echo -en "building ${modcommand}-files.txt..."
  60. fn_sleep_time
  61. # ${modsdir}/${modcommand}-files.txt.
  62. find "${extractdir}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt"
  63. local exitcode=$?
  64. if [ "${exitcode}" != 0 ]; then
  65. fn_print_fail_eol_nl
  66. fn_script_log_fatal "Building ${modsdir}/${modcommand}-files.txt"
  67. core_exit.sh
  68. else
  69. fn_print_ok_eol_nl
  70. fn_script_log_pass "Building ${modsdir}/${modcommand}-files.txt"
  71. fi
  72. # Adding removed files if needed.
  73. if [ -f "${modsdir}/.removedfiles.tmp" ]; then
  74. cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt"
  75. fi
  76. }
  77. # Copy the mod into serverfiles.
  78. fn_mod_copy_destination(){
  79. echo -en "copying ${modprettyname} to ${modinstalldir}..."
  80. fn_sleep_time
  81. cp -Rf "${extractdir}/." "${modinstalldir}/"
  82. local exitcode=$?
  83. if [ "${exitcode}" != 0 ]; then
  84. fn_print_fail_eol_nl
  85. fn_script_log_fatal "Copying ${modprettyname} to ${modinstalldir}"
  86. else
  87. fn_print_ok_eol_nl
  88. fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}"
  89. fi
  90. }
  91. # Add the mod to the installed-mods.txt.
  92. fn_mod_add_list(){
  93. if [ -z "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then
  94. echo -e "${modcommand}" >> "${modsinstalledlistfullpath}"
  95. fn_script_log_info "${modcommand} added to ${modsinstalledlist}"
  96. fi
  97. }
  98. # Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt.
  99. fn_mod_tidy_files_list(){
  100. # Check file list validity.
  101. fn_check_mod_files_list
  102. # Output to the user
  103. echo -en "tidy up ${modcommand}-files.txt..."
  104. fn_sleep_time
  105. fn_script_log_info "Tidy up ${modcommand}-files.txt"
  106. # Lines/files to remove from file list (end with ";" separator).
  107. removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64;"
  108. # Loop through files to remove from file list,
  109. # generate elements to remove from list.
  110. removefromlistamount=$(echo -e "${removefromlist}" | awk -F ';' '{ print NF }')
  111. # Test all subvalue of "removefromlist" using the ";" separator.
  112. for ((filesindex=1; filesindex < removefromlistamount; filesindex++)); do
  113. # Put current file into test variable.
  114. removefilevar=$(echo -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')
  115. # Delete line(s) matching exactly.
  116. sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt"
  117. # Exit on error.
  118. local exitcode=$?
  119. if [ "${exitcode}" != 0 ]; then
  120. fn_print_fail_eol_nl
  121. fn_script_log_fatal "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt"
  122. core_exit.sh
  123. break
  124. fi
  125. done
  126. fn_print_ok_eol_nl
  127. # Sourcemod fix
  128. # Remove metamod from sourcemod fileslist.
  129. if [ "${modcommand}" == "sourcemod" ]; then
  130. # Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt.
  131. sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt"
  132. sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt"
  133. fi
  134. # Remove common paths from deletion list (Add your sourcemod mod here)
  135. if [ "${modcommand}" == "gokz" ] || [ "${modcommand}" == "ttt" ] || [ "${modcommand}" == "steamworks" ] || [ "${modcommand}" == "get5" ]; then
  136. sed -i "/^addons\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
  137. sed -i "/^addons\/sourcemod\/configs$/d" "${modsdir}/${modcommand}-files.txt"
  138. sed -i "/^addons\/sourcemod\/extensions$/d" "${modsdir}/${modcommand}-files.txt"
  139. sed -i "/^addons\/sourcemod\/logs$/d" "${modsdir}/${modcommand}-files.txt"
  140. sed -i "/^addons\/sourcemod\/plugins$/d" "${modsdir}/${modcommand}-files.txt"
  141. sed -i "/^addons\/sourcemod\/plugins\/disabled$/d" "${modsdir}/${modcommand}-files.txt"
  142. sed -i "/^addons\/sourcemod\/scripting$/d" "${modsdir}/${modcommand}-files.txt"
  143. sed -i "/^addons\/sourcemod\/scripting\/include$/d" "${modsdir}/${modcommand}-files.txt"
  144. sed -i "/^addons\/sourcemod\/translations$/d" "${modsdir}/${modcommand}-files.txt"
  145. # Don't delete directories of translations like 'fr', 'sv', 'de', etc
  146. sed -i "/^addons\/sourcemod\/translations\/[A-Za-z0-9_]*$/d" "${modsdir}/${modcommand}-files.txt"
  147. sed -i "/^cfg\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
  148. sed -i "/^maps$/d" "${modsdir}/${modcommand}-files.txt"
  149. sed -i "/^materialss$/d" "${modsdir}/${modcommand}-files.txt"
  150. sed -i "/^materials\/models$/d" "${modsdir}/${modcommand}-files.txt"
  151. sed -i "/^materials\/models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
  152. sed -i "/^materials\/darkness$/d" "${modsdir}/${modcommand}-files.txt"
  153. sed -i "/^materials\/decals$/d" "${modsdir}/${modcommand}-files.txt"
  154. sed -i "/^materials\/overlays$/d" "${modsdir}/${modcommand}-files.txt"
  155. sed -i "/^models$/d" "${modsdir}/${modcommand}-files.txt"
  156. sed -i "/^models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
  157. sed -i "/^sound$/d" "${modsdir}/${modcommand}-files.txt"
  158. sed -i "/^sound\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
  159. fi
  160. # Remove paths of specific mods from deletion list
  161. if [ "${modcommand}" == "gokz" ]; then
  162. sed -i "/^addons\/sourcemod\/scripting\/include\/smjansson.inc$/d" "${modsdir}/${modcommand}-files.txt"
  163. sed -i "/^addons\/sourcemod\/scripting\/include\/GlobalAPI-Core.inc$/d" "${modsdir}/${modcommand}-files.txt"
  164. sed -i "/^addons\/sourcemod\/scripting\/include\/sourcebanspp.inc$/d" "${modsdir}/${modcommand}-files.txt"
  165. sed -i "/^addons\/sourcemod\/scripting\/include\/autoexecconfig.inc$/d" "${modsdir}/${modcommand}-files.txt"
  166. sed -i "/^addons\/sourcemod\/scripting\/include\/colorvariables.inc$/d" "${modsdir}/${modcommand}-files.txt"
  167. sed -i "/^addons\/sourcemod\/scripting\/include\/movementapi.inc$/d" "${modsdir}/${modcommand}-files.txt"
  168. sed -i "/^addons\/sourcemod\/scripting\/include\/movement.inc$/d" "${modsdir}/${modcommand}-files.txt"
  169. sed -i "/^addons\/sourcemod\/scripting\/include\/dhooks.inc$/d" "${modsdir}/${modcommand}-files.txt"
  170. sed -i "/^addons\/sourcemod\/scripting\/include\/updater.inc$/d" "${modsdir}/${modcommand}-files.txt"
  171. fi
  172. }
  173. ## Information Gathering.
  174. # Get details of a mod any (relevant and unique, such as full mod name or install command) value.
  175. fn_mod_get_info(){
  176. # Variable to know when job is done.
  177. modinfocommand="0"
  178. # Find entry in global array.
  179. for ((index=0; index <= ${#mods_global_array[@]}; index++)); do
  180. # When entry is found.
  181. if [ "${mods_global_array[index]}" == "${currentmod}" ]; then
  182. # Go back to the previous "MOD" separator.
  183. for ((index=index; index <= ${#mods_global_array[@]}; index--)); do
  184. # When "MOD" is found.
  185. if [ "${mods_global_array[index]}" == "MOD" ]; then
  186. # Get info.
  187. fn_mods_define
  188. modinfocommand="1"
  189. break
  190. fi
  191. done
  192. fi
  193. # Exit the loop if job is done.
  194. if [ "${modinfocommand}" == "1" ]; then
  195. break
  196. fi
  197. done
  198. # What happens if mod is not found.
  199. if [ "${modinfocommand}" == "0" ]; then
  200. fn_script_log_error "Could not find information for ${currentmod}"
  201. fn_print_error_nl "Could not find information for ${currentmod}"
  202. core_exit.sh
  203. fi
  204. }
  205. # Define all variables for a mod at once when index is set to a separator.
  206. fn_mods_define(){
  207. if [ -z "$index" ]; then
  208. fn_script_log_fatal "index variable not set. Please report an issue."
  209. fn_print_error "index variable not set. Please report an issue."
  210. echo -e "* https://github.com/GameServerManagers/LinuxGSM/issues"
  211. core_exit.sh
  212. fi
  213. modcommand="${mods_global_array[index+1]}"
  214. modprettyname="${mods_global_array[index+2]}"
  215. modurl="${mods_global_array[index+3]}"
  216. modfilename="${mods_global_array[index+4]}"
  217. modsubdirs="${mods_global_array[index+5]}"
  218. modlowercase="${mods_global_array[index+6]}"
  219. modinstalldir="${mods_global_array[index+7]}"
  220. modkeepfiles="${mods_global_array[index+8]}"
  221. modengines="${mods_global_array[index+9]}"
  222. modgames="${mods_global_array[index+10]}"
  223. modexcludegames="${mods_global_array[index+11]}"
  224. modsite="${mods_global_array[index+12]}"
  225. moddescription="${mods_global_array[index+13]}"
  226. }
  227. # Builds list of installed mods.
  228. # using installed-mods.txt grabing mod info from mods_list.sh.
  229. fn_mods_installed_list(){
  230. fn_mods_count_installed
  231. # Set/reset variables.
  232. installedmodsline="1"
  233. installedmodslist=()
  234. modprettynamemaxlength="0"
  235. modsitemaxlength="0"
  236. moddescriptionmaxlength="0"
  237. modcommandmaxlength="0"
  238. # Loop through every line of the installed mods list ${modsinstalledlistfullpath}.
  239. while [ "${installedmodsline}" -le "${installedmodscount}" ]; do
  240. currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")
  241. # Get mod info to make sure mod exists.
  242. fn_mod_get_info
  243. # Add the mod to available commands.
  244. installedmodslist+=( "${modcommand}" )
  245. # Increment line check.
  246. ((installedmodsline++))
  247. done
  248. if [ "${installedmodscount}" ]; then
  249. fn_script_log_info "${installedmodscount} addons/mods are currently installed"
  250. fi
  251. }
  252. # Loops through mods_global_array to define available mods & provide available commands for mods installation.
  253. fn_mods_available(){
  254. # First, reset variables.
  255. compatiblemodslist=()
  256. availablemodscommands=()
  257. # Find compatible games.
  258. # Find separators through the global array.
  259. for ((index="0"; index <= ${#mods_global_array[@]}; index++)); do
  260. # If current value is a separator; then.
  261. if [ "${mods_global_array[index]}" == "${modseparator}" ]; then
  262. # Set mod variables.
  263. fn_mods_define
  264. # Test if game is compatible.
  265. fn_mod_compatible_test
  266. # If game is compatible.
  267. if [ "${modcompatibility}" == "1" ]; then
  268. # Put it into an array to prepare user output.
  269. compatiblemodslist+=( "${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}" )
  270. # Keep available commands in an array to make life easier.
  271. availablemodscommands+=( "${modcommand}" )
  272. fi
  273. fi
  274. done
  275. }
  276. ## Mod compatibility check.
  277. # Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable.
  278. fn_compatible_mod_games(){
  279. # Reset test value.
  280. modcompatiblegame="0"
  281. # If value is set to GAMES (ignore).
  282. if [ "${modgames}" != "GAMES" ]; then
  283. # How many games we need to test.
  284. gamesamount=$(echo -e "${modgames}" | awk -F ';' '{ print NF }')
  285. # Test all subvalue of "modgames" using the ";" separator.
  286. for ((gamevarindex=1; gamevarindex < gamesamount; gamevarindex++)); do
  287. # Put current game name into modtest variable.
  288. gamemodtest=$( echo -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )
  289. # If game name matches.
  290. if [ "${gamemodtest}" == "${gamename}" ]; then
  291. # Mod is compatible.
  292. modcompatiblegame="1"
  293. fi
  294. done
  295. fi
  296. }
  297. # Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable.
  298. fn_compatible_mod_engines(){
  299. # Reset test value.
  300. modcompatibleengine="0"
  301. # If value is set to ENGINES (ignore).
  302. if [ "${modengines}" != "ENGINES" ]; then
  303. # How many engines we need to test.
  304. enginesamount=$(echo -e "${modengines}" | awk -F ';' '{ print NF }')
  305. # Test all subvalue of "modengines" using the ";" separator.
  306. for ((gamevarindex=1; gamevarindex < ${enginesamount}; gamevarindex++)); do
  307. # Put current engine name into modtest variable.
  308. enginemodtest=$( echo -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )
  309. # If engine name matches.
  310. if [ "${enginemodtest}" == "${engine}" ]; then
  311. # Mod is compatible.
  312. modcompatibleengine="1"
  313. fi
  314. done
  315. fi
  316. }
  317. # Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable.
  318. fn_not_compatible_mod_games(){
  319. # Reset test value.
  320. modeincompatiblegame="0"
  321. # If value is set to NOTGAMES (ignore).
  322. if [ "${modexcludegames}" != "NOTGAMES" ]; then
  323. # How many engines we need to test.
  324. excludegamesamount=$(echo -e "${modexcludegames}" | awk -F ';' '{ print NF }')
  325. # Test all subvalue of "modexcludegames" using the ";" separator.
  326. for ((gamevarindex=1; gamevarindex < excludegamesamount; gamevarindex++)); do
  327. # Put current engine name into modtest variable.
  328. excludegamemodtest=$( echo -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }' )
  329. # If engine name matches.
  330. if [ "${excludegamemodtest}" == "${gamename}" ]; then
  331. # Mod is compatible.
  332. modeincompatiblegame="1"
  333. fi
  334. done
  335. fi
  336. }
  337. # Sums up if a mod is compatible or not with modcompatibility=0/1.
  338. fn_mod_compatible_test(){
  339. # Test game and engine compatibility.
  340. fn_compatible_mod_games
  341. fn_compatible_mod_engines
  342. fn_not_compatible_mod_games
  343. if [ "${modeincompatiblegame}" == "1" ]; then
  344. modcompatibility="0"
  345. elif [ "${modcompatibleengine}" == "1" ]||[ "${modcompatiblegame}" == "1" ]; then
  346. modcompatibility="1"
  347. else
  348. modcompatibility="0"
  349. fi
  350. }
  351. ## Directory management.
  352. # Create mods files and directories if it doesn't exist.
  353. fn_create_mods_dir(){
  354. # Create lgsm data modsdir.
  355. if [ ! -d "${modsdir}" ]; then
  356. echo -en "creating LinuxGSM mods data directory ${modsdir}..."
  357. mkdir -p "${modsdir}"
  358. exitcode=$?
  359. if [ "${exitcode}" != 0 ]; then
  360. fn_print_fail_eol_nl
  361. fn_script_log_fatal "Creating mod download dir ${modsdir}"
  362. core_exit.sh
  363. else
  364. fn_print_ok_eol_nl
  365. fn_script_log_pass "Creating mod download dir ${modsdir}"
  366. fi
  367. fi
  368. # Create mod install directory.
  369. if [ ! -d "${modinstalldir}" ]; then
  370. echo -en "creating mods install directory ${modinstalldir}..."
  371. mkdir -p "${modinstalldir}"
  372. exitcode=$?
  373. if [ "${exitcode}" != 0 ]; then
  374. fn_print_fail_eol_nl
  375. fn_script_log_fatal "Creating mod install directory ${modinstalldir}"
  376. core_exit.sh
  377. else
  378. fn_print_ok_eol_nl
  379. fn_script_log_pass "Creating mod install directory ${modinstalldir}"
  380. fi
  381. fi
  382. # Create lgsm/data/${modsinstalledlist}.
  383. if [ ! -f "${modsinstalledlistfullpath}" ]; then
  384. touch "${modsinstalledlistfullpath}"
  385. fn_script_log_info "Created ${modsinstalledlistfullpath}"
  386. fi
  387. }
  388. # Create tmp download mod directory.
  389. fn_mods_create_tmp_dir(){
  390. if [ ! -d "${modstmpdir}" ]; then
  391. mkdir -p "${modstmpdir}"
  392. exitcode=$?
  393. echo -en "creating mod download directory ${modstmpdir}..."
  394. if [ "${exitcode}" != 0 ]; then
  395. fn_print_fail_eol_nl
  396. fn_script_log_fatal "Creating mod download directory ${modstmpdir}"
  397. core_exit.sh
  398. else
  399. fn_print_ok_eol_nl
  400. fn_script_log_pass "Creating mod download directory ${modstmpdir}"
  401. fi
  402. fi
  403. }
  404. # Remove the tmp mod download directory when finished.
  405. fn_mods_clear_tmp_dir(){
  406. if [ -d "${modstmpdir}" ]; then
  407. echo -en "clearing mod download directory ${modstmpdir}..."
  408. rm -fr "${modstmpdir:?}"
  409. exitcode=$?
  410. if [ "${exitcode}" != 0 ]; then
  411. fn_print_fail_eol_nl
  412. fn_script_log_fatal "Clearing mod download directory ${modstmpdir}"
  413. core_exit.sh
  414. else
  415. fn_print_ok_eol_nl
  416. fn_script_log_pass "Clearing mod download directory ${modstmpdir}"
  417. fi
  418. fi
  419. # Clear temp file list as well.
  420. if [ -f "${modsdir}/.removedfiles.tmp" ]; then
  421. rm -f "${modsdir:?}/.removedfiles.tmp"
  422. fi
  423. }
  424. # Counts how many mods were installed.
  425. fn_mods_count_installed(){
  426. if [ -f "${modsinstalledlistfullpath}" ]; then
  427. installedmodscount=$(wc -l < "${modsinstalledlistfullpath}")
  428. else
  429. installedmodscount=0
  430. fi
  431. }
  432. # Exits if no mods were installed.
  433. fn_mods_check_installed(){
  434. # Count installed mods.
  435. fn_mods_count_installed
  436. # If no mods are found.
  437. if [ ${installedmodscount} -eq 0 ]; then
  438. echo -e ""
  439. fn_print_failure_nl "No installed mods or addons were found"
  440. echo -e " * Install mods using LinuxGSM first with: ./${selfname} mods-install"
  441. fn_script_log_error "No installed mods or addons were found."
  442. core_exit.sh
  443. fi
  444. }
  445. # Checks that mod files list exists and isn't empty.
  446. fn_check_mod_files_list(){
  447. # File list must exist and be valid before any operation on it.
  448. if [ -f "${modsdir}/${modcommand}-files.txt" ]; then
  449. # How many lines is the file list.
  450. modsfilelistsize=$(wc -l < "${modsdir}/${modcommand}-files.txt")
  451. # If file list is empty.
  452. if [ "${modsfilelistsize}" -eq 0 ]; then
  453. fn_print_failure "${modcommand}-files.txt is empty"
  454. echo -e "* Unable to remove ${modprettyname}"
  455. fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}."
  456. core_exit.sh
  457. fi
  458. else
  459. fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist"
  460. fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}."
  461. core_exit.sh
  462. fi
  463. }
  464. fn_mod_exist(){
  465. modreq=$1
  466. # requires one parameter, the mod
  467. if [ -f "${modsdir}/${modreq}-files.txt" ]; then
  468. # how many lines is the file list
  469. modsfilelistsize=$(wc -l < "${modsdir}/${modreq}-files.txt")
  470. # if file list is empty
  471. if [ "${modsfilelistsize}" -eq 0 ]; then
  472. fn_mod_required_fail_exist "${modreq}"
  473. fi
  474. else
  475. fn_mod_required_fail_exist "${modreq}"
  476. fi
  477. }
  478. fn_mod_required_fail_exist(){
  479. modreq=$1
  480. # requires one parameter, the mod
  481. fn_script_log_fatal "${modreq}-files.txt is empty: unable to find ${modreq} installed"
  482. echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..."
  483. fn_print_fail_eol_nl
  484. core_exit.sh
  485. }
  486. fn_mod_liblist_gam_filenames(){
  487. # clear variables just in case
  488. moddll=""
  489. modso=""
  490. moddylib=""
  491. # default libraries
  492. case ${gamename} in
  493. "Counter-Strike 1.6")
  494. moddll="mp.dll"
  495. modso="cs.so"
  496. moddylib="cs.dylib"
  497. ;;
  498. "Day of Defeat")
  499. moddll="dod.dll"
  500. modso="dod.so"
  501. moddylib="dod.dylib"
  502. ;;
  503. "Team Fortress Classic")
  504. moddll="tfc.dll"
  505. modso="tfc.so"
  506. moddylib="tfc.dylib"
  507. ;;
  508. "Natural Selection")
  509. moddll="ns.dll"
  510. modso="ns_i386.so"
  511. moddylib=""
  512. ;;
  513. "The Specialists")
  514. moddll="mp.dll"
  515. modso="ts_i386.so"
  516. moddylib=""
  517. ;;
  518. "Half-Life: Deathmatch")
  519. moddll="hl.dll"
  520. modso="hl.so"
  521. moddylib="hl.dylib"
  522. ;;
  523. esac
  524. }
  525. # modifers for liblist.gam to add/remote metamod binaries
  526. fn_mod_install_liblist_gam_file(){
  527. fn_mod_liblist_gam_filenames
  528. if [ -f "${modinstalldir}/liblist.gam" ]; then
  529. # modify the liblist.gam file to initialize Metamod
  530. logentry="sed replace (dlls\\${moddll}) ${modinstalldir}/liblist.gam"
  531. echo -en "modifying gamedll in liblist.gam..."
  532. rpldll="s/dlls\\\\${moddll}/addons\/metamod\/dlls\/metamod.dll/g"
  533. sed -i $rpldll "${modinstalldir}/liblist.gam"
  534. grep -q "addons/metamod/dlls/metamod.dll" "${modinstalldir}/liblist.gam"
  535. exitcode=$?
  536. # if replacement back didn't happen, error out.
  537. if [ "${exitcode}" != 0 ]; then
  538. fn_script_log_fatal "${logentry}"
  539. fn_print_fail_eol_nl
  540. else
  541. fn_script_log_pass "${logentry}"
  542. fn_print_ok_eol_nl
  543. fi
  544. # modify the liblist.gam file to initialize metamod
  545. logentry="sed replace (dlls\\${modso}) ${modinstalldir}/liblist.gam"
  546. echo -en "modifying gamedll_linux in liblist.gam..."
  547. rplso="s/dlls\/${modso}/addons\/metamod\/dlls\/metamod.so/g"
  548. sed -i $rplso "${modinstalldir}/liblist.gam"
  549. grep -q "addons/metamod/dlls/metamod.so" "${modinstalldir}/liblist.gam"
  550. exitcode=$?
  551. # if replacement back didn't happen, error out
  552. if [ "${exitcode}" != 0 ]; then
  553. fn_script_log_fatal "${logentry}"
  554. fn_print_fail_eol_nl
  555. else
  556. fn_script_log_pass "${logentry}"
  557. fn_print_ok_eol_nl
  558. fi
  559. # mac os needs to be checked not all mods support mac os
  560. if [ -n "${moddylib}" ]; then
  561. # modify the liblist.gam file to initialize metamod
  562. logentry="sed replace (dlls\\${moddylib}) ${modinstalldir}/liblist.gam"
  563. echo -en "modifying gamedll_osx in liblist.gam..."
  564. rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g"
  565. sed -i $rpldylib "${modinstalldir}/liblist.gam"
  566. grep -q "addons/metamod/dlls/metamod.dylib" "${modinstalldir}/liblist.gam"
  567. exitcode=$?
  568. # if replacement back didn't happen, error out.
  569. if [ "${exitcode}" != 0 ]; then
  570. fn_script_log_fatal "${logentry}"
  571. fn_print_fail_eol_nl
  572. else
  573. fn_script_log_pass ${logentry}
  574. fn_print_ok_eol_nl
  575. fi
  576. fi
  577. fi
  578. }
  579. fn_mod_remove_liblist_gam_file(){
  580. fn_mod_liblist_gam_filenames
  581. if [ -f "${modinstalldir}/liblist.gam" ]; then
  582. # modify the liblist.gam file back to defaults
  583. logentry="sed replace (addons/metamod/dlls/metamod.dll) ${modinstalldir}/liblist.gam"
  584. echo -en "modifying gamedll in liblist.gam..."
  585. rpldll="s/addons\/metamod\/dlls\/metamod.dll/dlls\\\\${moddll}/g"
  586. sed -i $rpldll "${modinstalldir}/liblist.gam"
  587. grep -q "${moddll}" "${modinstalldir}/liblist.gam"
  588. exitcode=$?
  589. # if replacement back didn't happen, error out.
  590. if [ "${exitcode}" != 0 ]; then
  591. fn_script_log_fatal "${logentry}"
  592. fn_print_fail_eol_nl
  593. else
  594. fn_script_log_pass ${logentry}
  595. fn_print_ok_eol_nl
  596. fi
  597. # modify the liblist.gam file back to defaults
  598. logentry="sed replace (addons/metamod/dlls/metamod.so) ${modinstalldir}/liblist.gam"
  599. echo -en "modifying gamedll_linux in liblist.gam..."
  600. rplso="s/addons\/metamod\/dlls\/metamod.so/dlls\/${modso}/g"
  601. sed -i $rplso "${modinstalldir}/liblist.gam"
  602. grep -q "${modso}" "${modinstalldir}/liblist.gam"
  603. exitcode=$?
  604. # if replacement back didn't happen, error out
  605. if [ "${exitcode}" != 0 ]; then
  606. fn_script_log_fatal "${logentry}"
  607. fn_print_fail_eol_nl
  608. else
  609. fn_script_log_pass ${logentry}
  610. fn_print_ok_eol_nl
  611. fi
  612. # mac os needs to be checked not all mods support mac os
  613. if [ -n "${moddylib}" ]; then
  614. # modify the liblist.gam file back to defaults
  615. logentry="sed replace (addons/metamod/dlls/metamod.dylib) ${modinstalldir}/liblist.gam"
  616. echo -en "modifying gamedll_osx in liblist.gam..."
  617. rpldylib="s/addons\/metamod\/dlls\/metamod.dylib/dlls\/${moddylib}/g"
  618. sed -i $rpldylib "${modinstalldir}/liblist.gam"
  619. grep -q "${moddylib}" "${modinstalldir}/liblist.gam"
  620. # if replacement back didn't happen, error out.
  621. exitcode=$?
  622. if [ "${exitcode}" != 0 ]; then
  623. fn_script_log_fatal "${logentry}"
  624. fn_print_fail_eol_nl
  625. else
  626. fn_script_log_pass ${logentry}
  627. fn_print_ok_eol_nl
  628. fi
  629. fi
  630. fi
  631. }
  632. fn_mod_install_amxmodx_file(){
  633. # does plugins.ini exist?
  634. if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
  635. # since it does exist, is the entry already in plugins.ini
  636. logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) inserted into ${modinstalldir}/addons/metamod/plugins.ini"
  637. echo -en "adding amxmodx_mm_i386.so in plugins.ini..."
  638. grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
  639. exitcode=$?
  640. if [ "${exitcode}" != 0 ]; then
  641. # file exists but the entry does not, let's add it
  642. echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini"
  643. exitcode=$?
  644. if [ "${exitcode}" != 0 ]; then
  645. fn_script_log_fatal "${logentry}"
  646. fn_print_fail_eol_nl
  647. else
  648. fn_script_log_pass ${logentry}
  649. fn_print_ok_eol_nl
  650. fi
  651. fi
  652. else
  653. # create new file and add the mod to it
  654. echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini"
  655. exitcode=$?
  656. if [ "${exitcode}" != 0 ]; then
  657. fn_script_log_fatal "${logentry}"
  658. fn_print_fail_eol_nl
  659. core_exit.sh
  660. else
  661. fn_script_log_pass ${logentry}
  662. fn_print_ok_eol_nl
  663. fi
  664. fi
  665. }
  666. fn_mod_remove_amxmodx_file(){
  667. if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
  668. # since it does exist, is the entry already in plugins.ini
  669. logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) removed from ${modinstalldir}/addons/metamod/plugins.ini"
  670. echo -en "removing amxmodx_mm_i386.so in plugins.ini..."
  671. grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
  672. # iIs it found? If so remove it and clean up
  673. exitcode=$?
  674. if [ "${exitcode}" == 0 ]; then
  675. # delete the line we inserted
  676. sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' "${modinstalldir}/addons/metamod/plugins.ini"
  677. # remove empty lines
  678. sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini"
  679. exitcode=$?
  680. if [ "${exitcode}" != 0 ]; then
  681. fn_script_log_fatal "${logentry}"
  682. fn_print_fail_eol_nl
  683. else
  684. fn_script_log_pass ${logentry}
  685. fn_print_ok_eol_nl
  686. fi
  687. # if file is empty, remove it.
  688. if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
  689. rm "${modinstalldir}/addons/metamod/plugins.ini"
  690. fn_script_log_pass "file removed ${modinstalldir}/addons/metamod/plugins.ini because it was empty"
  691. fi
  692. fi
  693. fi
  694. }
  695. ## Database initialisation.
  696. mods_list.sh
  697. fn_mods_available