整合你提供的启停命令。🚀
#!/bin/bash
# ============================================
# 幻兽帕鲁服务器配置管理脚本 v2.0
# ============================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 配置文件路径
CONFIG_PATH="/home/palworld/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini"
BACKUP_DIR="/home/palworld/palworld/config_backups"
PALWORLD_DIR="/home/palworld/palworld"
PALWORLD_USER="palworld"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# ============================================
# 服务器控制函数
# ============================================
# 检查服务器状态
check_server_status() {
PALSERVER_PID=$(pgrep -f "PalServer-Linux-Shipping")
if [ -n "$PALSERVER_PID" ]; then
return 0 # 服务器运行中
else
return 1 # 服务器已停止
fi
}
# 显示服务器状态
show_server_status() {
if check_server_status; then
echo -e "${GREEN}● 服务器状态: 运行中${NC} (PID: $PALSERVER_PID)"
else
echo -e "${RED}● 服务器状态: 已停止${NC}"
fi
}
# 停止服务器
stop_server() {
echo -e "${YELLOW}正在停止服务器...${NC}"
PALSERVER_PID=$(pgrep -f "PalServer-Linux-Shipping")
if [ -n "$PALSERVER_PID" ]; then
echo -e "${BLUE}发送停止信号...${NC}"
kill $PALSERVER_PID
echo -e "${BLUE}等待服务器关闭 (最多10秒)...${NC}"
sleep 10
# 强制结束残留进程
pkill -9 -f "PalServer-Linux-Shipping" 2>/dev/null
# 再次检查
if check_server_status; then
echo -e "${RED}✗ 服务器停止失败!${NC}"
return 1
else
echo -e "${GREEN}✓ 服务器已成功停止${NC}"
return 0
fi
else
echo -e "${YELLOW}⚠ 服务器未运行${NC}"
return 0
fi
}
# 启动服务器
start_server() {
echo -e "${YELLOW}正在启动服务器...${NC}"
# 检查是否已运行
if check_server_status; then
echo -e "${YELLOW}⚠ 服务器已在运行中 (PID: $PALSERVER_PID)${NC}"
read -p "是否要重启服务器? (y/n): " restart_choice
if [ "$restart_choice" = "y" ] || [ "$restart_choice" = "Y" ]; then
stop_server
sleep 2
else
return 1
fi
fi
# 切换到palworld用户启动服务器
su - $PALWORLD_USER -c "cd $PALWORLD_DIR && screen -dmS palserver ./PalServer.sh"
echo -e "${BLUE}等待服务器启动 (15秒)...${NC}"
sleep 15
# 检查启动结果
if check_server_status; then
echo -e "${GREEN}✓ 服务器启动成功!${NC}"
echo ""
show_server_status
echo ""
echo -e "${CYAN}进程信息:${NC}"
ps aux | grep -E "PalServer|palserver" | grep -v grep
return 0
else
echo -e "${RED}✗ 服务器启动失败!${NC}"
echo -e "${YELLOW}请检查日志: screen -r palserver${NC}"
return 1
fi
}
# 重启服务器
restart_server() {
echo -e "${CYAN}════════════════════════════${NC}"
echo -e "${CYAN} 重启幻兽帕鲁服务器 ${NC}"
echo -e "${CYAN}════════════════════════════${NC}"
echo ""
if stop_server; then
echo ""
sleep 3
start_server
else
echo -e "${RED}服务器停止失败,取消重启操作${NC}"
return 1
fi
}
# 查看服务器日志
view_server_logs() {
show_header
echo -e "${CYAN}═══ 服务器日志 ═══${NC}"
echo ""
echo -e "${YELLOW}可用操作:${NC}"
echo -e " ${BLUE}1)${NC} 查看实时日志 (screen -r palserver)"
echo -e " ${BLUE}2)${NC} 查看最新日志文件"
echo -e " ${BLUE}3)${NC} 查看错误日志"
echo ""
read -p "请选择 [1-3] (0返回): " log_choice
case $log_choice in
1)
echo -e "${GREEN}连接到服务器日志...${NC}"
echo -e "${YELLOW}提示: 按 Ctrl+A 然后按 D 可以退出日志查看${NC}"
sleep 3
screen -r palserver
;;
2)
LOG_DIR="$PALWORLD_DIR/Pal/Saved/Logs"
if [ -d "$LOG_DIR" ]; then
LATEST_LOG=$(ls -t "$LOG_DIR"/*.log 2>/dev/null | head -1)
if [ -n "$LATEST_LOG" ]; then
echo -e "${GREEN}显示最新日志: $LATEST_LOG${NC}"
echo ""
tail -n 50 "$LATEST_LOG"
else
echo -e "${RED}未找到日志文件${NC}"
fi
else
echo -e "${RED}日志目录不存在: $LOG_DIR${NC}"
fi
read -p "按回车继续..."
;;
3)
LOG_DIR="$PALWORLD_DIR/Pal/Saved/Logs"
if [ -d "$LOG_DIR" ]; then
echo -e "${GREEN}搜索错误信息...${NC}"
echo ""
grep -i "error\|fail\|exception" "$LOG_DIR"/*.log 2>/dev/null | tail -n 30
else
echo -e "${RED}日志目录不存在${NC}"
fi
read -p "按回车继续..."
;;
0)
return
;;
esac
}
# ============================================
# 工具函数
# ============================================
# 显示标题
show_header() {
clear
echo -e "${CYAN}╔═══════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ 🎮 幻兽帕鲁服务器配置管理工具 v2.0 🎮 ║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════════════════════╝${NC}"
echo ""
show_server_status
echo ""
}
# 备份配置文件
backup_config() {
local timestamp=$(date +"%Y%m%d_%H%M%S")
local backup_file="$BACKUP_DIR/PalWorldSettings_$timestamp.ini.bak"
cp "$CONFIG_PATH" "$backup_file"
echo -e "${GREEN}✓ 配置已备份到: $backup_file${NC}"
}
# 读取当前配置值
get_config_value() {
local key=$1
grep -oP "(?<=$key=)[^,)]+" "$CONFIG_PATH" | head -1
}
# 更新配置值
update_config_value() {
local key=$1
local value=$2
# 备份配置
backup_config
# 使用sed替换值
sed -i "s/\($key=\)[^,)]*/\1$value/" "$CONFIG_PATH"
echo -e "${GREEN}✓ $key 已更新为: $value${NC}"
echo -e "${YELLOW}⚠ 配置已修改,需要重启服务器才能生效${NC}"
}
# 验证数字输入
validate_number() {
local input=$1
local min=$2
local max=$3
if ! [[ "$input" =~ ^[0-9]+\.?[0-9]*$ ]]; then
echo -e "${RED}❌ 请输入有效的数字!${NC}"
return 1
fi
if (( $(echo "$input < $min" | bc -l) )); then
echo -e "${RED}❌ 数值不能小于 $min${NC}"
return 1
fi
if [ -n "$max" ] && (( $(echo "$input > $max" | bc -l) )); then
echo -e "${RED}❌ 数值不能大于 $max${NC}"
return 1
fi
return 0
}
# ============================================
# 菜单函数
# ============================================
# 主菜单
main_menu() {
while true; do
show_header
echo -e "${YELLOW}当前配置文件: $CONFIG_PATH${NC}"
echo ""
echo -e "${PURPLE}【服务器管理】${NC}"
echo -e "${GREEN} 【S】 启动服务器${NC}"
echo -e "${RED} 【X】 停止服务器${NC}"
echo -e "${YELLOW} 【R】 重启服务器${NC}"
echo -e "${BLUE} 【L】 查看服务器日志${NC}"
echo ""
echo -e "${PURPLE}【配置管理】${NC}"
echo -e "${CYAN} 【1】 基础服务器设置${NC}"
echo -e "${CYAN} 【2】 游戏难度与倍率设置${NC}"
echo -e "${CYAN} 【3】 玩家相关设置${NC}"
echo -e "${CYAN} 【4】 帕鲁相关设置${NC}"
echo -e "${CYAN} 【5】 建筑与资源设置${NC}"
echo -e "${CYAN} 【6】 多人游戏设置${NC}"
echo -e "${CYAN} 【7】 高级设置${NC}"
echo ""
echo -e "${PURPLE}【其他功能】${NC}"
echo -e "${CYAN} 【8】 查看当前完整配置${NC}"
echo -e "${CYAN} 【9】 恢复备份${NC}"
echo -e "${CYAN} 【0】 退出${NC}"
echo ""
read -p "请选择功能: " choice
case $choice in
[Ss]) start_server; read -p "按回车继续..." ;;
[Xx]) stop_server; read -p "按回车继续..." ;;
[Rr]) restart_server; read -p "按回车继续..." ;;
[Ll]) view_server_logs ;;
1) server_basic_menu ;;
2) game_difficulty_menu ;;
3) player_settings_menu ;;
4) pal_settings_menu ;;
5) building_resource_menu ;;
6) multiplayer_menu ;;
7) advanced_menu ;;
8) view_config ;;
9) restore_backup ;;
0) echo -e "${GREEN}再见!👋${NC}"; exit 0 ;;
*) echo -e "${RED}无效选择,请重试${NC}"; sleep 2 ;;
esac
done
}
# 1. 基础服务器设置
server_basic_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 基础服务器设置 ═══${NC}"
echo ""
echo -e "当前服务器名称: ${GREEN}$(get_config_value 'ServerName')${NC}"
echo -e "当前服务器描述: ${GREEN}$(get_config_value 'ServerDescription')${NC}"
echo -e "当前服务器密码: ${GREEN}$(get_config_value 'ServerPassword')${NC}"
echo -e "当前管理员密码: ${GREEN}$(get_config_value 'AdminPassword')${NC}"
echo -e "当前公网IP: ${GREEN}$(get_config_value 'PublicIP')${NC}"
echo -e "当前端口: ${GREEN}$(get_config_value 'PublicPort')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改服务器名称${NC}"
echo -e "${YELLOW}【2】 修改服务器描述${NC}"
echo -e "${YELLOW}【3】 修改服务器密码${NC}"
echo -e "${YELLOW}【4】 修改管理员密码${NC}"
echo -e "${YELLOW}【5】 修改公网IP${NC}"
echo -e "${YELLOW}【6】 修改端口${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-6]: " choice
case $choice in
1)
read -p "请输入新的服务器名称: " value
update_config_value "ServerName" "\\\"$value\\\""
read -p "按回车继续..."
;;
2)
read -p "请输入新的服务器描述: " value
update_config_value "ServerDescription" "\\\"$value\\\""
read -p "按回车继续..."
;;
3)
read -p "请输入新的服务器密码 (留空表示无密码): " value
update_config_value "ServerPassword" "\\\"$value\\\""
read -p "按回车继续..."
;;
4)
read -p "请输入新的管理员密码: " value
update_config_value "AdminPassword" "\\\"$value\\\""
read -p "按回车继续..."
;;
5)
read -p "请输入新的公网IP: " value
update_config_value "PublicIP" "\\\"$value\\\""
read -p "按回车继续..."
;;
6)
read -p "请输入新的端口 (默认8211): " value
if validate_number "$value" 1024 65535; then
update_config_value "PublicPort" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 2. 游戏难度与倍率设置
game_difficulty_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 游戏难度与倍率设置 ═══${NC}"
echo ""
echo -e "当前经验倍率: ${GREEN}$(get_config_value 'ExpRate')${NC}"
echo -e "当前捕获倍率: ${GREEN}$(get_config_value 'PalCaptureRate')${NC}"
echo -e "当前工作速度: ${GREEN}$(get_config_value 'WorkSpeedRate')${NC}"
echo -e "当前昼夜速度: 白天 ${GREEN}$(get_config_value 'DayTimeSpeedRate')${NC} / 夜晚 ${GREEN}$(get_config_value 'NightTimeSpeedRate')${NC}"
echo -e "当前掉落倍率: ${GREEN}$(get_config_value 'EnemyDropItemRate')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改经验倍率 (推荐: 1.0-10.0)${NC}"
echo -e "${YELLOW}【2】 修改捕获倍率 (推荐: 1.0-5.0)${NC}"
echo -e "${YELLOW}【3】 修改工作速度 (推荐: 1.0-5.0)${NC}"
echo -e "${YELLOW}【4】 修改白天时间速度${NC}"
echo -e "${YELLOW}【5】 修改夜晚时间速度${NC}"
echo -e "${YELLOW}【6】 修改敌人掉落倍率${NC}"
echo -e "${YELLOW}【7】 修改采集倍率${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-7]: " choice
case $choice in
1)
read -p "请输入新的经验倍率 (0.1-100): " value
if validate_number "$value" 0.1 100; then
update_config_value "ExpRate" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入新的捕获倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PalCaptureRate" "$value"
fi
read -p "按回车继续..."
;;
3)
read -p "请输入新的工作速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "WorkSpeedRate" "$value"
fi
read -p "按回车继续..."
;;
4)
read -p "请输入白天时间速度 (0.1-5): " value
if validate_number "$value" 0.1 5; then
update_config_value "DayTimeSpeedRate" "$value"
fi
read -p "按回车继续..."
;;
5)
read -p "请输入夜晚时间速度 (0.1-5): " value
if validate_number "$value" 0.1 5; then
update_config_value "NightTimeSpeedRate" "$value"
fi
read -p "按回车继续..."
;;
6)
read -p "请输入敌人掉落倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "EnemyDropItemRate" "$value"
fi
read -p "按回车继续..."
;;
7)
read -p "请输入采集倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "CollectionDropRate" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 3. 玩家相关设置
player_settings_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 玩家相关设置 ═══${NC}"
echo ""
echo -e "玩家攻击倍率: ${GREEN}$(get_config_value 'PlayerDamageRateAttack')${NC}"
echo -e "玩家防御倍率: ${GREEN}$(get_config_value 'PlayerDamageRateDefense')${NC}"
echo -e "饥饿消耗速度: ${GREEN}$(get_config_value 'PlayerStomachDecreaceRate')${NC}"
echo -e "体力消耗速度: ${GREEN}$(get_config_value 'PlayerStaminaDecreaceRate')${NC}"
echo -e "生命恢复速度: ${GREEN}$(get_config_value 'PlayerAutoHPRegeneRate')${NC}"
echo -e "睡眠恢复速度: ${GREEN}$(get_config_value 'PlayerAutoHpRegeneRateInSleep')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改玩家攻击倍率${NC}"
echo -e "${YELLOW}【2】 修改玩家防御倍率${NC}"
echo -e "${YELLOW}【3】 修改饥饿消耗速度${NC}"
echo -e "${YELLOW}【4】 修改体力消耗速度${NC}"
echo -e "${YELLOW}【5】 修改生命恢复速度${NC}"
echo -e "${YELLOW}【6】 修改睡眠恢复速度${NC}"
echo -e "${YELLOW}【7】 修改物品重量倍率${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-7]: " choice
case $choice in
1)
read -p "请输入玩家攻击倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerDamageRateAttack" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入玩家防御倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerDamageRateDefense" "$value"
fi
read -p "按回车继续..."
;;
3)
read -p "请输入饥饿消耗速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerStomachDecreaceRate" "$value"
fi
read -p "按回车继续..."
;;
4)
read -p "请输入体力消耗速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerStaminaDecreaceRate" "$value"
fi
read -p "按回车继续..."
;;
5)
read -p "请输入生命恢复速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerAutoHPRegeneRate" "$value"
fi
read -p "按回车继续..."
;;
6)
read -p "请输入睡眠恢复速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PlayerAutoHpRegeneRateInSleep" "$value"
fi
read -p "按回车继续..."
;;
7)
read -p "请输入物品重量倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "ItemWeightRate" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 4. 帕鲁相关设置
pal_settings_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 帕鲁相关设置 ═══${NC}"
echo ""
echo -e "帕鲁攻击倍率: ${GREEN}$(get_config_value 'PalDamageRateAttack')${NC}"
echo -e "帕鲁防御倍率: ${GREEN}$(get_config_value 'PalDamageRateDefense')${NC}"
echo -e "帕鲁生成倍率: ${GREEN}$(get_config_value 'PalSpawnNumRate')${NC}"
echo -e "帕鲁饥饿速度: ${GREEN}$(get_config_value 'PalStomachDecreaceRate')${NC}"
echo -e "帕鲁恢复速度: ${GREEN}$(get_config_value 'PalAutoHPRegeneRate')${NC}"
echo -e "帕鲁蛋孵化时间: ${GREEN}$(get_config_value 'PalEggDefaultHatchingTime')${NC} 小时"
echo ""
echo -e "${YELLOW}【1】 修改帕鲁攻击倍率${NC}"
echo -e "${YELLOW}【2】 修改帕鲁防御倍率${NC}"
echo -e "${YELLOW}【3】 修改帕鲁生成倍率${NC}"
echo -e "${YELLOW}【4】 修改帕鲁饥饿速度${NC}"
echo -e "${YELLOW}【5】 修改帕鲁恢复速度${NC}"
echo -e "${YELLOW}【6】 修改帕鲁蛋孵化时间${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-6]: " choice
case $choice in
1)
read -p "请输入帕鲁攻击倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PalDamageRateAttack" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入帕鲁防御倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PalDamageRateDefense" "$value"
fi
read -p "按回车继续..."
;;
3)
read -p "请输入帕鲁生成倍率 (0.1-5): " value
if validate_number "$value" 0.1 5; then
update_config_value "PalSpawnNumRate" "$value"
fi
read -p "按回车继续..."
;;
4)
read -p "请输入帕鲁饥饿速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PalStomachDecreaceRate" "$value"
fi
read -p "按回车继续..."
;;
5)
read -p "请输入帕鲁恢复速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "PalAutoHPRegeneRate" "$value"
fi
read -p "按回车继续..."
;;
6)
read -p "请输入帕鲁蛋孵化时间(小时) (0.1-500): " value
if validate_number "$value" 0.1 500; then
update_config_value "PalEggDefaultHatchingTime" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 5. 建筑与资源设置
building_resource_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 建筑与资源设置 ═══${NC}"
echo ""
echo -e "建筑生命倍率: ${GREEN}$(get_config_value 'BuildObjectHpRate')${NC}"
echo -e "建筑伤害倍率: ${GREEN}$(get_config_value 'BuildObjectDamageRate')${NC}"
echo -e "建筑衰减速度: ${GREEN}$(get_config_value 'BuildObjectDeteriorationDamageRate')${NC}"
echo -e "采集物生命: ${GREEN}$(get_config_value 'CollectionObjectHpRate')${NC}"
echo -e "采集物刷新速度: ${GREEN}$(get_config_value 'CollectionObjectRespawnSpeedRate')${NC}"
echo -e "最大基地数量: ${GREEN}$(get_config_value 'BaseCampMaxNum')${NC}"
echo -e "基地工人数量: ${GREEN}$(get_config_value 'BaseCampWorkerMaxNum')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改建筑生命倍率${NC}"
echo -e "${YELLOW}【2】 修改建筑伤害倍率${NC}"
echo -e "${YELLOW}【3】 修改建筑衰减速度${NC}"
echo -e "${YELLOW}【4】 修改采集物生命${NC}"
echo -e "${YELLOW}【5】 修改采集物刷新速度${NC}"
echo -e "${YELLOW}【6】 修改最大基地数量${NC}"
echo -e "${YELLOW}【7】 修改基地工人数量${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-7]: " choice
case $choice in
1)
read -p "请输入建筑生命倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "BuildObjectHpRate" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入建筑伤害倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "BuildObjectDamageRate" "$value"
fi
read -p "按回车继续..."
;;
3)
read -p "请输入建筑衰减速度 (0-10, 0为不衰减): " value
if validate_number "$value" 0 10; then
update_config_value "BuildObjectDeteriorationDamageRate" "$value"
fi
read -p "按回车继续..."
;;
4)
read -p "请输入采集物生命倍率 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "CollectionObjectHpRate" "$value"
fi
read -p "按回车继续..."
;;
5)
read -p "请输入采集物刷新速度 (0.1-10): " value
if validate_number "$value" 0.1 10; then
update_config_value "CollectionObjectRespawnSpeedRate" "$value"
fi
read -p "按回车继续..."
;;
6)
read -p "请输入最大基地数量 (1-999): " value
if validate_number "$value" 1 999; then
update_config_value "BaseCampMaxNum" "$value"
fi
read -p "按回车继续..."
;;
7)
read -p "请输入基地工人数量 (1-30): " value
if validate_number "$value" 1 30; then
update_config_value "BaseCampWorkerMaxNum" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 6. 多人游戏设置
multiplayer_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 多人游戏设置 ═══${NC}"
echo ""
echo -e "最大玩家数: ${GREEN}$(get_config_value 'ServerPlayerMaxNum')${NC}"
echo -e "合作玩家数: ${GREEN}$(get_config_value 'CoopPlayerMaxNum')${NC}"
echo -e "公会最大人数: ${GREEN}$(get_config_value 'GuildPlayerMaxNum')${NC}"
echo -e "公会最大基地: ${GREEN}$(get_config_value 'BaseCampMaxNumInGuild')${NC}"
echo -e "PvP模式: ${GREEN}$(get_config_value 'bIsPvP')${NC}"
echo -e "友军伤害: ${GREEN}$(get_config_value 'bEnableFriendlyFire')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改最大玩家数${NC}"
echo -e "${YELLOW}【2】 修改合作玩家数${NC}"
echo -e "${YELLOW}【3】 修改公会最大人数${NC}"
echo -e "${YELLOW}【4】 修改公会最大基地数${NC}"
echo -e "${YELLOW}【5】 切换PvP模式${NC}"
echo -e "${YELLOW}【6】 切换友军伤害${NC}"
echo -e "${YELLOW}【7】 切换玩家间伤害${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-7]: " choice
case $choice in
1)
read -p "请输入最大玩家数 (1-32): " value
if validate_number "$value" 1 32; then
update_config_value "ServerPlayerMaxNum" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入合作玩家数 (1-4): " value
if validate_number "$value" 1 4; then
update_config_value "CoopPlayerMaxNum" "$value"
fi
read -p "按回车继续..."
;;
3)
read -p "请输入公会最大人数 (1-100): " value
if validate_number "$value" 1 100; then
update_config_value "GuildPlayerMaxNum" "$value"
fi
read -p "按回车继续..."
;;
4)
read -p "请输入公会最大基地数 (1-10): " value
if validate_number "$value" 1 10; then
update_config_value "BaseCampMaxNumInGuild" "$value"
fi
read -p "按回车继续..."
;;
5)
current=$(get_config_value 'bIsPvP')
if [ "$current" = "False" ]; then
update_config_value "bIsPvP" "True"
echo -e "${GREEN}PvP模式已启用${NC}"
else
update_config_value "bIsPvP" "False"
echo -e "${YELLOW}PvP模式已禁用${NC}"
fi
read -p "按回车继续..."
;;
6)
current=$(get_config_value 'bEnableFriendlyFire')
if [ "$current" = "False" ]; then
update_config_value "bEnableFriendlyFire" "True"
echo -e "${GREEN}友军伤害已启用${NC}"
else
update_config_value "bEnableFriendlyFire" "False"
echo -e "${YELLOW}友军伤害已禁用${NC}"
fi
read -p "按回车继续..."
;;
7)
current=$(get_config_value 'bEnablePlayerToPlayerDamage')
if [ "$current" = "False" ]; then
update_config_value "bEnablePlayerToPlayerDamage" "True"
echo -e "${GREEN}玩家间伤害已启用${NC}"
else
update_config_value "bEnablePlayerToPlayerDamage" "False"
echo -e "${YELLOW}玩家间伤害已禁用${NC}"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 7. 高级设置
advanced_menu() {
while true; do
show_header
echo -e "${CYAN}═══ 高级设置 ═══${NC}"
echo ""
echo -e "自动保存间隔: ${GREEN}$(get_config_value 'AutoSaveSpan')${NC} 分钟"
echo -e "RCON启用: ${GREEN}$(get_config_value 'RCONEnabled')${NC}"
echo -e "RCON端口: ${GREEN}$(get_config_value 'RCONPort')${NC}"
echo -e "死亡惩罚: ${GREEN}$(get_config_value 'DeathPenalty')${NC}"
echo -e "掉落物存活时间: ${GREEN}$(get_config_value 'DropItemAliveMaxHours')${NC} 小时"
echo -e "最大掉落物数量: ${GREEN}$(get_config_value 'DropItemMaxNum')${NC}"
echo ""
echo -e "${YELLOW}【1】 修改自动保存间隔${NC}"
echo -e "${YELLOW}【2】 修改RCON端口${NC}"
echo -e "${YELLOW}【3】 修改死亡惩罚 (None/Item/ItemAndEquipment/All)${NC}"
echo -e "${YELLOW}【4】 修改掉落物存活时间${NC}"
echo -e "${YELLOW}【5】 修改最大掉落物数量${NC}"
echo -e "${YELLOW}【6】 切换RCON${NC}"
echo -e "${YELLOW}【7】 修改补给箱刷新间隔${NC}"
echo -e "${YELLOW}【0】 返回主菜单${NC}"
echo ""
read -p "请选择 [0-7]: " choice
case $choice in
1)
read -p "请输入自动保存间隔(分钟) (1-60): " value
if validate_number "$value" 1 60; then
update_config_value "AutoSaveSpan" "$value"
fi
read -p "按回车继续..."
;;
2)
read -p "请输入RCON端口 (1024-65535): " value
if validate_number "$value" 1024 65535; then
update_config_value "RCONPort" "$value"
fi
read -p "按回车继续..."
;;
3)
echo "死亡惩罚选项:"
echo "1) None - 无惩罚"
echo "2) Item - 掉落物品"
echo "3) ItemAndEquipment - 掉落物品和装备"
echo "4) All - 全部掉落"
read -p "请选择 [1-4]: " penalty_choice
case $penalty_choice in
1) update_config_value "DeathPenalty" "None" ;;
2) update_config_value "DeathPenalty" "Item" ;;
3) update_config_value "DeathPenalty" "ItemAndEquipment" ;;
4) update_config_value "DeathPenalty" "All" ;;
*) echo -e "${RED}无效选择${NC}" ;;
esac
read -p "按回车继续..."
;;
4)
read -p "请输入掉落物存活时间(小时) (0.1-100): " value
if validate_number "$value" 0.1 100; then
update_config_value "DropItemAliveMaxHours" "$value"
fi
read -p "按回车继续..."
;;
5)
read -p "请输入最大掉落物数量 (100-10000): " value
if validate_number "$value" 100 10000; then
update_config_value "DropItemMaxNum" "$value"
fi
read -p "按回车继续..."
;;
6)
current=$(get_config_value 'RCONEnabled')
if [ "$current" = "False" ]; then
update_config_value "RCONEnabled" "True"
echo -e "${GREEN}RCON已启用${NC}"
else
update_config_value "RCONEnabled" "False"
echo -e "${YELLOW}RCON已禁用${NC}"
fi
read -p "按回车继续..."
;;
7)
read -p "请输入补给箱刷新间隔(分钟) (10-1000): " value
if validate_number "$value" 10 1000; then
update_config_value "SupplyDropSpan" "$value"
fi
read -p "按回车继续..."
;;
0) break ;;
*) echo -e "${RED}无效选择${NC}"; sleep 1 ;;
esac
done
}
# 8. 查看当前配置
view_config() {
show_header
echo -e "${CYAN}═══ 当前完整配置 ═══${NC}"
echo ""
cat "$CONFIG_PATH"
echo ""
read -p "按回车返回..."
}
# 9. 恢复备份
restore_backup() {
show_header
echo -e "${CYAN}═══ 恢复配置备份 ═══${NC}"
echo ""
if [ ! "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
echo -e "${RED}❌ 没有找到备份文件${NC}"
read -p "按回车返回..."
return
fi
echo "可用的备份文件:"
echo ""
local backups=($(ls -t "$BACKUP_DIR"/*.bak 2>/dev/null))
local i=1
for backup in "${backups[@]}"; do
local filename=$(basename "$backup")
local filedate=$(echo "$filename" | grep -oP '\d{8}_\d{6}')
local display_date=$(date -d "${filedate:0:8} ${filedate:9:2}:${filedate:11:2}:${filedate:13:2}" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "Unknown")
echo -e "${YELLOW}[$i]${NC} $display_date - $filename"
((i++))
done
echo ""
read -p "请选择要恢复的备份 (0 返回): " choice
if [ "$choice" -eq 0 ]; then
return
fi
if [ "$choice" -gt 0 ] && [ "$choice" -le "${#backups[@]}" ]; then
local selected_backup="${backups[$((choice-1))]}"
# 在恢复前先备份当前配置
backup_config
# 恢复选中的备份
cp "$selected_backup" "$CONFIG_PATH"
echo -e "${GREEN}✓ 配置已恢复${NC}"
echo -e "${YELLOW}⚠ 需要重启服务器才能生效${NC}"
else
echo -e "${RED}❌ 无效选择${NC}"
fi
read -p "按回车继续..."
}
# ============================================
# 脚本入口
# ============================================
# 检查root权限
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请使用root权限运行此脚本${NC}"
echo "使用: sudo $0"
exit 1
fi
# 检查配置文件是否存在
if [ ! -f "$CONFIG_PATH" ]; then
echo -e "${RED}错误: 配置文件不存在: $CONFIG_PATH${NC}"
exit 1
fi
# 检查bc命令(用于数值比较)
if ! command -v bc &> /dev/null; then
echo -e "${YELLOW}正在安装bc工具...${NC}"
apt-get update && apt-get install -y bc
fi
# 启动主菜单
main_menu
📝 完整使用指南
1️⃣ 安装脚本
# 创建脚本文件
sudo nano /usr/local/bin/palworld-manager.sh
# 粘贴完整脚本内容,保存并退出
# 添加执行权限
sudo chmod +x /usr/local/bin/palworld-manager.sh
# 创建软链接方便调用
sudo ln -s /usr/local/bin/palworld-manager.sh /usr/local/bin/pal
2️⃣ 运行脚本
# 方式1:完整路径
sudo palworld-manager.sh
# 方式2:使用别名(如果创建了软链接)
sudo pal启动命令【需要退出至主菜单以palworld的身份前往对应路径下运行】
su - palworld -c "cd /home/palworld/palworld && screen -dmS palserver ./PalServer.sh" && sleep 15 && echo "服务器状态:" && ps