Commit 01b190bc authored by Magix's avatar Magix Committed by GitHub
Browse files

UPGRADE TO 1.1.0 POG

Merge `development` into `stable`
parents 6b81b888 1beddf16
---
name: Issues
about: Create an issue if you need any help
title: '[Issue] '
labels: 'help wanted, question'
assignees: ''
---
**Did you look for other closed issues that have the same problem?**
<!--- It will be easier for us to solve your problem if there is less duplication of problems -->
**Describe the issue**
<!--- A clear and concise description of what the issue is. -->
**Which branch did you use?**
<!--- Stable branch / Development branch -->
**Screenshots**
<!--- If applicable, add screenshots to help explain your problem. -->
**Additional context**
<!--- Add any other context about the problem here. -->
---
name: Bug report
about: Create a bug report to help us improve Grasscutter
title: '[Bug] '
labels: 'bug'
assignees: ''
---
<!--- ONLY USE this form for bug reporting. If you need help or support, please USE issue report form instead. -->
**Describe the bug**
<!--- A clear and concise description of what the bug is. -->
**Which branch did you use?**
<!--- Stable branch / Development branch -->
**Screenshots**
<!--- If applicable, add screenshots to help explain your problem. -->
**Additional context**
<!--- Add any other context about the problem here. -->
---
name: Feature request
about: Suggest an idea for Grasscutter
title: '[Feature Request] '
labels: 'enhancement, suggestion'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
<!--- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
<!--- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
<!--- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
<!--- Add any other context or screenshots about the feature request here. -->
blank_issues_enabled: false
contact_links:
- name: Grasscutter Discord
url: https://discord.gg/T5vZU6UyeG
about: For support, discuss and and other things with Grasscutter.
\ No newline at end of file
## Description
Please carefully read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md) before making any pull requests.
And, **Do not make a pull request to merge into stable unless it is a hotfix. Use the development branch instead.**
## Issues fixed by this PR
<!--- Put the links of issues that may be fixed by this PR here (if any). -->
## Type of changes
<!--- Put an `x` in all the boxes that apply your changes. -->
- [ ] Bug fix
- [ ] New feature
- [ ] Enhancement
- [ ] Documentation
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] My pull request is unique and no other pull requests have been opened for these changes
- [ ] I have read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md)
- [ ] I am responsible for any copyright issues with my code if it occurs in the future.
\ No newline at end of file
name: "Build" name: "Build"
on: on:
workflow_dispatch: ~
push: push:
paths:
- "**.java"
branches: branches:
- "stable" - "stable"
- "development"
pull_request:
paths:
- "**.java"
types:
- opened
- synchronize
- reopened
jobs: jobs:
Build-Server-Jar: Build-Server-Jar:
runs-on: windows-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
...@@ -13,12 +24,11 @@ jobs: ...@@ -13,12 +24,11 @@ jobs:
uses: actions/setup-java@v3 uses: actions/setup-java@v3
with: with:
distribution: temurin distribution: temurin
java-version: '8' java-version: '17'
- name: Run Gradle - name: Run Gradle
run: .\gradlew.bat && .\gradlew jar run: ./gradlew && ./gradlew jar
- name: Upload build - name: Upload build
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: Grasscutter name: Grasscutter
path: grasscutter.jar path: grasscutter-*-dev.jar
...@@ -30,6 +30,9 @@ hs_err_pid* ...@@ -30,6 +30,9 @@ hs_err_pid*
build/ build/
out/ out/
# Ignore Gradle properties
gradle.properties
# Eclipse # Eclipse
.project .project
.classpath .classpath
...@@ -45,14 +48,24 @@ tmp/ ...@@ -45,14 +48,24 @@ tmp/
.loadpath .loadpath
.recommenders .recommenders
# VSCode
.vscode
# Grasscutter # Grasscutter
resources/* resources/
logs/
plugins/
data/AbilityEmbryos.json data/AbilityEmbryos.json
data/OpenConfig.json data/OpenConfig.json
proto/auto/
proto/protoc.exe
GM Handbook.txt GM Handbook.txt
config.json config.json
mitmdump.exe mitmdump.exe
grasscutter.jar *.jar
!lib/*.jar
mongod.exe mongod.exe
/src/generated/
/*.sh
language/
languages/
gacha-mapping.js
data/gacha_mappings.js
[submodule "Grasscutter-Protos"]
path = Grasscutter-Protos
url = https://github.com/Melledy/Grasscutter-Protos
Subproject commit 0537e9cc4c7856a7c6f88bbbaa908a80c4ee677e
# Grasscutter ![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
A WIP server reimplementation for *some anime game* 2.3-2.6 <div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
**Documentation**: [Grasscutter Wiki](https://github.com/Melledy/Grasscutter/wiki/) <div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
**Note**: For support please join the [Discord server](https://discord.gg/T5vZU6UyeG).
# Current features
* Logging in
* Combat
* Spawning monsters via console
* Inventory features (recieving items/characters, upgrading items/characters, etc)
* Gacha system
* Friends list
* Co-op *partially* work
# Quick setup guide
### Note
* If you update from an older version, delete `config.json` for regeneration
### Prerequisites
* JDK-8u202 ([mirror link](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/) since Oracle required an account to download old builds)
* Mongodb (recommended 4.0+)
* Proxy daemon: mitmproxy (mitmdump, recommended), Fiddler Classic, etc.
### Starting up Grasscutter server (Assuming you are on Windows) EN | [中文](README_zh-CN.md)
1. Setup compile environment `gradlew.bat`
2. Compile Grasscutter with `gradlew jar`
3. Create a folder named `resources` in your Grasscutter directory, bring your `BinOutput` and `ExcelBinOutput` folders into it *(Check the wiki for more details how to get those.)*
4. Run Grasscutter with `java -jar grasscutter.jar`. Make sure mongodb service is running as well.
### Connecting with the client **Attention:** We always welcome contributors to the project. Before adding your contribution, please carefully read our [Code of Conduct](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md).
½. Create an account using *server console command* below
1. Run a proxy daemon: (choose either one)
- mitmdump: `mitmdump -s proxy.py -k`
- Fiddler Classic: Run Fiddler Classic, turn on `Decrypt https traffic` in setting and change the default port there (Tools -> Options -> Connections) to anything other than `8888`, and load [this script](https://github.lunatic.moe/fiddlerscript).
- [Hosts file](https://github.com/Melledy/Grasscutter/wiki/Running#traffic-route-map)
2. Trust CA certificate:
- mitmdump: `certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer`
2. Set network proxy to `127.0.0.1:8080` or the proxy port you specified.
4. *yoink*
* or you can use `run.cmd` to start Server & Proxy daemon with one click ## Current features
# Grasscutter commands * Logging in
There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. * Combat
* Friends list
`account create [username] {playerid}` - Creates an account with the specified username and the in-game uid for that account. The playerid parameter is optional and will be auto generated if not set. * Teleportation
* Gacha system
* Co-op *partially* works
* Spawning monsters via console
* Inventory features (recieving items/characters, upgrading items/characters, etc)
`spawn [monster id] [level] [amount]` ## Quick setup guide
`give [item id] [amount]` **Note:** For support please join our [Discord](https://discord.gg/T5vZU6UyeG).
`givechar [avatar id] [level]` ### Requirements
`drop [item id] [amount]` * Java SE - 17 ([link](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html))
`killall` **Note:** If you just want to **run it**, then **jre** only is fine.
`setworldlevel [level]` - Relog to see effects properly * MongoDB (recommended 4.0+)
`godmode` - Prevents you from taking damage * Proxy daemon: mitmproxy (mitmdump, recommended), Fiddler Classic, etc.
`resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. ### Running
`setstats [stats] [amount]` - Changes the current character's specified stat. **Note:** If you updated from an older version, delete `config.json` to regenerate it.
`clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory 1. Get `grasscutter.jar`
- Download from [actions](https://nightly.link/Grasscutters/Grasscutter/workflows/build/stable/Grasscutter.zip)
- [Build by yourself](#Building)
2. Create a `resources` folder in the directory where grasscutter.jar is located and move your `BinOutput` and `ExcelBinOutput` folders there *(Check the [wiki](https://github.com/Grasscutters/Grasscutter/wiki) for more details how to get those.)*
3. Run Grasscutter with `java -jar grasscutter.jar`. **Make sure mongodb service is running as well.**
`pos` - Gets your current coordinate. ### Connecting with the client
`weather [weather id] [climate id]` - Changes the current weather. ½. Create an account using [server console command](#Commands).
1. Redirect traffic: (choose one)
- mitmdump: `mitmdump -s proxy.py -k`
Trust CA certificate:
**Note:**The CA certificate is usually stored in `% USERPROFILE%\ .mitmproxy`, or you can download it from `http://mitm.it`
​ Double click for [install](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) or ...
- Via command line
```shell
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Fiddler Classic: Run Fiddler Classic, turn on `Decrypt https traffic` in setting and change the default port there (Tools -> Options -> Connections) to anything other than `8888`, and load [this script](https://github.lunatic.moe/fiddlerscript).
- [Hosts file](https://github.com/Melledy/Grasscutter/wiki/Running#traffic-route-map)
2. Set network proxy to `127.0.0.1:8080` or the proxy port you specified.
*More commands will be updated in the [wiki](https://github.com/Melledy/Grasscutter/wiki/).* **you can also use `start.cmd` to start servers and proxy daemons automatically**
### Building
Grasscutter uses Gradle to handle dependencies & building.
**Requirements:**
- Java SE Development Kits - 17
- Git
##### Windows
```shell
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
.\gradlew.bat # Setting up environments
.\gradlew jar # Compile
```
##### Linux
```bash
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
chmod +x gradlew
./gradlew jar # Compile
```
You can find the output jar in the root of the project folder.
## Commands
You might want to use this command (`java -jar grasscutter.jar -handbook`) in a cmd that is in the grasscutter folder. It will create a handbook file (GM Handbook.txt) where you can find the item IDs for stuff you want
You may want to use this command (`java -jar grasscutter.jar -gachamap`) to generate a mapping file for the gacha record subsystem. The file will be generated to `GRASSCUTTER_RESOURCE/gcstatic` folder. Otherwise you may only see number IDs in the gacha record page.
There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. to run commands ingame, you need to add prefix `/` or `!` such as `/pos`
| Commands | Usage | Permission node | Availability | description | Alias |
| -------------- | ------------------------------------------------- | ------------------------- | ------------ | ------------------------------------------------------------ | ----------------------------------------------- |
| account | account <create\|delete> \<username> [UID] | | Server only | Creates an account with the specified username and the in-game UID for that account. The UID will be auto generated if not set. | |
| broadcast | broadcast \<message> | server.broadcast | Both side | Sends a message to all the players. | b |
| coop | coop \<playerId> \<target playerId> | server.coop | Both side | Forces someone to join the world of others. | |
| changescene | changescene \<scene id> | player.changescene | Client only | Switch scenes by scene ID. | scene |
| clear | clear <all\|wp\|art\|mat> [UID] | player.clearinv | Client only | Deletes all unequipped and unlocked level 0 artifacts(art)/weapons(wp)/material(all) or all, including 5-star rarity ones from your inventory. | clear |
| drop | drop <itemID\|itemName> [amount] | server.drop | Client only | Drops an item around you. | `d` `dropitem` |
| enterdungeon | enterdungeon \<dungeon id> | player.enterdungeon | Client only | Enter a dungeon by dungeon ID | |
| give | give [player] <itemId\|itemName> [amount] [level] [finement] | player.give | Both side | Gives item(s) to you or the specified player. (finement option only weapon.) | `g` `item` `giveitem` |
| givechar | givechar \<uid> \<avatarId> | player.givechar | Both side | Gives the player a specified character. | givec |
| giveart | giveart [player] \<artifactId> \<mainPropId> [\<appendPropId>[,\<times>]]... [level] | player.giveart | Both side | Gives the player a specified artifact. | gart |
| giveall | giveall [uid] [amount] | player.giveall | Both side | Gives all items. | givea |
| godmode | godmode [uid] | player.godmode | Client only | Prevents you from taking damage. | |
| heal | heal | player.heal | Client only | Heals all characters in your current team. | h |
| help | help [command] | | Both side | Sends the help message or shows information about a specified command. | |
| kick | kick \<player> | server.kick | Both side | Kicks the specified player from the server. (WIP) | k |
| killall | killall [playerUid] [sceneId] | server.killall | Both side | Kills all entities in the current scene or specified scene of the corresponding player. | |
| list | list | | Both side | Lists online players. | |
| permission | permission <add\|remove> \<UID> \<permission> | * | Both side | Grants or removes a permission for a user. | |
| position | position | | Client only | Sends your current coordinates. | pos |
| reload | reload | server.reload | Both side | Reloads the server config | |
| resetconst | resetconst [all] | player.resetconstellation | Client only | Resets the constellation level on your currently selected character, will need to relog after using the command to see any changes. | resetconstellation |
| restart | | | Both side | Restarts the current session | |
| say | say \<player> \<message> | server.sendmessage | Both side | Sends a message to a player as the server | `sendservmsg` `sendservermessage` `sendmessage` |
| setfetterlevel | setfetterlevel \<level> | player.setfetterlevel | Client only | Sets the friendship level for your currently selected character | setfetterlvl |
| setstats | setstats \<stat> \<value> | player.setstats | Client only | Sets a stat for your currently selected character | stats |
| setworldlevel | setworldlevel \<level> | player.setworldlevel | Client only | Sets your world level (Relog to see proper effects) | setworldlvl |
| spawn | spawn \<entityId> [amount] [level(monster only)] | server.spawn | Client only | Spawns some entities around you | |
| stop | stop | server.stop | Both side | Stops the server | |
| talent | talent \<talentID> \<value> | player.settalent | Client only | Sets talent level for your currently selected character | |
| teleport | teleport [@playerUid] \<x> \<y> \<z> [sceneId] | player.teleport | Both side | Change the player's position. | tp |
| tpall | | player.tpall | Client only | Teleports all players in your world to your position | |
| weather | weather \<weatherID> \<climateID> | player.weather | Client only | Changes the weather | w |
### Bonus ### Bonus
When you want to teleport to somewhere, use the ingame marking function on Map, click Confirm. You will see your character falling from a very high destination, exact location that you marked.
- Teleporting
- When you want to teleport to somewhere, use the in-game marking function on Map.
- Mark a point on the map using the fish hook marking (the last one.)
- (Optional) rename the map marker to a number to override the default Y coordinate (height, default 300.)
- Confirm and close the map.
- You will see your character falling from a very high destination, exact location that you marked.
# Quick Troubleshooting # Quick Troubleshooting
* If compiling wasn't successful, please check your JDK installation (must be JDK 8 and validated JDK's bin PATH variable)
* My client doesn't connect, doesn't login, 4206, etc... - Mostly your proxy daemon setup is *the issue*, if using Fiddler make sure it running on another port except 8888 * If compiling wasn't successful, please check your JDK installation (JDK 17 and validated JDK's bin PATH variable)
* Startup sequence: Mongodb > Grasscutter > Proxy daemon (mitmdump, fiddler, etc.) > Client * My client doesn't connect, doesn't login, 4206, etc... - Mostly your proxy daemon setup is *the issue*, if using
Fiddler make sure it running on another port except 8888
* Startup sequence: Mongodb > Grasscutter > Proxy daemon (mitmdump, fiddler, etc.) > Game
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
[EN](README.md) | 中文
**注意:** 我们一直欢迎您成为该项目的贡献者。在添加您的代码之前,请仔细阅读我们的 [代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md).
## 当前特性
* 登录
* 战斗
* 好友列表
* 传送系统
* 祈愿系统
* 从控制台生成魔物
* 多人游戏 *部分* 可用
* 物品栏相关 (接收物品/角色, 升级角色/武器等)
## 快速设置指南
**附:** 加入我们的 [Discord](https://discord.gg/T5vZU6UyeG) 获取更多帮助!
### 环境需求
* Java SE - 17 (当您没有Oracle账户,可以使用[镜像](https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/))
**注:** 如果您仅仅想要简单地**运行服务端**, 那么使用 **jre** 便足够了
* MongoDB (推荐 4.0+)
* Proxy daemon: mitmproxy (推荐使用mitmdump), Fiddler Classic, 等
### 运行
**注:** 如果您从旧版本升级到新版本,最好删除 `config.json` 并启动服务端jar来重新生成它
1. 获取 `grasscutter.jar`
-[actions](https://nightly.link/Grasscutters/Grasscutter/workflows/build/stable/Grasscutter.zip) 中下载
- [自行构建](#构建)
2.**grasscutter.jar** 所在目录中创建 `resources` 文件夹并将 `BinOutput``ExcelBinOutput` 放入其中 *(查看 [wiki](https://github.com/Grasscutters/Grasscutter/wiki) 了解更多)*
3. 通过命令 `java -jar grasscutter.jar` 来运行Grasscutter. **在此之前请确认MongoDB服务运行正常**
### 连接
½. 在服务器控制台中 [创建账户](#命令列表).
1. 重定向流量: (选其一)
- mitmdump: `mitmdump -s proxy.py -k`
信任 CA 证书:
**注:** mitmproxy的CA证书通常存放在 `% USERPROFILE%\ .mitmproxy`, 或者你也可以从`http://mitm.it` 中下载它
​ 双击来[安装根证书](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) 或者..
- 使用命令行
```shell
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Fiddler Classic: 运行Fiddler Classic, 在设置中开启 `解密https通信` 并将端口切换到除`8888` 以外的任意端口 (工具 -> 选项 -> 连接) 并加载 [此脚本](https://github.lunatic.moe/fiddlerscript).
- [Hosts文件](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map)
2. 设置代理为 `127.0.0.1:8080` 或其它你所设定的端口
**你也可以简单地运行 `start.cmd` 来全自动启动服务端并设置代理**
### 构建
Grasscutter 使用 Gradle 来处理依赖及构建.
**依赖:**
- Java SE Development Kits - 17
- Git
##### Windows
```shell
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
.\gradlew.bat # Setting up environments
.\gradlew jar # Compile
```
##### Linux
```bash
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
chmod +x gradlew
./gradlew jar # Compile
```
你可以在项目根目录中找到`grasscutter.jar`
## 命令列表
你可能需要在终端中运行 `java -jar grasscutter.jar -handbook` 它将会创建一个 `GM Handbook.txt` 以方便您查阅物品ID等
你可能需要在终端中运行 `java -jar grasscutter.jar -gachamap` 来使得祈愿历史记录系统正常显示物品信息。 这个命令生成一个配置文件到如下文件夹:`GRASSCUTTER_RESOURCE/gcstatic`。 不执行此命令,您的祈愿历史记录中将只会显示数字ID而非物品名称。(目前仅支持自动生成英文记录信息)
在每个玩家的朋友列表中都有一个名为“Server”的虚拟用户,你可以通过发送消息来使用命令。命令也适用于其他聊天室,例如私人/团队聊天。
要在游戏中使用命令,需要添加 `/``!` 前缀,如 `/pos`
| 命令 | 用法 | 权限节点 | 可用性 | 注释 | 别名 |
| -------------- | -------------------------------------------- | ------------------------- | -------- | ------------------------------------------ | ----------------------------------------------- |
| account | account <create\|delete> <用户名> [uid] | | 仅服务端 | 通过指定用户名和uid增删账户 | |
| broadcast | broadcast <消息内容> | server.broadcast | 均可使用 | 给所有玩家发送公告 | b |
| coop | coop \<uid> <目标uid> | server.coop | 均可使用 | 强制某位玩家进入指定玩家的多人世界 | |
| changescene | changescene <场景ID> | player.changescene | 仅客户端 | 切换到指定场景 | scene |
| clear | clear <all\|wp\|art\|mat> [UID] | player.clearinv | 仅客户端 | 删除所有未装备及未解锁的圣遗物(art)或武器(wp)或材料(mat)或者所有(all),包括五星 | clear |
| drop | drop <物品ID\|物品名称> [数量] | server.drop | 仅客户端 | 在指定玩家周围掉落指定物品 | `d` `dropitem` |
| enterdungeon | enterdungeon <地牢ID> | player.enterdungeon | 仅客户端 | 进入某个地牢 | |
| give | give [uid] <物品ID\|物品名称> [数量] [等级] [精炼等级] | player.give | 均可使用 | 给予指定玩家一定数量及等级的物品 (精炼等级仅适用于武器) | `g` `item` `giveitem` |
| givechar | givechar \<uid> <角色ID> [等级] | player.givechar | 均可使用 | 给予指定玩家对应角色 | givec |
| giveart | giveart [uid] \<圣遗物ID> \<主属性ID> [\<副属性ID>[,<次数>]]... [等级] | player.giveart | 均可使用 | 给予玩家指定属性的圣遗物 | gart |
| giveall | giveall [uid] [数量] | player.giveall | 均可使用 | 给予指定玩家全部物品 | givea |
| godmode | godmode [uid] | player.godmode | 仅客户端 | 保护你不受到任何伤害(依然会被击退) | |
| heal | heal | player.heal | 仅客户端 | 治疗队伍中所有角色 | h |
| help | help [命令] | | 均可使用 | 显示帮助或展示指定命令的帮助 | |
| kick | kick \<uid> | server.kick | 均可使用 | 从服务器中踢出指定玩家 (WIP) | k |
| killall | killall [uid] [场景ID] | server.killall | 均可使用 | 杀死指定玩家世界中所在或指定场景的全部生物 | |
| list | list | | 均可使用 | 列出在线玩家 | |
| permission | permission <add\|remove> <UID> <权限节点> | * | 均可使用 | 添加或移除玩家的权限 | |
| position | position | | 仅客户端 | 获取当前坐标 | pos |
| reload | reload | server.reload | 均可使用 | 重载服务器配置 | |
| resetconst | resetconst [all] | player.resetconstellation | 仅客户端 | 重置当前角色的命座,重新登录即可生效 | resetconstellation |
| restart | restart | | 均可使用 | 重启服务端 | |
| say | say \<uid> <消息> | server.sendmessage | 均可使用 | 作为服务器发送消息给玩家 | `sendservmsg` `sendservermessage` `sendmessage` |
| setfetterlevel | setfetterlevel <好感等级> | player.setfetterlevel | 仅客户端 | 设置当前角色的好感等级 | `setfetterlvl` `setfriendship` |
| setstats | setstats <属性> <数值> | player.setstats | 仅客户端 | 直接修改当前角色的面板 | stats |
| setworldlevel | setworldlevel <世界等级> | player.setworldlevel | 仅客户端 | 设置世界等级(重新登录即可生效) | setworldlvl |
| spawn | spawn <实体ID> [数量] [等级] | server.spawn | 仅客户端 | 在你周围生成实体 | |
| stop | stop | server.stop | 均可使用 | 停止服务器 | |
| talent | talent <天赋ID> <等级> | player.settalent | 仅客户端 | 设置当前角色的天赋等级 | |
| teleport | teleport [@playerUid] \<x> \<y> \<z> [sceneId] | player.teleport | 均可使用 | 传送玩家到指定坐标 | tp |
| tpall | | player.tpall | 仅客户端 | 传送多人世界中所有的玩家到自身地点 | |
| weather | weather <天气ID> <气候ID> | player.weather | 仅客户端 | 改变天气 | w |
### 额外功能
当你想传送到某个地点, 只需要在地图中创建标记, 关闭地图后即可到达目标地点上空
- 传送
- 当你想传送到某个地点时,可以使用游戏里的地图标记功能。
- 用鱼钩(最后一个图标)在地图上标记一个点位。
- (可选) 将标记名称改为数字,即可修改传送位置的Y坐标(高度,缺省值是300)。
- 确认添加标记,并关闭地图。
- 你会看到你的角色从你选定点位的正上方高空落下。
# 快速排除问题
* 如果编译未能成功,请检查您的jdk安装 (JDK 17并确认jdk处于环境变量`PATH`
* 我的客户端无法登录/连接, 4206, 其它... - 大部分情况下这是因为您的代理存在问题.如果使用Fiddler请确认Fiddler监听端口不是`8888`
* 启动顺序: MongoDB > Grasscutter > 代理程序 (mitmdump, fiddler等.) > 客户端
...@@ -6,38 +6,90 @@ ...@@ -6,38 +6,90 @@
* User Manual available at https://docs.gradle.org/5.6.3/userguide/tutorial_java_projects.html * User Manual available at https://docs.gradle.org/5.6.3/userguide/tutorial_java_projects.html
*/ */
buildscript {
repositories {
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
}
}
plugins { plugins {
// Apply the application plugin to add support for building a CLI application
id 'application'
// Apply the java plugin to add support for Java // Apply the java plugin to add support for Java
id 'java' id 'java'
// Apply the application plugin to add support for building a CLI application // Apply the protobuf auto generator
id 'application' id 'com.google.protobuf' version "0.8.18"
// Eclipse Support
id 'eclipse'
// IntelliJ Support
id 'idea'
// Maven
id 'maven-publish'
id 'signing'
} }
sourceCompatibility = 1.8 compileJava.options.encoding = "UTF-8"
targetCompatibility = 1.8 compileTestJava.options.encoding = "UTF-8"
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
group = 'xyz.grasscutters'
version = '1.1.0'
sourceCompatibility = 17
targetCompatibility = 17
java {
withJavadocJar()
withSourcesJar()
}
repositories { repositories {
mavenCentral() mavenCentral()
jcenter()
} }
dependencies { dependencies {
implementation fileTree(dir: 'lib', include: ['*.jar']) implementation fileTree(dir: 'lib', include: ['*.jar'])
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32' implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32'
implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.6' implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.9'
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.6' implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.9'
implementation group: 'io.netty', name: 'netty-all', version: '4.1.69.Final'
implementation group: 'org.jline', name: 'jline', version: '3.21.0'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.8' implementation group: 'org.jline', name: 'jline-terminal-jna', version: '3.21.0'
implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.18.1' implementation group: 'net.java.dev.jna', name: 'jna', version: '5.10.0'
implementation group: 'org.reflections', name: 'reflections', version: '0.10.2' implementation group: 'io.netty', name: 'netty-all', version: '4.1.71.Final'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.8'
implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.18.2'
implementation group: 'dev.morphia.morphia', name: 'core', version: '1.6.1' implementation group: 'org.reflections', name: 'reflections', version: '0.10.2'
implementation group: 'dev.morphia.morphia', name: 'morphia-core', version: '2.2.6'
implementation group: 'org.greenrobot', name: 'eventbus-java', version: '3.3.1' implementation group: 'org.greenrobot', name: 'eventbus-java', version: '3.3.1'
implementation group: 'org.danilopianini', name: 'java-quadtree', version: '0.1.9'
implementation group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.2'
implementation group: 'org.quartz-scheduler', name: 'quartz-jobs', version: '2.3.2'
implementation group: 'org.luaj', name: 'luaj-jse', version: '3.0.1'
protobuf files('proto/')
}
configurations.all {
exclude group: 'org.slf4j', module: 'slf4j'
} }
application { application {
...@@ -59,9 +111,121 @@ jar { ...@@ -59,9 +111,121 @@ jar {
duplicatesStrategy = DuplicatesStrategy.INCLUDE duplicatesStrategy = DuplicatesStrategy.INCLUDE
from('src/main/java') { from('src/main/java') {
include '*.xml' include '*.xml'
} }
destinationDir = file(".") destinationDir = file(".")
} }
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'grasscutter'
from components.java
versionMapping {
usage('java-api') {
fromResolutionOf('runtimeClasspath')
}
usage('java-runtime') {
fromResolutionResult()
}
}
pom {
name = 'Grasscutter'
description = 'A server software reimplementation for an anime game.'
url = 'https://github.com/Grasscutters/Grasscutter'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'meledy'
name = 'Meledy'
email = 'meledy@xigam.tech' // not a real email kek
}
developer {
id = 'magix'
name = 'Magix'
email = 'magix@xigam.tech'
}
}
scm {
connection = 'scm:git:git@github.com:Grasscutters/Grasscutter.git'
developerConnection = 'scm:git:ssh://github.com:Grasscutters/Grasscutter.git'
url = 'https://github.com/Grasscutters/Grasscutter'
}
}
}
}
repositories {
maven {
// change URLs to point to your repos, e.g. http://my.org/repo
def releasesRepoUrl = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
def snapshotsRepoUrl = 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
name = 'sonatype'
credentials(PasswordCredentials)
}
}
}
clean {
delete protobuf.generatedFilesBaseDir
}
protobuf {
protoc {
// The artifact spec for the Protobuf Compiler
artifact = 'com.google.protobuf:protoc:3.18.1'
}
// generatedFilesBaseDir = "$projectDir/src/main/java/emu/grasscutter/net/proto/"
generatedFilesBaseDir = "$projectDir/src/generated/"
}
sourceSets {
main {
proto {
// In addition to the default 'src/main/proto'
srcDir 'src/generated'
}
java {
srcDir 'src/java'
}
}
}
idea {
module {
// proto files and generated Java files are automatically added as
// source dirs.
// If you have additional sources, add them here:
sourceDirs += file("/proto/");
}
}
eclipse {
classpath {
file.whenMerged { cp ->
cp.entries.add( new org.gradle.plugins.ide.eclipse.model.SourceFolder('src/generated/main/java', null) )
}
}
}
signing {
sign publishing.publications.mavenJava
}
javadoc {
options.encoding = 'UTF-8'
if(JavaVersion.current().isJava9Compatible()) {
options.addBooleanOption('html5', true)
}
}
processResources {
dependsOn "generateProto"
}
This source diff could not be displayed because it is too large. You can view the blob instead.
[
{
"expId": 101,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101001,
"minCount": 4,
"maxCount": 5
}, {
"itemId": 101002,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 1,
"maxCount": 2
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 3,
"maxCount": 4
}, {
"itemId": 101003,
"minCount": 7,
"maxCount": 8
}
]
}
]
},
{
"expId": 102,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100064,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100064,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100064,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100064,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 103,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101001,
"minCount": 4,
"maxCount": 5
}, {
"itemId": 101002,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 1,
"maxCount": 2
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 3,
"maxCount": 4
}, {
"itemId": 101003,
"minCount": 7,
"maxCount": 8
}
]
}
]
},
{
"expId": 104,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100062,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100062,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100062,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100062,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 105,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100013,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100013,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100013,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100013,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 106,
"expeditionRewardDataList": [
{
"hourTime": 4,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 625,
"maxCount": 625
}
]
},
{
"hourTime": 8,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 1575,
"maxCount": 1575
}
]
},
{
"hourTime": 12,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 2500,
"maxCount": 2500
}
]
},
{
"hourTime": 20,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 5000,
"maxCount": 5000
}
]
}
]
},
{
"expId": 201,
"expeditionRewardDataList": [
{
"hourTime": 4,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 625,
"maxCount": 625
}
]
},
{
"hourTime": 8,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 1575,
"maxCount": 1575
}
]
},
{
"hourTime": 12,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 2500,
"maxCount": 2500
}
]
},
{
"hourTime": 20,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 5000,
"maxCount": 5000
}
]
}
]
},
{
"expId": 202,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100063,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100063,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100063,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100063,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 203,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101001,
"minCount": 4,
"maxCount": 5
}, {
"itemId": 101002,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 1,
"maxCount": 2
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 6,
"maxCount": 7
}, {
"itemId": 101003,
"minCount": 2,
"maxCount": 3
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 101002,
"minCount": 3,
"maxCount": 4
}, {
"itemId": 101003,
"minCount": 7,
"maxCount": 8
}
]
}
]
},
{
"expId": 204,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100013,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100013,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100013,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100013,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 205,
"expeditionRewardDataList": [
{
"hourTime": 4,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 625,
"maxCount": 625
}
]
},
{
"hourTime": 8,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 1575,
"maxCount": 1575
}
]
},
{
"hourTime": 12,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 2500,
"maxCount": 2500
}
]
},
{
"hourTime": 20,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 5000,
"maxCount": 5000
}
]
}
]
},
{
"expId": 206,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100063,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100063,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100063,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100026,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100063,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 301,
"expeditionRewardDataList": [
{
"hourTime": 4,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 625,
"maxCount": 625
}
]
},
{
"hourTime": 8,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 1575,
"maxCount": 1575
}
]
},
{
"hourTime": 12,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 2500,
"maxCount": 2500
}
]
},
{
"hourTime": 20,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 5000,
"maxCount": 5000
}
]
}
]
},
{
"expId": 302,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 101211,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 101211,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 101211,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100014,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 101211,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 303,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100002,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100002,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100002,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100012,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100002,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 304,
"expeditionRewardDataList": [
{
"hourTime": 4,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 625,
"maxCount": 625
}
]
},
{
"hourTime": 8,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 1575,
"maxCount": 1575
}
]
},
{
"hourTime": 12,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 2500,
"maxCount": 2500
}
]
},
{
"hourTime": 20,
"expeditionRewardData": [
{
"itemId": 202,
"minCount": 5000,
"maxCount": 5000
}
]
}
]
},
{
"expId": 305,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100064,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 101210,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100064,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 101210,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100064,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 101210,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100064,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 101210,
"minCount": 8,
"maxCount": 12
}
]
}
]
},
{
"expId": 306,
"expeditionRewardDataList": [
{
"hourTime": 4,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 1,
"maxCount": 1
}, {
"itemId": 100062,
"minCount": 1,
"maxCount": 1
}
]
},
{
"hourTime": 8,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 2,
"maxCount": 4
}, {
"itemId": 100062,
"minCount": 2,
"maxCount": 4
}
]
},
{
"hourTime": 12,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 4,
"maxCount": 6
}, {
"itemId": 100062,
"minCount": 4,
"maxCount": 6
}
]
},
{
"hourTime": 20,
"rewardMora": 0,
"expeditionRewardData": [
{
"itemId": 100061,
"minCount": 8,
"maxCount": 12
}, {
"itemId": 100062,
"minCount": 8,
"maxCount": 12
}
]
}
]
}
]
\ No newline at end of file
{
"list": [
{
"ann_id": 1,
"title": "<b>Welcome to Grasscutter!</b>",
"subtitle": "<b>Welcome</b>",
"banner": "https://uploadstatic-sea.mihoyo.com/announcement/2020/09/17/f4aa42d505822805eebf4a55d72a78d8_2755691727027973637.jpg",
"content": "Hi there!<br>First of all, welcome to Grasscutter. If you have any issues, please let us know so that Lawnmower can help you! Check out our:<br><div><p style=\"white-space: pre-wrap;\"><strong>¡þDiscord¡þ</strong></p><p style=\"white-space: pre-wrap;\"><a href=\"https://discord.gg/T5vZU6UyeG\">https://discord.gg/T5vZU6UyeG</a></p><p style=\"white-space: pre-wrap;\"><strong>¡þGitHub¡þ</strong></p><p style=\"white-space: pre-wrap;\"><a href=\"https://github.com/Grasscutters/Grasscutter\">https://github.com/Grasscutters/Grasscutter</a></p></div>",
"lang": "es-es"
},
{
"ann_id": 2,
"title": "<b>How to use announcements</b>",
"subtitle": "<b>How to use</b>",
"banner": "https://uploadstatic-sea.mihoyo.com/announcement/2020/09/17/f4aa42d505822805eebf4a55d72a78d8_2755691727027973637.jpg",
"content": "<strong>Tips<br></strong>>How to use announcements<br><br>>Announcement content can use HTML<br><br>>The specific content of the announcement is stored in the program directory<code>data/GameAnnouncement.json</code>, while<code>GameAnnouncementList.json</code> stores the announcement list data<br><br><strong>How to use</strong><br>>In <code>GameAnnouncement</code><table><thead><thead><tr><th>Parameters</th><th>Description</th></thead></thead><thbody><thead><tr><th>ann_Id</th><th>Announcement unique id</th></thead><thead><tr><th>title</th><th>Show at the top of the content</th></thead><thead><tr><th>subtitle</th><th>title shown on the left</th></thead><thead><tr><th>banner</th><th>Display between content and title</th></thead><thead><tr><th>content</th><th>as u see</th></thead><thead><tr><th>lang</th><th>display language</th></thead><thead><tr><th>total</th><th>Announcement quantity</th></thead></thbody></table><br><br>>In <code>GameAnnouncementList</code><br>If you want to add an annouement, please add the list data in the announcement type corresponding to GameAnnouncementList, and finally add the announcement content in GameAnnouncement",
"lang": "es-es"
},
{
"ann_id": 3,
"title": "<b>ÕâÊǻ¹«¸æ--This is the event announcement</b>",
"subtitle": "<b>Welcome</b>",
"banner":"https://uploadstatic-sea.mihoyo.com/announcement/2020/09/22/7d85f19b152d218e73224d7c138a0fd0_5818585260283672899.jpg",
"content": "Welcome",
"lang": "es-es"
}
],
"total": 3
}
\ No newline at end of file
{
"t": "System.currentTimeMillis()",
"list": [
{
"list": [
{
"ann_id": 1,
"title": "<b>Welcome to Grasscutter!</b>",
"subtitle": "<b>Welcome</b>",
"banner": "https://uploadstatic-sea.mihoyo.com/announcement/2020/09/22/7d85f19b152d218e73224d7c138a0fd0_5818585260283672899.jpg",
"content": "",
"type_label": "Juego",
"tag_label": "1",
"tag_icon": "https://uploadstatic-sea.mihoyo.com/announcement/2020/03/05/a2588f1a51faee9fa8dfe9aead649dd6_7237021399135895303.png",
"login_alert": 1,
"lang": "es-es",
"start_time": "2020-09-25 04:05:30",
"end_time": "2023-10-30 11:00:00",
"type": 2,
"remind": 0,
"alert": 0,
"tag_start_time": "2000-01-02 15:04:05",
"tag_end_time": "2030-01-02 15:04:05",
"remind_ver": 1,
"has_content": true,
"extra_remind": 0
},
{
"ann_id": 2,
"title": "<b>这是游戏公告 -- This is the game announcement</b>",
"subtitle": "<b>This is the game announcement</b>",
"banner": "https://uploadstatic-sea.mihoyo.com/announcement/2020/09/17/85b7163c95745a76d49b3d163d893592_6487108933004985049.jpg",
"content": "",
"type_label": "Juego",
"tag_label": "1",
"tag_icon": "https://uploadstatic-sea.mihoyo.com/announcement/2020/03/05/a2588f1a51faee9fa8dfe9aead649dd6_7237021399135895303.png",
"login_alert": 1,
"lang": "es-es",
"start_time": "2020-09-25 15:12:09",
"end_time": "2030-10-30 11:00:00",
"type": 2,
"remind": 0,
"alert": 0,
"tag_start_time": "2000-01-02 08:04:05",
"tag_end_time": "2030-01-02 08:04:05",
"remind_ver": 1,
"has_content": true,
"extra_remind": 0
}
],
"type_id": 2,
"type_label": "Juego"
},
{
"list": [
{
"ann_id": 3,
"title": "<b>这是活动公告--This is the event announcement</b>",
"subtitle": "<b>Welcome</b>",
"banner": "https://uploadstatic-sea.mihoyo.com/announcement/2020/09/22/7d85f19b152d218e73224d7c138a0fd0_5818585260283672899.jpg",
"content": "",
"type_label": "Eventos",
"tag_label": "1",
"tag_icon": "https://uploadstatic-sea.mihoyo.com/announcement/2020/03/05/a2588f1a51faee9fa8dfe9aead649dd6_7237021399135895303.png",
"login_alert": 1,
"lang": "es-es",
"start_time": "2020-09-25 04:05:30",
"end_time": "2022-05-02 00:51:00",
"type": 2,
"remind": 0,
"alert": 0,
"tag_start_time": "2000-01-02 15:04:05",
"tag_end_time": "2022-05-02 00:51:00",
"remind_ver": 1,
"has_content": true,
"extra_remind": 0
}
],
"type_id": 1,
"type_label": "Eventos"
},
{
"list": [
{}
],
"type_id": 3,
"type_label": "Others"
}
],
"total": 3,
"type_list": [
{
"id": 2,
"name": "游戏系统公告",
"mi18n_name": "Juego"
},
{
"id": 1,
"name": "活动公告",
"mi18n_name": "Eventos"
},
{
"id": 3,
"name": "其他",
"mi18n_name": "Others"
}
],
"alert": true,
"alert_id": 2,
"timezone": -5,
"pic_list": [
],
"pic_total": 0,
"pic_type_list": [
],
"pic_alert": false,
"pic_alert_id": 0,
"static_sign": ""
}
\ No newline at end of file
[
{
"shopId": 1004,
"items": [
{
"goodsId": 1004202,
"goodsItem": {
"Id": 202,
"Count": 1000000
},
"scoin": 1,
"buyLimit": 500,
"beginTime": 1575129600,
"endTime": 2051193600,
"minLevel": 1,
"maxLevel": 99,
"costItemList": [
{
"Id": 223,
"Count": 100
}
]
},
{
"goodsId": 10048006,
"goodsItem": {
"Id": 108006,
"Count": 20
},
"scoin": 100,
"hcoin": 100,
"mcoin": 100,
"buyLimit": 50000,
"beginTime": 1575129600,
"endTime": 2051193600,
"minLevel": 1,
"maxLevel": 99
},
{
"goodsId": 10048033,
"goodsItem": {
"Id": 108033,
"Count": 20
},
"scoin": 1,
"buyLimit": 50000,
"beginTime": 1575129600,
"endTime": 2051193600,
"minLevel": 1,
"maxLevel": 99
}
]
}
]
\ No newline at end of file
[
{
"itemId": 115019,
"containsItem": [
{
"Id": 104002,
"Count": 40
},
{
"Id": 202,
"Count": 30000
}
]
},
{
"itemId": 115020,
"containsItem": [
{
"Id": 104013,
"Count": 25
},
{
"Id": 202,
"Count": 30000
}
]
},
{
"itemId": 115021,
"containsItem": [
{
"Id": 115013,
"Count": 5
},
{
"Id": 104003,
"Count": 40
},
{
"Id": 202,
"Count": 120000
}
]
},
{
"itemId": 115022,
"containsItem": [
{
"Id": 115017,
"Count": 25
},
{
"Id": 202,
"Count": 150000
}
]
},
{
"itemId": 115023,
"containsItem": [
{
"Id": 115025,
"Count": 10
},
{
"Id": 202,
"Count": 60000
}
]
},
{
"itemId": 115029,
"containsItem": [
{
"Id": 104013,
"Count": 100
},
{
"Id": 202,
"Count": 100000
}
]
},
{
"itemId": 115030,
"containsItem": [
{
"Id": 104003,
"Count": 12
},
{
"Id": 202,
"Count": 10000
}
]
},
{
"itemId": 115034,
"containsItem": [
{
"Id": 115013,
"Count": 6
},
{
"Id": 202,
"Count": 60000
}
]
},
{
"itemId": 115032,
"containsItem": [
{
"Id": 115024,
"Count": 12
}
]
},
{
"itemId": 115010,
"containsItem": [
{
"Id": 104002,
"Count": 80
},
{
"Id": 104012,
"Count": 40
}
]
},
{
"itemId": 115011,
"containsItem": [
{
"Id": 104003,
"Count": 50
},
{
"Id": 104013,
"Count": 25
},
{
"Id": 107009,
"Count": 1
},
{
"Id": 202,
"Count": 50000
}
]
}
]
[
{
"itemId": 115017,
"optionItem": [
104302,
104305,
104308,
104311,
104314,
104317,
104321,
104324,
104327
]
},
{
"itemId": 115024,
"optionItem": [
114001,
114005,
114009,
114013,
114017,
114021,
114025,
114029,
114033
]
},
{
"itemId": 115013,
"optionItem": [
104112,
104122,
104142,
104152,
104162,
104172
]
},
{
"itemId": 115025,
"optionItem": [
114002,
114006,
114010,
114014,
114018,
114022,
114026,
114030,
114034
]
}
]
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment