version 0.4.0 release
This commit is contained in:
@@ -34,17 +34,18 @@ h2mm
|
|||||||
### Available commands
|
### Available commands
|
||||||
|
|
||||||
- `install` - Install a mod by the file provided (directory, zip, patch).
|
- `install` - Install a mod by the file provided (directory, zip, patch).
|
||||||
- `uninstall` - Uninstall a mod by name (or index).
|
- `uninstall` - Uninstall a mod.
|
||||||
- `list` - List all installed mods.
|
- `list` - List all installed mods.
|
||||||
- `enable` - Enable a mod by name (or index).
|
- `enable` - Enable a mod.
|
||||||
- `disable` - Disable a mod by name (or index).
|
- `disable` - Disable a mod.
|
||||||
- `export` - Export installed mods to a zip file.
|
- `export` - Export installed mods to a zip file.
|
||||||
- `import` - Import mods from a zip file.
|
- `import` - Import mods from a zip file.
|
||||||
|
- `order` - Change load order for a mod.
|
||||||
- `modpack-create` - Create a modpack from the currently installed mods.
|
- `modpack-create` - Create a modpack from the currently installed mods.
|
||||||
- `modpack-switch` - Switch to a modpack by name (or index).
|
- `modpack-switch` - Switch to a modpack.
|
||||||
- `modpack-list` - List all installed modpacks.
|
- `modpack-list` - List all installed modpacks.
|
||||||
- `modpack-delete` - Delete a modpack by name (or index).
|
- `modpack-delete` - Delete a modpack.
|
||||||
- `modpack-overwrite` - Overwrite a modpack by name (or index).
|
- `modpack-overwrite` - Overwrite a modpack.
|
||||||
- `modpack-reset` - Reset all installed modpacks.
|
- `modpack-reset` - Reset all installed modpacks.
|
||||||
- `update` - Update h2mm to latest version.
|
- `update` - Update h2mm to latest version.
|
||||||
- `reset` - Reset all installed mods.
|
- `reset` - Reset all installed mods.
|
||||||
@@ -52,6 +53,8 @@ h2mm
|
|||||||
|
|
||||||
### Basic usage
|
### Basic usage
|
||||||
|
|
||||||
|
To find out how to use a command, you can run `h2mm <COMMAND> --help`.
|
||||||
|
|
||||||
#### Install mod(s)
|
#### Install mod(s)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -65,17 +68,17 @@ h2mm install -n "Example mod" mod* # using a wildcard to include all files
|
|||||||
#### Uninstall a mod
|
#### Uninstall a mod
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
h2mm uninstall "Example mod"
|
h2mm uninstall -n "Example mod"
|
||||||
h2mm uninstall -i 1 # uninstall mod with index 1
|
h2mm uninstall -i 3
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Enable/disable mods
|
#### Enable/disable mods
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
h2mm enable "Example mod"
|
h2mm enable -n "Example mod"
|
||||||
h2mm enable -i 1 # enable mod with index 1
|
h2mm enable -i 3
|
||||||
h2mm disable "Example mod"
|
h2mm disable -n "Example mod"
|
||||||
h2mm disable -i 1 # disable mod with index 1
|
h2mm disable -i 3
|
||||||
```
|
```
|
||||||
|
|
||||||
#### List installed mods
|
#### List installed mods
|
||||||
@@ -115,6 +118,7 @@ You can use the short form of commands to save some time. The shortcuts are:
|
|||||||
- `l` for `list`
|
- `l` for `list`
|
||||||
- `ex` for `export`
|
- `ex` for `export`
|
||||||
- `im` for `import`
|
- `im` for `import`
|
||||||
|
- `o` for `order`
|
||||||
- `mc` for `modpack-create`
|
- `mc` for `modpack-create`
|
||||||
- `ms` for `modpack-switch`
|
- `ms` for `modpack-switch`
|
||||||
- `ml` for `modpack-list`
|
- `ml` for `modpack-list`
|
||||||
@@ -129,10 +133,10 @@ You can use the short form of commands to save some time. The shortcuts are:
|
|||||||
You can set up modpacks by using the `modpack-*` commands. This allows you to quickly change between a set of mods. For more information, check the help message.
|
You can set up modpacks by using the `modpack-*` commands. This allows you to quickly change between a set of mods. For more information, check the help message.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
h2mm modpack-create "Modpack 1"
|
h2mm modpack-create -n "Modpack 1"
|
||||||
# install, enable, disable other mods...
|
# install, enable, disable other mods...
|
||||||
h2mm modpack-create "Modpack 2"
|
h2mm modpack-create -n "Modpack 2"
|
||||||
h2mm modpack-switch "Modpack 1"
|
h2mm modpack-switch -n "Modpack 1"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Exporting and importing
|
### Exporting and importing
|
||||||
@@ -140,8 +144,8 @@ h2mm modpack-switch "Modpack 1"
|
|||||||
You can export all installed mods to a zip file and import mods from the same file. This can be useful for sharing mods with others or for backing up your mods. The archive file (`.tar.gz`) will be saved in the current directory.
|
You can export all installed mods to a zip file and import mods from the same file. This can be useful for sharing mods with others or for backing up your mods. The archive file (`.tar.gz`) will be saved in the current directory.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
h2mm export modpack1.zip
|
h2mm export
|
||||||
h2mm import modpack2.zip
|
h2mm import /path/to/mods.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
### Resetting all installed mods
|
### Resetting all installed mods
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
VERSION="0.3.15"
|
VERSION="0.4.0"
|
||||||
|
|
||||||
# --- Globals ---
|
# --- Globals ---
|
||||||
|
|
||||||
@@ -18,6 +18,12 @@ H2PATH="${HOME}/.config/h2mm/h2path"
|
|||||||
LAST_CHECKED_UPDATE_FILE="${HOME}/.config/h2mm/last_update"
|
LAST_CHECKED_UPDATE_FILE="${HOME}/.config/h2mm/last_update"
|
||||||
VERSION_URL="https://raw.githubusercontent.com/v4n00/h2mm-cli/refs/heads/master/version"
|
VERSION_URL="https://raw.githubusercontent.com/v4n00/h2mm-cli/refs/heads/master/version"
|
||||||
|
|
||||||
|
breaking_changes_patches=(
|
||||||
|
["2"]='sed -i "s/^\([0-9]\+\),/\1,ENABLED,/" "$1/mods.csv"'
|
||||||
|
["3"]='sed -i "1 i\\3" "$1/mods.csv"'
|
||||||
|
["4"]='awk '\''BEGIN {FS=OFS=","} NR==1 {print 4; next} {print NR-1, $2, $3, $4, $5}'\'' "$1/mods.csv" | tee "$1/mods.csv" > /dev/null'
|
||||||
|
)
|
||||||
|
|
||||||
# --- Utility Functions ---
|
# --- Utility Functions ---
|
||||||
|
|
||||||
function get_version_major() {
|
function get_version_major() {
|
||||||
@@ -52,6 +58,16 @@ function disable_all_modpacks() {
|
|||||||
sed -i 's/ENABLED/DISABLED/' "$MODPACKS_DB_FILE"
|
sed -i 's/ENABLED/DISABLED/' "$MODPACKS_DB_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parse_help_no_arguments() {
|
||||||
|
display_help="$1"
|
||||||
|
[[ "$2" == "--help" || "$2" == "-h" ]] && { $display_help; exit 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_help_has_arguments() {
|
||||||
|
display_help="$1"
|
||||||
|
[[ $# -eq 1 || "$2" == "--help" || "$2" == "-h" ]] && { $display_help; exit 0; }
|
||||||
|
}
|
||||||
|
|
||||||
function log() {
|
function log() {
|
||||||
local type="$1"
|
local type="$1"
|
||||||
shift
|
shift
|
||||||
@@ -189,89 +205,93 @@ function initialize_modpack_directories() {
|
|||||||
|
|
||||||
# --- Help Functions ---
|
# --- Help Functions ---
|
||||||
|
|
||||||
function display_help() {
|
function display_help_main() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Helldivers 2 Mod Manager v${VERSION}
|
Helldivers 2 Mod Manager v${VERSION}
|
||||||
Usage: h2mm [OPTION] COMMAND
|
Usage: h2mm [OPTION] COMMAND
|
||||||
Commands:
|
Commands:
|
||||||
i, install Install a mod by the file provided (directory, zip, patch).
|
i, install Install a mod by the file provided (directory, zip, patch).
|
||||||
u, uninstall Uninstall a mod by name (or index).
|
u, uninstall Uninstall a mod.
|
||||||
l, list List all installed mods.
|
l, list List all installed mods.
|
||||||
e, enable Enable a mod by name (or index).
|
e, enable Enable a mod.
|
||||||
d, disable Disable a mod by name (or index).
|
d, disable Disable a mod.
|
||||||
ex, export Export installed mods to a zip file.
|
ex, export Export installed mods to a zip file.
|
||||||
im, import Import mods from a zip file.
|
im, import Import mods from a zip file.
|
||||||
|
o, order Change load order of a mod.
|
||||||
mc, modpack-create Create a modpack from the currently installed mods.
|
mc, modpack-create Create a modpack from the currently installed mods.
|
||||||
ms, modpack-switch Switch to a modpack by name (or index).
|
ms, modpack-switch Switch to a modpack.
|
||||||
ml, modpack-list List all installed modpacks.
|
ml, modpack-list List all installed modpacks.
|
||||||
mc, modpack-delete Delete a modpack by name (or index).
|
mc, modpack-delete Delete a modpack.
|
||||||
mo, modpack-overwrite Overwrite a modpack by name (or index).
|
mo, modpack-overwrite Overwrite a modpack.
|
||||||
mr, modpack-reset Reset all installed modpacks.
|
mr, modpack-reset Reset all installed modpacks.
|
||||||
up, update Update h2mm to the latest version.
|
up, update Update h2mm to the latest version.
|
||||||
r, reset Reset all installed mods.
|
r, reset Reset all installed mods.
|
||||||
help Display this help message.
|
help Display this help message.
|
||||||
For more information on usage, use h2mm [COMMAND] --help.
|
For more information on usage, use h2mm <COMMAND> --help.
|
||||||
Usage:
|
Usage:
|
||||||
h2mm install /path/to/mod.zip
|
h2mm install /path/to/mod.zip
|
||||||
h2mm install /path/to/mod/files
|
h2mm uninstall -n "Example mod"
|
||||||
h2mm uninstall \"Example mod\"
|
h2mm list
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_install_help() {
|
function display_help_install() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm install [OPTIONS] MOD_FILES|MOD_DIRECTORIES|MOD_ZIPS
|
Usage: h2mm install [OPTIONS] <MOD_FILES|MOD_DIRECTORIES|MOD_ZIPS>
|
||||||
Install a mod with any combination of mod files, directories, and zip files.
|
Install a mod with any combination of mod files, directories, and zip files.
|
||||||
Options:
|
Options:
|
||||||
-n "<MOD_NAME>" Name the mod yourself, inside double quotes.
|
-n "MOD_NAME" Name of the mod.
|
||||||
<MOD_FILES> Multiple mod files, accepts wildcards.
|
MOD_ZIPS Zip file(s) containing mod files.
|
||||||
<MOD_DIRECTORIES> Directory/directories containing mod files.
|
MOD_FILES Mod file(s), accepts wildcards.
|
||||||
<MOD_ZIPS> Zip file(s) containing mod files.
|
MOD_DIRECTORIES Directory/directories containing mod files.
|
||||||
Example:
|
Example:
|
||||||
h2mm install /path/to/mod.zip
|
h2mm install /path/to/mod.zip
|
||||||
h2mm install /path/to/mod/files
|
h2mm install /path/to/mod/files
|
||||||
h2mm install /path/to/mod.zip /path/to/mod2.zip /path/to/mod/files
|
h2mm install /path/to/mod.zip /path/to/mod2.zip /path/to/mod/files
|
||||||
h2mm install -n "Example mod" mod.patch_0 mod.patch_0.stream
|
h2mm install mod.patch_0 mod.patch_0.stream -n "Example mod"
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_uninstall_help() {
|
function display_help_uninstall() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm uninstall [OPTIONS] "MOD_NAME"
|
Usage: h2mm uninstall [OPTIONS] <"MOD_NAME"|MOD_INDEX>
|
||||||
Uninstall a mod by name or index.
|
Uninstall a mod by name or index.
|
||||||
Options:
|
Options:
|
||||||
-i <index> Index of the mod to uninstall.
|
-n "MOD_NAME" Name of the mod to uninstall.
|
||||||
|
-i MOD_INDEX Index of the mod to uninstall.
|
||||||
Usage:
|
Usage:
|
||||||
h2mm uninstall "Example mod"
|
h2mm uninstall -n "Example mod"
|
||||||
h2mm uninstall -i 1 # uninstall mod with index 1
|
h2mm uninstall -i 3
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_enable_help() {
|
function display_help_enable() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm enable [OPTIONS] "MOD_NAME"
|
Usage: h2mm enable [OPTIONS] <"MOD_NAME"|MOD_INDEX>
|
||||||
Enable a mod by name or index.
|
Enable a mod by name or index.
|
||||||
Options:
|
Options:
|
||||||
-i <index> Index of the mod to enable.
|
-n "MOD_NAME" Name of the mod to enable.
|
||||||
|
-i MOD_INDEX Index of the mod to enable.
|
||||||
Usage:
|
Usage:
|
||||||
h2mm enable "Example mod"
|
h2mm enable -n "Example mod"
|
||||||
h2mm enable -i 1 # enable mod with index 1
|
h2mm enable -i 3
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_disable_help() {
|
function display_help_disable() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm disable [OPTIONS] "MOD_NAME"
|
Usage: h2mm disable [OPTIONS] <"MOD_NAME"|MOD_INDEX>
|
||||||
Disable a mod by name or index.
|
Disable a mod by name or index.
|
||||||
Options:
|
Options:
|
||||||
-i <index> Index of the mod to disable.
|
-n "MOD_NAME" Name of the mod to disable.
|
||||||
|
-i MOD_INDEX Index of the mod to disable.
|
||||||
Usage:
|
Usage:
|
||||||
h2mm disable "Example mod"
|
h2mm disable -n "Example mod"
|
||||||
h2mm disable -i 1 # disable mod with index 1
|
h2mm disable -i 3
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_list_help() {
|
function display_help_list() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm list
|
Usage: h2mm list
|
||||||
Database of mods is stored in Steam/steamapps/common/Helldivers\ 2/data/mods.csv
|
Database of mods is stored in Steam/steamapps/common/Helldivers\ 2/data/mods.csv
|
||||||
@@ -281,43 +301,43 @@ Options:
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_reset_help() {
|
function display_help_reset() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm reset
|
Usage: h2mm reset
|
||||||
Reset all installed mods.
|
Reset all installed mods.
|
||||||
Deletes all installed mods/modpacks and the database file.
|
Deletes all installed mods/modpacks and the database file.
|
||||||
Database of mods is stored in Steam/steamapps/common/Helldivers\ 2/data/mods.csv, along with the mods.
|
Database of mods is stored in Steam/steamapps/common/Helldivers 2/data/mods.csv, along with the mods.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_export_help() {
|
function display_help_export() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm export
|
Usage: h2mm export
|
||||||
Export installed mods and database to a zip file (in h2mm format, archive with csv).
|
Export installed mods, modpacks and database to a zip file (in h2mm format - archive with csv) in the current working directory.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_import_help() {
|
function display_help_import() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm import
|
Usage: h2mm import <ARCHIVE_FILE>
|
||||||
Import mods and database from an archive file (coming from h2mm).
|
Import mods, modpacks and database from an archive file (coming from h2mm).
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_order_help() {
|
function display_help_order() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm order [OPTIONS] [MOD_NAME|MOD_INDEX] <NEW_INDEX>
|
Usage: h2mm order [OPTIONS] <"MOD_NAME"|MOD_INDEX> <NEW_INDEX>
|
||||||
Change order of a mod by name or index.
|
Change order of a mod by name or index.
|
||||||
Options:
|
Options:
|
||||||
-i <index> Index of the mod to order.
|
-i index Index of the mod to order.
|
||||||
-n <index> New index of the mod.
|
-n "MOD_NAME" Name of the mod to order.
|
||||||
Usage:
|
Usage:
|
||||||
h2mm order -n "Example mod" 1
|
h2mm order -n "Example mod" 6
|
||||||
h2mm order -i 1 2
|
h2mm order -i 3 6
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_list_help() {
|
function display_help_modpack_list() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-list
|
Usage: h2mm modpack-list
|
||||||
List all installed modpacks.
|
List all installed modpacks.
|
||||||
@@ -326,24 +346,24 @@ You can rename, delete, or edit this file to manage modpacks manually.
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_create_help() {
|
function display_help_modpack_create() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-create "MODPACK_NAME"
|
Usage: h2mm modpack-create -n "MODPACK_NAME"
|
||||||
Create a modpack from a range of mods specified after command is called.
|
Create a modpack from a range of mods specified after command is called.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_switch_help() {
|
function display_help_modpack_switch() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-switch [OPTIONS] "MODPACK_NAME"
|
Usage: h2mm modpack-switch [OPTIONS] <"MODPACK_NAME"|MODPACK_INDEX>
|
||||||
Switch to a modpack by name or index.
|
Switch to a modpack by name or index.
|
||||||
Options:
|
Options:
|
||||||
-i <index> Index of the modpack to switch to.
|
-n "MODPACK_NAME" Name of the modpack to switch to.
|
||||||
Switch to a modpack by name or index.
|
-i index Index of the modpack to switch to.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_reset_help() {
|
function display_help_modpack_reset() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-reset
|
Usage: h2mm modpack-reset
|
||||||
Reset all installed modpacks.
|
Reset all installed modpacks.
|
||||||
@@ -352,21 +372,23 @@ Database of modpacks is stored in Steam/steamapps/common/Helldivers\ 2/data/modp
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_delete_help() {
|
function display_help_modpack_delete() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-delete [OPTIONS] "MODPACK_NAME"
|
Usage: h2mm modpack-delete [OPTIONS] <"MODPACK_NAME"|MODPACK_INDEX>
|
||||||
Options:
|
|
||||||
-i <index> Index of the modpack to delete.
|
|
||||||
Delete a modpack by name or index.
|
Delete a modpack by name or index.
|
||||||
|
Options:
|
||||||
|
-n "MODPACK_NAME" Name of the modpack to delete.
|
||||||
|
-i index Index of the modpack to delete.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
function display_modpack_overwrite_help() {
|
function display_help_modpack_overwrite() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: h2mm modpack-overwrite [OPTIONS] "MODPACK_NAME"
|
Usage: h2mm modpack-overwrite [OPTIONS] <"MODPACK_NAME"|MODPACK_INDEX>
|
||||||
Options:
|
|
||||||
-i <index> Index of the modpack to overwrite.
|
|
||||||
Overwrite a modpack (the mods that it uses) by name or index.
|
Overwrite a modpack (the mods that it uses) by name or index.
|
||||||
|
Options:
|
||||||
|
-n "MODPACK_NAME" Name of the modpack to overwrite.
|
||||||
|
-i index Index of the modpack to overwrite.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,22 +520,23 @@ function upgrade_mods() {
|
|||||||
# Mod management
|
# Mod management
|
||||||
|
|
||||||
function mod_disable() {
|
function mod_disable() {
|
||||||
|
parse_help_has_arguments display_help_disable "$@"
|
||||||
local mod_name=""
|
local mod_name=""
|
||||||
local mod_index=""
|
local mod_index=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_disable_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid mod index."; exit 1; }
|
||||||
mod_index="$2"; shift 2
|
mod_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_disable_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Mod name is required."; exit 1; }
|
||||||
|
mod_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
mod_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -557,26 +580,29 @@ function mod_disable() {
|
|||||||
sed -i "/^$mod_index,/s/ENABLED/DISABLED/" "$DB_FILE"
|
sed -i "/^$mod_index,/s/ENABLED/DISABLED/" "$DB_FILE"
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Could not disable mod."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Could not disable mod."; exit 1; }
|
||||||
log INFO "Mod $mod_name ${GREEN}successfully${NC} disabled."
|
log INFO "Mod ${GREEN}successfully${NC} disabled: $mod_name."
|
||||||
|
|
||||||
|
disable_all_modpacks
|
||||||
}
|
}
|
||||||
|
|
||||||
function mod_enable() {
|
function mod_enable() {
|
||||||
|
parse_help_has_arguments display_help_enable "$@"
|
||||||
local mod_name=""
|
local mod_name=""
|
||||||
local mod_index=""
|
local mod_index=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_enable_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid mod index."; exit 1; }
|
||||||
mod_index="$2"; shift 2
|
mod_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_enable_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Mod name is required."; exit 1; }
|
||||||
|
mod_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
mod_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -614,24 +640,22 @@ function mod_enable() {
|
|||||||
sed -i "/^$mod_index,/s/DISABLED/ENABLED/" "$DB_FILE"
|
sed -i "/^$mod_index,/s/DISABLED/ENABLED/" "$DB_FILE"
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Could not enable mod."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Could not enable mod."; exit 1; }
|
||||||
log INFO "Mod $mod_name ${GREEN}successfully${NC} enabled."
|
log INFO "Mod ${GREEN}successfully${NC} enabled: $mod_name."
|
||||||
|
|
||||||
|
disable_all_modpacks
|
||||||
}
|
}
|
||||||
|
|
||||||
function mod_reset() {
|
function mod_reset() {
|
||||||
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
parse_help_no_arguments display_help_reset "$@"
|
||||||
display_reset_help
|
local no_path_reset=false; [[ "$1" == "--no-path-reset" ]] && no_path_reset=true
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
local modpack=false
|
|
||||||
[[ "$1" == "--modpack" ]] && modpack=true
|
|
||||||
|
|
||||||
log PROMPT "Are you sure you want to ${RED}reset${NC} all installed mods? (Y/n): "
|
log PROMPT "Are you sure you want to ${RED}reset${NC} all installed mods? (Y/n): "
|
||||||
read confirm
|
read confirm
|
||||||
|
|
||||||
if [[ "$confirm" == "y" || "$confirm" == "Y" || "$confirm" = "" ]]; then
|
if [[ "$confirm" == "y" || "$confirm" == "Y" || "$confirm" = "" ]]; then
|
||||||
rm -f "$MODS_DIR"/*.patch_*
|
rm -f "$MODS_DIR"/*.patch_*
|
||||||
rm -f "$DB_FILE"
|
rm -f "$DB_FILE"
|
||||||
[[ $modpack == false ]] && rm -f "$H2PATH"
|
[[ $no_path_reset == false ]] && rm -f "$H2PATH"
|
||||||
log INFO "Mods ${GREEN}successfully${NC} reset."
|
log INFO "Mods ${GREEN}successfully${NC} reset."
|
||||||
else
|
else
|
||||||
log INFO "Reset cancelled."
|
log INFO "Reset cancelled."
|
||||||
@@ -640,22 +664,19 @@ function mod_reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_install() {
|
function mod_install() {
|
||||||
|
parse_help_has_arguments display_help_install "$@"
|
||||||
local mod_name=""
|
local mod_name=""
|
||||||
local mod_dir=()
|
local mod_dir=()
|
||||||
local mod_files=()
|
local mod_files=()
|
||||||
local mod_zip=()
|
local mod_zip=()
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_install_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-n)
|
"-n")
|
||||||
|
[[ -z "$2" ]] && { log ERROR "Mod name is required."; exit 1; }
|
||||||
mod_name="$2"; shift 2
|
mod_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
|
||||||
display_install_help; exit 0
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
if [[ -f "$1" && "$1" == *.zip ]]; then
|
if [[ -f "$1" && "$1" == *.zip ]]; then
|
||||||
mod_zip+=("$1")
|
mod_zip+=("$1")
|
||||||
@@ -688,7 +709,7 @@ function mod_install() {
|
|||||||
mod_zip=("${mod_zip[@]:1}")
|
mod_zip=("${mod_zip[@]:1}")
|
||||||
done
|
done
|
||||||
|
|
||||||
# extract the zip file and pass it to mod dirs
|
# if zip, extract the zip file and pass it to mod dirs
|
||||||
if [[ -n "$mod_zip" ]]; then
|
if [[ -n "$mod_zip" ]]; then
|
||||||
command -v unzip &> /dev/null || { log ERROR "unzip package is not installed."; exit 1; }
|
command -v unzip &> /dev/null || { log ERROR "unzip package is not installed."; exit 1; }
|
||||||
|
|
||||||
@@ -777,8 +798,6 @@ function mod_install() {
|
|||||||
[[ ! -f "$file" ]] && { log ERROR "Mod file $file does not exist."; exit 1; }
|
[[ ! -f "$file" ]] && { log ERROR "Mod file $file does not exist."; exit 1; }
|
||||||
done
|
done
|
||||||
|
|
||||||
# hash table - in case multiple named files are needed for 1 mod install, store the patch count
|
|
||||||
declare -A patch_count
|
|
||||||
# store the target files so we can put them in the database later
|
# store the target files so we can put them in the database later
|
||||||
target_files=()
|
target_files=()
|
||||||
# sort the mod files because with the below logic, the .stream and .gpu_resources files need to come after their respective patch files
|
# sort the mod files because with the below logic, the .stream and .gpu_resources files need to come after their respective patch files
|
||||||
@@ -786,23 +805,18 @@ function mod_install() {
|
|||||||
|
|
||||||
for file in "${mod_files[@]}"; do
|
for file in "${mod_files[@]}"; do
|
||||||
base_name=$(get_basename "$file")
|
base_name=$(get_basename "$file")
|
||||||
patch_prefix="$MODS_DIR/${base_name}.patch_"
|
|
||||||
# count already installed patches
|
|
||||||
count=$(ls "${patch_prefix}"* 2>/dev/null | grep -E '([0-9]+$)' 2>/dev/null | wc -l)
|
|
||||||
|
|
||||||
# set patch count for file name if it doesn't exist yet
|
|
||||||
if [[ -z "${patch_count[$file]+unset}" ]]; then
|
|
||||||
patch_count["$file"]=$count
|
|
||||||
fi
|
|
||||||
# if the file has an extension (e.g. .stream, .gpu_resources), set the last patch number for the next step
|
|
||||||
patch_count["$base_name"]=$count
|
|
||||||
|
|
||||||
# if the file has an extension, look for the last patch number and use that, otherwise, the count will be wrong
|
|
||||||
extension=$(get_extension "$file")
|
extension=$(get_extension "$file")
|
||||||
|
|
||||||
|
|
||||||
|
# count already installed patches
|
||||||
|
count=$(ls "$MODS_DIR/${base_name}.patch_"* 2>/dev/null | grep -E '([0-9]+$)' 2>/dev/null | wc -l)
|
||||||
|
|
||||||
|
# if the file has an extension, look for the last patch number and subtract 1, otherwise, the count will be wrong
|
||||||
|
target_file="${base_name}.patch_"
|
||||||
if [[ -n "$extension" ]]; then
|
if [[ -n "$extension" ]]; then
|
||||||
target_file="${base_name}.patch_$((patch_count[$base_name] - 1))${extension}"
|
target_file="${target_file}$(($count - 1))${extension}"
|
||||||
else
|
else
|
||||||
target_file="${base_name}.patch_${patch_count[$file]}"
|
target_file="${target_file}${count}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
target_files+=($target_file)
|
target_files+=($target_file)
|
||||||
@@ -823,22 +837,23 @@ function mod_install() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_uninstall() {
|
function mod_uninstall() {
|
||||||
|
parse_help_has_arguments display_help_uninstall "$@"
|
||||||
local mod_name=""
|
local mod_name=""
|
||||||
local mod_index=""
|
local mod_index=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_uninstall_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid mod index."; exit 1; }
|
||||||
mod_index="$2"; shift 2
|
mod_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_uninstall_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Mod name is required."; exit 1; }
|
||||||
|
mod_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
mod_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -879,26 +894,14 @@ function mod_uninstall() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_list() {
|
function mod_list() {
|
||||||
|
parse_help_no_arguments display_help_list "$@"
|
||||||
local verbose=false
|
local verbose=false
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
[[ "$1" == "--verbose" || "$1" == "-v" ]] && verbose=true
|
||||||
case "$1" in
|
|
||||||
--help|-h)
|
|
||||||
display_list_help
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--verbose|-v)
|
|
||||||
verbose=true
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log INFO "No mods installed."; return; }
|
# quit if no mods are installed
|
||||||
|
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log INFO "No mods installed."; exit 0; }
|
||||||
|
|
||||||
log INFO "Installed mods:"
|
log INFO "Installed mods:"
|
||||||
|
|
||||||
@@ -915,8 +918,7 @@ function mod_list() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_export() {
|
function mod_export() {
|
||||||
[[ "$1" == "--help" || "$1" == "-h" ]] && { display_export_help; exit 0; }
|
parse_help_no_arguments display_help_export "$@"
|
||||||
|
|
||||||
local save_dir=$(pwd)
|
local save_dir=$(pwd)
|
||||||
local archive_name="Helldivers_2_Mods_$(date +%Y-%m-%d_%H-%M-%S)"
|
local archive_name="Helldivers_2_Mods_$(date +%Y-%m-%d_%H-%M-%S)"
|
||||||
local modpack_export=false
|
local modpack_export=false
|
||||||
@@ -928,7 +930,7 @@ function mod_export() {
|
|||||||
archive_name="$3"
|
archive_name="$3"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log INFO "No mods installed."; exit 1; }
|
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log ERROR "No mods installed."; exit 1; }
|
||||||
|
|
||||||
if [[ $modpack_export == false ]]; then
|
if [[ $modpack_export == false ]]; then
|
||||||
log PROMPT "Archive file will be saved to ${save_dir}/${archive_name}. Make? (Y/n): "
|
log PROMPT "Archive file will be saved to ${save_dir}/${archive_name}. Make? (Y/n): "
|
||||||
@@ -966,32 +968,57 @@ function mod_export() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_import() {
|
function mod_import() {
|
||||||
[[ "$1" == "--help" || "$1" == "-h" ]] && { display_import_help; exit 0; }
|
parse_help_has_arguments display_help_import "$@"
|
||||||
|
local modpack=false; [[ "$1" == "--modpack" ]] && { modpack=true; shift 1; }
|
||||||
local modpack=false
|
|
||||||
[[ "$1" == "--modpack" ]] && { modpack=true; shift 1; }
|
|
||||||
|
|
||||||
|
# check if the file exists
|
||||||
[[ ! -f "$1" ]] && { log ERROR "File $1 does not exist."; exit 1; }
|
[[ ! -f "$1" ]] && { log ERROR "File $1 does not exist."; exit 1; }
|
||||||
|
|
||||||
# reset mods before importing
|
# reset mods before importing
|
||||||
if [[ $modpack == false ]]; then
|
[[ $modpack == false ]] && log INFO "Importing mods will ${RED}reset${NC} your mods."
|
||||||
log INFO "Importing mods will ${RED}reset${NC} your mods."
|
mod_reset --no-path-reset
|
||||||
mod_reset
|
|
||||||
else
|
|
||||||
mod_reset --modpack
|
|
||||||
fi
|
|
||||||
|
|
||||||
# extract in temp directory
|
# extract in temp directory
|
||||||
OUT_DIR=$(mktemp -d)
|
OUT_DIR=$(mktemp -d)
|
||||||
tar -xzf "$1" -C "$OUT_DIR"
|
tar -xzf "$1" -C "$OUT_DIR"
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Could not import mods. Possibly because the archive is invalid."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Could not import mods. Possibly because the archive is invalid."; exit 1; }
|
||||||
|
|
||||||
|
# get the mods directory
|
||||||
MODS_EXPORT_DIR="$OUT_DIR/Helldivers 2 Mods"
|
MODS_EXPORT_DIR="$OUT_DIR/Helldivers 2 Mods"
|
||||||
[[ ! -d "$MODS_EXPORT_DIR" ]] && { log ERROR "Could not import mods. Possibly because the archive is invalid."; exit 1; }
|
[[ ! -d "$MODS_EXPORT_DIR" ]] && { log ERROR "Could not import mods. Possibly because the archive is invalid."; exit 1; }
|
||||||
|
|
||||||
# copy mods
|
# fix breaking changes if the version number (from the first line) is different
|
||||||
cp "$MODS_EXPORT_DIR"/* "$MODS_DIR"
|
db_version=$(head -n 1 "$MODS_EXPORT_DIR/mods.csv")
|
||||||
|
current_version=$(echo "$VERSION" | awk -F. '{print $2}')
|
||||||
|
|
||||||
|
[[ -z "$db_version" || ! "$db_version" =~ ^[0-9]+$ ]] && { log ERROR "Invalid version number inside mods.csv from imported archive."; exit 1; }
|
||||||
|
|
||||||
|
if [[ "$db_version" != "$current_version" ]]; then
|
||||||
|
log INFO "Import detected version 0.$db_version.x, current version is 0.$current_version.x."
|
||||||
|
|
||||||
|
# iterate from installed major number to latest major number
|
||||||
|
for ((i = db_version + 1; i <= current_version; i++)); do
|
||||||
|
if [[ -n "${breaking_changes_patches[$i]}" ]]; then
|
||||||
|
# apply breaking changes patch
|
||||||
|
eval $(echo "${breaking_changes_patches[$i]}" | sed "s:\$1:$MODS_EXPORT_DIR:g")
|
||||||
|
else
|
||||||
|
log INFO "No breaking changes for version $i."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
log ERROR "Failed to apply breaking changes patch for version $i. Do you want to continue? (Y/n): "
|
||||||
|
read -er response
|
||||||
|
|
||||||
|
[[ "$response" != "y" && "$response" != "Y" && -n "$response" ]] && { log INFO "Exiting." ; exit 1; }
|
||||||
|
else
|
||||||
|
log INFO "Version upgrade fix ${GREEN}successfully${NC} applied for version $i."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# copy everything in
|
||||||
|
cp -r "$MODS_EXPORT_DIR"/* "$MODS_DIR"
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Failed to import mods."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Failed to import mods."; exit 1; }
|
||||||
|
|
||||||
@@ -999,8 +1026,7 @@ function mod_import() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mod_order {
|
function mod_order {
|
||||||
[[ "$1" == "--help" || "$1" == "-h" ]] && { display_order_help; exit 0; }
|
parse_help_has_arguments display_help_order "$@"
|
||||||
|
|
||||||
local mod_name=""
|
local mod_name=""
|
||||||
local mod_index=""
|
local mod_index=""
|
||||||
local new_index=""
|
local new_index=""
|
||||||
@@ -1008,15 +1034,14 @@ function mod_order {
|
|||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid mod index."; exit 1; }
|
||||||
mod_index="$2"; shift 2
|
mod_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
-n)
|
"-n")
|
||||||
|
[[ -z "$2" ]] && { log ERROR "Mod name is required."; exit 1; }
|
||||||
mod_name="$2"; shift 2
|
mod_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
|
||||||
display_order_help; exit 0
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
new_index="$1"; shift 1
|
new_index="$1"; shift 1
|
||||||
;;
|
;;
|
||||||
@@ -1054,23 +1079,23 @@ function mod_order {
|
|||||||
declare -A replace_count
|
declare -A replace_count
|
||||||
for file in $current_mod_files; do
|
for file in $current_mod_files; do
|
||||||
extension=$(get_extension "$file")
|
extension=$(get_extension "$file")
|
||||||
basename=$(get_basename "$file")
|
base_name=$(get_basename "$file")
|
||||||
|
|
||||||
# if the file has no extension, add the basename to the hash table or increment the count
|
# if the file has no extension, add the basename to the hash table or increment the count
|
||||||
if [[ -z "$extension" ]]; then
|
if [[ -z "$extension" ]]; then
|
||||||
replace_count["$basename"]=$(( ${replace_count["$basename"]:-0} + 1 ))
|
replace_count["$base_name"]=$(( ${replace_count["$base_name"]:-0} + 1 ))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# step 2.1 - iterate over the basenames, find and store the files with the same basenames as the ones we want to upgrade/downgrade
|
# step 2.1 - iterate over the basenames, find and store the files with the same basenames as the ones we want to upgrade/downgrade
|
||||||
declare -A files_to_replace
|
declare -A files_to_replace
|
||||||
for basename in "${!replace_count[@]}"; do
|
for base_name in "${!replace_count[@]}"; do
|
||||||
IFS= files_to_replace["$basename"]=$(echo "$entries" | awk -F, '{print $4}' | grep -o "$basename\.patch_[^ ]*"); unset IFS
|
IFS= files_to_replace["$base_name"]=$(echo "$entries" | awk -F, '{print $4}' | grep -o "$base_name\.patch_[^ ]*"); unset IFS
|
||||||
done
|
done
|
||||||
|
|
||||||
# step 2.2 - reverse sort the files_to_replace if we are in descending order
|
# step 2.2 - reverse sort the files_to_replace if we are in descending order
|
||||||
[[ $ascending_order == false ]] && for basename in "${!files_to_replace[@]}"; do
|
[[ $ascending_order == false ]] && for base_name in "${!files_to_replace[@]}"; do
|
||||||
files_to_replace["$basename"]=$(echo "${files_to_replace["$basename"]}" | sort -rV)
|
files_to_replace["$base_name"]=$(echo "${files_to_replace["$base_name"]}" | sort -rV)
|
||||||
done
|
done
|
||||||
|
|
||||||
# move current mod files to "t_$file" so we can move the new files to the correct index
|
# move current mod files to "t_$file" so we can move the new files to the correct index
|
||||||
@@ -1080,17 +1105,17 @@ function mod_order {
|
|||||||
done
|
done
|
||||||
|
|
||||||
# step 3 - for every basename in files_to_replace, add replace_count to each file's patch number and move
|
# step 3 - for every basename in files_to_replace, add replace_count to each file's patch number and move
|
||||||
for basename in "${!files_to_replace[@]}"; do
|
for base_name in "${!files_to_replace[@]}"; do
|
||||||
files=$(echo "${files_to_replace["$basename"]}" | tr ' ' '\n')
|
files=$(echo "${files_to_replace["$base_name"]}" | tr ' ' '\n')
|
||||||
|
|
||||||
for file in $files; do
|
for file in $files; do
|
||||||
basename=$(get_basename "$file")
|
base_name=$(get_basename "$file")
|
||||||
patch_number=$(get_patch_number "$file")
|
patch_number=$(get_patch_number "$file")
|
||||||
extension=$(get_extension "$file")
|
extension=$(get_extension "$file")
|
||||||
|
|
||||||
# if ascending order, subtract replace_count to the patch number, otherwise add
|
# if ascending order, subtract replace_count to the patch number, otherwise add
|
||||||
operation="-"; [[ $ascending_order == false ]] && operation="+"
|
operation="-"; [[ $ascending_order == false ]] && operation="+"
|
||||||
new_file="${basename}.patch_$(($patch_number $operation ${replace_count["$basename"]}))${extension}"
|
new_file="${base_name}.patch_$(($patch_number $operation ${replace_count["$base_name"]}))${extension}"
|
||||||
|
|
||||||
mv "$MODS_DIR/$file" "$MODS_DIR/$new_file"
|
mv "$MODS_DIR/$file" "$MODS_DIR/$new_file"
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Could not move mod file $file."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Could not move mod file $file."; exit 1; }
|
||||||
@@ -1104,12 +1129,12 @@ function mod_order {
|
|||||||
|
|
||||||
# step 4 - for every file in current_mod_files, subtract the basename's array size of files_to_replace from the patch number
|
# step 4 - for every file in current_mod_files, subtract the basename's array size of files_to_replace from the patch number
|
||||||
for file in $current_mod_files; do
|
for file in $current_mod_files; do
|
||||||
basename=$(get_basename "$file")
|
base_name=$(get_basename "$file")
|
||||||
patch_number=$(get_patch_number "$file")
|
patch_number=$(get_patch_number "$file")
|
||||||
extension=$(get_extension "$file")
|
extension=$(get_extension "$file")
|
||||||
|
|
||||||
# get size of only files without an extension
|
# get size of only files without an extension
|
||||||
size=$(echo "${files_to_replace["$basename"]}" | grep -E "${basename}.patch_[0-9]+$" | tr ' ' '\n' | wc -l)
|
size=$(echo "${files_to_replace["$base_name"]}" | grep -E "${base_name}.patch_[0-9]+$" | tr ' ' '\n' | wc -l)
|
||||||
|
|
||||||
# in case size is 0, move t_file back to file later
|
# in case size is 0, move t_file back to file later
|
||||||
new_file=${file}
|
new_file=${file}
|
||||||
@@ -1117,7 +1142,7 @@ function mod_order {
|
|||||||
if [[ $size -gt 0 ]]; then
|
if [[ $size -gt 0 ]]; then
|
||||||
# if ascending order, add size from the patch number, otherwise subtract
|
# if ascending order, add size from the patch number, otherwise subtract
|
||||||
operation="+"; [[ $ascending_order == false ]] && operation="-"
|
operation="+"; [[ $ascending_order == false ]] && operation="-"
|
||||||
new_file="${basename}.patch_$(($patch_number $operation $size))${extension}"
|
new_file="${base_name}.patch_$(($patch_number $operation $size))${extension}"
|
||||||
|
|
||||||
log INFO "Reindexing ${ORANGE}$file${NC} to ${GREEN}$new_file${NC}."
|
log INFO "Reindexing ${ORANGE}$file${NC} to ${GREEN}$new_file${NC}."
|
||||||
|
|
||||||
@@ -1162,15 +1187,16 @@ function mod_order {
|
|||||||
sed -i "$((new_index + 1))i $entry" "$DB_FILE"
|
sed -i "$((new_index + 1))i $entry" "$DB_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log INFO "Mod ${GREEN}successfully${NC} reindexed: $mod_name from $mod_index to $new_index."
|
log INFO "Mod ${GREEN}successfully${NC} reindexed: \"$mod_name\" went from $mod_index to $new_index."
|
||||||
}
|
}
|
||||||
|
|
||||||
# --- Modpacks management ---
|
# --- Modpack management ---
|
||||||
|
|
||||||
function modpack_list() {
|
function modpack_list() {
|
||||||
[[ "$1" == "--help" || "$1" == "-h" ]] && { display_modpack_list_help; exit 0; }
|
parse_help_no_arguments display_help_modpack_list "$@"
|
||||||
|
|
||||||
[[ $(wc -l < "$MODPACKS_DB_FILE") -le 1 ]] && { log INFO "No modpacks saved."; return; }
|
# quit if no modpacks are saved
|
||||||
|
[[ $(wc -l < "$MODPACKS_DB_FILE") -le 1 ]] && { log INFO "No modpacks saved."; exit 0; }
|
||||||
|
|
||||||
log INFO "Saved modpacks:"
|
log INFO "Saved modpacks:"
|
||||||
|
|
||||||
@@ -1180,10 +1206,9 @@ function modpack_list() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modpack_create() {
|
function modpack_create() {
|
||||||
|
parse_help_no_arguments display_help_modpack_create "$@"
|
||||||
local modpack_name=""
|
local modpack_name=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_modpack_create_help; exit 0; }
|
|
||||||
|
|
||||||
# if no mods are installed, exit
|
# if no mods are installed, exit
|
||||||
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log ERROR "No mods installed."; exit 1; }
|
[[ $(wc -l < "$DB_FILE") -le 1 ]] && { log ERROR "No mods installed."; exit 1; }
|
||||||
|
|
||||||
@@ -1234,7 +1259,7 @@ function modpack_create() {
|
|||||||
mod_export --modpack "$MODPACKS_FOLDER" "$modpack_name"
|
mod_export --modpack "$MODPACKS_FOLDER" "$modpack_name"
|
||||||
|
|
||||||
log INFO "Modpack ${GREEN}successfully${NC} created: \$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
log INFO "Modpack ${GREEN}successfully${NC} created: \$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
||||||
log INFO "Switch to the modpack with 'h2mm modpack-switch $modpack_name'."
|
log INFO "Switch to the modpack with 'h2mm modpack-switch -n \"$modpack_name\"'."
|
||||||
|
|
||||||
# warn user to create a modpack with his main mods
|
# warn user to create a modpack with his main mods
|
||||||
[[ $(wc -l < "$MODPACKS_DB_FILE") -le 1 ]] && log INFO "If this is your first modpack, it is ${ORANGE}recommended${NC} to create a separate modpack with your main mods."
|
[[ $(wc -l < "$MODPACKS_DB_FILE") -le 1 ]] && log INFO "If this is your first modpack, it is ${ORANGE}recommended${NC} to create a separate modpack with your main mods."
|
||||||
@@ -1245,22 +1270,23 @@ function modpack_create() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modpack_switch() {
|
function modpack_switch() {
|
||||||
|
parse_help_has_arguments display_help_modpack_switch "$@"
|
||||||
local modpack_name=""
|
local modpack_name=""
|
||||||
local modpack_index=""
|
local modpack_index=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_modpack_switch_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid modpack index."; exit 1; }
|
||||||
modpack_index="$2"; shift 2
|
modpack_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_modpack_switch_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Modpack name is required."; exit 1; }
|
||||||
|
modpack_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
modpack_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -1271,7 +1297,9 @@ function modpack_switch() {
|
|||||||
get_modpack_name_and_index "$modpack_name" "$modpack_index"
|
get_modpack_name_and_index "$modpack_name" "$modpack_index"
|
||||||
|
|
||||||
log INFO "Switching modpacks mods will ${RED}reset${NC} your mods."
|
log INFO "Switching modpacks mods will ${RED}reset${NC} your mods."
|
||||||
|
silent=true
|
||||||
mod_import --modpack "$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
mod_import --modpack "$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
||||||
|
silent=false
|
||||||
|
|
||||||
log INFO "Modpack ${GREEN}successfully${NC} switched: $modpack_name."
|
log INFO "Modpack ${GREEN}successfully${NC} switched: $modpack_name."
|
||||||
|
|
||||||
@@ -1281,10 +1309,7 @@ function modpack_switch() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modpack_reset() {
|
function modpack_reset() {
|
||||||
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
parse_help_no_arguments display_help_modpack_reset "$@"
|
||||||
display_modpack_reset_help
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
log PROMPT "Are you sure you want to ${RED}reset${NC} all installed modpacks? (Y/n): "
|
log PROMPT "Are you sure you want to ${RED}reset${NC} all installed modpacks? (Y/n): "
|
||||||
read confirm
|
read confirm
|
||||||
@@ -1300,22 +1325,23 @@ function modpack_reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modpack_delete() {
|
function modpack_delete() {
|
||||||
|
parse_help_has_arguments display_help_modpack_delete "$@"
|
||||||
local modpack_name=""
|
local modpack_name=""
|
||||||
local modpack_index=""
|
local modpack_index=""
|
||||||
|
|
||||||
[[ $# -eq 0 ]] && { display_modpack_delete_help; exit 0; }
|
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid modpack index."; exit 1; }
|
||||||
modpack_index="$2"; shift 2
|
modpack_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_modpack_delete_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Modpack name is required."; exit 1; }
|
||||||
|
modpack_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
modpack_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -1334,42 +1360,41 @@ function modpack_delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modpack_overwrite() {
|
function modpack_overwrite() {
|
||||||
[[ $# -eq 0 ]] && { display_modpack_overwrite_help; exit 0; }
|
parse_help_has_arguments display_help_modpack_overwrite "$@"
|
||||||
|
|
||||||
local modpack_name=""
|
local modpack_name=""
|
||||||
local modpack_index=""
|
local modpack_index=""
|
||||||
|
|
||||||
# parse arguments
|
# parse arguments
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-i)
|
"-i")
|
||||||
|
[[ -z "$2" || ! "$2" =~ ^[0-9]+$ ]] && { log ERROR "Invalid modpack index."; exit 1; }
|
||||||
modpack_index="$2"; shift 2
|
modpack_index="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
--help|-h)
|
"-n")
|
||||||
display_modpack_save_help; exit 0
|
[[ -z "$2" ]] && { log ERROR "Modpack name is required."; exit 1; }
|
||||||
|
modpack_name="$2"; shift 2
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
modpack_name="$1"; shift 1
|
$display_help; exit 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
[[ -z "$modpack_name" && -z "$modpack_index" ]] && { log ERROR "Modpack name or index is required to save."; exit 1; }
|
[[ -z "$modpack_name" && -z "$modpack_index" ]] && { log ERROR "Modpack name or index is required to overwrite."; exit 1; }
|
||||||
|
|
||||||
get_modpack_name_and_index "$modpack_name" "$modpack_index"
|
get_modpack_name_and_index "$modpack_name" "$modpack_index"
|
||||||
|
|
||||||
# if the modpack doesn't exist, exit
|
# if the modpack doesn't exist, exit
|
||||||
[[ ! -f "$MODPACKS_FOLDER/$modpack_name.tar.gz" ]] && { log ERROR "Modpack $modpack_name does not exist."; exit 1; }
|
[[ ! -f "$MODPACKS_FOLDER/$modpack_name.tar.gz" ]] && { log ERROR "Modpack $modpack_name does not exist."; exit 1; }
|
||||||
|
|
||||||
|
|
||||||
rm -f "$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
rm -f "$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && { log ERROR "Could not delete modpack."; exit 1; }
|
[[ $? -ne 0 ]] && { log ERROR "Could not delete modpack."; exit 1; }
|
||||||
|
|
||||||
# use built-in export function
|
# use built-in export function
|
||||||
mod_export --modpack "$MODPACKS_FOLDER" "$modpack_name"
|
mod_export --modpack "$MODPACKS_FOLDER" "$modpack_name"
|
||||||
|
|
||||||
log INFO "Modpack ${GREEN}successfully${NC} saved: \$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
log INFO "Modpack ${GREEN}successfully${NC} overwritten: \$MODPACKS_FOLDER/$modpack_name.tar.gz"
|
||||||
sed -i "/^$modpack_index,/s/DISABLED/ENABLED/" "$MODPACKS_DB_FILE"
|
sed -i "/^$modpack_index,/s/DISABLED/ENABLED/" "$MODPACKS_DB_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1391,10 +1416,10 @@ function self_update() {
|
|||||||
# --- Main ---
|
# --- Main ---
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
[[ $# -lt 1 ]] && { display_help; exit 1; }
|
parse_help_has_arguments display_help_main "$@"
|
||||||
|
|
||||||
|
command="$1"; shift
|
||||||
|
|
||||||
command="$1"
|
|
||||||
shift
|
|
||||||
initialize_directories
|
initialize_directories
|
||||||
initialize_modpack_directories
|
initialize_modpack_directories
|
||||||
check_for_updates
|
check_for_updates
|
||||||
@@ -1451,11 +1476,8 @@ function main() {
|
|||||||
"update"|"up")
|
"update"|"up")
|
||||||
self_update
|
self_update
|
||||||
;;
|
;;
|
||||||
"help"|"--help"|"-h"|"h")
|
|
||||||
display_help
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
display_help
|
$display_help
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-7
@@ -44,6 +44,7 @@ EOF
|
|||||||
breaking_changes_patches=(
|
breaking_changes_patches=(
|
||||||
["2"]='sed -i "s/^\([0-9]\+\),/\1,ENABLED,/" "$1/mods.csv"'
|
["2"]='sed -i "s/^\([0-9]\+\),/\1,ENABLED,/" "$1/mods.csv"'
|
||||||
["3"]='sed -i "1 i\\3" "$1/mods.csv"'
|
["3"]='sed -i "1 i\\3" "$1/mods.csv"'
|
||||||
|
["4"]='awk '\''BEGIN {FS=OFS=","} NR==1 {print 4; next} {print NR-1, $2, $3, $4, $5}'\'' "$1/mods.csv" | tee "$1/mods.csv" > /dev/null'
|
||||||
)
|
)
|
||||||
|
|
||||||
# notify if update is happening
|
# notify if update is happening
|
||||||
@@ -105,10 +106,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# handle breaking changes
|
# handle breaking changes
|
||||||
installed_major=""
|
installed_major=$(echo "$installed_version" | awk -F. '{print $2}')
|
||||||
latest_major=""
|
latest_major=$(echo "$latest_version" | awk -F. '{print $2}')
|
||||||
IFS='.' read -r _1 installed_major _2 <<< "$installed_version"
|
|
||||||
IFS='.' read -r _1 latest_major _2 <<< "$latest_version"
|
|
||||||
|
|
||||||
if [[ $latest_major -gt $installed_major ]]; then
|
if [[ $latest_major -gt $installed_major ]]; then
|
||||||
log INFO ""
|
log INFO ""
|
||||||
@@ -121,7 +120,15 @@ if [[ $latest_major -gt $installed_major ]]; then
|
|||||||
target_dir="Steam/steamapps/common/Helldivers\ 2/data"
|
target_dir="Steam/steamapps/common/Helldivers\ 2/data"
|
||||||
log INFO "Searching for the Helldivers 2 data directory... (20 seconds timeout)"
|
log INFO "Searching for the Helldivers 2 data directory... (20 seconds timeout)"
|
||||||
|
|
||||||
|
# check if game directory is in ~/.config/h2mm/h2path
|
||||||
|
if [[ -f "$HOME/.config/h2mm/h2path" ]]; then
|
||||||
|
game_dir=$(cat "$HOME/.config/h2mm/h2path")
|
||||||
|
[[ ! -d "$game_dir" ]] && { log ERROR "Helldivers 2 data directory in ~/.config/h2mm/h2path is not a valid directory." ; exit 1; }
|
||||||
|
else
|
||||||
game_dir=$(timeout 20 find "$search_dir" -type d -path "*/$target_dir" 2>/dev/null | head -n 1)
|
game_dir=$(timeout 20 find "$search_dir" -type d -path "*/$target_dir" 2>/dev/null | head -n 1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if not found, prompt user
|
||||||
if [[ -z "$game_dir" ]]; then
|
if [[ -z "$game_dir" ]]; then
|
||||||
log INFO "Could not find the Helldivers 2 data directory automatically."
|
log INFO "Could not find the Helldivers 2 data directory automatically."
|
||||||
log PROMPT "Please enter the path to the Helldivers 2 data directory: "
|
log PROMPT "Please enter the path to the Helldivers 2 data directory: "
|
||||||
@@ -137,17 +144,20 @@ if [[ $latest_major -gt $installed_major ]]; then
|
|||||||
# iterate from installed major number to latest major number
|
# iterate from installed major number to latest major number
|
||||||
for ((i = installed_major + 1; i <= latest_major; i++)); do
|
for ((i = installed_major + 1; i <= latest_major; i++)); do
|
||||||
if [[ -n "${breaking_changes_patches[$i]}" ]]; then
|
if [[ -n "${breaking_changes_patches[$i]}" ]]; then
|
||||||
eval $(echo "${breaking_changes_patches[$i]}" | sed "s:\$1:$game_dir:")
|
# apply breaking changes patch
|
||||||
|
eval $(echo "${breaking_changes_patches[$i]}" | sed "s:\$1:$game_dir:g")
|
||||||
else
|
else
|
||||||
log INFO "No breaking changes for version $i."
|
log INFO "No breaking changes for version $i."
|
||||||
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
log ERROR "Failed to apply breaking changes patch for version $i. Do you want to continue? (Y/n): "
|
log ERROR "Failed to apply breaking changes patch for version $i. Do you want to continue? (Y/n): "
|
||||||
read -er response
|
read -er response
|
||||||
|
|
||||||
[[ "$response" != "y" && "$response" != "Y" && -n "$response" ]] && { log INFO "Exiting. Uninstall the script, then retry the install script." ; exit 1; }
|
[[ "$response" != "y" && "$response" != "Y" && -n "$response" ]] && { log INFO "Exiting." ; exit 1; }
|
||||||
else
|
else
|
||||||
log INFO "Successfully applied breaking changes patch for version $i."
|
log INFO "Version upgrade fix ${GREEN}successfully${NC} applied for version $i."
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
log INFO ""
|
log INFO ""
|
||||||
|
|||||||
Reference in New Issue
Block a user