Campofinale 系列项目部署心得

前言

Campofinale 是一个由 Team Stardust 开发的实验性本地服务器项目,为某款工厂建造类游戏提供本地服务器实现。项目使用C#编写,基于.NET框架,目前仍在积极开发中。

这里只着重讲如何部署,而且做到服务端与客户端分离。如果你只有一台机器,那么直接照着项目的README.md做即可。

服务端部署

服务端只有Campofinale本体。

编译 Campofinale

可以直接去那边下预编译包,下第一个出现的7z后缀文件然后找个地方解压就行。

装完就跳过这一部分吧。

安装.NET SDK,项目推荐使用8.0版本。

在 Windows 系统下,可以使用WinGet安装:

1
winget install Microsoft.DotNet.SDK.8

对于别的系统,自己找教程吧。

你需要确保在装完之后,dotnet命令可用。下面的命令能够确认是否成功安装:

1
dotnet --list-sdks

下载并解压源码包,或者使用git克隆仓库:

1
2
git clone https://git.teamstardust.org/Campofinale/Campofinale.git
cd Campofinale

编译(参考项目中的GitHub Workflows):

1
2
dotnet restore
dotnet build --no-restore --configuration Release

复制 / 移动二进制程序:

1
2
mkdir -p ../_build
mv Campofinale/bin/Release/net8.0 ../_build/Campofinale

这里的二进制程序目录可能有所不同,以实际为准。

安装依赖和资源

按项目说明来:

  • 安装.NET Runtime,注意这个跟 SDK 有区别,二者选其一;
  • 安装MongoDBMongoDB Server必装,同时还有个可选的 GUI 工具MongoDB Compass方便查看数据库;
  • 下载JsonTableCfgDynamicAssets

由于涉及到可能比较敏感的仓库名称,故不提供命令示例。

mitmproxy是给客户端用的,服务端用不到。

修改配置文件

进入程序目录,先启动一次Campofinale.exe,然后找到并打开配置文件server_config.json

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
{
"mongoDatabase": {
"uri": "mongodb://localhost:27017",
"collection": "Campofinale"
},
"dispatchServer": {
"bindAddress": "127.0.0.1",
"bindPort": 5000,
"accessAddress": "127.0.0.1",
"accessPort": 5000,
"emailFormat": "@campofinale.ps"
},
"gameServer": {
"bindAddress": "127.0.0.1",
"bindPort": 30000,
"accessAddress": "127.0.0.1",
"accessPort": 30000,
"useExternalAuthSdk": false,
"externalAuthSdkUrl": ""
},
"serverOptions": {
"defaultSceneNumId": 87,
"maxPlayers": 20,
"missionsEnabled": false,
"giveAllItems": false,
"disableLevelscripts": true,
"useEncryption": false
},
"logOptions": {
"packets": true,
"packetWarnings": true,
"packetBodies": false,
"debugPrint": false
}
}

作为服务端,建议把127.0.0.1改为服务器的真实 IP,保证客户端能够访问到两个 Server 地址;同时开放涉及到的两个端口(500030000)。

你需要自行考虑安全性问题。我这边是用的 Tailscale,毕竟又不需要提供服务。

英语好的话,你可以随便改配置。

客户端会先访问dispatchServer进行登录和下载资源,然后服务端会返回给客户端gameServer信息,最后客户端访问gameServer成功后进入游戏。

同时,客户端会尝试和奇怪的地址通信,后面遇到了可以先忽略。

至此,服务端配置完成。

服务端指令

记得创建账号:

1
account create <username>

客户端部署

安装相应资源

去项目 Discord 群(自己找!)找安装包,这个不单独提供;然后正常下载游戏资源即可,下完不要直接打开。

应用 Patch

去项目 Discord 群下相关文件:

  • launcher.exe
  • patch.dll
  • 我是游戏Beta.exe

去游戏本体安装目录覆盖;把launcher.exe做个桌面快捷方式,好找。

以后就开launcher.exe了。

劫持并重定向相关流量

项目采用了mitmproxy方案,将本来应该和正经dispatchServer的通信转移到了咱们自己开的Campofinale服务端;然后咱们的服务端检查登录信息并下发了可用的gameServer,而这个gameServer还是咱们自己的服务端!因此重定向只需要考虑dispatchServer的地址和端口就行了。

这里其实想怎么弄都行(软路由什么的)。

你需要安装cert。一般来说,跑一遍mitmproxy之后,你的用户目录下会多出来一个新目录~/.mitmproxy,这个目录里面有需要的cert

打开mitmproxy-ca-cert.cer,安装到受信任的根证书颁发机构存储区。不同系统做法不同。

编写相应脚本script.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from mitmproxy import http

REQ_HOSTS = ["__________.com", "_________"]
DISPATCH_SERVER_HOST = "127.0.0.1"
DISPATCH_SERVER_PORT = 5000


def request(flow: http.HTTPFlow) -> None:
condition = any(map(
lambda _: _ in flow.request.pretty_url,
REQ_HOSTS
))
if condition:
if flow.request.method == "CONNECT":
return
if "/get_latest_resources" in flow.request.pretty_url:
return
flow.request.scheme = "http"
flow.request.cookies.update(
{"OriginalHost": flow.request.host, "OriginalUrl": flow.request.url}
)
flow.request.host = DISPATCH_SERVER_HOST
flow.request.port = DISPATCH_SERVER_PORT

我平时会用uv管理Python项目,所以这里我直接用uv了:

1
uvx mitmproxy -s script.py

删了些敏感的东西,自己补上。

运行客户端

运行launcher.exe启动游戏。

邮箱:<username>@randomemailformathere.whatyouwant;密码随意。

总结

整体还算顺利,注意以下几点:

  • 服务端:依赖装起来没?资源下载了没?两处 IP 和端口处理了没?
  • 客户端:Patch 没?脚本修改了没?
  • 注意dispatchServergameServer的区别。

然鹅跑起来发现:我新手教程呢?

算了不管了。

作为一个实验性项目,Campofinale 展现了社区的技术实力。虽然功能尚未完善,但基础的游戏体验已经可以实现。期待项目的后续发展!


Campofinale 系列项目部署心得
https://blog.fqilin.top/campofinale-usage/
作者
F_Qilin
发布于
2025年12月2日
许可协议