幻兽帕鲁脚本

前言

幻兽帕鲁已经出了有一段时间了,并且各大厂商居然趁机出了一堆低价的游戏服务器(仅限新用户),当然也是为了拉拢用户,不得不说,大厂出手,小厂根本没有生存空间,就这价格战能给你玩死。

本文所有的脚本文件可以在这里找到:

昕某人の网盘分享

两种联机方式

目前关服基本被挤爆了,想要在线玩官服基本不大可能,所以有三种方式可以和好友联机:

  1. 本地开房,通过邀请码联机。这种问题的最大缺点有两个:
    1. 其他人想要玩,必须让主机上线
    2. 最多只支持4人联机
  2. 通过本地服务器+内网穿透,这种也有几个问题
    1. 其他人想要玩,必须让主机上线,也就是让开服的人的电脑保持一直开启
    2. 内网穿透的质量难以保证,目前由于游戏非常火爆,大量的内网穿透工具基本都爆满
  3. 通过云服务器

通过上面可以看出,去整一个服务器开服,也是非常好的方式,当然如果你想纯纯白嫖,还是有些许难度的。

通过Linux搭建服务器

本文就通过linux搭建一个服务器,可以让几个人一起联机游玩。

为什么不用win

不用windows的原因有以下几个:

  1. 我不会用windows,说实话确实不太会用Windows的服务器版本,最开始尝试的时候,一个防火墙的配置也得百度半天才弄明白
  2. Windows本身系统占用内存较大,这是非常致命的问题,目前幻兽帕鲁的服务器的内存占用情况非常恐怖,经过几天的游玩发现,基本16GB的内存的服务器,在不定时重启的情况下,连续游玩5个小时给我内存吃完了,确实有点离谱。
  3. 我个人认为,使用sh脚本去控制还是比较方便的

一键安装服务端

这里直接参考[腾讯云]([10秒极速开服]幻兽帕鲁服务器全自动部署保姆教程(持续更新)-腾讯云开发者社区-腾讯云 (tencent.com))提供的脚本即可,既然有轮子,就没必要自己造了。通过远程ssh登录服务器,直接执行以下指令,并等待即可。或者直接按照腾讯云给的教程搭建即可。

img

腾讯云甚至出了一键修改参数的功能,不得不说这波确实赢麻了。

我这边基本前面的搭建方式都是和他们一样,包括:

  • 一键开服
  • 内存压缩功能
  • 虚拟内存功能

剩下的自动管理脚本都是在原有基础上进行修改的,个人感觉比腾讯云提供的更为方便些,并且可以避免一些BUG的发生。

自动管理脚本

本文的重点在于自动管理脚本,下面重点说脚本。因为目前服务端存在一些bug,我们需要在重启时尽量避免这些bug的发生。

首先使用root用户登录服务器,再进行下面的操作。

定期备份

在root用户目录下创建脚本文件。

首先进入root用户目录:

1
cd ~

然后创建一个脚本文件:

1
touch backup_game_saved.sh

使用vim或者其他编辑器(我这里使用的XTerminal自带的工具),输入以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash

game_saved_dir=/home/steam/Steam/steamapps/common/PalServer/Pal/Saved
game_saved_backup_dir=/home/steam/palbackup

while [ $# -gt 0 ]; do
case $1 in
--game-saved-dir)
game_saved_dir=$2
shift
shift
;;
--game-saved-backup-dir)
game_saved_backup_dir=$2
shift
shift
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
done

if [ ! -d $game_saved_dir ]; then
echo "$game_saved_dir not exist"
exit 1
fi

if [ ! -d $game_saved_backup_dir ]; then
mkdir -p $game_saved_backup_dir
fi

backup_time=$(date +%Y%m%d_%H%M%S)
backup_filename=${backup_time}.tgz
log_time=$(date +"%Y-%m-%d %H:%M:%S")
cd $game_saved_dir/../
tar zcf $backup_filename Saved
mv $backup_filename $game_saved_backup_dir

echo "[${log_time}] backup game saved to:${game_saved_backup_dir}/${backup_filename}"

delete_time=$(date -d '3 days ago' +"%Y-%m-%d %H:%M:%S")
for file in "$game_saved_backup_dir"/*; do
create_time=$(stat -c %w "$file")
if [[ "$create_time" < "$delete_time" ]]; then
rm "$file"
echo "The backup files created 3 days ago have been deleted! $file"
fi
done

上面的脚本用于创建一个以当前日期为文件名字的存档备份,并存储到/home/steam/palbackup目录下,如果你不是root登录,则没有权限访问Steam用户的用户目录,会导致备份失败。

game_saved_dir:为需要备份的文件目录

game_saved_backup_dir:为备份文件所存储的地方

上面的脚本还会自动清理时间超过三天的备份文件。

首先给脚本可执行的权限:

1
chmod +x backup_game_saved.sh

可以通过crontab工具来创建定时任务,输入以下命令启动crontab的设置:

1
crontab -e

然后在文件后面追加如下内容即可:

1
0 */5 * * * /bin/bash /root/backup_game_saved.sh >> /var/log/pal-server-backup.log 2>&1

上面设置了一个定时任务,任务每5个小时自动运行一次,运行的指令为 /bin/bash /root/backup_game_saved.sh,也就是运行一次备份脚本,并且运行过程中的echo指令输出的内容会被重定向到/var/log/pal-server-backup.log文件中,以便后期查看。

image-20240204133118896

RCON发送广播消息

这个RCON的工具是支持多个平台的,但是当时我没有保存链接,现在找不着了,只留下了适用于x86架构服务器的一个可执行文件,不过基本腾讯云和阿里云的服务器一样,都是可以使用的。

image-20240204133606761

首先给此脚本运行权限:

1
chmod +x pst-cli

然后执行脚本,首次执行脚本会在当前目录下生成一个config.yaml的配置文件,修改此文件的内容:

image-20240204133807810

其次需要打开服务器的RCON端口,修改方式就是修改配置文件:

image-20240204133946044

推荐一个服务器配置文件的生成工具(当然使用腾讯云的可视化配置也可以,我这边是自己安装ubuntu系统后自行搭建的)幻兽帕鲁服务器配置生成器 (bluefissure.com)

然后启动服务器,在ssh终端输入如下指令即可确认是否配置正确:

1
/root/pst-cli player list

image-20240204134207820

重启带来的bug

目前经过几天的游玩和测试,由重启服务端引起bug有两个比较明显:

  1. 服务器重启过后,所有帕鲁会集中到帕鲁终端,附近,并被卡住,不干活也不吃饭,结果就是等第二天上线一看(期间发生过重启),不是抑郁就是衰弱,并且都是空腹状态。这种情况要求重启以后必须有玩家回到帕鲁终端一次。
  2. 当有玩家在一个boss附近(只要视野中能看到boss),此时服务器突然重启,当重启完成后,在进入服务器,就会发现boss消失了,其实boss被卡到地下了。这个bug一旦触发,暂时还没找到解决办法,只能等1个小时以后,boss刷新了才能再看到

所以上面使用RCON的作用,主要是针对上面的第二个bug,在服务器即将重启时,向所有玩家广播信息,提醒其赶紧远离boss,防止boss卡住。

内存占用过多自动重启

前面的步骤一样,创建一个脚本文件,编写脚本,并赋予可执行权限。

1
2
touch pal_auto_restart_with_mem.sh
chomd +x pal_auto_restart_with_mem.sh

下面脚本用于当内存占用过多时自动重启服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
service_name="pal-server.service"
mem_threshold=90
log_time=$(date +"%Y-%m-%d %H:%M:%S")
mem_usage_percent=$(free | awk '/Mem:/ {printf("%.0f", $3/$2 * 100.0)}')
if [ "$mem_usage_percent" -ge "$mem_threshold" ]; then
echo "[${log_time}]Memory usage is above $mem_threshold%. Restarting service: $service_name..."
/root/pst-cli player list
for((i=30; i>0; i-=10))
do
log_time=$(date +"%Y-%m-%d %H:%M:%S")
/root/pst-cli broadcast -m "The server will restart after ${i} seconds" > /dev/null
sleep 10
done
systemctl restart "$service_name"
echo "[${log_time}] Restarting service: ${service_name}..."
fi

mem_threshold 就是监测阈值,按照上面的设置,当内存占用超过90%时,会自动重启服务。并在重启前30秒通过pst-cli文件向所有玩家广播,以保证boss不会被卡没。

然后同样的,添加一个定时任务,任务周期为60s,每60秒监测服务器的内存情况。(这里不要低于30s,因为整个重启过程就需要30s的时间)。

1
*/1 * * * * /bin/bash /root/pal_auto_restart_with_mem.sh >> /var/log/pal-server-restart.log 2>&1

同样将log记录下来。

定时重启

定时重启脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
service_name="pal-server.service"
log_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${log_time}] Restarting service: ${service_name}..."
/root/pst-cli player list
for ((i=30; i>0; i-=10))
do
log_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${log_time}] The server will restart after ${i} seconds"
/root/pst-cli broadcast -m "The server will restart after ${i} seconds" > /dev/null
sleep 10
done

systemctl restart "${service_name}"
log_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${log_time}] Service: ${service_name} is restart successed!"

关于定时重启,我这边的建议是不要加,因为每次重启都会发生上面所说的两个bug。