#!/bin/bash
#需要修改5行，9行，10行，257行，-insecure指服务器不开启VAC，防止有些人本地绑了快捷键的也进不来，其实257行没啥改的,自己问AI都知道怎么改

# 定义路径变量
STEAM_DIR="/root/CS2"	#比如你的服务器根目录是/root，你想在root文件夹里创一个CS2文件夹，那就是/root/CS2，根据自己服务器来
SERVER_DIR="$STEAM_DIR/cs2-ds"
BIN_DIR="$SERVER_DIR/game/bin/linuxsteamrt64"
SCREEN_NAME="cs2"
PORT="修改为你的服务器端口"
STEAM_SDK_DIR="/root/.steam/sdk64"	#把root改成你自己的目录，这里是为了解决v社的傻逼bug
GAMEINFO_FILE="$SERVER_DIR/game/csgo/gameinfo.gi"

# 添加neko加速源变量
STEAMCMD_URL="https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz"
STEAMCMD_QUICK_URI="https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz"

# 捕获 Ctrl+C 信号
trap 'onCtrlC' INT
function onCtrlC() {
    echo
    echo -e "\n\033[31m操作已取消！已停止脚本\033[0m"
    exit 1
}

# 修改gameinfo.gi文件以支持MetaMod
function patch_gameinfo() {
    echo "正在检查并修改 gameinfo.gi 文件..."
    
    if [ ! -f "$GAMEINFO_FILE" ]; then
        echo -e "\033[33m警告: 未找到 gameinfo.gi 文件，跳过修改\033[0m"
        return 1
    fi
    
    # 检查是否已经修改过
    if grep -q "Game.*csgo/addons/metamod" "$GAMEINFO_FILE"; then
        echo -e "\033[32mgameinfo.gi 文件已经包含 MetaMod 路径，无需修改\033[0m"
        return 0
    fi
    
    # 在 "Game	csgo" 前添加 MetaMod 路径
	if sed -i '/^[[:space:]]*Game[[:space:]]\+csgo[[:space:]]*$/i Game\t\tcsgo\/addons\/metamod' "$GAMEINFO_FILE"; then
        echo -e "\033[32m成功修改 gameinfo.gi 文件，添加了 MetaMod 支持\033[0m"
        return 0
    else
        echo -e "\033[31m修改 gameinfo.gi 文件失败\033[0m"
        return 1
    fi
}

# 安装32位依赖库（需要root权限）
function install_dependencies() {
    echo -e "\e[92m开始安装依赖库...\e[0m"
    
    # 检查是否为root用户
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "\e[31m错误：请先使用 root 用户运行此脚本安装依赖库！\e[0m"
        echo -e "\e[33m可以使用以下命令切换为root用户：\e[0m"
        echo -e "\e[36msudo -i\e[0m 或 \e[36msu root\e[0m"
        return 1
    fi
	
    # 更新软件包列表
    echo "正在更新软件包列表..."
    apt update
    
    source "/etc/os-release"
    case "${ID}" in
        ubuntu)
            echo "Ubuntu系统安装依赖"
            dpkg --add-architecture i386
            case "${VERSION_ID}" in
                16.04|18.04|20.04)
                    apt -y install lib32gcc1 lib32stdc++6 lib32z1-dev curl wget screen zip unzip tar grep sed
                    ;;
                22.04)
                    apt -y install lib32gcc-s1 lib32stdc++6 lib32z1-dev curl wget screen zip unzip tar grep sed
                    ;;
                *)
                    echo -e "\e[34m不支持的系统版本\e[0m \e[31m${VERSION_ID}\e[0m"
                    exit 1
                    ;;
            esac
            ;;
        debian)
            echo "Debian系统安装依赖"
            dpkg --add-architecture i386
            case "${VERSION_ID}" in
                9|10)
                    apt -y install lib32gcc1 lib32stdc++6 lib32z1-dev curl wget screen zip unzip tar grep sed
                    ;;
                11|12)
                    apt -y install lib32gcc-s1 lib32stdc++6 lib32z1-dev curl wget screen zip unzip tar grep sed
                    ;;
                *)
                    echo -e "\e[34m不支持的系统版本\e[0m \e[31m${VERSION_ID}\e[0m"
                    exit 1
                    ;;
            esac
            ;;
        *)
            echo -e "${ID}\e[34m不支持的操作系统\e[0m \e[31m${ID}\e[0m"
            exit 1
            ;;
    esac
    
    if [ "${?}" -ne 0 ]; then
        echo -e "\e[31m依赖安装失败\e[0m"
        exit 1
    else
        echo -e "\e[92m依赖安装成功！请继续安装服务器\e[0m"
    fi
}

# 安装服务器
install_server() {
   # 检查是否已经安装过依赖
    echo -e "\e[92m开始安装CS2服务器...\e[0m"
    echo -e "\e[93m请确认是否已经安装过依赖库？\e[0m"
    read -p "如果已经安装过依赖，请输入 y 继续；如果没有安装过，请输入 n 退出安装 (y/n): " dep_installed
    
    if [[ "$dep_installed" != "y" && "$dep_installed" != "Y" ]]; then
        echo -e "\e[31m请先使用选项1安装依赖库（需要在root用户下安装）！\e[0m"
        return 1
    fi
    
    echo "正在安装 SteamCMD 和 CS2 服务器..."
    mkdir -p "$STEAM_DIR"
    cd "$STEAM_DIR" || exit
    
    # 检查是否已经安装过steamcmd
    if [ -f "$STEAM_DIR/steamcmd.sh" ]; then
        echo "SteamCMD 已经安装，跳过下载步骤。"
    else
        # 统一使用相同的压缩包名称
        TAR_FILE="steamcmd_linux.tar.gz"
        
        # 尝试使用neko加速源下载
        echo "尝试从 Neko 加速源下载 SteamCMD..."
        if wget -O "$TAR_FILE" "$STEAMCMD_QUICK_URI"; then
            echo "从 Neko 加速源下载成功！"
        else
            echo "Neko 加速源下载失败，尝试官方源..."
            if wget -O "$TAR_FILE" "$STEAMCMD_URL"; then
                echo "官方源下载成功！"
            else
                echo -e "\033[31m下载 SteamCMD 失败！请检查网络连接。\033[0m"
                exit 1
            fi
        fi

        # 解压并清理
        tar xvf "$TAR_FILE"
        rm "$TAR_FILE"
        chmod +x steamcmd.sh
    fi

    # 安装或更新CS2服务器
    echo "正在安装或更新 CS2 服务器..."
    if ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login anonymous +app_update 730 validate +quit; then
        echo -e "\n\033[32m安装完成！服务器文件位于 $SERVER_DIR\033[0m"
    else
        echo -e "\033[31m安装 CS2 服务器失败！请检查网络连接或磁盘空间。\033[0m"
        exit 1
    fi
	
	# 创建第一个软连接：steamclient.so
    echo "正在创建 steamclient.so 软连接..."
    mkdir -p "$STEAM_SDK_DIR"
    rm -f "$STEAM_SDK_DIR/steamclient.so"
    ln -s "$STEAM_DIR/linux64/steamclient.so" "$STEAM_SDK_DIR/"
    
    if [ $? -eq 0 ]; then
        echo -e "\033[32msteamclient.so 软连接创建成功！\033[0m"
    else
        echo -e "\033[33m警告: steamclient.so 软连接创建失败\033[0m"
    fi

    # 创建第二个软连接：libv8*.so 库文件
    echo "正在创建 libv8*.so 库文件软连接..."
    cd "$BIN_DIR" || { echo -e "\033[31m错误: 无法进入目录 $BIN_DIR\033[0m"; return 1; }
    CSGO_BIN_DIR="$SERVER_DIR/game/csgo/bin/linuxsteamrt64"
    
    for lib in libv8*.so; do
        if [ -f "$lib" ]; then
            rm -f "$CSGO_BIN_DIR/$lib"
            ln -s "$BIN_DIR/$lib" "$CSGO_BIN_DIR/"
            echo "已创建软连接: $lib"
        fi
    done
    
    echo -e "\033[32mlibv8*.so 库文件软连接创建完成！\033[0m"
	
	 # 修改gameinfo.gi文件以支持MetaMod
    patch_gameinfo
}

# 更新服务器
update_server() {
    stop_server
    if [ ! -f "$STEAM_DIR/steamcmd.sh" ]; then
        echo -e "\033[31m错误: SteamCMD 未找到，请先安装服务器\033[0m"
        return 1
    fi
    echo "正在更新 CS2 服务器..."
    cd "$STEAM_DIR" || exit
    if ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login anonymous +app_update 730 validate +quit; then
        echo -e "\n\033[32m更新完成！\033[0m"
		
        # 更新后重新创建软连接
        echo "正在重新创建软连接..."
        
        # 重新创建 steamclient.so 软连接
        mkdir -p "$STEAM_SDK_DIR"
        rm -f "$STEAM_SDK_DIR/steamclient.so"
        ln -s "$STEAM_DIR/linux64/steamclient.so" "$STEAM_SDK_DIR/"
        
        # 重新创建 libv8*.so 库文件软连接
        cd "$BIN_DIR" || { echo -e "\033[31m错误: 无法进入目录 $BIN_DIR\033[0m"; return 1; }
        CSGO_BIN_DIR="$SERVER_DIR/game/csgo/bin/linuxsteamrt64"
        
        for lib in libv8*.so; do
            if [ -f "$lib" ]; then
                rm -f "$CSGO_BIN_DIR/$lib"
                ln -s "$BIN_DIR/$lib" "$CSGO_BIN_DIR/"
            fi
        done
        
        echo -e "\033[32m软连接已更新！\033[0m"
		
		# 更新后重新修改gameinfo.gi文件
        patch_gameinfo
    else
        echo -e "\033[31m更新失败！请检查网络连接。\033[0m"
        return 1
    fi
}

# 启动服务器（包含自动停止功能）
start_server() {
    # 先尝试停止同名服务器
    if screen -list | grep -q "$SCREEN_NAME"; then
        echo -e "\033[33m检测是否存在已有服务器实例，正在关闭...\033[0m"
        screen -XS "$SCREEN_NAME" quit
        sleep 2  # 等待关闭完成
    fi

    echo "正在启动 CS2 服务器..."
    cd "$BIN_DIR" || { echo -e "\033[31m错误: 无法进入目录 $BIN_DIR\033[0m"; return 1; }
    
    # 确保目录下有可执行文件
    if [ ! -f "./cs2" ]; then
        echo -e "\033[31m错误: 未找到 cs2 可执行文件\033[0m"
        return 1
    fi
    
    # 启动服务器
    screen -dmS "$SCREEN_NAME" ./cs2 -dedicated -insecure -console -nomaster +port "$PORT" +map de_dust2 +game_type 0 +game_mode 1 +exec server.cfg +sv_logfile 1 -serverlogging -maxplayers_override 12 -maxplayers 12
    
    # 验证启动
    sleep 1
    if screen -list | grep -q "$SCREEN_NAME"; then
        echo -e "\n\033[32m服务器已在后台启动 (Screen会话: $SCREEN_NAME)\033[0m"
        echo "使用 'screen -r $SCREEN_NAME' 查看控制台"
		echo "在控制台中输入 'quit' 可以关闭服务器"
        return 0
    else
        echo -e "\033[31m错误: 服务器启动失败！\033[0m"
        return 1
    fi
}

# 关闭服务器
stop_server() {
    if screen -list | grep -q "$SCREEN_NAME"; then
        echo "正在关闭 CS2 服务器..."
        screen -XS "$SCREEN_NAME" quit
        echo -e "\n\033[32m服务器已关闭\033[0m"
    else
        echo -e "\033[33m警告: 未找到名为 $SCREEN_NAME 的Screen会话\033[0m"
    fi
}

# 显示菜单 (单次显示)
show_menu() {
    clear
    echo -e "\n\033[34m========== CS2 服务器管理菜单 ==========\033[0m"
    echo -e "1. 安装依赖库 \033[31m（请先使用root用户安装）\033[0m"
    echo "2. 安装服务器 \033[31m（不要用CentOS系统）\033[0m"
    echo "3. 更新服务器"
    echo "4. 启动服务器"
    echo "5. 关闭服务器"
    echo "6. 退出"
    echo -e "\033[34m=======================================\033[0m"
}

# 主逻辑 (单次选择)
show_menu
read -p "请输入选项 [1-6]: " choice
case $choice in
    1) install_dependencies ;;
    2) install_server ;;
    3) update_server ;;
    4) start_server ;;
    5) stop_server ;;
    6) echo "退出脚本"; exit 0 ;;
    *) echo -e "\033[31m无效选项\033[0m"; exit 1 ;;
esac