|
#!/bin/env bash |
|
|
|
# BASE Config |
|
STEAMLOCAL="${HOME}/.local/share/Steam" |
|
STEAMAPPS="${STEAMLOCAL}/steamapps" |
|
PROTON_VERSION="Proton - Experimental" |
|
|
|
GAME_NAME="Carrier Command 2" |
|
GAME_ID="1489630" |
|
GAME_EXE="dedicated_server.exe" |
|
|
|
declare -a PROTON_LOCATIONS=("${STEAMAPPS}/common" "${STEAMLOCAL}/compatibilitytools.d") |
|
|
|
# See if we can handle XML |
|
XMLSTARLET=`which xml 2>/dev/null` |
|
if [ ! -f "${XMLSTARLET}" ]; then |
|
echo "xmlstarlet not installed, please install this for handling mods" |
|
XMLSTARLET="" |
|
fi |
|
|
|
# Find the exe to run |
|
CC2_INSTALL="${STEAMLOCAL}/steamapps/common/${GAME_NAME}" |
|
GAME_PATH="${CC2_INSTALL}/${GAME_EXE}" |
|
|
|
if [ ! -f "${GAME_PATH}" ]; then |
|
echo "Cannot find server executable, please check that ${GAME_NAME} is installed and that the STEAMLOCAL variable is correct" |
|
echo "STEAMLOCAL: ${STEAMLOCAL}" |
|
echo "Expected Game Path: ${GAME_PATH}" |
|
exit 1 |
|
fi |
|
|
|
# Find the version of proton we're running |
|
PROTON="" |
|
for val in "${PROTON_LOCATIONS[@]}"; do |
|
PROTONTEST="${val}/${PROTON_VERSION}/proton" |
|
if [ -f "${PROTONTEST}" ]; then |
|
PROTON="${PROTONTEST}" |
|
fi |
|
done |
|
|
|
if [ ! -f "${PROTON}" ]; then |
|
echo "Unable to find proton version: ${PROTON_VERSION}" |
|
echo "Please check the PROTON_VERSION variable and ensure that version is installed in steam" |
|
exit 1 |
|
fi |
|
|
|
export STEAM_COMPAT_CLIENT_INSTALL_PATH="${STEAMLOCAL}" |
|
export STEAM_COMPAT_DATA_PATH="${STEAMAPPS}/compatdata/${GAME_ID}-srv" |
|
export WINEPREFIX="${STEAM_COMPAT_DATA_PATH}/pfx" |
|
|
|
if [ "$1" = "mods" ]; then |
|
if [ "${XMLSTARLET}" != "" ]; then |
|
echo "Available mods:" |
|
echo |
|
for val in `ls ${STEAMAPPS}/workshop/content/${GAME_ID}`; do |
|
MOD_PATH="${STEAMAPPS}/workshop/content/${GAME_ID}/${val}" |
|
MOD_NAME=`xml sel -t -v "/data/@name" "${MOD_PATH}/mod.xml"` |
|
echo "${MOD_NAME}" |
|
done |
|
fi |
|
|
|
exit 0 |
|
fi |
|
|
|
if [ "$1" = "addmod" ]; then |
|
if [ "${XMLSTARLET}" != "" ]; then |
|
WANTED_MOD_NAME=$2 |
|
MOD_COMPATPATH="" |
|
|
|
echo "Adding mod ${MOD_NAME}" |
|
for val in `ls ${STEAMAPPS}/workshop/content/${GAME_ID}`; do |
|
MOD_PATH="${STEAMAPPS}/workshop/content/${GAME_ID}/${val}" |
|
MOD_NAME=`xml sel -t -v "/data/@name" "${MOD_PATH}/mod.xml"` |
|
|
|
if [ "${MOD_NAME}" = "${WANTED_MOD_NAME}" ]; then |
|
MOD_COMPATPATH=`"${PROTON}" getcompatpath "${MOD_PATH}" 2>/dev/null` |
|
echo "${MOD_NAME}: ${MOD_COMPATPATH}" |
|
xml ed \ |
|
-s "/data/active_mod_folders" -t elem -n mod\ |
|
-a "/data/active_mod_folders/mod[last()]" -t attr -n name -v "${MOD_NAME}"\ |
|
-a "/data/active_mod_folders/mod[last()]" -t attr -n value -v "${MOD_COMPATPATH}"\ |
|
server_config.xml >tmp.xml |
|
|
|
mv -f tmp.xml server_config.xml |
|
fi |
|
done |
|
|
|
if [ "${MOD_COMPATPATH}" = "" ]; then |
|
echo "Could not find mod: ${WANTED_MOD_NAME}" |
|
fi |
|
fi |
|
|
|
exit 0 |
|
fi |
|
|
|
if [ "$1" = "proton" ]; then |
|
if [ "${XMLSTARLET}" != "" ]; then |
|
echo "Current proton: ${PROTON_VERSION}" |
|
echo |
|
for val in "${PROTON_LOCATIONS[@]}"; do |
|
ls "${val}" | grep "Proton" | xargs -i{} echo "{}" |
|
done |
|
|
|
fi |
|
|
|
exit 0 |
|
fi |
|
|
|
if [ "$1" = "init" ]; then |
|
|
|
# Create our own prefix so that we can run the normal game through steam at the same time as our server |
|
rm -rf "${STEAM_COMPAT_DATA_PATH}" |
|
mkdir -p "${STEAM_COMPAT_DATA_PATH}/pfx" |
|
#cp -ra "${ORIG_STEAM_COMPAT_DATA_PATH}" "${STEAM_COMPAT_DATA_PATH}" |
|
|
|
TEMPLATE="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\ |
|
<data port=\"25565\" max_players=\"4\" server_name=\"\" password=\"\" island_count=\"16\" team_count_ai=\"1\" team_count_human=\"1\" base_difficulty=\"1\" loadout_type=\"0\" blueprints=\"0\" game_data_path=\"\">\n\ |
|
<permissions>\n\ |
|
</permissions>\n\ |
|
<active_mod_folders>\n\ |
|
</active_mod_folders>\n\ |
|
</data>\n\ |
|
" |
|
echo -e ${TEMPLATE} >server_config.xml |
|
echo -e ${GAME_ID} >steam_appid.txt |
|
|
|
if [ "${XMLSTARLET}" != "" ]; then |
|
|
|
PERSONA=`grep -m1 PersonaName ${STEAMLOCAL}/config/loginusers.vdf | awk -e '{print $2}'` |
|
eval PERSONA=${PERSONA} |
|
SERVER_NAME="${PERSONA}-CC2" |
|
echo "Server Name: ${SERVER_NAME}" |
|
|
|
GAME_DATA_PATH="${STEAMAPPS}/common/${GAME_NAME}/rom_0" |
|
GAME_DATA_COMPATPATH=`"${PROTON}" getcompatpath "${GAME_DATA_PATH}" 2>/dev/null` |
|
|
|
echo "Setting data path: ${GAME_DATA_COMPATPATH}" |
|
xml ed \ |
|
-u "/data/@game_data_path" -v "${GAME_DATA_COMPATPATH}"\ |
|
-u "/data/@server_name" -v "${SERVER_NAME}"\ |
|
server_config.xml >tmp.xml |
|
mv -f tmp.xml server_config.xml |
|
|
|
|
|
for STEAMID in `grep SteamID ${STEAMLOCAL}/config/config.vdf | awk -e '{print $2}'`; do |
|
eval STEAMID=${STEAMID} |
|
echo "Adding ADMIN ${STEAMID}" |
|
|
|
xml ed \ |
|
-s "/data/permissions" -t elem -n peer\ |
|
-a "/data/permissions/peer[last()]" -t attr -n steam_id -v "${STEAMID}"\ |
|
-a "/data/permissions/peer[last()]" -t attr -n is_banned -v "false"\ |
|
-a "/data/permissions/peer[last()]" -t attr -n is_admin -v "true"\ |
|
server_config.xml >tmp.xml |
|
mv -f tmp.xml server_config.xml |
|
done |
|
|
|
|
|
xml sel -t -v "/data/active_mod_folders/path/@value" "${WINEPREFIX}/drive_c/users/steamuser/AppData/Roaming/Carrier Command 2/mods.xml" |
|
for ACTIVEMOD in `xml sel -t -v "/data/active_mod_folders/path/@value" "${WINEPREFIX}/drive_c/users/steamuser/AppData/Roaming/Carrier Command 2/mods.xml"`; do |
|
echo "Adding mod from game config: ${ACTIVEMOD}" |
|
xml ed \ |
|
-s "/data/active_mod_folders" -t elem -n mod\ |
|
-a "/data/active_mod_folders/mod[last()]" -t attr -n value -v "${ACTIVEMOD}"\ |
|
server_config.xml >tmp.xml |
|
mv -f tmp.xml server_config.xml |
|
done |
|
|
|
fi |
|
exit 0 |
|
fi |
|
|
|
|
|
if [ "$1" = "run" ]; then |
|
"${PROTON}" runinprefix "${GAME_PATH}" |
|
|
|
exit 0 |
|
fi |
|
|
|
echo "Available commands: proton, init, mods, addmod, run" |