CelestialCosmic / themeblog

blog articles by Celestial_Cosmic,source code by chanshiyucx
1 stars 0 forks source link

搭建泰拉瑞亚(tModLoader)服务器 #16

Open CelestialCosmic opened 2 years ago

CelestialCosmic commented 2 years ago

自己搭建与朋友们一起玩耍用的泰拉瑞亚服务器

起源

我和我的朋友上线的时间并不是总是重叠,一天在翻看灾厄 mod 的 wiki 时,偶然发现泰拉瑞亚也能自己开服,在朋友的强力推动下,我开始研究服务器的搭建

资料收集

与 minecraft 开服一样,需要一个服务端。根据 wiki 的指引,在官网的最底下的链接下载到了服务器的文件

服务器配置

首先给文件夹下的二进制文件授权,然后执行文件

chmod +x ./TerrariaServer.bin.x86_64
./TerrariaServer.bin.x86_64

之后会出现一些创建世界的选项,按自己的需求填就行

完成以后服务器就已经开好了,玩原版的话就已经可以 enjoy 了

(我也没想到会这么简单)

tmodloader

先去下开服的组件,然后在此原服务端的基础上覆盖 tmod 的东西进去

把之前的世界和 mod 导入

mv /home/celestial/Mods /home/celestial/.local/share/Terraria/ModLoader/
mv /home/celestial/Worlds /home/celestial/.local/share/Terraria/ModLoader/

还是给授权

chmod 744 tModLoaderServer
chmod 744 tModLoaderServer.bin.x86_64

执行

./tModLoaderServer

启用 mod 和世界后,启动服务

一切都很顺畅,除了......服务端是老版的

原来论坛的不是最新的,github 的才是!

再折腾一次

systemd 服务保活

跑起来了,但是一旦关掉终端大家都完蛋

ネコ的博客用 systemd 提供了一个挺不错的支持方式,我就拿来用了

当然,少不了自己再在源代码的基础上进行三次修改

ネコ博客中代码的来源

serverconfig.txt

world=/root/.local/share/Terraria/ModLoader/Worlds/xxx.wld

maxplayers=

password=

worldpath=/opt/terraria/Worlds

terraria.service

[Unit]
Description=tModLoader Server
After=network.target local-fs.target
[Service]
Type=forking
User=root
ExecStart=/home/celestial/1431tmod2/Linux/terraria.sh start
ExecStop=/home/celestial/1431tmod2/Linux/terraria.sh stop
[Install]
WantedBy=multi-user.target

terraria.sh

#!/bin/bash

USERNAME='root'
SCNAME='terraria'
BIN_PATH="/home/celestial/1431tmod2/Linux/"
SERVICE='tModLoaderServer.bin.x86_64'
CONFIG='/home/celestial/1431tmod2/Linux/serverconfig.txt'

start() {
   ps_out=`ps -ef | grep $SERVICE | grep -v 'grep' | grep -v $0`
   result=$(echo $ps_out | grep "$1")
   if [[ "$result" != "" ]] ; then
       echo "$SERVICE is already running!"
       exit
   else
       echo "Starting $SERVICE..."
       screen -S $SCNAME -dm $BIN_PATH$SERVICE -config $CONFIG
       exit
   fi
   exit
}

stop() {
   ps_out=`ps -ef | grep $SERVICE | grep -v 'grep' | grep -v $0`
   result=$(echo $ps_out | grep "$1")
   if [[ "$result" != "" ]] ; then
       echo "Stopping $SERVICE "
       screen -p 0 -S $SCNAME -X eval 'stuff "say SERVER SHUTTING DOWN IN 15 SECONDS. "\015'
       sleep 15
       screen -p 0 -S $SCNAME -X eval 'stuff "exit"\015'
       exit
   else
       echo "$SERVICE is not running!"
       exit
   fi
   exit
}

save() {
   ps_out=`ps -ef | grep $SERVICE | grep -v 'grep' | grep -v $0`
   result=$(echo $ps_out | grep "$1")
   if [[ "$result" != "" ]] ; then
       echo 'World data saving...'
       screen -p 0 -S $SCNAME -X eval 'stuff "say World saveing..."\015'
       screen -p 0 -S $SCNAME -X eval 'stuff "save"\015'
       exit
   else
       echo "$SERVICE is not running!"
       exit
   fi
}

status() {
   ps_out=`ps -ef | grep $SERVICE | grep -v 'grep' | grep -v $0`
   result=$(echo $ps_out | grep "$1")
   if [[ "$result" != "" ]] ; then
       echo "$SERVICE is already running!"
       exit
   else
       echo "$SERVICE is not running!"
       exit
   fi
}

case "$1" in
   start)
       start
       ;;
   stop)
       stop
       ;;
   save)
       save
       ;;
   status)
       status
       ;;
   *)
       echo  $"Usage: $0 {start|stop|status|save}"
esac

按照ネコ提供的方式,为terraria.sh提供 744 的权限,然后就可以通过 systemctl 的指令来控制开关了

尽管在我的设备上运行的时候出现了奇怪的问题:使用 systemd 控制会卸载所有模组,而直接使用 shell 文件却不会,但现成的 shell 依旧大大减轻了维护的工作量

结尾

我的体验还不错,但似乎朋友的卡顿比较严重(出现了获得重复物品的情况),也不知道是线路的问题还是数据跨境安全网关在搞鬼

但这是一个真正意义的“私服”了

参考依据

ネコ的博客

ウィキモエ中的文章

fandom wiki

tModLoader 的 github 界面

泰拉瑞亚官网

泰拉瑞亚论坛

GUI 开服