本文章仅供个人使用,这个是我的一个学习docker的项目笔记

原神启动

grasscutter割草机官方项目地址:https://github.com/Grasscutters/Grasscutter
官方 Wiki 文档:https://github.com/Grasscutters/Grasscutter/wiki

安装docker


开篇我们来介绍一下我们搭建元神私服所要采用的大工具,我们后面的项目都是基于此进行部署的】
什么是docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。
Docker使用沙箱机制,容器之间不会有任何接口。它基于轻量级虚拟化技术,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源。
通过容器,可以实现方便快速并且与平台解耦的自动化部署方式,无论部署时的环境如何,容器中的应用程序都会运行在同一种环境下。Docker包括镜像、容器、仓库,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是web应用或者数据库应用)及其环境能够做到“一次封装,到处运行”。
如需更多与Docker有关的信息,建议访问Docker官网进行了解。
docker的一些基础命令

#docker pull 镜像名:tag
# 拉取nginx最新镜像
docker pull nginx:latest
#查看镜像
docker images
# 运行nginx容器 --name 指定容器名 -v 指定映射关系 -d 后台运行容器 -it 标准输入并且打开终端 容器要混行的时候必须要给他指定一个初始命令才行,要不然运行不起来
docker run -dit --name mynginx -v /root/html:/usr/share/nginx/html nginx:latest
# 删除镜像
docker rmi 镜像名
# 删除所有镜像
docker rmi -f `docker images -qa`
#删除容器
docker ps #查看到你想要删除的容器id
docker rm -f 容器id # -f 指定强制删除 我不管你运行不运行 我是管理员,我让你死你就得死。
docker rm -f `docker ps -qa` #删除所有的容器不管你死活。
# 从主机拷贝文件到容器里面
docker ps # 查看容器id
docker cp [文件] [容器名:/目录] #拷贝本机文件内容到容器内部
# 查看容器的内部ip
docker ps
docker inspect [容器id]

我们的原神私服采用的是docker部署的,docker部署的好处就是隔离性很强,各个容器之间互不影响。docker是基于软件层面的隔离,虚拟机是基于硬件物理层面的隔离,但是一台服务器上面只能运行一个操作系统,但是可以运行无数个docker容器,容器里面可以放不同的服务,游戏私服,网盘,个人博客,靶场都行。这就是容器的好处。
话不多说,我们直接上代码安装docker吧

[root@docker-server ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #获取docker-ce源
[root@docker-server ~]# yum install docker-ce -y #安装docker-ce
[root@docker-server ~]# systemctl enable --now docker #开机自启动

割草机环境安装

我们下载的是github上面开源的割草机服务端
然后官方文档说需要两个开发环境一个是mongodb,一个是java
所以我们现在开始安装这两个环境同样是用docker的形式拉去镜像然后进行部署,好了,话不多说,我们直接上源码。

安装mongodb

docker pull mongo             # 拉取MongoDB镜像,默认拉取的是最新版
mkdir -p /mydocker/mongodb/data #创建数据目录
# -it指定终端指定标准输入 --name 容器名 -v指定映射目录
docker run -itd --name mongodb -v /mydocker/mongodb/data:/data/db mongo

安装jdk17

这边我们安装grasscutter割草机,这个割草机同样是服务器运行环境,首先我们要先拉取python镜像,然后在python上面运行割草机grasscutter,然后在里面我们安装jdk17的环境,后面有用,暂时还用不到

docker pull python  
docker run -itd --name grasscutter -p 22102:22102/udp -p 444:444/tcp python
docker ps # 查看容器运行情况
此处创建容器时映射的 22102 和 444 端口,是为了后续搭建 Grasscutter 私服保留的。
22102(UDP)是游戏服务器(GameServer)端口,用来处理一些传送、伤害数值计算等信息,如果是在服务器部署的话记得在安全组放开这个端口的 UDP 协议,防止出现 4206 错误无法进入游戏。我们需要放行22102的服务器端口
iptables -A INPUT -p udp --dport 22102 -j ACCEPT
444 (TCP) 是用来处理登录、游戏更新的端口 (DispatchServer),默认的 443 大概率被占用,可以更换成自己喜欢的,本文使用 444。
iptables -A INPUT -p tcp --dport 444 -j ACCEPT

进入容器

docker exec -it grasscutter /bin/bash
#安装一些环境和工具
apt-get update #更新apt-get
apt-get install -y vim
apt-get install -y wget
# 安装jdk17
apt install openjdk-17-jdk -y

服务端部署

喜欢折腾的玩家看这里,如果不喜欢折腾我在请继续读下去,我在后面放了傻瓜包,一键部署。哈哈哈,来吧开始

折腾版

下载仓库文件

下载割草机 Grasscutter 仓库文件(Code -> Download ZIP):
https://github.com/Grasscutters/Grasscutter
git clone https://github.com/Grasscutters/Grasscutter
这边可能需要梯子,尽力而为吧,做不了就用傻瓜包来搞
这里建议将左上角 stable 分支改为 development 分支再下载,此分支更新频率高,包含更多大世界新特性
将文件放至服务器任意目录(如根目录 / Grasscutter)解压,进行下一步处理

下载 resources 资源文件

从另一个仓库下载资源:https://github.com/Koko-boya/Grasscutter_Resources
git clone https://github.com/Koko-boya/Grasscutter_Resources
mv Grasscutter_Resources /Grasscutter/resources
`
将文件夹改名为 resources,放入上个步骤的目录 / Grasscutter / 中。注意,原版割草机仓库中并不包含 resources 文件夹。

下载 jar 启动文件

我给到了你们三种方式的jar文件下载地址,任意选一个吧,选个下载速度快的,当然如果你是大佬,你也可以选择自己构建哈哈
①从自动构建下载 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
下载好了之后我们先把他导入到/root目录下

最终配置应该如以上 我标红的是必须要有的文件,其他都无所谓,可以删掉。然后用docker cp Grasscutter grasscutter:/Grasscutter拷贝到docker容器里面,最后进入到docker容器里面

docker exec -it grasscutter /bin/bash
cd /Grasscutter
java -jar grasscutter-1.7.4.jar
root@genshin_grasscutter:/Grasscutter# java -jar grasscutter-1.7.4.jar
04:11:25 <INFO:Grasscutter> Loading Grasscutter...
04:11:25 <INFO:Grasscutter> 正在启动 Grasscutter...
04:11:25 <INFO:Grasscutter> 游戏版本:4.0.0
04:11:25 <INFO:Grasscutter> Grasscutter 版本:1.7.4-5ebad71e9
04:11:26 <INFO:ResourceLoader> 正在加载 resources...
04:11:35 <INFO:ResourceLoader> 完成加载 resources
04:11:36 <INFO:HttpServer> [Dispatch] Dispatch 服务器启动于 你的ip:666
04:11:36 <INFO:GameServer> Grasscutter 是免费开源软件,遵循 AGPL-3.0 license。
        如果你是付费购买的,那你已经被骗了。
        项目地址:https://github.com/Grasscutters/Grasscutter
04:11:36 <INFO:GameServer> 游戏服务器启动于 你的ip:22102
04:11:36 <INFO:Grasscutter> 加载完成!输入 "help" 查看命令列表
> account aaa 10001 #创建账号和密码
#如果出现如上 说明我们的割草机搭建成功了a

傻瓜包

这边我整合好了服务端的傻瓜包 直接导入你的割草机服务器里面就好了
地址如下:
整合包(3.1.5仅服务端):https://github.com/snoobi-seggs/nahida_seggs

服务端文件结构

Grasscutter
 ├── keystore.p12
 ├── grasscutter.jar
 └── resources
     ├── BinOutput
     ├── ExcelBinOutput
     ├── Readable
     ├── Subtitle
     └── TextMap

很显然我们在github上下载的一大堆没用的东西,我们按照我上面给的这个目录可以进行删减。

配置config文件

grasscuter文件的目录下的结构大概是这个样子的
接下来我们需要编辑一下config.json 配置文件
写什么呢?这边我也给到了你
把原本里面的文件删除然后copy新的文件进去即可,当然你们也可以来我的云服务器玩

{
  "folderStructure": {
    "resources": "./resources/",
    "data": "./data/",
    "packets": "./packets/",
    "scripts": "./resources/Scripts/",
    "plugins": "./plugins/"
  },
  "databaseInfo": {
    "server": {
      "connectionUri": "mongodb://localhost:27017",   //【localhost替换为mongodb容器内部IP】
      "collection": "grasscutter"
    },
    "game": {
      "connectionUri": "mongodb://localhost:27017",    //【localhost替换为mongodb容器内部IP】
      "collection": "grasscutter"
    }
  },
  "language": {
    "language": "zh_CN",
    "fallback": "en_US",
    "document": "EN"
  },
  "account": {
    "autoCreate": true,
    "defaultPermissions": [],
    "maxPlayer": -1
  },
  "server": {
    "debugLevel": "NONE",
    "runMode": "HYBRID",
    "http": {
      "bindAddress": "0.0.0.0",
      "accessAddress": "服务器公网IP",
      "bindPort": 444,
      "accessPort": 0,
      "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",
      "accessAddress": "服务器公网IP",
      "bindPort": 22102,
      "accessPort": 0,
      "loadEntitiesForPlayerRange": 100,
      "enableScriptInBigWorld": false,
      "enableConsole": true,
      "gameOptions": {
        "inventoryLimits": {
          "weapons": 2000,
          "relics": 2000,
          "materials": 2000,
          "furniture": 2000,
          "all": 30000
        },
        "avatarLimits": {
          "singlePlayerTeam": 5,
          "multiplayerTeam": 6
        },
        "sceneEntityLimit": 1000,
        "watchGachaConfig": false,
        "enableShopItems": true,
        "staminaUsage": true,
        "energyUsage": false,
        "resinOptions": {
          "resinUsage": false,
          "cap": 160,
          "rechargeTime": 480
        },
        "rates": {
          "adventureExp": 1.0,
          "mora": 1.0,
          "leyLines": 1.0
        }
      },
      "joinOptions": {
        "welcomeEmotes": [
          2007,
          1002,
          4010
        ],
        "welcomeMessage": "Welcome to \u003ccolor\u003dred\u003eGenshin!",
        "welcomeMail": {
          "title": "Welcome to Genshin",
          "content": "Hi there!\r\nFirst of all, welcome to Ghenshin!",
          "sender": "aila",
          "items": [
            {
              "itemId": 13509,
              "itemCount": 1,
              "itemLevel": 1
            },
            {
              "itemId": 201,
              "itemCount": 99999,
              "itemLevel": 1
            }
          ]
        }
      },
      "serverAccount": {
        "avatarId": 10000029,
        "nameCardId": 210001,
        "adventureRank": 60,
        "worldLevel": 8,
        "nickName": "Server-aila",
        "signature": "Welcome to Genshin"
      }
    },
    "dispatch": {
      "regions": [],
      "defaultName": "Genshin"
    }
  },
  "version": 3
}

查看mongodb 容器内部ip

配置文件config.json里面有个mongodb的容器内部ip地址,可以用如下地址进行查看

docker ps #查看mongodb的容器id
docker inspect [mongodb id]|grep "IP*"


这边查到了ip就可以填进配置文件里面啦

运行grasscutter割草机服务器

#在容器内部里面
cd /grasscutter
java -jar grasscutter-1.2.3-dev.jar


如果出现以上情况说明服务端搭建成功了,之后的客户端网上很多教程有教怎么搞的我这边就不再过多赘述了。
我放上几个链接,你们自己去看吧

一些用的到的链接

全部客户端链接

https://github.com/kyou-nase/GI-Download-Library

Grasscutter-资源统计

(一个很有用的资源整合项目):https://github.com/Yuer-QAQ/Awesome-Grasscutter

客户端工具

我这边用的fiddler进行流量的转发
Fiddler 官网下载:https://www.telerik.com/fiddler/fiddler-classic

命令指令

传统方式的命令执行,是在进入游戏后进入会话列表,添加会话用户找到 Server 用户并添加,就可以发送 “/ 命令” 的方式来执行指令。
当然,这种方法效率有些低,我们可以使用 @jie65535 制作的命令生成器:
https://github.com/jie65535/GrasscutterCommandGenerator
可以方便地生成命令供粘贴使用。
进一步,这个工具还可以通过插件的方式远程执行指令,更加快捷:
服务端插件:https://github.com/jie65535/gc-opencommand-plugin

管理员命令指令

05:09:26 <INFO:CommandHandler> 可用命令:
05:09:26 <INFO:CommandHandler> account - 创建或删除账号
        用法:account create <username> [<UID>]
        用法:account delete <username>
        用法:account create <username> <password> [<UID>]
        用法:account resetpass <username> <password>
        所需权限:无
05:09:26 <INFO:CommandHandler> achievement - 达成、撤销成就或设置成就进度
        用法:am @<UID> (grant|revoke) <achievementId>
        用法:am @<UID> progress <achievementId> <progress>
        用法:am @<UID> grantall
        用法:am @<UID> revokeall
        别名:am
        所需权限:player.achievement (对其他玩家使用这个命令还需要权限 player.achievement.others)
05:09:26 <INFO:CommandHandler> announce - 向所有在线玩家发送公告,或者管理服务器的公告
        用法:a <content>
        用法:a refresh
        用法:a (tpl|revoke) <templateId>
        别名:a
        所需权限:server.announce
05:09:26 <INFO:CommandHandler> ban - 封禁玩家
        用法:ban @<UID> [<time> [<reason>]]
        所需权限:server.ban
05:09:26 <INFO:CommandHandler> clear - 从你的背包中删除所有未装备且已解锁的物品,包括稀有物品
        用法:clear @<UID> (all|wp|art|mat) [lv<max level>] [r<max refinement>] [<max rarity>*]
        所需权限:player.clearinv (对其他玩家使用这个命令还需要权限 player.clearinv.others)
05:09:26 <INFO:CommandHandler> coop - 强制传送指定玩家到他人的世界。如果没有指定玩家,则会使你进入多人游戏状态
        用法:coop @<UID> [<host UID>]
        所需权限:server.coop (对其他玩家使用这个命令还需要权限 server.coop.others)
05:09:26 <INFO:CommandHandler> cutscene - 播放过场动画
        用法:c @<UID> [<cutsceneId>]
        别名:c
        所需权限:player.cutscene (对其他玩家使用这个命令还需要权限 player.cutscene.others)
05:09:26 <INFO:CommandHandler> debug - 🇺🇸Useful debugging commands for developers.
        用法:debug /debug
        所需权限:grasscutter.command.debug
05:09:26 <INFO:CommandHandler> enter_dungeon - 进入指定秘境
        用法:dungeon @<UID> <dungeonId>
        别名:enterdungeon dungeon
        所需权限:player.enterdungeon (对其他玩家使用这个命令还需要权限 player.enterdungeon.others)
05:09:26 <INFO:CommandHandler> entity - 编辑现存实体的属性
        用法:entity @<UID> <configId gadget> [state<state>] [maxhp<maxhp>] [hp<hp>(0 for infinite)] [atk<atk>] [def<def>]
        用法:entity @<UID> <configId monster> [ai<aiId>] [maxhp<maxhp>] [hp<hp>(0 for infinite)] [atk<atk>] [def<def>]
        所需权限:server.entity
05:09:26 <INFO:CommandHandler> give - 向你或指定的玩家给予物品。比如可以给予全部武器,角色和/或材料,也可以给予自定义圣遗物
        用法:g @<UID> (<itemId>|<avatarId>|all|weapons|mats|avatars) [lv<level>] [r<refinement>] [x<amount>] [c<constellation>] [sl<skilllevel>]
        用法:g @<UID> <artifactId> [lv<level>] [x<amount>] [<mainPropId>] [<appendPropId>[,<times>]]...
        别名:g item giveitem
        所需权限:player.give (对其他玩家使用这个命令还需要权限 player.give.others)
05:09:26 <INFO:CommandHandler> group - 更改 group 的加载
        用法:gr @<UID> (refresh) [<groupId>] [<suiteId>]
        别名:gr
        所需权限:player.group (对其他玩家使用这个命令还需要权限 player.group.others)
05:09:26 <INFO:CommandHandler> heal - 治疗当前队伍的角色
        用法:h @<UID>
        别名:h
        所需权限:player.heal (对其他玩家使用这个命令还需要权限 player.heal.others)
05:09:26 <INFO:CommandHandler> help - 发送帮助信息或显示指定命令的信息
        用法:help [<command>]
        所需权限:无
05:09:26 <INFO:CommandHandler> info - 生成问题排除用的 debug 信息
        用法:info /info
        别名:troubleshoot helpme
        所需权限:无
05:09:26 <INFO:CommandHandler> kick - 从服务器内踢出指定玩家
        用法:kick @<UID>
        别名:restart
        所需权限:无 (对其他玩家使用这个命令还需要权限 server.kick)
05:09:26 <INFO:CommandHandler> killall - 杀死所有怪物
        用法:killall @<UID> [<sceneId>]
        所需权限:server.killall (对其他玩家使用这个命令还需要权限 server.killall.others)
05:09:26 <INFO:CommandHandler> killCharacter - 杀死玩家当前角色
        用法:kill @<UID>
        别名:suicide kill
        所需权限:player.killcharacter (对其他玩家使用这个命令还需要权限 player.killcharacter.others)
05:09:26 <INFO:CommandHandler> language - 显示或切换当前语言
        用法:lang [<language code>]
        别名:lang
        所需权限:无
05:09:26 <INFO:CommandHandler> list - 查看所有玩家
        用法:list [uid]
        别名:players
        所需权限:无
05:09:26 <INFO:CommandHandler> permission - 添加或移除指定玩家的权限
        用法:permission @<UID> add <permission>
        用法:permission @<UID> remove <permission>
        用法:permission @<UID> clear
        用法:permission @<UID> list
        所需权限:permission
05:09:26 <INFO:CommandHandler> position - 获取所在位置和旋转信息
        用法:pos @<UID>
        别名:pos
        所需权限:无
05:09:26 <INFO:CommandHandler> quest - 添加或完成任务
        用法:q @<UID> (add|finish|running|talking|debug|triggers|grouptriggers) [<questId>]
        用法:q @<UID> dungeons
        别名:q
        所需权限:player.quest (对其他玩家使用这个命令还需要权限 player.quest.others)
05:09:26 <INFO:CommandHandler> reload - 重载配置文件和数据
        用法:reload
        所需权限:server.reload
05:09:26 <INFO:CommandHandler> resetConst - 重置当前角色的命之座,执行命令后需重新登录以生效
        用法:resetConst @<UID> [all]
        别名:resetconstellation
        所需权限:player.resetconstellation (对其他玩家使用这个命令还需要权限 player.resetconstellation.others)
05:09:26 <INFO:CommandHandler> resetShopLimit - 重置指定玩家的商店刷新时间
        用法:resetshop @<UID>
        别名:resetshop
        所需权限:server.resetshop (对其他玩家使用这个命令还需要权限 server.resetshop.others)
05:09:26 <INFO:CommandHandler> sendMail - 向指定用户发送邮件。此命令的用法会根据撰写阶段而改变
        用法:sendMail (<userId>|all) [<templateId>]
        用法:sendMail help
        所需权限:server.sendmail
05:09:26 <INFO:CommandHandler> sendMessage - 向玩家以服务器的身份发送消息。如果没有指定目标,则向服务器的全部玩家发送
        用法:b <message>
        别名:say sendservmsg sendservermessage b broadcast
        所需权限:server.sendmessage (对其他玩家使用这个命令还需要权限 server.sendmessage.others)
05:09:26 <INFO:CommandHandler> setConst - 为当前活跃角色设置命座等级
        用法:setConst @<UID> <constellation level> [all]
        别名:setconstellation
        所需权限:player.setconstellation (对其他玩家使用这个命令还需要权限 player.setconstellation.others)
05:09:26 <INFO:CommandHandler> setFetterLevel - 设置当前角色的好感度等级
        用法:setfetterlvl @<UID> <level>
        别名:setfetterlvl setfriendship
        所需权限:player.setfetterlevel (对其他玩家使用这个命令还需要权限 player.setfetterlevel.others)
05:09:26 <INFO:CommandHandler> setProp - 设置账号的状态。比如可以通过此命令启用 GodMode,也可以解锁深渊或更改纪行等级
        可更改的状态列表(不区分大小写):GodMode(上帝模式)|UnlimitedStamina(无限体力)|UnlimitedEnergy(无限能量)|TowerLevel(深渊)|WorldLevel(世界等级)|BPLevel(纪行等级)|SetOpenState(设置开放状态)|UnsetOpenState(取消开放状态)|UnlockMap(解锁地图)
        查看 PlayerProperty enum 以获得其他数值,格式为 PROP_MAX_SPRING_VOLUME -> max_spring_volume
        用法:prop @<UID> <prop> <value>
        别名:prop
        所需权限:player.setprop (对其他玩家使用这个命令还需要权限 player.setprop.others)
05:09:26 <INFO:CommandHandler> setSceneTag - 设置特定于账户的场景标签。这可以控制诸如石头挡住门、建筑物可见以及其他(通常与任务相关)影响世界可见度的事物。
        用法:tag @<UID> <add|remove|unlockall|reset> <sceneTagId>
        别名:tag
        所需权限:player.setscenetag (对其他玩家使用这个命令还需要权限 player.setscenetag.others)
05:09:26 <INFO:CommandHandler> setStats - 设置当前角色的属性
        可更改的属性列表:hp(生命值)|maxhp(最大生命值)|def(防御力)|atk(攻击力)|em(元素精通)|er(元素充能效率)|crate(暴击率)|cdmg(暴击伤害)|cdr(冷却缩减)|heal(治疗加成)|heali(受治疗加成)|shield(护盾强效)|defi(无视防御)
        元素增伤:epyro(火)|ecryo(冰)|ehydro(水)|egeo(岩)|edendro(草)|eelectro(雷)|ephys(物理)
        元素抗性:respyro(火)|rescryo(冰)|reshydro(水)|resgeo(岩)|resdendro(草)|reselectro(雷)|resphys(物理)
        用法:stat @<UID> [set] <stat> <value>
        用法:stat @<UID> (lock|freeze) <stat> [<value>]
        用法:stat @<UID> (unlock|unfreeze) <stat>
        别名:stats stat
        所需权限:player.setstats (对其他玩家使用这个命令还需要权限 player.setstats.others)
05:09:26 <INFO:CommandHandler> sound - 播放声音
        用法:sound @<UID> [<audioname>] [<x><y><z>]
        别名:audio
        所需权限:player.sound (对其他玩家使用这个命令还需要权限 player.sound.others)
05:09:26 <INFO:CommandHandler> spawn - 在你附近生成实体
        用法:s @<UID> <itemId> [x<amount>] [blk<blockId>] [grp<groupId>] [cfg<configId>] [<x> <y> <z>] [<rotX> <rotY> <rotZ>]
        用法:s @<UID> <gadgetId> [x<amount>] [state<state>] [maxhp<maxhp>] [hp<hp>(0 for infinite)] [atk<atk>] [def<def>] [blk<blockId>] [grp<groupId>] [cfg<configId>] [<x> <y> <z>] [<rotX> <rotY> <rotZ>]
        用法:s @<UID> <monsterId> [x<amount>] [lv<level>] [ai<aiId>] [maxhp<maxhp>] [hp<hp>(0 for infinite)] [atk<atk>] [def<def>] [blk<blockId>] [grp<groupId>] [cfg<configId>] [<x> <y> <z>] [<rotX> <rotY> <rotZ>]
        别名:drop s
        所需权限:server.spawn (对其他玩家使用这个命令还需要权限 server.spawn.others)
05:09:26 <INFO:CommandHandler> stop - 停止服务器
        用法:stop
        别名:shutdown
        所需权限:server.stop
05:09:26 <INFO:CommandHandler> talent - 设置当前角色的天赋等级
        用法:talent @<UID> set <talentId> <level>
        用法:talent @<UID> (n|e|q|all) <level>
        用法:talent @<UID> getid
        所需权限:player.settalent (对其他玩家使用这个命令还需要权限 player.settalent.others)
05:09:26 <INFO:CommandHandler> team - 手动修改你的队伍
        用法:team @<UID> add <avatarId,...>
        用法:team @<UID> (remove|set) [index|first|last|index-index,...]
        所需权限:player.team (对其他玩家使用这个命令还需要权限 player.team.others)
05:09:26 <INFO:CommandHandler> teleport - 改变指定玩家的位置
        用法:tp @<UID> <x> <y> <z> [sceneId]
        别名:tp
        所需权限:player.teleport (对其他玩家使用这个命令还需要权限 player.teleport.others)
05:09:26 <INFO:CommandHandler> teleportAll - 将你世界中的所有玩家传送到你所在的位置
        用法:tpall @<UID>
        别名:tpall
        所需权限:player.tpall (对其他玩家使用这个命令还需要权限 player.tpall.others)
05:09:26 <INFO:CommandHandler> trialAvatarActivity - 控制试用角色的活动。可以切换秘境和奖励的状态
        用法:taa @<UID> change <scheduleId>
        用法:taa @<UID> toggleDungeon <index(start from 1)|all>
        用法:taa @<UID> toggleReward <index(start from 1)|all>
        别名:taa
        所需权限:player.trialavataractivity (对其他玩家使用这个命令还需要权限 player.trialavataractivity.others)
05:09:26 <INFO:CommandHandler> unban - 取消玩家的封禁
        用法:unban @<UID>
        所需权限:server.ban
05:09:26 <INFO:CommandHandler> unlockall - 为玩家解锁全部开放状态
        用法:unlockall @<UID>
        所需权限:player.unlockall (对其他玩家使用这个命令还需要权限 player.unlockall.others)
05:09:26 <INFO:CommandHandler> weather - 更改天气 ID 和气候类型
        天气 ID 可以在 ./Resources/ExcelBinOutput/WeatherExcelConfigData.json 中找到
        气候类型:sunny(晴天), cloudy(多云), rain(雨), thunderstorm(雷雨), snow(雪), mist(雾)
        用法:w @<UID> weather [<weatherId>] [<climateType>]
        别名:w
        所需权限:player.weather (对其他玩家使用这个命

注意:本文章仅仅是个人使用,算是我自己的一个笔记。严禁通过这种形式赚钱或者非法意义的盈利。
docker是个好东西,可以用来搭建个人博客,隔离性很强,而且轻量化,一个docker容器占用的系统资源和空间也很小。

客户端配置

本篇使用国服客户端登录私服

安装证书

第一次进入服务器必须要安装证书,之后进入可直接跳过安装证书步骤
使用xftp等软件将下载的.p12证书传输到本机中
双击证书,选择本地计算机

无脑下一步


选择所有证书都放入下列存储,并点击浏览,再选择受信任的根证书颁发机构

设置代理

到设置->网络->代理->手动设置代理根据实际情况填写代理IP地址以及端口,端口默认为22102将“请勿对以下列条目开头的地址使用代理服务器。若有多个条目,请使用英文分号(;)来分割”处的内容删除,并将“请勿将代理服务器用于本地地址”的勾取消。
也可以使用ondrive里的米哈游代理转向.exe(易语言编写,报毒很正常,如果杀软报毒了添加信任即可)软件设置代理,也是一样根据实际情况填写代理IP地址以及端口。
开启代理进入的便是私服,不开启代理进入的便是官服。

原神启动!!!

启动前请确保客户端已经更新完成!!!
先开代理后进游戏!!!
登录界面出现HOYOVERSE即代表成功连上私服

用户名输入你之前创建的用户名,密码随便填写即可(请记住自己设置的密码)。
进门白屏后请立即关闭代理!!!
接下来就是过场动画了

之后就可以愉快的玩耍啦!!!