Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions lgsm/config-default/config-lgsm/cs2server/_default.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,49 @@

## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
# https://docs.linuxgsm.com/game-servers/counter-strike-2
# [Game Modes] gametype gamemode gamemodeflags skirmishid mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)
# Arms Race 1 0 0 0 mg_armsrace
# Boom! Headshot! 1 2 0 6 mg_skirmish_headshots
# Classic Casual 0 0 0 0 mg_casualsigma, mg_casualdelta
# Classic Competitive (Default) 0 1 0 0 mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
# Classic Competitive (Short Match) 0 1 32 0 mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
# Danger Zone 6 0 0 0 mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco)
# Deathmatch (Default) 1 2 0 0 mg_deathmatch
# Deathmatch (Free For All) 1 2 32 0 mg_deathmatch
# Deathmatch (Team vs Team) 1 2 4 0 mg_deathmatch
# Demolition 1 1 0 0 mg_demolition
# Flying Scoutsman 0 0 0 3 mg_skirmish_flyingscoutsman
# Hunter-Gatherers 1 2 0 7 mg_skirmish_huntergatherers
# Retakes 0 0 0 12 mg_skirmish_retakes
# Stab Stab Zap 0 0 0 1 mg_skirmish_stabstabzap
# Trigger Discipline 0 0 0 4 mg_skirmish_triggerdiscipline
# Wingman 0 2 0 0 mg_de_prime, mg_de_blagai, mg_de_vertigo, mg_de_inferno, mg_de_overpass, mg_de_cbble, mg_de_train, mg_de_shortnuke, mg_de_shortdust, mg_de_lake
gametype="0"
gamemode="1"
gamemodeflags="0"
skirmishid="0"
mapgroup="mg_active"
ip="0.0.0.0"
port="27015"
clientport="27005"
sourcetvport="27020"
defaultmap="de_mirage"
maxplayers="16"
wsapikey=""

## Game Server Login Token (GSLT): Required
# GSLT is required for running a public server.
# More info: https://docs.linuxgsm.com/steamcmd/gslt
gslt=""

## Workshop Parameters | https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators
# To get an API key visit - https://steamcommunity.com/dev/apikey
wsapikey=""
wscollectionid=""
wsstartmap=""

## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -authkey ${wsapikey} +exec ${selfname}.cfg"
startparameters="-dedicated -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -maxplayers ${maxplayers} +map ${defaultmap} +mapgroup ${mapgroup} +game_type ${gametype} +game_mode ${gamemode} +sv_game_mode_flags ${gamemodeflags} +sv_skirmish_id ${skirmishid} -authkey ${wsapikey} +host_workshop_collection ${wscollectionid} +host_workshop_map ${wsstartmap} +sv_setsteamaccount ${gslt} +exec ${selfname}.cfg"

#### LinuxGSM Settings ####

## LinuxGSM Stats
# Send useful stats to LinuxGSM developers.
# https://docs.linuxgsm.com/configuration/linuxgsm-stats
Expand Down
10 changes: 10 additions & 0 deletions lgsm/modules/command_mods_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,21 @@ if [ "${modcommand}" == "metamod" ]; then
fn_mod_install_liblist_gam_file
fi

# Create/modify existing gameinfo.gi file for Metamod:Source 2
if [ "${modcommand}" == "metamodsource2" ]; then
fn_mod_install_gameinfo_gi_file
fi

# Create/modify plugins.ini file for Metamod
if [ "${modcommand}" == "amxmodx" ]; then
fn_mod_install_amxmodx_file
fi

# Prevent WeaponPaints install without CounterStrikeSharp.
if [ "${modcommand}" == "weaponpaints" ]; then
fn_mod_exist "cssharp"
fi

echo -e "${modprettyname} installed"
fn_script_log_pass "${modprettyname} installed."

Expand Down
5 changes: 5 additions & 0 deletions lgsm/modules/command_mods_remove.sh
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,11 @@ if [ "${modcommand}" == "amxmodx" ]; then
fn_mod_remove_amxmodx_file
fi

# Remove metamod line from gameinfo.gi when uninstalling Metamod: Source 2
if [ "${modcommand}" == "metamodsource2" ]; then
fn_mod_remove_gameinfo_gi_file
fi

echo -e "${modprettyname} removed"
fn_script_log "${modprettyname} removed"

Expand Down
4 changes: 2 additions & 2 deletions lgsm/modules/core_getopt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,8 @@ if [ "${shortname}" == "squad" ]; then
fi

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

## Installer.
Expand Down
8 changes: 6 additions & 2 deletions lgsm/modules/info_game.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1176,16 +1176,20 @@ fn_info_game_col() {
# Filetype: cfg
fn_info_game_cs2() {
if [ -f "${servercfgfullpath}" ]; then
fn_info_game_valve_keyvalues "rconpassword" "rcon_password"
fn_info_game_valve_keyvalues "servername" "hostname"
fn_info_game_valve_keyvalues "defaultmap" "map"
fn_info_game_valve_keyvalues "serverpassword" "sv_password"
fi
clientport="${clientport:-"0"}"
defaultmap="${defaultmap:-"NOT SET"}"
maxplayers="${maxplayers:-"0"}"
serverpassword="${serverpassword:-"NOT SET"}"
port="${port:-"0"}"
queryport="${port:-"0"}"
rconpassword="${rconpassword:-"NOT SET"}"
rconport="${port:-"0"}"
servername="${servername:-"NOT SET"}"
serverpassword="${serverpassword:-"NOT SET"}"
#steamport="${steamport:-"0"}" Steamport is optional so we dont want it to show as not set.
}

# Config Type: ini
Expand Down
4 changes: 3 additions & 1 deletion lgsm/modules/info_messages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1020,7 +1020,9 @@ fn_info_messages_cs2() {
{
fn_port "header"
fn_port "Game" port udp
fn_port "Query" queryport tcp
fn_port "RCON" rconport tcp
fn_port "SourceTV" sourcetvport udp
fn_port "Client" clientport udp
} | column -s $'\t' -t
}

Expand Down
4 changes: 2 additions & 2 deletions lgsm/modules/install_config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ fn_default_config_remote() {
echo -e ""
echo -e "${bold}${lightyellow}Downloading ${gamename} Configs${default}"
fn_messages_separator
echo -e "Downloading default configs from: ${italic}https://github.com/GameServerManagers/Game-Server-Configs${default}"
echo -e "Downloading default configs from: ${italic}https://github.com/xe1os/Game-Server-Configs${default}"
echo -e ""
fn_sleep_time_1
mkdir -p "${lgsmdir}/config-default/config-game"
githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/main"
githuburl="https://raw.githubusercontent.com/xe1os/Game-Server-Configs/main"
for config in "${array_configs[@]}"; do
# Downloads default configs from Game-Server-Configs repo to lgsm/config-default.
fn_fetch_file "${githuburl}/${shortname}/${config}" "${remote_fileurl_backup}" "GitHub" "Bitbucket" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "forcedl" "nohash"
Expand Down
73 changes: 73 additions & 0 deletions lgsm/modules/mods_core.sh
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@ fn_mod_copy_destination() {
fn_print_ok_eol_nl
fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}"
fi

if [ "${modcommand}" == "weaponpaints" ]; then
fn_mod_install_weaponpaints_files
fi
}

# Add the mod to the installed-mods.txt.
Expand Down Expand Up @@ -188,6 +192,11 @@ fn_mod_tidy_files_list() {
sed -i "/^addons\/sourcemod\/scripting\/include\/dhooks.inc$/d" "${modsdir}/${modcommand}-files.txt"
sed -i "/^addons\/sourcemod\/scripting\/include\/updater.inc$/d" "${modsdir}/${modcommand}-files.txt"
fi

# Remove specific mod paths from deletion list
if [ "${modcommand}" == "metamodsource2" ]; then
sed -i "/^addons\/gameinfo.gi$/d" "${modsdir}/${modcommand}-files.txt"
fi
}

## Information Gathering.
Expand Down Expand Up @@ -742,6 +751,70 @@ fn_mod_remove_amxmodx_file() {
fi
}

fn_mod_install_gameinfo_gi_file() {
if [ -f "${modinstalldir}/gameinfo.gi" ]; then
# modify the liblist.gam file to initialize Metamod
echo -en "modifying gameinfo.gi..."
sed -i "/Game_LowViolence/a \ \ \ \ \ \ \ \ \ \ \ Game\ \ \ \ csgo/addons/metamod" "${modinstalldir}/gameinfo.gi"
exitcode=$?
# if replacement back didn't happen, error out.
if [ "${exitcode}" != 0 ]; then
fn_script_log_fail "${logentry}"
fn_print_fail_eol_nl
else
fn_script_log_pass "${logentry}"
fn_print_ok_eol_nl
fi
fi
}

fn_mod_remove_gameinfo_gi_file() {
if [ -f "${modinstalldir}/gameinfo.gi" ]; then
# modify the liblist.gam file to initialize Metamod
logentry="sed -i '/csgo\/addons\/metamod/d' /game/csgo/gameinfo.gi"
echo -en "Restoring gameinfo.gi..."
sed -i "/csgo\/addons\/metamod/d" "${modinstalldir}/gameinfo.gi"
exitcode=$?
# if replacement back didn't happen, error out.
if [ "${exitcode}" != 0 ]; then
fn_script_log_fail "${logentry}"
fn_print_fail_eol_nl
else
fn_script_log_pass "${logentry}"
fn_print_ok_eol_nl
fi
fi
}

fn_mod_install_weaponpaints_files() {
if [ -d "${modinstalldir}/WeaponPaints" ]; then
echo -en "moving WeaponPaints plugin to plugins directory..."
fn_sleep_time

mkdir -p "${modinstalldir}/plugins"
rm -rf "${modinstalldir}/plugins/WeaponPaints"
mv "${modinstalldir}/WeaponPaints" "${modinstalldir}/plugins/WeaponPaints"
exitcode=$?

if [ "${exitcode}" -ne 0 ]; then
fn_print_fail_eol_nl
fn_script_log_fail "Moving WeaponPaints to ${modinstalldir}/plugins/WeaponPaints"
core_exit.sh
else
fn_print_ok_eol_nl
fn_script_log_pass "Moving WeaponPaints to ${modinstalldir}/plugins/WeaponPaints"
fi

# Update uninstall/update file list after moving plugin folder.
sed -i "s#^WeaponPaints#plugins/WeaponPaints#g" "${modsdir}/${modcommand}-files.txt"
fi

# Do not let uninstall remove the shared CounterStrikeSharp gamedata directory itself.
if [ -f "${modsdir}/${modcommand}-files.txt" ]; then
sed -i "/^gamedata$/d" "${modsdir}/${modcommand}-files.txt"
fi
}

## Database initialisation.

mods_list.sh
Expand Down
28 changes: 27 additions & 1 deletion lgsm/modules/mods_list.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@ stripperversion="1.2.2-git141"
stripperlatestfile="stripper-${stripperversion}-linux.tar.gz"
stripperdownloadurl="http://www.bailopan.net/stripper/snapshots/1.2/${stripperlatestfile}"
stripperurl="${stripperdownloadurl}"
# Metamod:Source 2
metamodsource2version="2.0"
metamodsource2scrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodsource2version}/mmsource-latest-linux"
metamodsource2latestfile=$(wget "${metamodsource2scrapeurl}" -q -O -)
metamodsource2downloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodsource2version}"
metamodsource2url="${metamodsource2downloadurl}"
# Counter Strike Sharp
cssharplastbuild=$(curl --connect-timeout 10 -sL https://api.github.com/repos/roflmuffin/CounterStrikeSharp/releases/latest | jq '.assets[] | select(.browser_download_url | contains("runtime") and contains("linux"))')
cssharplatestfile=$(echo "${cssharplastbuild}" | jq -r '.name')
cssharplatestlink=$(echo "${cssharplastbuild}" | jq -r '.browser_download_url')

# CS:GO Mods
get5lastbuild=$(curl --connect-timeout 3 -sL https://api.github.com/repos/splewis/get5/releases/latest | jq '.assets[] |select(.browser_download_url | endswith(".tar.gz"))')
Expand All @@ -94,6 +104,15 @@ movementapilatestversion=$(curl --connect-timeout 3 -s https://api.github.com/re
movementapilatestfile="MovementAPI-v${movementapilatestversion}.zip"
movementapilatestlink="https://github.com/danzayau/MovementAPI/releases/download/${movementapilatestversion}/${movementapilatestfile}"

# CS2 Mods
simpleadminlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/daffyyyy/CS2-SimpleAdmin/releases/latest | jq -r '.assets[].browser_download_url')
matchzylatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/xe1os/MatchZy/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
matchzylatestfile="MatchZy-${matchzylatestversion}.zip"
matchzylatestlink="https://github.com/xe1os/MatchZy/releases/download/${matchzylatestversion}/${matchzylatestfile}"
weaponpaintslastbuild=$(curl --connect-timeout 10 -sL https://api.github.com/repos/Nereziel/cs2-WeaponPaints/releases/latest | jq '.assets[] | select(.name == "WeaponPaints.zip")')
weaponpaintslatestfile=$(echo "${weaponpaintslastbuild}" | jq -r '.name')
weaponpaintslatestlink=$(echo "${weaponpaintslastbuild}" | jq -r '.browser_download_url')

# Rust
carbonrustapilatestfile="Carbon.Linux.Release.tar.gz"
carbonrustlatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/CarbonCommunity/Carbon.Core/releases/tags/production_build | jq -r '.assets[]|select(.name == "Carbon.Linux.Release.tar.gz") | .browser_download_url')
Expand Down Expand Up @@ -167,6 +186,13 @@ mod_info_dhook=(MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.ph
mod_info_movement=(MOD "movementapi" "movementapi" "${movementapilatestlink}" "${movementapilatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API ${movementapilatestversion} - Required for GOKZ")
mod_info_cleaner=(MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ")

# CS2 Mods
mod_info_metamodsource2=(MOD "metamodsource2" "Metamod: Source 2 (dev build)" "${metamodsource2url}" "${metamodsource2latestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source2;" "GAMES" "NOTGAMES" "https://www.metamodsource.net" "Plugins Framework ported to Source 2")
mod_info_cssharp=(MOD "cssharp" "Counter Strike Sharp" "${cssharplatestlink}" "${cssharplatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/counterstrikesharp/configs;" "source2;" "GAMES" "NOTGAMES" "https://docs.cssharp.dev/" "Plugins/mod framework (Requires Metamod: Source 2)")
mod_info_simpleadmin=(MOD "simpleadmin" "CS2-SimpleAdmin" "${simpleadminlatestlink}" "CS2-SimpleAdmin.zip" "0" "LowercaseOff" "${systemdir}/addons" "addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin;" "source2;" "GAMES" "NOTGAMES" "https://cs2-simpleadmin.daffyy.love/" "Manage your Counter-Strike 2 server by simple commands")
mod_info_matchzy=(MOD "matchzy" "MatchZy" "${matchzylatestlink}" "${matchzylatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg/MatchZy;" "source2;" "GAMES" "NOTGAMES" "https://shobhit-pathak.github.io/MatchZy/" "Plugin for running and managing practice/pugs/scrims/matches")
mod_info_weaponpaints=(MOD "weaponpaints" "CS2 WeaponPaints" "${weaponpaintslatestlink}" "${weaponpaintslatestfile}" "0" "LowercaseOff" "${systemdir}/addons/counterstrikesharp" "configs/plugins/WeaponPaints;" "source2;" "GAMES" "NOTGAMES" "https://github.com/Nereziel/cs2-WeaponPaints" "Weapon/knife/glove/agent paint plugin for CS2. Requires CounterStrikeSharp runtime, PlayerSettingsCS2, AnyBaseLibCS2, MenuManagerCS2, and MySQL")

# Garry's Mod Addons
mod_info_ulib=(MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework")
mod_info_ulx=(MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)")
Expand Down Expand Up @@ -211,4 +237,4 @@ mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valheimpluslatestlink}
mod_info_bepinexvh=(MOD "bepinexvh" "BepInEx Valheim" "${bepinexvhlatestlink}" "denikson-BepInExPack_Valheim.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/" "Unity / XNA game patcher and plugin framework")

# REQUIRED: Set all mods info into the global array
mods_global_array=("${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustcarbon[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" "${mod_info_bepinexvh[@]}")
mods_global_array=("${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustcarbon[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" "${mod_info_bepinexvh[@]}" "${mod_info_metamodsource2[@]}" "${mod_info_cssharp[@]}" "${mod_info_simpleadmin[@]}" "${mod_info_matchzy[@]}" "${mod_info_weaponpaints[@]}")
Loading