「一」总体逻辑实现
1. Grasscutter简介
众所周知,对于剧情后期玩家来说,原神在版本更新的间隙会有很长时间的长草期。于是,为了创造乐趣,伟大的除草机便诞生了!(经典开头)
关于Grasscutter,是作者通过分析原客户端的请求和服务器返回值,模拟这些请求和返回基于Java写了一个模拟的拟态服务端(并不是原版泄露GM版),目前功能正在以较高的频率逐步增加中,仓库的提交频率也是呈现出一片欣欣向荣。
项目地址:https://github.com/Grasscutters/Grasscutter
官方Wiki文档:https://github.com/Grasscutters/Grasscutter/wiki
基本原理:
【客户端】-通过第三方代理转发软件,在本地抓包拦截原神客户端发向官方服务器的网络请求,并转而发送向自建的服务器(可以搭建在本地机器)
【服务端】-接收客户端发来的请求并模拟原版返回值,由于可以自定义数据,故而实现了自由度极高的私服功能。类似的东西还有很多,Grasscutter是其中的一个。
注意:2.8及之后版本客户端需要补丁
为解决官方自2.8版本后针对私服的保护措施,可在两种方式中任选其一(替换前注意备份~):①Metadata补丁:https://github.com/Grasscutters/Grasscutter/files/9181234/metadata-patch.zip
替换至安装路径:
/Genshin Impact game/Yuanshen_Data/
Managed/Metadata/global-metadata.dat
--或--
②UserAssembly补丁:https://anonfiles.com/H0VbR750yf/UserAssembly_zip
替换至安装路径:
/Genshin Impact game/Yuanshen_Data/
Native/UserAssembly.dll
【所有补丁归档】:
①https://github.com/AZthemute/GI-GC-patches
②https://github.com/34736384/RSAPatch
另外,也可以使用第三方启动器进行打补丁操作,更加方便,比如Cultivation和Acrepi等:https://github.com/gc-toolkit/GenshinLauncher
https://github.com/Grasscutters/Cultivation
(Cultivation在之前测试时发现不能及时更新内置的补丁,若提示版本不匹配请手动下载补丁)
「二」服务端搭建
本文综合各路先驱者教程及实操经验,介绍通过Docker容器技术较为简单地搭建原神私服。
Docker是一种如字面意思的“容器”技术,可以理解为更加小型的虚拟机(当然本质并不是)。使用她的目的是为了将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题,同时也方便服务端的迁移。
本流程适用基于Linux系统的服务器搭建,当然,如果想在本地搭建,可以选择直接安装环境所需软件;或通过Windows平台运行Docker,即使用Docker Desktop运行环境。不过,后者因为诸如性能等原因并不推荐,有兴趣可点此了解。
2.1 所需环境
如官方文档所示,需要MongoDB 4.0+和JDK 17+两个环境,我们使用两个Docker容器分别实现。
2.2 安装环境
·2.2.1· 首先,安装Docker(社区版)
yum install -y docker-ce # 安装docker
systemctl start docker # 启动docker服务
CentOS、Debian和Ubuntu的安装命令有些许差异,可自行搜索
也可以使用宝塔面板一键安装,更加便捷。
·2.2.2· 创建Docker network(可选,意义不大可跳过)
使用docker network对Docker容器进行统一管理,MongoDB数据库不对外提供端口,各容器之间通过hostname进行内部通信,保护系统安全。
docker network create genshin # 创建Docker network
docker network ls # 查看已创建的网络
·2.2.3· 【第一个Docker容器“mongodb”】:MongoDB环境
搭建Docker-MongoDB环境,在同一个docker network里,在内部通过hostname进行通信。
退出容器内部的命令是exit
docker pull mongo:latest # 拉取MongoDB基础镜像
mkdir -p /mydocker/mongodb/data # 在物理机创建目录
# 创建容器,容器名mongodb;网络为创建的genshin;
# -v表示 宿主机路径:容器路径;-h表示hostname;
# 最后指定镜像mongo
docker run -itd --name mongodb --network genshin -v /mydocker/mongodb/data:/data/db -h genshin_mongo mongo
docker update mongodb --restart=always # 重启Docker时,自动启动容器
若没有创建Docker network,可以将第三句命令去掉--network:
docker run -itd --name mongodb -v /mydocker/mongodb/data:/data/db mongo
mongodb容器创建完成后一般不需要进行任何操作了,主要操作集中于下面的第二个容器
·2.2.4· 【第二个Docker容器“grasscutter”】:JDK 17环境
搭建Docker-JDK17环境,同时这也是割草机服务端的运行容器:
①「创建容器」
docker pull python # 拉取Python基础镜像
# 创建容器,容器名grasscutter;网络为创建的genshin;
# -v表示 宿主机路径:容器路径;-h表示hostname;
# -p表示端口映射,这里将默认的443端口改为666或其他,避免占用;
# -h表示hostname;最后指定镜像python
docker run -itd --name grasscutter -v /mydocker/Grasscutter:/Grasscutter --network genshin -p 22102:22102/udp -p 666:666/tcp -h genshin_grasscutter python
iptables -I INPUT -p udp --dport 22102 -j ACCEPT # 放行22102端口的udp协议
iptables -I INPUT -p tcp --dport 666 -j ACCEPT # 放行666端口的tcp协议
docker update grasscutter --restart=always # 设置开机自启
docker exec -it grasscutter /bin/bash # 进入容器内部
cat /etc/issue # 查看系统版本(Debian GNU/Linux 11)
若没有创建Docker network,可以将第二句命令去掉--network:
docker run -itd --name grasscutter -v /mydocker/Grasscutter:/Grasscutter -p 22102:22102/udp -p 666:666/tcp python
推荐使用数据卷方式共享目录
为方便编辑,上面两个容器都使用了Docker数据卷的方式读写数据,也就是将物理机上的目录“共享”到容器,-v后的顺序为 宿主机路径:容器路径既命令后使用参数:-v /mydocker/Grasscutter:/Grasscutter
表示将宿主机的目录/mydocker/Grasscutter挂载到容器的/Grasscutter目录,其下内容将实时同步
②「在该容器内安装常用软件包」
apt-get update # 更新apt-get
apt-get install sudo -y # 安装sudo
apt-get install wget -y # 安装wget
apt-get install curl -y # 安装curl
apt-get install vim -y # 安装vim
③「在该容器内安装jdk-17」
sudo apt install openjdk-17-jdk -y # 安装jdk17
sudo apt install openjdk-17-jre -y # 安装jre17
java -version # 检查版本
javac -version
此处创建容器时映射的22102和666端口,是为了后续搭建Grasscutter私服保留的。
22102(UDP)是游戏服务器(GameServer)端口,用来处理一些传送、伤害数值计算等信息,如果是在服务器部署的话记得在安全组放开这个端口的UDP协议,防止出现4206错误无法进入游戏。
666(TCP)是用来处理登录、游戏更新的端口(DispatchServer),默认的443大概率被占用,可以更换成自己喜欢的,本文使用666。
「三」下载服务端资源
3.1 下载仓库文件
下载割草机Grasscutter仓库文件(Code -> Download ZIP):https://github.com/Grasscutters/Grasscutter这里建议将左上角stable分支改为development分支再下载,此分支更新频率高,包含更多大世界新特性
以前的旧更新
2022/5/19 Update:
更新
近日development分支结构做了较大改动,详情可查看这个commit:https://github.com/Grasscutters/Grasscutter/commit/ead0df336e811bfb0401c4ed9af4308ba144180a
以及这个pr:
https://github.com/Grasscutters/Grasscutter/pull/927
如若第一次搭建追求稳定,还是先使用stable稳定分支文件进行搭建(×)
2022.6.8更新:现在直接用development分支就可以~
将文件放至服务器任意目录(如刚刚挂载的mydocker/Grasscutter)解压,进行下一步处理
3.2 下载resources资源文件
从另一个仓库下载资源:https://github.com/Koko-boya/Grasscutter_Resources
https://git.crepe.moe/grasscutters/Grasscutter_Resources
https://gitlab.com/YuukiPS/GC-Resources(支持3.4版本)
将文件夹改名为resources,放入上个步骤的目录mydocker/Grasscutter中。注意,原始割草机仓库中并不包含resources文件夹。
3.3 下载jar启动文件
截至2023.02.07,正式版本号为1.4.3,开发版为1.4.6
3.4版本国内预编译jar:https://pan.huang1111.cn/s/nwXnfm
①【推荐】:从自动构建下载development版本:
https://nightly.link/Grasscutters/Grasscutter/workflows/build/development/Grasscutter.zip
①从releases下载:https://github.com/Melledy/Grasscutter/releases
②stable版本自动构建下载:
https://nightly.link/Grasscutters/Grasscutter/workflows/build/stable/Grasscutter.zip
③也可以自己尝试构建:https://github.com/Grasscutters/Grasscutter#Building
下载完成后放入根目录,可以删掉其他多余的文件。此时,运行前必需的目录结构应为:
Grasscutter
├── src
├── lib
├── keystore.p12
├── plugin-schema.json
├── grasscutter-1.x.x.jar
└── resources
├── BinOutput
├── ExcelBinOutput
├── Readable
├── Scripts
├── Subtitle
├── TextMap
└── QuestEncryptionKeys.json
运行前的目录结构:
(图片时效性可能滞后,仅供参考。请以上述文字结构为准)
3.4 复制到Docker容器(已弃用)
【关于复制】:
我们已经通过-v挂载数据卷形式启动grasscutter容器,所以这里的复制操作没用了,直接在宿主机上更改文件更加方便
相关命令备份:
①在容器与宿主机之间相互复制文件:
docker cp [路径] [容器名]:[路径]
(注:表示从前者复制到后者,可互换顺序)②进入指定容器:
docker exec -it [容器名] /bin/bash
3.5 第一次启动
docker exec -it grasscutter /bin/bash # 进入grasscutter容器
cd /Grasscutter # 进入刚刚下载的文件夹
java -jar grasscutter-1.x.x.jar # 启动
第一次启动会失败,因为我们初次启动的目的是让jar包执行时自动生成一个config.json(如果有就不会重新生成),下面我们需要修改里面的配置(若是挂载数据卷,可直接在宿主机对应目录mydocker/Grasscutter修改):
vim config.json
配置含义说明:
·如果是本地运行,里面的两个PublicIp不用改;如果是在服务器运行,需要把两个PublicIp改为服务器的公网IP。
·“server”中的的“bindPort”: 666是用来处理登录、游戏更新的端口(DispatchServer),默认的443服务器端口可能更容易出问题,比如国内可能需要备案才能使用,或者被Nginx等服务占用。且Windows服务器也可能会被VMWare的Share共享服务或者Steam占用,所以建议改为别的端口。改好后记得在安全组/防火墙放行该端口的TCP协议。
·“game”中的“bindPort”: 22102是游戏服务器(GameServer)的端口,用来处理一些传送、伤害数值计算等信息,如果是在服务器部署的话记得在安全组/防火墙放开这个端口的UDP协议,防止出现4206错误无法进入游戏。
·“welcomeMessage”: “Welcome to Grasscutter!”,这个是进服务器之后Server发给你的欢迎语句,可以改成“欢迎来到XXX私服“之类的。
·“KeystorePassword”: “123456”,证书文件的密码,不需要修改。
·“autoCreate”: true,这个是控制自动创建账号的,改为true之后,如果登录私服的时候没有那个账号的话会自动创建一个并登录进去,然后分配默认的uid,从10001开始往后顺延。
·"EXPERIMENTAL_RealPassword": 实验性质的真·密码登录,在之前的版本中密码是形同虚设的
·“singlePlayerTeam”: 5 “multiplayerTeam”: 10, 联机队伍中最多角色数,更改之后可以切换联机数量。
可能用到的命令:
①查看容器的内部IP:docker inspect 容器名 | grep IPAddress
②查询运行的Java程序:ps -ef|grep java
③停止运行的Java程序:kill [进程ID]
我的配置文件供参考(3.0版本后更新,可能滞后):
{
"folderStructure": {
"resources": "./resources/",
"data": "./data/",
"packets": "./packets/",
"scripts": "./resources/Scripts/",
"plugins": "./plugins/"
},
"databaseInfo": {
"server": {
"connectionUri": "mongodb://【mongodb容器内部IP】:27017",
"collection": "grasscutter"
},
"game": {
"connectionUri": "mongodb://【mongodb容器内部IP】:27017",
"collection": "grasscutter"
}
},
"language": {
"language": "zh_CN",
"fallback": "zh_CN",
"document": "CN"
},
"account": {
"autoCreate": true,
"EXPERIMENTAL_RealPassword": false,
"defaultPermissions": [],
"maxPlayer": -1
},
"server": {
"debugWhitelist": [],
"debugBlacklist": [],
"runMode": "HYBRID",
"logCommands": false,
"http": {
"bindAddress": "0.0.0.0",
"bindPort": 666,
"accessAddress": "【服务器IP】",
"accessPort": 666,
"encryption": {
"useEncryption": true,
"useInRouting": true,
"keystore": "./keystore.p12",
"keystorePassword": "123456"
},
"policies": {
"cors": {
"enabled": false,
"allowedOrigins": [
"*"
]
}
},
"files": {
"indexFile": "./index.html",
"errorFile": "./404.html"
}
},
"game": {
"bindAddress": "0.0.0.0",
"bindPort": 22102,
"accessAddress": "【服务器IP】",
"accessPort": 22102,
"loadEntitiesForPlayerRange": 100,
"enableScriptInBigWorld": true,
"enableConsole": true,
"kcpInterval": 20,
"logPackets": "NONE",
"gameOptions": {
"inventoryLimits": {
"weapons": 3000,
"relics": 3000,
"materials": 3000,
"furniture": 3000,
"all": 30000
},
"avatarLimits": {
"singlePlayerTeam": 5,
"multiplayerTeam": 10
},
"sceneEntityLimit": 1000,
"watchGachaConfig": false,
"enableShopItems": true,
"staminaUsage": false,
"energyUsage": false,
"fishhookTeleport": true,
"resinOptions": {
"resinUsage": true,
"cap": 160,
"rechargeTime": 1
},
"rates": {
"adventureExp": 1.0,
"mora": 1.0,
"leyLines": 1.0
}
},
"joinOptions": {
"welcomeEmotes": [
2007,
1002,
4010
],
"welcomeMessage": "欢迎来到<color=#66CCFF>青空</color>的提瓦特!",
"welcomeMail": {
"title": "欢迎来到 <color=#66CCFF>天空岛</color>服务器!",
"content": "你好,远渡星海的旅行者!\r\n这里是本白毛天理统治下的<color=red>提</color><color=green>瓦</color><color=blue>特</color>世界,所属<color=#66CCFF>天空岛</color>服务器。来体验一个特别的提瓦特吧!",
"sender": "白毛天理",
"items": [
{
"itemId": 13509,
"itemCount": 1,
"itemLevel": 1
},
{
"itemId": 201,
"itemCount": 99999,
"itemLevel": 1
},
{
"itemId": 11101,
"itemCount": 1000,
"itemLevel": 1
},
{
"itemId": 223,
"itemCount": 1000,
"itemLevel": 1
},
{
"itemId": 224,
"itemCount": 1000,
"itemLevel": 1
}
]
}
},
"serverAccount": {
"avatarId": 10000007,
"nameCardId": 210001,
"adventureRank": 60,
"worldLevel": 8,
"nickName": "白毛天理",
"signature": "天空岛之上,天理永存"
}
},
"dispatch": {
"regions": [],
"defaultName": "<color=#66CCFF>天空岛</color>服务器",
"logRequests": "NONE"
}
},
"version": 4
}
旧代码
{
"DatabaseUrl": "mongodb://【mongodb容器内部IP】:27017",
"DatabaseCollection": "grasscutter",
"RESOURCE_FOLDER": "./resources/",
"DATA_FOLDER": "./data/",
"PACKETS_FOLDER": "./packets/",
"DUMPS_FOLDER": "./dumps/",
"KEY_FOLDER": "./keys/",
"SCRIPTS_FOLDER": "./resources/Scripts/",
"PLUGINS_FOLDER": "./plugins/",
"DebugMode": "NONE",
"RunMode": "HYBRID",
"GameServer": {
"Name": "【服务器名】",
"Ip": "0.0.0.0",
"PublicIp": "【服务器IP】",
"Port": 22102,
"PublicPort": 22102,
"DispatchServerDatabaseUrl": "mongodb://【mongodb容器内部IP】:27017",
"DispatchServerDatabaseCollection": "grasscutter",
"InventoryLimitWeapon": 2000,
"InventoryLimitRelic": 2000,
"InventoryLimitMaterial": 2000,
"InventoryLimitFurniture": 2000,
"InventoryLimitAll": 30000,
"MaxAvatarsInTeam": 5,
"MaxAvatarsInTeamMultiplayer": 10,
"MaxEntityLimit": 1000,
"WatchGacha": false,
"ServerNickname": "【服务器用户昵称】",
"ServerAvatarId": 10000007,
"ServerNameCardId": 210001,
"ServerLevel": 60,
"ServerWorldLevel": 8,
"ServerSignature": "【服务器用户签名】",
"WelcomeEmotes": [
2007,
1002,
4010
],
"WelcomeMotd": "Welcome to Grasscutter!",
"WelcomeMailTitle": "Welcome to Grasscutter!",
"WelcomeMailSender": "Grasscutter",
"WelcomeMailContent": "Hi there!\r\nFirst of all, welcome to Grasscutter. If you have any issues, please let us know so that AIR The Sustainer can help you! \r\n\r\nCheck out our:\r\n\u003ctype\u003d\"browser\" text\u003d\"Discord\" href\u003d\"https://discord.gg/T5vZU6UyeG\"/\u003e",
"WelcomeMailItems": [
{
"itemId": 13509,
"itemCount": 1,
"itemLevel": 1
},
{
"itemId": 201,
"itemCount": 10000,
"itemLevel": 1
},
{
"itemID": 223,
"itemCount": 1000,
"itemLevel": 1
},
{
"itemId": 224,
"itemCount": 1000,
"itemLevel": 1
}
],
"EnableOfficialShop": true,
"Game": {
"ADVENTURE_EXP_RATE": 10.0,
"MORA_RATE": 10.0,
"DOMAIN_DROP_RATE": 10.0
}
},
"DispatchServer": {
"Ip": "0.0.0.0",
"PublicIp": "【服务器IP】",
"Port": 444,
"PublicPort": 444,
"KeystorePath": "./keystore.p12",
"KeystorePassword": "123456",
"UseSSL": true,
"FrontHTTPS": true,
"CORS": false,
"CORSAllowedOrigins": [
"*"
],
"AutomaticallyCreateAccounts": true,
"defaultPermissions": [
""
],
"GameServers": []
},
"LocaleLanguage": "zh-CN",
"DefaultLanguage": "zh-CN",
"OpenStamina": true
}
配置文件中的语言Language可以使用zh-CN或en-US~
以后更新的时候只用替换掉grasscutter.jar和resources文件夹就行,config.json也要重新生成并进行修改。
出现类似下方的提示,既为启动成功:
-> 此时如果想创建自定义UID账号,可输入:
account create [用户名] [想要的UID]
-> 建议使用permission命令给予自己的账号所有权限:
permission @[你的UID] add *.*
-> 卡池编辑:
卡池数据在[服务器目录]\data\banners.json中,如果没有这个文件,请自行创建
卡池及补丁等文件通常会在Discord的resource频道中放出,那里会有人跟进最新的卡池/游戏数据制作,建议加入:
https://discord.gg/grasscutter
启动成功后直接关闭就行,不需要nohup指令,因为可能会造成性能和空间的消耗。
此时浏览器访问https://ip:port可以看到Welcome to Grasscutter的字样
(如http://127.0.0.1:666/)。
「四」准备畅玩,安装代理转发软件
至此,服务端的搭建已经完成!我们只需要将原神游戏发出的请求转发到自己的服务器上就OK了~
开头介绍的Cultivation启动器内置了代理功能,若失效可使用以下方法:
在这里推荐Windows端使用Fiddler作为流量转发工具,不需要再下载一遍游戏,启动 Fiddler 是私服,关掉 Fiddler 就是官服。
更新:2.8及之后版本注意
在官服和私服之间切换时,不要忘记将之前打的补丁恢复!当然若没有恢复后果也只是无法正常启动游戏~可使用第三方启动器查看补丁状态及恢复/备份操作。
Fiddler官网下载:https://www.telerik.com/fiddler/fiddler-classic
配置说明:
第一步:选择左上角Tools-Options,在HTTPS里面选择Decrypt HTTPS traffic,三个勾可以都打上。
第二步:选择Connections,然后选择一个端口,建议避开8888端口防止占用,我这里用的是8181端口,点击OK。
第三步:在Fiddler右侧找到FiddlerScript,把原来的代码全部删掉,然后把下面的这一段代码放进去(只需把oS.host改成自己的即可),然后点击左上角的Save Script保存脚本使其生效。
/* 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:666"; // This can also be replaced with another IP address.(输入域名也可)
}
if(oS.uriContains("http://uspider.yuanshen.com:8888/log")){
oS.oRequest.FailSession(200, "Blocked", "haha");
}
}
};
恭喜!至此,理论的搭建已经全部完成,打开游戏体验吧~
当登陆界面的logo变成hoyoverse,意味着代理已经成功运行了,输入事先创建的用户名,密码随便写~
「五」指令的下达
传统方式的命令执行,是在进入游戏后进入会话列表,添加会话用户找到Server用户并添加,就可以发送“/命令”的方式来执行指令。
当然,这种方法效率有些低,我们可以使用@jie65535制作的命令生成器:
https://github.com/jie65535/GrasscutterCommandGenerator
可以方便地生成命令供粘贴使用。
进一步,这个工具还可以通过插件的方式远程执行指令,更加快捷:
服务端插件:https://github.com/jie65535/gc-opencommand-plugin
服务端插件使用方法:
·在Release下载 jar
·放入服务器目录中的/Grasscutter/plugins文件夹
·重启割草机服务端:
①查询运行的Java程序:ps -ef|grep java
②停止运行的Java程序:kill [进程ID]
③java -jar grasscutter-1.x.x.jar
·先进入游戏,再打开命令生成器,在“远程”页面中查询、发送验证码到你的UID,再将游戏中左下角消息中的验证码填入即可。接下来,使用一键执行命令,成为提瓦特的天理吧!
拓展:环境备份方法:
一、Docker镜像备份法
生成本地镜像:
docker save -o [导出的镜像名.tar] [本地镜像名]:[镜像标签]
如:docker save -o /home/grasscutter-image.tar grasscutter:latest
使用本地镜像:
docker load -i [本地tar包文件]
二、手动备份法
复制Docker内指定目录到宿主机:
docker cp grasscutter:/Grasscutter /Grasscutter
输出MongoDB数据库备份:
mongodump -o /home/mongodb/
恢复所有数据到数据库:
mongorestore /home/mongodb/
年轻时诋毁原神,长大后理解OP,成熟后成为天理!
〔部分引用〕使用Grasscutter服务端搭建原神私服
版权所有 Copyright 2023 WorldlineChanger Personal. All rights reserved.
给tcp端口绑定了域名,udp的端口怎么才能也绑定到相同的域名下面@(乖)
反向代理吗?域名对应IP的话不用绑定就能直接连通吧,nginx的话无论tcp还是udp都是可以一样用proxy_pass实现端口转发的
为什么我在启动的时候提示我加载缓存的“TextMaps”超时
可以搜索一下issue,或者Discord的帮助支持频道
我进去游戏给主角起完名字点确定为啥没有反应呢?
补丁还能用吗?登录的时候提示连接超时
补丁现在需要加入Discord获取比较方便
浏览器访问能看到welcom,代理后登录提示4214,怎么处理
https://github.com/Grasscutters/Grasscutter/issues?q=4214一般是资源文件及服务端版本不一致导致
没错,就是客户端补丁
好的,感谢反馈
3.4版本服务端和客户端都完美运行,不过就是好像人物技能奶人回血的功能没有实现?
老bug(特性)了,记得很久以前有人pr过来着。因为奶等技能在服务端实现故需要第三方代码模仿效果,服务端的泄露代码也不能光明正大加到仓库里,可能随版本更新需要有人跟随更新
什么错误都没有 就是进门卡住白屏 会是什么原因呢
白屏情况一般都是数据库兼容问题(清数据库),或服务器版本与本地游戏不一致导致的
博主回复的好快哈哈哈@(笑眼)晚上回去再试试 白屏的时候用的是 1.4.3.jar 今天换grasscutter-1.4.6.jar试试
哈哈好的,我昨天用3.4预编译 jar:https://pan.huang1111.cn/s/nwXnfm和https://gitlab.com/YuukiPS/GC-Resources 跑起来了,不过客户端还没试
使用两个docker的方式的局域网部署,参考给出的配置文件配置后。再次启动出现下面这个错误。
<WARN:DataLoader> Failed to create gacha mappings.
com.google.gson.JsonSyntaxException: java.io.IOException: Invalid DynamicFloat definition - BOOLEAN
最近3.4的私服还没有正式并入仓库,可以先看看这个支持3.4的pr:https://github.com/Grasscutters/Grasscutter/pull/2041评论区有提到https://github.com/yeyeyeawa/Grasscutter 的jar文件搭配3.3的patch file、加上https://gitlab.com/YuukiPS/GC-Resources 可以完美运行,我这边暂时还没尝试@(爱心)
3.4已测试成功
大佬,请问我在跟着教程做的时候用的全是最新的resource(3.3)和jar包(1.4.3),然后再启动服务器的时候就全是resource的错误和语言的错误是咋回事?
过几天我再试试,最近gc的资源包之类资源逐渐转移到Discord群内分享,你可以先在群内看看有没有相似反馈@(玫瑰)
大佬请问discord群号是多少啊
Github简介有说:https://discord.gg/T5vZU6UyeG
看晕了。。。
确实有点,过阵子继续优化下步骤
07:34:54 <INFO:Language> Loading cached TextMaps
07:34:56 <INFO:Tools> GM Handbooks generated!
Exception in thread "main" com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}]
运行时候这是什么问题呢?@(乖)
修改mongodb.conf 是在什么位置呢
我没有把加docker network,可能不同docker直接网不通? 我回头再全部重来一遍
检查你的docker容器IP地址 config.CFG内 localip--替换为 docker ps指令输出 非Python那个
进入游戏为什么没有任务指引,任务npc也都没有了@(乖)
请问登入时显示账号格式错误怎么解呢
检查下有事先注册成功吗
大佬,账号数据都是在数据库中吗,以后版本迭代数据会继承吗
目前更新后数据继承都没问题的,过几天我再试下3.0的
感谢大佬~持续关注大佬~
再问个问题,大佬 我服务端搭建好了,但是客户端 我自己搞了个代理,把原神米哈游之类的域名全部重定向到我的server,server换成了ip,中间就是搞了个http代理,然后我客户端也用上了这个代理,但是打开游戏的时候还是不能请求 这是为什么?
不清楚你用的什么代理策略,可能是服务器端口未开放,或代理软件问题。顺便一提,应该代理到你的DispatchServer端口而不是22102,你看下
是这个端口
代理换成了fiddle了,连上去4205错误。 server端有client的连接日志 但是这个4205啥意思
4205一般是因为更新失败而拒绝登录,可检查代理策略是否有误,也常见于文件缺失,或jar与资源版本不匹配
问个问题,我启动成功的。
但是浏览器访问它显示的game server的地址https://192.168.0.222:22102 显示连接失败 咋回事
搞定了 的确是端口被占用了
关于副本和深渊无法加载感觉是不是运行时弹出报错导致的,请问大佬知道怎么解决吗?错误信息如下:
<ERROR:ResourceLoader> Error loading resource file: [FetterInfoExcelConfigData.json, FettersExcelConfigData.json, FetterStoryExcelConfigData.json, PhotographExpressionExcelConfigData.json, PhotographPosenameExcelConfigData.json]
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
<ERROR:ResourceLoader> Error loading resource file: [ReliquaryLevelExcelConfigData.json]
<ERROR:GameDepot> Relic properties are missing weights! Please check your ReliquaryMainPropExcelConfigData or ReliquaryAffixExcelConfigData files in your ExcelBinOutput folder.
<ERROR:ResourceLoader> Unable to load quest keys - ./resources/QuestEncryptionKeys.json not found.
<ERROR:TowerSystem> Unable to load tower schedule config.
深渊之类是可以的,一般这种情况是资源文件(resources)缺失,重新下载并检查版本是否最新/结构是否正确
请问是不是深渊和副本都不能打啊?我这边搭建好后进副本或者深渊加载完后环境都是空荡荡的
编辑配置文件的时候不会用vim,所以有其他方法编辑吗.
推荐一个远程连接软件FinalShell:http://www.hostbuf.com/ 可以编辑文件
登录4214是哪里出问题了吗,国服客户端
看下这些反馈:https://github.com/Grasscutters/Grasscutter/issues?q=4214一般是资源文件及服务端版本不一致导致