#!/bin/bash # include /etc/os-type for distri specific packages . /etc/os-release OS=$ID OS_VER=$VERSION_ID ## check if variables for installation are predefined otherwise set defaults for xashvar in BUILD_DIR INSTALL_DIR DS_PORT do # build helpervariable xashvarname=XASH_$xashvar # if [ -z ${!xashvarname} ] then case ${xashvar} in BUILD_DIR) XASH_BUILD_DIR=$(pwd)/build ;; INSTALL_DIR) XASH_INSTALL_DIR=$(pwd)/xash3d ;; DS_PORT) XASH_DS_PORT=27015 ;; esac fi done ## these variables are from github.com/FWGS/xashds-docker, nice to have :) hlds_build=8684 amxmod_version=1.8.2 jk_botti_version=1.43 steamcmd_url="https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" hlds_url="https://github.com/DevilBoy-eXe/hlds/releases/download/$hlds_build/hlds_build_$hlds_build.zip" metamod_url="https://github.com/mittorn/metamod-p/releases/download/1/metamod.so" amxmod_url="http://www.amxmodx.org/release/amxmodx-$amxmod_version-base-linux.tar.gz" jk_botti_url="http://koti.kapsi.fi/jukivili/web/jk_botti/jk_botti-$jk_botti_version-release.tar.xz" # colors for colored output 8) RED="\e[31m" GREEN="\e[32m" YELLOW="\e[33m" ENDCOLOR="\e[0m" showhelp() { echo "Usage: $0 [server|client] [install|update] [0.19|0.20] Description: Script to install an Xash3D engine full game client or dedicated server with game data from steamcmd Server tested on Debian 11 ; Client tested on Ubuntu 20.04 Origin: https://git.la10cy.net/DeltaLima/xash3d-installscript You can override following variables default values: XASH_INSTALL_DIR, XASH_DS_PORT and XASH_BUILD_DIR Example: 1) Install client version 0.20 located in ~/Games/Xash3D where the build directory is as well XASH_INSTALL_DIR=~/Games/Xash3D XASH_BUILD_DIR=\$XASH_INSTALL_DIR/build $0 client install 0.20 2) Install server version '0.19' into '~/opt/xashds_oldengine' XASH_INSTALL_DIR=~/opt/xashds_old $0 server update 0.19 Resources we are using: $steamcmd_url $hlds_url 0.20: https://github.com/FWGS/xash3d-fwgs 0.19: https://gitlab.com/tyabus/xash3d" exit 1 } function message() { case $1 in info) MESSAGE_TYPE="${GREEN}INFO${ENDCOLOR}" ;; warn) MESSAGE_TYPE="${YELLOW}WARN${ENDCOLOR}" ;; error) MESSAGE_TYPE="${RED}ERROR${ENDCOLOR}" ;; esac echo -e "[${MESSAGE_TYPE}] $2" } function checkerror() { if [ $1 -gt 0 ] then message error "Something went wrong, got wrong exit code ${RED}ERROR${ENDCOLOR}" message error "Exit here." exit 1 fi } case $3 in "0.19") XASH_GIT_URL="https://gitlab.com/tyabus/xash3d" ;; "0.20") XASH_GIT_URL="https://github.com/FWGS/xash3d-fwgs" ## wtf did i here lol #XASH_GIT_URL="https://github.com/kungfulon/xash3d-fwgs" ;; *) showhelp ;; esac XASH_INSTALL_VERSION=$3 case $2 in "update") ;; "install") ;; *) showhelp ;; esac XASH_INSTALL_MODE=$2 # client libsdl2-dev:i386 libfreetype6-dev:i386 libfontconfig-dev:i386 # both g++-multilib git curl build-essential cmake zip xz-utils libstdc++6:i386 lib32gcc1-s1 gnupg2 gcc-multilib ca-certificates case $OS in debian) PACKAGES_OSSPECIFIC="lib32gcc-s1" ;; ubuntu) case $OS_VER in 20.04|21.10|22.04) PACKAGES_OSSPECIFIC="lib32gcc-s1" ;; *) PACKAGES_OSSPECIFIC="lib32gcc1-s1" ;; esac ;; esac XASH_APT_PACKAGES="${PACKAGES_OSSPECIFIC} g++-multilib git curl build-essential cmake unzip zip xz-utils libstdc++6:i386 gnupg2 gcc-multilib ca-certificates python-is-python3" case $1 in "client") XASH_APT_PACKAGES+=" libsdl2-dev:i386 libfreetype6-dev:i386 libfontconfig-dev:i386" case $XASH_INSTALL_VERSION in 0.19) message warn "!! Client in version 0.19 does not work at the moment! !!" message warn "!! press enter to continue, or STRG+C to abort. !!" read -p "> " CMAKE_OPTIONS='-DXASH_DOWNLOAD_DEPENDENCIES=yes -DXASH_STATIC=ON -DXASH_DLL_LOADER=ON -DXASH_VGUI=ON -DMAINUI_USE_STB=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32"' ;; 0.20) WAF_OPTIONS="--enable-stb --enable-utils --enable-tests --enable-lto" ;; esac ;; "server") case $XASH_INSTALL_VERSION in 0.19) CMAKE_OPTIONS='-DXASH_DEDICATED=ON -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32"' ;; 0.20) WAF_OPTIONS="-d --enable-tests --enable-lto" ;; esac ;; *) showhelp ;; esac XASH_INSTALL_TYPE=$1 export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig message info "Creating directories" XASH_GIT_DIR="$(echo ${XASH_GIT_URL} | cut -d / -f5)" if [ ! -d $XASH_INSTALL_DIR ] then mkdir -p $XASH_INSTALL_DIR && message info "created ${YELLOW}${XASH_INSTALL_DIR}${ENDCOLOR}" checkerror $? fi if [ ! -d $XASH_BUILD_DIR ] then mkdir -p $XASH_BUILD_DIR && message info "created ${YELLOW}${XASH_BUILD_DIR}${ENDCOLOR}" checkerror $? fi if [ "$XASH_INSTALL_MODE" == "install" ] && [ ! $NOAPT ] then message info "Performing apt install" sudo dpkg --add-architecture i386 sudo apt update sudo apt-get install -y --no-install-recommends $XASH_APT_PACKAGES fi message info "Prepare ${YELLOW}${XASH_GIT_DIR}${ENDCOLOR}" ## compile xash3ds # prepare and configure for compiling cd $XASH_BUILD_DIR case $XASH_INSTALL_MODE in "install") git clone --recursive $XASH_GIT_URL checkerror $? test -d ${XASH_GIT_DIR} || mkdir -p ${XASH_GIT_DIR}/bin/ if [ ! -d ${XASH_GIT_DIR}/bin ] then mkdir -p ${XASH_GIT_DIR}/bin && message info "created ${YELLOW}${XASH_GIT_DIR}/bin${ENDCOLOR}" checkerror $? fi checkerror $? case $XASH_INSTALL_VERSION in 0.19) cd ${XASH_GIT_DIR}/bin ;; 0.20) cd ${XASH_GIT_DIR} # as of 14.01.2024 master branch does not compile , going back to last known working commit # fixed test "$XASH_INSTALL_TYPE" == "server" && git checkout 0132eb6e44cb4a414d400c9ba42e5b4a94dcb590 # last with xash binary # last compiles 5ac8f63741c25c73ab771fb10211a320031c12dd ;; esac ;; "update") cd ${XASH_GIT_DIR} case $XASH_INSTALL_VERSION in 0.19) cd bin #old cmake from ubuntu 20.04 #cmake --cmake-clean-cache ../ # cmake --clean-first ../ checkerror $? cd ../ if [ "$(ls -A bin)" ] then rm -Rf bin/* checkerror $? fi git pull checkerror $? cd bin ;; 0.20) #./waf clean #checkerror $? if [ "$(ls -A bin)" ] then rm -Rf bin/* checkerror $? fi checkerror $? #test "$XASH_INSTALL_TYPE" != "server" && git pull checkerror $? ;; esac ;; *) exit 1 ;; esac ## build message info "Compiling ${YELLOW}${XASH_GIT_DIR}${ENDCOLOR}" case $XASH_INSTALL_VERSION in 0.19) cmake $CMAKE_OPTIONS ../ checkerror $? make -j2 #VERBOSE=1 checkerror $? ;; 0.20) ./waf configure -T release $WAF_OPTIONS checkerror $? ./waf build checkerror $? ./waf install --destdir=bin/ checkerror $? ;; esac ## here we fetch half-life from steam server if [ "$XASH_INSTALL_MODE" == "install" ] then message info "prepare steamcmd for downloading gamedata" mkdir -p $XASH_BUILD_DIR/steam checkerror $? cd $XASH_BUILD_DIR/steam ## an steamcmd automation echo "login anonymous force_install_dir $XASH_INSTALL_DIR app_set_config 90 mod valve app_update 90 app_update 90 app_update 90 validate app_update 90 validate quit" > $XASH_BUILD_DIR/steam/hlds.install checkerror $? ## fetch steamcmd message info "getting steamcmd binary" curl -L "$steamcmd_url" | tar xzvf - checkerror $? ## run half-life download from steam server with steamcmd ## If grep find Error then fetch the hlds zip from github message info "downloading gamedata with steamcmd from valve - this takes a while" if ./steamcmd.sh +runscript hlds.install | grep Error then message warn "${YELLOW}!!${ENDCOLOR} There was an error fetching Half-Life with steamcmd. Fallback download it from github ${YELLOW}!!${ENDCOLOR}" message info "$hlds_url" ## this is just another source you can use instead of steamcmd. curl -LJO "$hlds_url" checkerror $? unzip "hlds_build_$hlds_build.zip" -d "hlds_build_$hlds_build" checkerror $? cp -a "hlds_build_$hlds_build/hlds_build_$hlds_build"/* $XASH_INSTALL_DIR #checkerror $? fi fi ## copy xash3d binaries to result ## place Xash3D binaries in result and overwrite all message info "copy xash3d binaries to ${YELLOW}${XASH_INSTALL_DIR}${ENDCOLOR}" case $XASH_INSTALL_VERSION in 0.19) cd $XASH_BUILD_DIR/$XASH_GIT_DIR/bin case $XASH_INSTALL_TYPE in server) cp -R engine/xash3d $XASH_INSTALL_DIR/xash #cp -R build/xash3d/bin/engine/xash3d $XASH_INSTALL_DIR/xash checkerror $? ;; client) cp -R engine/xash3d mainui/libxashmenu.so vgui_support/libvgui_support.so vgui_support/vgui.so $XASH_INSTALL_DIR checkerror $? ;; esac ;; 0.20) cp -R $XASH_BUILD_DIR/$XASH_GIT_DIR/bin/* $XASH_INSTALL_DIR checkerror $? ;; esac # copy icon for desktop file to install dir if [ "$XASH_INSTALL_TYPE" == "client" ] && [ "$XASH_INSTALL_MODE" == "install" ] then cp ${XASH_BUILD_DIR}/${XASH_GIT_DIR}/game_launch/icon-xash-material.ico ${XASH_INSTALL_DIR} fi # it seems that the build actually (21.08.2022) is buggy and does not exec server.cfg by its own if [ "$XASH_INSTALL_MODE" == "install" ] then case $XASH_INSTALL_TYPE in server) message info "Creating start.sh script for dedicated server in ${YELLOW}${XASH_INSTALL_DIR}${ENDCOLOR}" # all 0.19 xash3d versions are using +port and 0.20 -port case $XASH_INSTALL_VERSION in 0.19) lol="+port" ;; 0.20) lol="-port" ;; esac echo "#!/bin/bash ./xash +ip 0.0.0.0 ${lol} ${XASH_DS_PORT} -pingboost 1 -timeout 3 +map boot_camp +exec server.cfg echo screenname xash_${XASH_INSTALL_VERSION}_${XASH_DS_PORT}" > $XASH_INSTALL_DIR/start.sh checkerror $? chmod +x $XASH_INSTALL_DIR/start.sh checkerror $? echo "After=network.target [Service] User=$(whoami) WorkingDirectory=${XASH_INSTALL_DIR} #Type=oneshot #StandardOutput=journal ExecStart=${XASH_INSTALL_DIR}/start.sh ExecStop=/bin/kill -9 \$MAINPID [Install] WantedBy=multi-user.target" > $XASH_INSTALL_DIR/xashds_${XASH_INSTALL_VERSION}_${XASH_DS_PORT}.service checkerror $? touch $XASH_INSTALL_DIR/valve/listip.cfg touch $XASH_INSTALL_DIR/valve/banned.cfg message info "If you need an example config for a public server, have a look into ${YELLOW}https://github.com/FWGS/xashds-docker/tree/master/valve${ENDCOLOR}" ;; client) echo "[Desktop Entry] Name=Xash3D ${XASH_INSTALL_VERSION} GenericName=Half-Life Comment=OpenSource Half-Life Engine Exec=${XASH_INSTALL_DIR}/start-xash3d.sh Icon=${XASH_INSTALL_DIR}/icon-xash-material.ico Terminal=false Type=Application StartupNotify=false Categories=Game; X-Desktop-File-Install-Version=0.24" > $XASH_INSTALL_DIR/Xash3D_$(echo ${XASH_INSTALL_VERSION} | sed 's/\.//').desktop checkerror $? echo "#!/bin/sh export LD_LIBRARY_PATH=/lib32:/lib64:/lib:${XASH_INSTALL_DIR} ${XASH_INSTALL_DIR}/xash3d" > $XASH_INSTALL_DIR/start-xash3d.sh chmod +x $XASH_INSTALL_DIR/start-xash3d.sh ;; esac fi case $XASH_INSTALL_MODE in install) message info "${GREEN}DONE!!${ENDCOLOR} Installation completed without erros." message info "Your ready to run Xash3D installation is located in" message info "${YELLOW}${XASH_INSTALL_DIR}${ENDCOLOR}" case $XASH_INSTALL_TYPE in client) message info "You can run the game with ${YELLOW}'./start-xash3d.sh'${ENDCOLOR} from the install location" message info "To install the game into your applications menu, run:" message info "${YELLOW}'desktop-file-install --dir=\$HOME/.local/share/applications ${XASH_INSTALL_DIR}/Xash3D_$(echo $XASH_INSTALL_VERSION | sed 's/\.//').desktop'${ENDCOLOR}" ;; server) message info "You can start the server with ${YELLOW}'./start.sh'${ENDCOLOR} from the install location" ;; esac ;; update) message info "${GREEN}DONE!!${ENDCOLOR} Update completed without errors." ;; esac