摸鱼服务器

UPDATE

挂了

服务器简介

Steam的服务器太慢了,所以网课摸鱼摸了个泰拉服务器。是个灾厄开荒,中世界。

欢迎各位来玩。务必自觉开荒,拜托了。(我甚至提前搭了传送网已经够不肝了

IP: \(39.97.220.53\)

端口:\(7777\)

现在想的是每天下午 7:00~23:30 开着。 然后就看到加作业了,错了错了下次,不敢了。

没有特殊情况应该会一直挂着。

密码的话请 \(Q\) 我(其实本来想写防熊的但是……没看懂 \(Tshock\) 代码,所以就用这种劣质方法了

这里 下载Mods,密码 \(ac6r\)

服务器信息

版本 : \(tmodloader\) \(11.7.5\)

Mods:

主mod :Calamity1.4.4.005 (俺也知道大山猪今天发了1.4.5,但是没汉化也没办法啊qaq) 已更换 \(Calamity \; 1.4.5.001\)

辅助mod:

Fargo,炼金npc(非新版),自动连点,无限buff栏位,luaifk,自动连点,bosschecklist,额外翅膀栏位,合成表查询。(大概就这些吧……

汉化:

在Mod管理器中点击 \(Localizer\) 右上角的小钥匙即可选择汉化包。

问题

1.有的mod显示版本太旧

卸掉重装tmod。

2.鼠标有移动界限,设置列表点到就卡住

一律退出重进,或者重启tmod

3.to be continued

现在还在测试中,后面的锅慢慢修

搭建过程记录

环境

阿里云 轻量应用服务器:1C2G,Ubuntu 18.04 镜像

最好建个新用户

adduser steam

安装 steamcmd

cd ~/steamcmd

wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz

tar -xvzf steamcmd_linux.tar.gz

./steamcmd.sh

登录下载terraria

login USERNAME

app_update 105600 

运行terraria文件夹下自带的Server

./TerrariaServer

按照指示新建world

在管理台开启端口7777的TCP和UDP

检验一下是否能链接服务器

然后下载 tModLoader

最好新建个文件夹 出了锅好调试

之后运行 tmodloaderserver ,首次运行后会自己生成mod文件夹,位置在:

~/.local/share/Terraria

可能是1.4版本适配问题 直接使用 \(11.7.5\)\(tmod\) 会使这些未更新的 \(mod\) 不适配 似乎先使用\(11.7.4\) 然后再用 \(11.7.5\) 就行了。(鬼知道什么原理

然后发现 \(Magicstore\) 出了bug,一直是 \(0\) 储存,退出去回来后还会炸掉周围物块。

找了半天发现有人发了错误报告,原来是 \(Magicstore\) 在linux上没有合适运行环境,安装mono后把缺失的链接复制到tr里即可(捧读)。

apt install mono-runtime
cp /usr/lib/libMonoPosixHelper.so [tr的目录]

虽然仍然一使用存储模块就会报错,但是实际上可以用了。(草这些bug鬼知道我试了多久

然后照着大佬的脚本自己糊了一份(基本就是看了遍加注释,几处试图修改只有一点点成功了)。

功能大概是:报时,自动保存,自动备份,显示欢迎信息,游戏内调时间。

import subprocess
from threading import Thread
from queue import Queue, Empty
import psutil
from datetime import datetime
import time
import traceback
import sys
import os

world_name = sys.argv[1]

server_path = "/home/steam/steamcmd/steamapps/common/Terraria/tModLoader11.7.5"
world_path = "/home/steam/.local/share/Terraria/ModLoader/Worlds"
backup_path = "/home/steam/tModLoaderServerBackup"

cmd = ("%s/tModLoaderServer.bin.x86_64 -world %s/%s.wld" % (server_path,
                                                            world_path,
                                                            world_name)).split() + sys.argv[2:]

p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)


def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()


q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q), daemon=True)
t.start()


pid = p.pid

def gfs(Filepath,size=0):
    for root,dirs,files in os.walk(Filepath):
        for f in files :
            size += os.path.getsize(os.path.join(root,f))
    return size


def monitor():
    print(pid)
    ready = False

    while psutil.pid_exists(pid):
        def write(s):
            s += '\n'
            p.stdin.write(s.encode())
            p.stdin.flush()
        try:
            line = q.get_nowait().decode()
            print(line[:-1]) #将server里的输出打印到屏幕上
            if not ready and "Type 'help' for a list of commands." in line:
                ready = True
            if ready:
                if "\exit" in line:
                    write("say Closing in 60s...")
                    time.sleep(60)
                    write("say Now closing...")
                    write("exit")
                if "\dawn" in line:
                    write("say Switch game time 4:30AM.")
                    write("dawn")
                if "\dusk" in line:
                    write("say Switch game time 7:30PM.")
                    write("dusk")
                if "has joined." in line:
                    write("say Welcome to %s! 请自觉开荒,尽量不要破坏人为建筑物。 不要在网课期间摸鱼![滑稽][怒]" % (world_name))
        except Empty:
            if ready:
                now = datetime.now()
                if now.second < 5:
                    if now.minute % 15 == 0: #自动备份 自动报时
                        write("say Current time: %02d:%02d." % (now.hour, now.minute))
                        if gfs(backup_path) >= 1073741824 :
                            os.system("cd backup_path")
                            os.system("rm -rf *")
                        for ext in [".wld", ".twld"]:
                            os.system("cp %s %s" % (world_path + '/' + world_name + ext,
                                                    backup_path + '/' + world_name + datetime.now().strftime("-%Y-%M-%d-%H-%M") + ext))

                    if now.minute % 3 == 1: #自动保存
                        write("say Now saving...")
                        write("save")
            time.sleep(5)


try:
    monitor()
except Exception as e:  #错误处理
    p.stdin.write(b'exit')
    traceback.print_exc() #输出错误信息

本来想着每天最后一节晚自习摸会鱼,结果最后每天基本只能有半个小时时间,然后就折腾了四天……

最后终于摸出来了 不容易

参考了下面几个文章(于是把里面的锅都踩了一遍顺便还添新锅):

https://www.jxtxzzw.com/archives/3629

https://zerol.me/2020/02/08/Terraria-Server-With-Mods/


-EOF-
posted @ 2020-08-02 16:55  T_horn  阅读(329)  评论(0编辑  收藏  举报