本教程仅用于个人技术研究及学习交流使用,严禁任何商业行为!
若向任何人提供游戏私服服务造成违反法律法规,本站概不负责!

本来只是在和朋友讨论原神的时候顺手一搜,没想到已经真的有大神实现了。

这里参考开源项目实现,并针对在自己实际部署过程中遇到的问题,进行了部分经验总结:

项目地址:Grasscutters Software & utilities to emulate a certain anime game.

完美圣遗物

首先是服务器端运行环境的搭建,这里分为Linux和Windows来讲解:

游戏服务器运行环境

Linux运行环境部署

这里以CentOS为例:

一、是基础的软件安装,比如:wget、git、nano,分别为下载、Github项目拉取、和文本编辑器。

sudo yum -y install wget
sudo yum -y install git
sudo yum -y install nano#编辑器看个人习惯
#根据系统yum -y install可能替换为(如Ubuntu/Debian)apt -y install等

二、是软件运行环境的部署,这里原神服务器需要用到的是Java和MongoDB,我们将其安装进对应的文件夹。

cd ~
#安装java SE 17
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/x64/linux/OpenJDK17U-jdk_x64_linux_hotspot_17.0.3_7.tar.gz
tar zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.3_7.tar.gz
sudo mv jdk-17.0.3+7 /usr/local/java
#安装Mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.8.tgz
tar zxvf mongodb-linux-x86_64-rhel70-5.0.8.tgz
sudo mv mongodb-linux-x86_64-rhel70-5.0.8 /usr/local/mongodb

三、将安装好的软件添加到系统环境变量。

#配置环境
sudo nano /etc/profile
#在文件末尾添加以下内容
#配置java SE 17环境
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar;
#配置Mongodb环境
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
#Ctrl+X退出
source /etc/profile
# 验证是否安装成功
java -version
mongo -version

四、到这一步如果部署成功应该会出现:

运行java -version显示

运行mongo -version显示

五、配置mongodb数据库。

#配置Mongodb数据库
cd /usr/local/mongodb
mkdir data
mkdir log
nano mongod.conf
#添加以下内容
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
port=27017
auth=false
fork=true
bind_ip=127.0.0.1
#Ctrl+X退出

Windows运行环境部署

Windows环境大家应该熟悉很多,这里就不一一细说操作步骤了,主要就是3个软件的安装:git、Java和MongoDB:

接下来就是安装:

JDK和git没什么好说的,跟着安装程序一路点下一步就好了,其中git步骤可能会有点多,但是不用慌,全部保持默认就好了。

MongoDB其实也是一路下一步,在过程中选择“Complete”就行,再在下一页把“Install Mongodb Compass”这个勾选去掉(其实就是个捆绑软件,没勾掉也无所谓)。

MongoDB安装时注意的两个地方

如何验证安装成功:

组合键win+R –> 运行 输入cmd 在控制台里输入 java -version,如出现如下图信息表示安装成功。

组合键win+R —> 运行 输入 services.msc 打开系统服务,找到 MongoDB Server,如图,显示“正在运行”就OK了。

游戏服务器部署

由于接下来的步骤Linux和Windows操作基本一致,我就把两边操作统一起来讲:

首先是服务端文件的拉取以及编译,这里两边拉取都用的是git,Liunx下命令如下:

#Linux
#编译服务端程序
cd ~
#使用代理clone项目
git clone -b development https://ghproxy.com/https://github.com/Grasscutters/Grasscutter
cd Grasscutter
./gradlew jar
# 编译程序先会下载补充资源,如网络不好可能会失败,然后编译完成后会在当前目录下生成 grasscutter-XXX-dev.jar 文件

Windows同理:

#Windows
#在任意文件夹右键 “Git Bash Here” 打开控制台窗口,运行命令:
git clone -b development https://ghproxy.com/https://github.com/Grasscutters/Grasscutter
cd Grasscutter
./gradlew.bat jar

编译成功提示,一般编译需要的时间从3到15分钟不等,稍安勿躁~

然后下载服务器资源文件:

#下载服务端资源文件
git clone https://ghproxy.com/https://github.com/Koko-boya/Grasscutter_Resources
cd Grasscutter_Resources
#加载服务端资源文件
cp -r Resources ~/Grasscutter/resources 
#这一步Windows可以直接将下好的 Grasscutter_Resources 文件夹里的 Resources 文件夹改成 resources 放到 Grasscutter文件夹里。

接下来就是第一次运行,用于生成GM(游戏管理员)手册,以及配置文件:

# 先运行一下服务端,生成配置文件,handbook后缀为生成GM手册
cd ~/Grasscutter
java -jar grasscutter-XXX-dev.jar -handbook
# 修改刚生成的配置文件
nano config.json
#这里主要修改服务器运行的IP和端口号,需要记住,后面会用到

标记处就是服务器IP,下面的bindPort就是对应服务的端口号

这里如果是本机部署可以不用修改,如果是局域网设备或者云服务器部署需要将IP改为对应的服务器IP,端口号按需修改,其中上面的"server"为服务器连接IP和端口(TCP),下面的"game"为游戏数据通讯IP和端口(UDP)。

游戏服务器运行

服务器运行准备

服务器运行前需要先将数据库打开:

#每次重启后,启动前,先打开数据库
mongod -f /usr/local/mongodb/mongod.conf
如果是云服务器这里注意不要打开27012端口,这是MongoDB数据库端口,以免被“好心人”删库跑路

服务器运行及参数

如果你跟着教程做到了这一步,那么恭喜你,你已经马上就可以开始游戏了。

#具体根据编译生成的jar文件名来
java -jar grasscutter-XXXX-dev.jar
#如果出现内存不足请加上参数运行,如下,其他参数请自行搜索
java -jar grasscutter-XXXX-dev.jar -Xmx 256M

当出现如下画面的时候,你就已经成功让服务器运行了起来:

看到”Game Server started“就大功告成了

基本指令和更新

开完服务器,第一件事当然就是创建帐号啦

account create XXX 1 #XXX 是你的登录用户名 1 是你的UID 这里没有设置密码,你可以随便输入

进入游戏,这和官方服务器会有所不同,没有新手教程,怪物刷新也有所不同,另外就是大招没有能量条,所有传送点可用,等等等等,都需要你自己去摸索。

对了,好友列表里有个默认好友叫Server,你可以直接朝他发送指令,目标是自己的时候无需增加对象UID,试试给他发送 /giveall 吧!

/give [UID] [物品ID] [数量] #基本格式
#物品ID比如 223:纠缠之缘 224:相遇之缘,去试试抽卡吧,个人感觉爆率略低于官服,但是应该是一样的。具体物品ID查看服务器目录下生成的GM手册"GM Handbook.txt"

有了git,后期更新也很方便,组合键Ctrl+C关闭服务器,然后运行如下命令即可:

#更新程序
#Ctrl+C 结束掉程序
git pull
./gradlew jar
#接游戏服务器运行章节

登录游戏

PC客户端运行准备

目前,项目已经支持PC官服直连,所以游戏客户端的准备只需要去原神官网下载最新版本(截至目前为2.7)即可。

接下来就是关于网络环境了,这里我们需要了解游戏客户端与服务器的沟通方式,一般是通过TCP协议连接与认证,之后通过UDP协议低延迟传输游戏数据。这个协议的目的地址一般是嵌入在游戏客户端里的,我们不方便去修改,但是我们可以通过将客户端发送的数据包劫持给我们自己服务器的地址,这样就可以实现官服登录的目的(主要是懒~)。

这里我们需要用到一个软件Fiddler:“Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。”(百度百科)

Fiddler下载地址:https://www.telerik.com/download/fiddler

Windows下的软件安装就不细说了,一路下一步。

接下来就是进行数据解析和劫持了,

第一步:打开Fiddler,找到菜单栏的 Tool > options,切换到https,把如图两个勾上。

第二步:切换到 connections ,如图,把端口改成8181,好了后按 OK 保存设置。

第三步:主界面选 Fiddler Script ,清空原来的脚本,粘贴如下内容。脚本中的 oS.host 后面改为你服务器的IP地址,搞定了记得点左上角SaveScript。

/* Original script by NicknameGG, modified for Grasscutter by contributors. */
import System;
import System.Windows.Forms;
import Fiddler;
import System.Text.RegularExpressions;
 
class Handlers
{
    static function OnBeforeRequest(oS: Session) {
        if(oS.host.EndsWith(".yuanshen.com") || oS.host.EndsWith("hoyoverse.com") || oS.host.EndsWith("mihoyo.com")) {
            oS.host = "你的服务器IP:端口"; // This can also be replaced with another IP address.
        }
        if(oS.uriContains("http://uspider.yuanshen.com:8888/log") ){
            oS.oRequest.FailSession(200, "Blocked", "LOL");
        }
    }
};

第四步:运行,记得关闭任何代理软件否则会劫持失败(加速器、梯子)

如果觉得上述比较复杂,当然你也可以使用一个大佬使用易语言写的简易脚本(易语言程序杀毒软件极易误报):QNAP SmartShare

第五步,登录,通过上面的服务器指令创建的账户没有密码,这里任意输入就好

开始享受你的旅程吧!旅行者!

最后感谢小伟博客提供的部分图片(Windows环境下的部分部署过程)