UltimateByte 9 лет назад
Родитель
Сommit
41230b0cfe
1 измененных файлов с 78 добавлено и 3 удалено
  1. 78 3
      lgsm/functions/mods_core.sh

+ 78 - 3
lgsm/functions/mods_core.sh

@@ -34,6 +34,10 @@ fn_clear_tmp_mods(){
 		rm -r "${modstmpdir}"
 		rm -r "${modstmpdir}"
 		fn_script_log "Clearing temp mod download directory: ${modstmpdir}"
 		fn_script_log "Clearing temp mod download directory: ${modstmpdir}"
 	fi
 	fi
+	# Clear temp file list as well
+	if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then
+		rm "${modsdatadir}/.removedfiles.tmp"
+	fi
 }
 }
 
 
 # Create tmp download mod directory
 # Create tmp download mod directory
@@ -83,8 +87,24 @@ fn_mod_lowercase(){
 fn_remove_cfg_files(){
 fn_remove_cfg_files(){
 	# Remove config file after extraction for updates set by ${modkeepfiles}
 	# Remove config file after extraction for updates set by ${modkeepfiles}
 	if [ "${modkeepfiles}" !=  "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then
 	if [ "${modkeepfiles}" !=  "OVERWRITE" ]&&[ "${modkeepfiles}" != "NOUPDATE" ]; then
-	echo "Prevent erasing custom files."
-	echo "Todo list"
+		# Upon mods updates, config files should not be overwritten
+		# We will just remove these files before copying the mod to the destination
+		removefilesamount="$(echo "${modkeepfiles}" | awk -F ';' '{ print NF }')"
+		# Test all subvalue of "modgames" using the ";" separator
+		for ((removefilesindex=1; removefilesindex < ${removefilesamount}; removefilesindex++)); do
+			# Put current game name into modtest variable
+			removefiletest="$( echo "${modkeepfiles}" | awk -F ';' -v x=${removefilesindex} '{ print $x }' )"
+			# If it matches
+			if [ -f "${extractdir}/${removefiletest}" ]||[ -d "${extractdir}/${removefiletest}" ]; then
+				# Then delete the file!
+				rm -R "${extractdir}/${removefiletest}"
+				# Write this file path in a tmp file, to rebuild a full file list
+				if [ ! -f "${modsdatadir}/.removedfiles.tmp" ]; then
+					touch "${modsdatadir}/.removedfiles.tmp"
+				fi
+					echo "${removefiletest}" > ${modsdatadir}/.removedfiles.tmp"
+			fi
+		done
 	fi
 	fi
 }
 }
 
 
@@ -95,8 +115,12 @@ fn_mod_fileslist(){
 		fn_script_log "Created ${modsdatadir}"
 		fn_script_log "Created ${modsdatadir}"
 	fi
 	fi
 	# ${modsdatadir}/${modcommand}-files.list
 	# ${modsdatadir}/${modcommand}-files.list
-	find "${extractdir}" -mindepth 1 -printf '%P\n' >> ${modsdatadir}/${modcommand}-files.list
+	find "${extractdir}" -mindepth 1 -printf '%P\n' > ${modsdatadir}/${modcommand}-files.list
 	fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}"
 	fn_script_log "Writing file list: ${modsdatadir}/${modcommand}-files.list}"
+	# Adding removed files if needed
+	if [ -f "${modsdatadir}/.removedfiles.tmp" ]; then
+		cat "${modsdatadir}/.removedfiles.tmp" >> ${modsdatadir}/${modcommand}-files.list
+	fi
 }
 }
 
 
 fn_mod_copy_destination(){
 fn_mod_copy_destination(){
@@ -136,3 +160,54 @@ fn_mod_add_list(){
 		fn_script_log "${modcommand} added to ${modslockfile}"
 		fn_script_log "${modcommand} added to ${modslockfile}"
 	fi
 	fi
 }
 }
+
+fn_check_files_list(){
+	# File list must exist and be valid before any operation on it
+	if [ -f "${modsdatadir}/${modcommand}-files.list" ]; then
+	# How many lines is the file list
+		modsfilelistsize="$(cat "${modsdatadir}/${modcommand}-files.list" | wc -l)"
+		# If file list is empty
+		if [ $modsfilelistsize -eq 0 ]; then
+			fn_print_error_nl "${modcommand}-files.list is empty"
+			echo "Exiting."
+			fn_scrip_log_fatal "${modcommand}-files.list is empty"
+			exitcode="2"
+			core_exit.sh
+		fi
+	else
+			fn_print_error_nl "${modsdatadir}/${modcommand}-files.list don't exist"
+			echo "Exiting."
+			fn_scrip_log_fatal "${modsdatadir}/${modcommand}-files.list don't exist"
+			exitcode="2"
+			core_exit.sh
+		fi
+}
+
+fn_postinstall_tasks(){
+	# Sourcemod, but any other game as well should never delete "cfg" or "addons" folder
+	# Prevent addons folder from being removed by clearing them in: ${modsdatadir}/${modcommand}-files.list
+	fn_check_files_list
+	# Output to the user
+	fn_print_information_nl "Rearranging ${modcommand}-files.list"
+	fn_script_log_info "Rearranging ${modcommand}-files.list"
+	smremovefromlist="cfg;addons"
+	# Loop through every single line to find any of the files to remove from the list
+	# that way these files won't get removed upon update or uninstall
+	fileslistline=1
+	while [ $fileslistline -le $modsfilelistsize ]; do
+		testline="$(sed "${fileslistline}q;d" "${modsdatadir}/${modcommand}-files.list")"
+		# How many elements to remove from list
+		smremoveamount="$(echo "${smremovefromlist}" | awk -F ';' '{ print NF }')"
+		# Test all subvalue of "modkeepfiles" using the ";" separator
+		for ((filesindex=1; filesindex < ${smremoveamount}; filesindex++)); do
+			# Put current file into test variable
+			smremovetestvar="$( echo "${smremovefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }' )"
+			# If it matches
+			if [ "${testline}" == "${smremovetestvar}" ]; then
+				# Then delete the line!
+				sed -i "${testline}d" "${modsdatadir}/${modcommand}-files.list"
+			fi
+		done
+		let fileslistline=fileslistline+1
+	done
+}