Merge branch 'development' into stable

This commit is contained in:
Melledy 2022-06-07 03:35:32 -07:00 committed by GitHub
commit 610d24d84c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
950 changed files with 25571 additions and 11289 deletions

View File

@ -25,6 +25,16 @@ jobs:
with:
distribution: temurin
java-version: '17'
- name: Cache gradle files
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
./.gradle/loom-cache
key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle', 'gradle.properties', '**/*.accesswidener') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Run Gradle
run: ./gradlew && ./gradlew jar
- name: Upload build

36
.gitignore vendored
View File

@ -17,7 +17,7 @@
*.nar
*.ear
*.zip
*.tar.gz
*.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
@ -52,20 +52,30 @@ tmp/
.vscode
# Grasscutter
resources/
logs/
plugins/
data/AbilityEmbryos.json
data/OpenConfig.json
/resources
/logs
/plugins
/data
/keys
/language
/languages
/src/generated
/*.jar
/*.sh
GM Handbook.txt
config.json
mitmdump.exe
*.jar
!lib/*.jar
mongod.exe
/src/generated/
/*.sh
language/
languages/
gacha-mapping.js
data/gacha_mappings.js
mappings.js
BuildConfig.java
# lombok
/.apt_generated/
# macOS
.DS_Store
data/hk4e/announcement/

View File

@ -67,7 +67,7 @@ EN | [中文](README_zh-CN.md)
2. Set network proxy to `127.0.0.1:8080` or the proxy port you specified.
**you can also use `start.cmd` to start servers and proxy daemons automatically**
**you can also use `start.cmd` to start servers and proxy daemons automatically, but you have to set up JAVA_HOME enviroment**
### Building
@ -98,61 +98,11 @@ chmod +x gradlew
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
- Teleporting
- When you want to teleport somewhere, use the in-game marking function on the 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.
### Commands have moved to the [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)!
# Quick Troubleshooting
* If compiling wasn't successful, please check your JDK installation (JDK 17 and validated JDK's bin PATH variable)
* My client doesn't connect, doesn't login, 4206, etc... - Your proxy daemon setup is most likely *the issue*, if you are using Fiddler, make sure it running on another port other than 8888
* Startup sequence: Mongodb > Grasscutter > Proxy daemon (mitmdump, fiddler, etc.) > Game
* 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

View File

@ -123,11 +123,13 @@ chmod +x gradlew
| godmode | godmode [uid] | player.godmode | 仅客户端 | 保护你不受到任何伤害(依然会被击退) | |
| heal | heal | player.heal | 仅客户端 | 治疗队伍中所有角色 | h |
| help | help [命令] | | 均可使用 | 显示帮助或展示指定命令的帮助 | |
| join | join [多个角色id] | player.join | 仅客户端 | 强制入队角色跟config.json中的avatarLimits有关跟队内角色数量上限有关。用法`join 10000021 10000022` | |
| kick | kick \<uid> | server.kick | 均可使用 | 从服务器中踢出指定玩家 (WIP) | k |
| killall | killall [uid] [场景ID] | server.killall | 均可使用 | 杀死指定玩家世界中所在或指定场景的全部生物 | |
| list | list | | 均可使用 | 列出在线玩家 | |
| permission | permission <add\|remove> <UID> <权限节点> | * | 均可使用 | 添加或移除玩家的权限 | |
| position | position | | 仅客户端 | 获取当前坐标 | pos |
| remove | remove [多个角色在队伍中的序号] | player.remove | 仅客户端 | 强制将某个角色从当前队伍中移除。例如`remove 1 2`表示将1号和2号角色移除 | |
| reload | reload | server.reload | 均可使用 | 重载服务器配置 | |
| resetconst | resetconst [all] | player.resetconstellation | 仅客户端 | 重置当前角色的命座,重新登录即可生效 | resetconstellation |
| restart | restart | | 均可使用 | 重启服务端 | |
@ -140,6 +142,7 @@ chmod +x gradlew
| talent | talent <天赋ID> <等级> | player.settalent | 仅客户端 | 设置当前角色的天赋等级 | |
| teleport | teleport [@playerUid] \<x> \<y> \<z> [sceneId] | player.teleport | 均可使用 | 传送玩家到指定坐标 | tp |
| tpall | | player.tpall | 仅客户端 | 传送多人世界中所有的玩家到自身地点 | |
| unlocktower | | player.tower | 仅客户端 | 解锁深渊全部层 | ut |
| weather | weather <天气ID> <气候ID> | player.weather | 仅客户端 | 改变天气 | w |
### 额外功能

View File

@ -43,7 +43,8 @@ sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
group = 'xyz.grasscutters'
version = '1.1.0'
version = '1.1.2-dev'
sourceCompatibility = 17
targetCompatibility = 17
@ -86,6 +87,9 @@ dependencies {
implementation group: 'org.luaj', name: 'luaj-jse', version: '3.0.1'
protobuf files('proto/')
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
}
configurations.all {
@ -97,12 +101,14 @@ application {
mainClassName = 'emu.grasscutter.Grasscutter'
}
jar {
manifest {
attributes 'Main-Class': 'emu.grasscutter.Grasscutter'
}
jar.baseName = 'grasscutter'
jar.archiveName = project.hasProperty('jarFilename') ? "${jarFilename}.${extension}" : archiveName
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
@ -226,6 +232,23 @@ javadoc {
}
}
task injectGitHash {
def gitCommitHash = {
try {
return 'git rev-parse --verify --short HEAD'.execute().text.trim()
} catch (e) {
return "GIT_NOT_FOUND"
}
}
new File(projectDir, "src/main/java/emu/grasscutter/BuildConfig.java").text = """
package emu.grasscutter;
public class BuildConfig {
public static final String VERSION = \"${version}\";
public static final String GIT_HASH = \"${gitCommitHash()}\";
}
"""
}
processResources {
dependsOn "generateProto"
}

View File

@ -1,49 +0,0 @@
[
{
"gachaType": 200,
"scheduleId": 893,
"bannerType": "STANDARD",
"prefabPath": "GachaShowPanel_A022",
"previewPrefabPath": "UI_Tab_GachaShowPanel_A022",
"titlePath": "UI_GACHA_SHOW_PANEL_A022_TITLE",
"costItem": 224,
"beginTime": 0,
"endTime": 1924992000,
"sortId": 1000,
"rateUpItems1": [],
"rateUpItems2": []
},
{
"gachaType": 301,
"scheduleId": 903,
"bannerType": "EVENT",
"prefabPath": "GachaShowPanel_A079",
"previewPrefabPath": "UI_Tab_GachaShowPanel_A079",
"titlePath": "UI_GACHA_SHOW_PANEL_A048_TITLE",
"costItem": 223,
"beginTime": 0,
"endTime": 1924992000,
"sortId": 9998,
"maxItemType": 1,
"rateUpItems1": [1002],
"rateUpItems2": [1053, 1020, 1045]
},
{
"gachaType": 302,
"scheduleId": 913,
"bannerType": "WEAPON",
"prefabPath": "GachaShowPanel_A080",
"previewPrefabPath": "UI_Tab_GachaShowPanel_A080",
"titlePath": "UI_GACHA_SHOW_PANEL_A021_TITLE",
"costItem": 223,
"beginTime": 0,
"endTime": 1924992000,
"sortId": 9997,
"minItemType": 2,
"eventChance": 75,
"softPity": 80,
"hardPity": 80,
"rateUpItems1": [11509, 12504],
"rateUpItems2": [11401, 12402, 13407, 14401, 15401]
}
]

View File

@ -1,29 +0,0 @@
{
"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
}

View File

@ -1,119 +0,0 @@
{
"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": ""
}

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
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

295
install.sh Normal file
View File

@ -0,0 +1,295 @@
#!/usr/bin/env bash
# Grasscutter install script for linux
# Made by TurtleIdiot
# Stops the installer if any command has a non-zero exit status
set -e
# Checks for root
if [ $EUID != 0 ]; then
echo "Please run the installer as root!"
exit
fi
is_command() {
# Checks if a given command is available
local check_command="$1"
command -v "${check_command}" > /dev/null 2>&1
}
# IP validation
valid_ip() {
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS="."
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
# Checks for supported installer(s) (only apt-get and pacman right now, might add more in the future)
if is_command apt-get ; then
echo -e "Supported package manager found (apt-get)\n"
GC_DEPS="mongodb openjdk-17-jre"
INSTALLER_DEPS="wget openssl unzip git"
SYSTEM="deb" # Debian-based (debian, ubuntu)
elif is_command pacman ; then
echo -e "supported package manager found (pacman)\n"
GC_DEPS="jre17-openjdk"
INSTALLER_DEPS="curl wget openssl unzip git base-devel" # curl is still a dependency here in order to successfully build mongodb
SYSTEM="arch" # Arch for the elitists :P
else
echo "No supported package manager found"
exit
fi
BRANCH="stable" # Stable by default
# Allows choice between stable and dev branch
echo "Please select the branch you wish to install"
echo -e "!!NOTE!!: stable is the recommended branch.\nDo *NOT* use development unless you have a reason to and know what you're doing"
select branch in "stable" "development" ; do
case $branch in
stable )
BRANCH="stable"
break;;
development )
BRANCH="development"
break;;
esac
done
echo "The following packages will have to be installed in order to INSTALL grasscutter:"
echo -e "$INSTALLER_DEPS \n"
echo "The following packages will have to be installed to RUN grasscutter:"
echo -e "$GC_DEPS \n"
echo "Do you wish to proceed and install grasscutter?"
select yn in "Yes" "No" ; do
case $yn in
Yes ) break;;
No ) exit;;
esac
done
echo "Updating package cache..."
case $SYSTEM in # More concise than if
deb ) apt-get update -qq;;
arch ) pacman -Syy;;
esac
# Starts installing dependencies
echo "Installing setup dependencies..."
case $SYSTEM in # These are one-liners anyways
deb ) apt-get -qq install $INSTALLER_DEPS -y;;
arch ) pacman -Sq --noconfirm --needed $INSTALLER_DEPS > /dev/null;;
esac
echo "Done"
echo "Installing grasscutter dependencies..."
case $SYSTEM in
deb) apt-get -qq install $GC_DEPS -y > /dev/null;;
arch ) pacman -Sq --noconfirm --needed $GC_DEPS > /dev/null;;
esac
# *sighs* here we go...
INST_ARCH_MONGO="no"
if [ $SYSTEM = "arch" ]; then
echo -e "-=-=-=-=-=--- !! IMPORTANT !! ---=-=-=-=-=-\n"
echo -e " Due to licensing issues with mongodb,\n it is no longer available on the official arch repositiries."
echo -e " In order to install mongodb,\n it needs to be fetched from the Arch User Repository.\n"
echo -e " As this script is running as root,\n a temporary user will need to be created to run makepkg."
echo -e " The temporary user will be deleted once\n makepkg has finished.\n"
echo -e " This will be handled automatically.\n"
echo -e "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
echo -e "!!NOTE!!: Only select \"Skip\" if mongodb is already installed on this system"
echo "Do you want to continue?"
select yn in "Yes" "Skip" "No" ; do
case $yn in
Yes )
INST_ARCH_MONGO="yes"
break;;
No ) exit;;
Skip )
INST_ARCH_MONGO="no"
break;;
esac
done
fi
if [ $INST_ARCH_MONGO = "yes" ]; then
DIR=$(pwd)
# Make temp user
echo "Creating temporary user..."
TEMPUSER="gctempuser"
TEMPHOME="/home/$TEMPUSER"
useradd -m $TEMPUSER
cd $TEMPHOME
# Do the actual makepkg shenanigans
echo "Building mongodb... (this will take a moment)"
su $TEMPUSER<<EOF
mkdir temp
cd temp
git clone https://aur.archlinux.org/mongodb-bin.git -q
cd mongodb-bin
makepkg -s > /dev/null
exit
EOF
mv "$(find -name "mongodb-bin*.pkg.tar.zst" -type f)" ./mongodb-bin.pkg.tar.zst
cd $DIR
# Snatch the file to current working directory
mv "$TEMPHOME/mongodb-bin.pkg.tar.zst" ./mongodb-bin.pkg.tar.zst
chown root ./mongodb-bin.pkg.tar.zst
chgrp root ./mongodb-bin.pkg.tar.zst
chmod 775 ./mongodb-bin.pkg.tar.zst
echo "Installing mongodb..."
pacman -U mongodb-bin.pkg.tar.zst --noconfirm > /dev/null
rm mongodb-bin.pkg.tar.zst
echo "Starting mongodb..."
systemctl enable mongodb
systemctl start mongodb
echo "Removing temporary account..."
userdel -r $TEMPUSER
fi
echo "Done"
echo "Getting grasscutter..."
# Download and rename jar
wget -q --show-progress "https://nightly.link/Grasscutters/Grasscutter/workflows/build/$BRANCH/Grasscutter.zip"
echo "unzipping"
unzip -qq Grasscutter.zip
mv $(find -name "grasscutter*.jar" -type f) grasscutter.jar
# Download resources
echo "Downloading resources... (this will take a moment)"
wget -q --show-progress https://github.com/Koko-boya/Grasscutter_Resources/archive/refs/heads/main.zip -O resources.zip
echo "Extracting..."
unzip -qq resources.zip
mv ./Grasscutter_Resources-main/Resources ./resources
# Here we do a sparse checkout to only pull /data and /keys
echo "Downloading keys and data..."
mkdir repo
cd repo
git init -q
git remote add origin https://github.com/Grasscutters/Grasscutter.git
git fetch -q
git config core.sparseCheckout true
echo "data/" >> .git/info/sparse-checkout
echo "keys/" >> .git/info/sparse-checkout
git pull origin stable -q
cd ../
mv ./repo/data ./data
mv ./repo/keys ./keys
# Generate handbook/config
echo "Please enter language when *NEXT* prompted (press enter/return to continue to language select)"
read
java -jar grasscutter.jar -handbook
# Prompt IP address for config.json and for generating new keystore.p12 file
echo "Please enter the IP address that will be used to connect to the server"
echo "This can be a local or a public IP address"
echo "This IP address will be used to generate SSL certificates so it is important it is correct"
while : ; do
read -p "Enter IP: " SERVER_IP
if valid_ip $SERVER_IP; then
break;
else
echo "Invalid IP address. Try again."
fi
done
# Replaces "127.0.0.1" with given IP
sed -i "s/127.0.0.1/$SERVER_IP/g" config.json
# Generates new keystore.p12 with the server's IP address
# This is done to prevent a "Connection Timed Out" error from appearing
# after clicking to enter the door in the main menu/title screen
# This issue only exists when connecting to a server *other* than localhost
# since the default keystore.p12 has only been made for localhost
mkdir certs
cd certs
echo "Generating CA key and certificate pair..."
openssl req -x509 -nodes -days 25202 -newkey rsa:2048 -subj "/C=GB/ST=Essex/L=London/O=Grasscutters/OU=Grasscutters/CN=$SERVER_IP" -keyout CAkey.key -out CAcert.crt
echo "Generating SSL key and certificate pair..."
openssl genpkey -out ssl.key -algorithm rsa
# Creates a conf file in order to generate a csr
cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = GB
ST = Essex
L = London
O = Grasscutters
OU = Grasscutters
CN = $SERVER_IP
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = $SERVER_IP
EOF
# Creates csr using key and conf
openssl req -new -key ssl.key -out ssl.csr -config csr.conf
# Creates conf to finalise creation of certificate
cat > cert.conf <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, keyAgreement, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = $SERVER_IP
EOF
# Creates ssl cert
openssl x509 -req -in ssl.csr -CA CAcert.crt -CAkey CAkey.key -CAcreateserial -out ssl.crt -days 25202 -sha256 -extfile cert.conf
echo "Generating keystore.p12 from key and certificate..."
openssl pkcs12 -export -out keystore.p12 -inkey ssl.key -in ssl.crt -certfile CAcert.crt -passout pass:123456
cd ../
mv ./certs/keystore.p12 ./keystore.p12
echo "Done"
echo -e "Asking Noelle to clean up...\n"
rm -rf Grasscutter.zip resources.zip ./certs ./Grasscutter_Resources-main ./repo
echo -e "All done!\n"
echo -e "You can now uninstall the following packages if you wish:\n$INSTALLER_DEPS"
echo -e "-=-=-=-=-=--- !! IMPORTANT !! ---=-=-=-=-=-\n"
echo "Please make sure that ports 443 and 22102 are OPEN (both tcp and udp)"
echo -e "In order to run the server, run the following command:\nsudo java -jar grasscutter.jar"
echo "You must run it using sudo as port 443 is a privileged port"
echo "To play, use the IP you provided earlier ($SERVER_IP) via GrassClipper or Fiddler"
exit

Binary file not shown.

49
plugin-schema.json Normal file
View File

@ -0,0 +1,49 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "JSON schema for a Grasscutter Plugin",
"type": "object",
"additionalProperties": true,
"definitions": {
"plugin-name": {
"type": "string",
"pattern": "^[A-Za-z\\d_.-]+$"
}
},
"required": [ "name", "description", "mainClass" ],
"properties": {
"name": {
"description": "The unique name of plugin.",
"$ref": "#/definitions/plugin-name"
},
"mainClass": {
"description": "The plugin's initial class file.",
"type": "string",
"pattern": "^(?!org\\.bukkit\\.)([a-zA-Z_$][a-zA-Z\\d_$]*\\.)*[a-zA-Z_$][a-zA-Z\\d_$]*$"
},
"version": {
"description": "A plugin revision identifier.",
"type": [ "string", "number" ]
},
"description": {
"description": "Human readable plugin summary.",
"type": "string"
},
"author": {
"description": "The plugin author.",
"type": "string"
},
"authors": {
"description": "The plugin contributors.",
"type": "array",
"items": {
"type": "string"
}
},
"website": {
"title": "Website",
"description": "The URL to the plugin's site",
"type": "string",
"format": "uri"
}
}
}

View File

@ -0,0 +1,11 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "Vector.proto";
message AbilityActionGenerateElemBall {
Vector pos = 1;
Vector rot = 2;
uint32 room_id = 3;
}

View File

@ -2,8 +2,8 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityString.proto";
import "AbilityScalarValueEntry.proto";
import "AbilityString.proto";
message AbilityAppliedAbility {
AbilityString ability_name = 1;

View File

@ -2,8 +2,8 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityString.proto";
import "AbilityAttachedModifier.proto";
import "AbilityString.proto";
import "ModifierDurability.proto";
message AbilityAppliedModifier {

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityAttachedModifier {
bool is_invalid = 1;
uint32 owner_entity_id = 2;

View File

@ -4,15 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "AbilityControlBlock.proto";
// CmdId: 1155
// EnetChannelId: 0
// EnetIsReliable: true
message AbilityChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1112;
}
uint32 entity_id = 1;
AbilityControlBlock ability_control_block = 2;
uint32 entity_id = 3;
AbilityControlBlock ability_control_block = 10;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityEmbryo {
uint32 ability_id = 1;
fixed32 ability_name_hash = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityGadgetInfo {
uint32 camp_id = 1;
uint32 camp_target_type = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityIdentifier {
uint32 instanced_ability_id = 1;
uint32 ability_caster_id = 2;

View File

@ -4,15 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "AbilityInvokeEntry.proto";
// CmdId: 1131
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AbilityInvocationsNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1118;
}
repeated AbilityInvokeEntry invokes = 1;
repeated AbilityInvokeEntry invokes = 8;
}

View File

@ -3,52 +3,58 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
enum AbilityInvokeArgument {
ABILITY_NONE = 0;
ABILITY_META_MODIFIER_CHANGE = 1;
ABILITY_META_COMMAND_MODIFIER_CHANGE_REQUEST = 2;
ABILITY_META_SPECIAL_FLOAT_ARGUMENT = 3;
ABILITY_META_OVERRIDE_PARAM = 4;
ABILITY_META_CLEAR_OVERRIDE_PARAM = 5;
ABILITY_META_REINIT_OVERRIDEMAP = 6;
ABILITY_META_GLOBAL_FLOAT_VALUE = 7;
ABILITY_META_CLEAR_GLOBAL_FLOAT_VALUE = 8;
ABILITY_META_ABILITY_ELEMENT_STRENGTH = 9;
ABILITY_META_ADD_OR_GET_ABILITY_AND_TRIGGER = 10;
ABILITY_META_SET_KILLED_SETATE = 11;
ABILITY_META_SET_ABILITY_TRIGGER = 12;
ABILITY_META_ADD_NEW_ABILITY = 13;
ABILITY_META_REMOVE_ABILITY = 14;
ABILITY_META_SET_MODIFIER_APPLY_ENTITY = 15;
ABILITY_META_MODIFIER_DURABILITY_CHANGE = 16;
ABILITY_META_ELEMENT_REACTION_VISUAL = 17;
ABILITY_META_SET_POSE_PARAMETER = 18;
ABILITY_META_UPDATE_BASE_REACTION_DAMAGE = 19;
ABILITY_META_TRIGGER_ELEMENT_REACTION = 20;
ABILITY_META_LOSE_HP = 21;
ABILITY_ACTION_TRIGGER_ABILITY = 50;
ABILITY_ACTION_SET_CRASH_DAMAGE = 51;
ABILITY_ACTION_EFFECT = 52;
ABILITY_ACTION_SUMMON = 53;
ABILITY_ACTION_BLINK = 54;
ABILITY_ACTION_CREATE_GADGET = 55;
ABILITY_ACTION_APPLY_LEVEL_MODIFIER = 56;
ABILITY_ACTION_GENERATE_ELEM_BALL = 57;
ABILITY_ACTION_SET_RANDOM_OVERRIDE_MAP_VALUE = 58;
ABILITY_ACTION_SERVER_MONSTER_LOG = 59;
ABILITY_ACTION_CREATE_TILE = 60;
ABILITY_ACTION_DESTROY_TILE = 61;
ABILITY_ACTION_FIRE_AFTER_IMAGE = 62;
ABILITY_MIXIN_AVATAR_STEER_BY_CAMERA = 100;
ABILITY_MIXIN_MONSTER_DEFEND = 101;
ABILITY_MIXIN_WIND_ZONE = 102;
ABILITY_MIXIN_COST_STAMINA = 103;
ABILITY_MIXIN_ELITE_SHIELD = 104;
ABILITY_MIXIN_ELEMENT_SHIELD = 105;
ABILITY_MIXIN_GLOBAL_SHIELD = 106;
ABILITY_MIXIN_SHIELD_BAR = 107;
ABILITY_MIXIN_WIND_SEED_SPAWNER = 108;
ABILITY_MIXIN_DO_ACTION_BY_ELEMENT_REACTION = 109;
ABILITY_MIXIN_FIELD_ENTITY_COUNT_CHANGE = 110;
ABILITY_MIXIN_SCENE_PROP_SYNC = 111;
ABILITY_MIXIN_WIDGET_MP_SUPPORT = 112;
ABILITY_INVOKE_ARGUMENT_NONE = 0;
ABILITY_INVOKE_ARGUMENT_META_MODIFIER_CHANGE = 1;
ABILITY_INVOKE_ARGUMENT_META_COMMAND_MODIFIER_CHANGE_REQUEST = 2;
ABILITY_INVOKE_ARGUMENT_META_SPECIAL_FLOAT_ARGUMENT = 3;
ABILITY_INVOKE_ARGUMENT_META_OVERRIDE_PARAM = 4;
ABILITY_INVOKE_ARGUMENT_META_CLEAR_OVERRIDE_PARAM = 5;
ABILITY_INVOKE_ARGUMENT_META_REINIT_OVERRIDEMAP = 6;
ABILITY_INVOKE_ARGUMENT_META_GLOBAL_FLOAT_VALUE = 7;
ABILITY_INVOKE_ARGUMENT_META_CLEAR_GLOBAL_FLOAT_VALUE = 8;
ABILITY_INVOKE_ARGUMENT_META_ABILITY_ELEMENT_STRENGTH = 9;
ABILITY_INVOKE_ARGUMENT_META_ADD_OR_GET_ABILITY_AND_TRIGGER = 10;
ABILITY_INVOKE_ARGUMENT_META_SET_KILLED_SETATE = 11;
ABILITY_INVOKE_ARGUMENT_META_SET_ABILITY_TRIGGER = 12;
ABILITY_INVOKE_ARGUMENT_META_ADD_NEW_ABILITY = 13;
ABILITY_INVOKE_ARGUMENT_META_REMOVE_ABILITY = 14;
ABILITY_INVOKE_ARGUMENT_META_SET_MODIFIER_APPLY_ENTITY = 15;
ABILITY_INVOKE_ARGUMENT_META_MODIFIER_DURABILITY_CHANGE = 16;
ABILITY_INVOKE_ARGUMENT_META_ELEMENT_REACTION_VISUAL = 17;
ABILITY_INVOKE_ARGUMENT_META_SET_POSE_PARAMETER = 18;
ABILITY_INVOKE_ARGUMENT_META_UPDATE_BASE_REACTION_DAMAGE = 19;
ABILITY_INVOKE_ARGUMENT_META_TRIGGER_ELEMENT_REACTION = 20;
ABILITY_INVOKE_ARGUMENT_META_LOSE_HP = 21;
ABILITY_INVOKE_ARGUMENT_JDDDLJELBLJ = 22;
ABILITY_INVOKE_ARGUMENT_ACTION_TRIGGER_ABILITY = 50;
ABILITY_INVOKE_ARGUMENT_ACTION_SET_CRASH_DAMAGE = 51;
ABILITY_INVOKE_ARGUMENT_ACTION_EFFECT = 52;
ABILITY_INVOKE_ARGUMENT_ACTION_SUMMON = 53;
ABILITY_INVOKE_ARGUMENT_ACTION_BLINK = 54;
ABILITY_INVOKE_ARGUMENT_ACTION_CREATE_GADGET = 55;
ABILITY_INVOKE_ARGUMENT_ACTION_APPLY_LEVEL_MODIFIER = 56;
ABILITY_INVOKE_ARGUMENT_ACTION_GENERATE_ELEM_BALL = 57;
ABILITY_INVOKE_ARGUMENT_ACTION_SET_RANDOM_OVERRIDE_MAP_VALUE = 58;
ABILITY_INVOKE_ARGUMENT_ACTION_SERVER_MONSTER_LOG = 59;
ABILITY_INVOKE_ARGUMENT_ACTION_CREATE_TILE = 60;
ABILITY_INVOKE_ARGUMENT_ACTION_DESTROY_TILE = 61;
ABILITY_INVOKE_ARGUMENT_ACTION_FIRE_AFTER_IMAGE = 62;
ABILITY_INVOKE_ARGUMENT_FNANDDPDLOL = 63;
ABILITY_INVOKE_ARGUMENT_MIXIN_AVATAR_STEER_BY_CAMERA = 100;
ABILITY_INVOKE_ARGUMENT_MIXIN_MONSTER_DEFEND = 101;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIND_ZONE = 102;
ABILITY_INVOKE_ARGUMENT_MIXIN_COST_STAMINA = 103;
ABILITY_INVOKE_ARGUMENT_MIXIN_ELITE_SHIELD = 104;
ABILITY_INVOKE_ARGUMENT_MIXIN_ELEMENT_SHIELD = 105;
ABILITY_INVOKE_ARGUMENT_MIXIN_GLOBAL_SHIELD = 106;
ABILITY_INVOKE_ARGUMENT_MIXIN_SHIELD_BAR = 107;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIND_SEED_SPAWNER = 108;
ABILITY_INVOKE_ARGUMENT_MIXIN_DO_ACTION_BY_ELEMENT_REACTION = 109;
ABILITY_INVOKE_ARGUMENT_MIXIN_FIELD_ENTITY_COUNT_CHANGE = 110;
ABILITY_INVOKE_ARGUMENT_MIXIN_SCENE_PROP_SYNC = 111;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIDGET_MP_SUPPORT = 112;
ABILITY_INVOKE_ARGUMENT_NJHBFADEOON = 113;
ABILITY_INVOKE_ARGUMENT_EGCIFFFLLBG = 114;
ABILITY_INVOKE_ARGUMENT_OFDGFACOLDI = 115;
ABILITY_INVOKE_ARGUMENT_KDPKJGJNGFB = 116;
}

View File

@ -2,8 +2,8 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityInvokeEntryHead.proto";
import "AbilityInvokeArgument.proto";
import "AbilityInvokeEntryHead.proto";
import "ForwardType.proto";
message AbilityInvokeEntry {

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityInvokeEntryHead {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;

View File

@ -0,0 +1,21 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "ModifierAction.proto";
import "AbilityString.proto";
import "AbilityAttachedModifier.proto";
import "ModifierProperty.proto";
message AbilityMetaModifierChange {
ModifierAction action = 1;
AbilityString parent_ability_name = 2;
AbilityString parent_ability_override = 3;
AbilityAttachedModifier attached_instanced_modifier = 4;
repeated ModifierProperty properties = 5;
int32 modifier_local_id = 6;
bool is_mute_remote = 7;
uint32 apply_entity_id = 8;
bool is_attached_parent_ability = 9;
uint32 server_buff_uid = 10;
}

View File

@ -0,0 +1,9 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityScalarValueEntry.proto";
message AbilityMetaReInitOverrideMap {
repeated AbilityScalarValueEntry override_map = 1;
}

View File

@ -0,0 +1,7 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityMixinCostStamina {
bool is_swim = 1;
}

View File

@ -5,12 +5,12 @@ option java_package = "emu.grasscutter.net.proto";
import "MassivePropSyncInfo.proto";
message AbilityMixinRecoverInfo {
oneof Source {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;
}
uint32 local_id = 3;
repeated uint32 data_list = 4;
bool is_serverbuff_modifier = 5;
repeated MassivePropSyncInfo massive_prop_list = 6;
oneof source {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;
}
}

View File

@ -0,0 +1,8 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityMixinWidgetMpSupport {
uint32 target_entity_id = 1;
}

View File

@ -3,11 +3,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
enum AbilityScalarType {
UNKNOW = 0;
FLOAT = 1;
INT = 2;
BOOL = 3;
TRIGGER = 4;
STRING = 5;
UINT = 6;
ABILITY_SCALAR_TYPE_UNKNOW = 0;
ABILITY_SCALAR_TYPE_FLOAT = 1;
ABILITY_SCALAR_TYPE_INT = 2;
ABILITY_SCALAR_TYPE_BOOL = 3;
ABILITY_SCALAR_TYPE_TRIGGER = 4;
ABILITY_SCALAR_TYPE_STRING = 5;
ABILITY_SCALAR_TYPE_UINT = 6;
}

View File

@ -2,16 +2,16 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityString.proto";
import "AbilityScalarType.proto";
import "AbilityString.proto";
message AbilityScalarValueEntry {
oneof Value {
AbilityString key = 1;
AbilityScalarType value_type = 2;
oneof value {
float float_value = 3;
string string_value = 4;
int32 int_value = 5;
uint32 uint_value = 6;
}
AbilityString key = 1;
AbilityScalarType value_type = 2;
}

View File

@ -2,9 +2,8 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AbilityString {
oneof Type {
oneof type {
string str = 1;
uint32 hash = 2;
}

View File

@ -2,10 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityScalarValueEntry.proto";
import "AbilityAppliedAbility.proto";
import "AbilityAppliedModifier.proto";
import "AbilityMixinRecoverInfo.proto";
import "AbilityScalarValueEntry.proto";
message AbilitySyncStateInfo {
bool is_inited = 1;

View File

@ -2,45 +2,42 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "ActivityNullDetailInfo.proto";
import "ActivityWatcherInfo.proto";
/*import "ArenaChallengeActivityDetailInfo.proto";
import "AsterActivityDetailInfo.proto";
import "BlessingActivityDetailInfo.proto";
import "BlitzRushActivityDetailInfo.proto";
import "BounceConjuringActivityDetailInfo.proto";
import "BuoyantCombatDetailInfo.proto";
import "ChannelerSlabActivityDetailInfo.proto";
import "ChessActivityDetailInfo.proto";
import "CrucibleActivityDetailInfo.proto";
import "DeliveryActivityDetailInfo.proto";
import "DigActivityDetailInfo.proto";
import "DragonSpineActivityDetailInfo.proto";
import "EchoShellDetailInfo.proto";
import "EffigyActivityDetailInfo.proto";
import "ExpeditionActivityDetailInfo.proto";
import "FindHilichurlDetailInfo.proto";
import "FleurFairActivityDetailInfo.proto";
import "FlightActivityDetailInfo.proto";
import "HideAndSeekActivityDetailInfo.proto";
import "LunaRiteDetailInfo.proto";
import "MistTrialActivityDetailInfo.proto";
import "MoonfinTrialActivityDetailInfo.proto";
import "MusicGameActivityDetailInfo.proto";
import "PlantFlowerActivityDetailInfo.proto";
import "RoguelikeDungeonActivityDetailInfo.proto";
import "SalesmanActivityDetailInfo.proto";
import "SeaLampActivityDetailInfo.proto";
import "SeaLampActivityInfo.proto";
import "SummerTimeDetailInfo.proto";
import "SumoActivityDetailInfo.proto";
import "TreasureMapActivityDetailInfo.proto";
import "TrialAvatarActivityDetailInfo.proto";
import "WaterSpiritActivityDetailInfo.proto";*/
message ActivityInfo {
oneof Detail {
ActivityNullDetailInfo sam_lamp_info = 11;
ActivityNullDetailInfo crucible_info = 12;
ActivityNullDetailInfo salesman_info = 13;
ActivityNullDetailInfo trial_avatar_info = 14;
ActivityNullDetailInfo delivery_info = 16;
ActivityNullDetailInfo aster_info = 21;
ActivityNullDetailInfo flight_info = 25;
ActivityNullDetailInfo dragon_spine_info = 31;
ActivityNullDetailInfo effigy_info = 32;
ActivityNullDetailInfo treasure_map_info = 35;
ActivityNullDetailInfo blessing_info = 41;
ActivityNullDetailInfo sea_lamp_info = 42;
ActivityNullDetailInfo expedition_info = 43;
ActivityNullDetailInfo arena_challenge_info = 44;
ActivityNullDetailInfo fleur_fair_info = 51;
ActivityNullDetailInfo water_spirit_info = 52;
ActivityNullDetailInfo challneler_slab_info = 61;
ActivityNullDetailInfo mist_trial_activity_info = 62;
ActivityNullDetailInfo hide_and_seek_info = 63;
ActivityNullDetailInfo find_hilichurl_info = 64;
ActivityNullDetailInfo summer_time_info = 65;
ActivityNullDetailInfo buoyant_combat_info = 66;
ActivityNullDetailInfo echo_shell_info = 67;
ActivityNullDetailInfo bounce_conjuring_info = 68;
ActivityNullDetailInfo blitz_rush_info = 69;
ActivityNullDetailInfo chess_info = 70;
ActivityNullDetailInfo sumo_info = 71;
ActivityNullDetailInfo moonfin_trial_info = 72;
ActivityNullDetailInfo luna_rite_info = 73;
ActivityNullDetailInfo plant_flower_info = 74;
ActivityNullDetailInfo music_game_info = 75;
ActivityNullDetailInfo roguelike_dungoen_info = 76;
ActivityNullDetailInfo dig_info = 77;
}
uint32 activity_id = 1;
uint32 schedule_id = 2;
uint32 begin_time = 3;
@ -59,4 +56,57 @@ message ActivityInfo {
repeated uint32 taken_reward_list = 24;
bool is_hidden = 26;
uint32 first_day_start_time = 27;
//bool MIFCLBCMKJI = 28;
//bool BPGCBIEDEDM = 29;
//map<uint32, uint32> AGKPABKOHDA = 30;
/*oneof detail {
SeaLampActivityDetailInfo sam_lamp_info = 11;
CrucibleActivityDetailInfo crucible_info = 12;
SalesmanActivityDetailInfo salesman_info = 13;
TrialAvatarActivityDetailInfo trial_avatar_info = 14;
DeliveryActivityDetailInfo delivery_info = 16;
AsterActivityDetailInfo aster_info = 21;
FlightActivityDetailInfo flight_info = 25;
DragonSpineActivityDetailInfo dragon_spine_info = 31;
EffigyActivityDetailInfo effigy_info = 32;
TreasureMapActivityDetailInfo treasure_map_info = 35;
BlessingActivityDetailInfo blessing_info = 41;
SeaLampActivityInfo sea_lamp_info = 42;
ExpeditionActivityDetailInfo expedition_info = 43;
ArenaChallengeActivityDetailInfo arena_challenge_info = 44;
FleurFairActivityDetailInfo fleur_fair_info = 51;
WaterSpiritActivityDetailInfo water_spirit_info = 52;
ChannelerSlabActivityDetailInfo challneler_slab_info = 61;
MistTrialActivityDetailInfo mist_trial_activity_info = 62;
HideAndSeekActivityDetailInfo hide_and_seek_info = 63;
FindHilichurlDetailInfo find_hilichurl_info = 64;
SummerTimeDetailInfo summer_time_info = 65;
BuoyantCombatDetailInfo buoyant_combat_info = 66;
EchoShellDetailInfo echo_shell_info = 67;
BounceConjuringActivityDetailInfo bounce_conjuring_info = 68;
BlitzRushActivityDetailInfo blitz_rush_info = 69;
ChessActivityDetailInfo chess_info = 70;
SumoActivityDetailInfo sumo_info = 71;
MoonfinTrialActivityDetailInfo moonfin_trial_info = 72;
LunaRiteDetailInfo luna_rite_info = 73;
PlantFlowerActivityDetailInfo plant_flower_info = 74;
MusicGameActivityDetailInfo music_game_info = 75;
RoguelikeDungeonActivityDetailInfo roguelike_dungoen_info = 76;
DigActivityDetailInfo dig_info = 77;
DOCNGBMKEID hachi_info = 78;
DLHPBNNDGFI winter_camp_info = 79;
IFACCKLEJCC potion_info = 80;
PFMCPMIMGLM tanuki_travel_activity_info = 81;
JEIAODKGIBD lantern_rite_activity_info = 82;
EPDOGGKOCAP michiae_matsuri_info = 83;
NHMFHLIGAKL bartender_info = 84;
EAGKNMCLJDI ugc_info = 85;
ADPBMLFDHJD crystal_link_info = 86;
JACDNLEIDOO irodori_info = 87;
EHDKFDJEEGP photo_info = 88;
BEPFLAKHNHL spice_info = 89;
MMNEJBFMAEA gacha_info = 90;
JLMHDDHOGGD luminance_stone_challenge_info = 91;
IGBMCJOPGIL rogue_diary_info = 92;
}*/
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message ActivityWatcherInfo {
uint32 watcher_id = 1;
uint32 cur_progress = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AiSkillCdInfo {
map<uint32, uint32> skill_cd_map = 1;
map<uint32, uint32> skill_group_cd_map = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AiSyncInfo {
uint32 entity_id = 1;
bool has_path_to_target = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AiThreatInfo {
map<uint32, uint32> ai_threat_map = 1;
}

View File

@ -0,0 +1,26 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AnchorPointData.proto";
// import "CCEOEOHLAPK.proto";
import "ClientCollectorData.proto";
import "LunchBoxData.proto";
import "OneoffGatherPointDetectorData.proto";
import "WidgetCoolDownData.proto";
import "WidgetSlotData.proto";
// CmdId: 4273
// EnetChannelId: 0
// EnetIsReliable: true
message AllWidgetDataNotify {
repeated AnchorPointData anchor_point_list = 13;
uint32 next_anchor_point_usable_time = 10;
LunchBoxData lunch_box_data = 11;
repeated OneoffGatherPointDetectorData oneoff_gather_point_detector_data_list = 5;
repeated ClientCollectorData client_collector_data_list = 6;
repeated WidgetCoolDownData cool_down_group_data_list = 2;
repeated WidgetCoolDownData normal_cool_down_data_list = 4;
repeated WidgetSlotData slot_list = 3;
// CCEOEOHLAPK KNPDHPEGCHI = 12;
}

View File

@ -0,0 +1,13 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "Vector.proto";
message AnchorPointData {
uint32 anchor_point_id = 1;
Vector pos = 2;
Vector rot = 3;
uint32 end_time = 4;
uint32 scene_id = 5;
}

View File

@ -0,0 +1,13 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AnchorPointData.proto";
// CmdId: 4268
// EnetChannelId: 0
// EnetIsReliable: true
message AnchorPointDataNotify {
repeated AnchorPointData anchor_point_list = 14;
uint32 next_usable_time = 6;
}

View File

@ -0,0 +1,18 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 4254
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AnchorPointOpReq {
uint32 anchor_point_op_type = 6;
uint32 anchor_point_id = 1;
enum AnchorPointOpType {
ANCHOR_POINT_OP_TYPE_NONE = 0;
ANCHOR_POINT_OP_TYPE_TELEPORT = 1;
ANCHOR_POINT_OP_TYPE_REMOVE = 2;
}
}

View File

@ -0,0 +1,12 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 4278
// EnetChannelId: 0
// EnetIsReliable: true
message AnchorPointOpRsp {
int32 retcode = 13;
uint32 anchor_point_op_type = 3;
uint32 anchor_point_id = 2;
}

View File

@ -2,12 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AnimatorParameterValueInfo {
oneof ParaVal {
uint32 para_type = 1;
oneof para_val {
int32 int_val = 2;
float float_val = 3;
bool bool_val = 4;
}
uint32 para_type = 1;
}

View File

@ -4,15 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "FriendBrief.proto";
// CmdId: 4038
// EnetChannelId: 0
// EnetIsReliable: true
message AskAddFriendNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 4006;
}
uint32 target_uid = 1;
FriendBrief target_friend_brief = 2;
uint32 target_uid = 13;
FriendBrief target_friend_brief = 10;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 4032
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AskAddFriendReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 4100;
}
uint32 target_uid = 1;
uint32 target_uid = 8;
}

View File

@ -2,18 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 4017
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AskAddFriendRsp {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 4001;
}
int32 retcode = 1;
uint32 target_uid = 2;
uint32 param = 3;
int32 retcode = 11;
uint32 target_uid = 14;
uint32 param = 13;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AttackHitEffectResult {
uint32 hit_eff_level = 1;
float retreat_strength = 2;

View File

@ -3,9 +3,9 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AbilityIdentifier.proto";
import "AttackHitEffectResult.proto";
import "HitCollision.proto";
import "Vector.proto";
import "AttackHitEffectResult.proto";
message AttackResult {
uint32 attacker_id = 1;
@ -37,4 +37,5 @@ message AttackResult {
float endure_delta = 37;
uint32 target_type = 38;
float element_durability_attenuation = 39;
uint32 EGPFEACDCLP = 40;
}

View File

@ -4,15 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "AvatarInfo.proto";
// CmdId: 1757
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarAddNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1795;
}
AvatarInfo avatar = 1;
bool is_in_team = 2;
AvatarInfo avatar = 11;
bool is_in_team = 15;
}

View File

@ -4,14 +4,9 @@ option java_package = "emu.grasscutter.net.proto";
import "SceneEntityInfo.proto";
// CmdId: 1780
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarChangeCostumeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1724;
}
SceneEntityInfo entity_info = 1;
}

View File

@ -2,17 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1734
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarChangeCostumeReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1606;
}
uint64 avatar_guid = 1;
uint32 costume_id = 2;
uint64 avatar_guid = 7;
uint32 costume_id = 8;
}

View File

@ -2,17 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1723
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarChangeCostumeRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1748;
}
int32 retcode = 1;
uint64 avatar_guid = 2;
uint32 costume_id = 3;
int32 retcode = 15;
uint64 avatar_guid = 3;
uint32 costume_id = 1;
}

View File

@ -5,20 +5,15 @@ option java_package = "emu.grasscutter.net.proto";
import "AvatarInfo.proto";
import "AvatarTeam.proto";
// CmdId: 1695
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarDataNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1694;
}
repeated AvatarInfo avatar_list = 1;
map<uint32, AvatarTeam> avatar_team_map = 2;
uint32 cur_avatar_team_id = 3;
fixed64 choose_avatar_guid = 4;
repeated uint64 temp_avatar_guid_list = 5;
repeated uint32 owned_flycloak_list = 6;
repeated AvatarInfo avatar_list = 15;
map<uint32, AvatarTeam> avatar_team_map = 6;
uint32 cur_avatar_team_id = 2;
fixed64 choose_avatar_guid = 11;
repeated uint64 temp_avatar_guid_list = 14;
repeated uint32 owned_flycloak_list = 8;
repeated uint32 owned_costume_list = 7;
}

View File

@ -4,17 +4,12 @@ option java_package = "emu.grasscutter.net.proto";
import "Vector.proto";
// CmdId: 1616
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarDieAnimationEndReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1737;
}
uint64 die_guid = 1;
uint32 skill_id = 2;
Vector reborn_pos = 3;
uint64 die_guid = 14;
uint32 skill_id = 4;
Vector reborn_pos = 13;
}

View File

@ -2,17 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1765
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarDieAnimationEndRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1697;
}
int32 retcode = 1;
uint64 die_guid = 2;
uint32 skill_id = 3;
int32 retcode = 12;
uint64 die_guid = 11;
uint32 skill_id = 13;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AvatarEquipAffixInfo {
uint32 equip_affix_id = 1;
uint32 left_cd_time = 2;

View File

@ -2,23 +2,18 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "SceneWeaponInfo.proto";
import "SceneReliquaryInfo.proto";
import "SceneWeaponInfo.proto";
// CmdId: 690
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarEquipChangeNotify {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 615;
}
uint64 avatar_guid = 1;
uint32 equip_type = 2;
uint32 item_id = 3;
uint32 item_id = 8;
uint64 equip_guid = 4;
SceneWeaponInfo weapon = 5;
SceneReliquaryInfo reliquary = 6;
SceneWeaponInfo weapon = 13;
SceneReliquaryInfo reliquary = 11;
}

View File

@ -1,19 +1,15 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionInfo.proto";
// CmdId: 1636
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarExpeditionAllDataRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1783;
}
int32 retcode = 1;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 2;
repeated uint32 open_expedition_list = 3;
uint32 expedition_count_limit = 4;
int32 retcode = 11;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 1;
repeated uint32 open_expedition_list = 6;
uint32 expedition_count_limit = 7;
}

View File

@ -2,15 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1655
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarExpeditionCallBackReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1618;
}
repeated uint64 avatar_guid = 1;
repeated uint64 avatar_guid = 12;
}

View File

@ -1,17 +1,13 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionInfo.proto";
// CmdId: 1642
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarExpeditionCallBackRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1633;
}
int32 retcode = 1;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 2;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 14;
}

View File

@ -1,16 +1,12 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionInfo.proto";
// CmdId: 1698
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarExpeditionDataNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1621;
}
map<uint64, AvatarExpeditionInfo> expedition_info_map = 1;
}

View File

@ -2,15 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1603
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarExpeditionGetRewardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1610;
}
uint64 avatar_guid = 1;
uint64 avatar_guid = 5;
}

View File

@ -1,19 +1,16 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionInfo.proto";
import "ItemParam.proto";
message AvatarExpeditionGetRewardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1670;
}
int32 retcode = 1;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 2;
repeated ItemParam item_list = 3;
// CmdId: 1646
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarExpeditionGetRewardRsp {
int32 retcode = 15;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 5;
repeated ItemParam item_list = 6;
repeated ItemParam BNFDDKNNJJH = 2;
}

View File

@ -1,6 +1,7 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionState.proto";
message AvatarExpeditionInfo {

View File

@ -2,17 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1675
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarExpeditionStartReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1609;
}
uint64 avatar_guid = 1;
uint64 avatar_guid = 8;
uint32 exp_id = 2;
uint32 hour_time = 3;
uint32 hour_time = 7;
}

View File

@ -1,17 +1,13 @@
syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "AvatarExpeditionInfo.proto";
// CmdId: 1688
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarExpeditionStartRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1646;
}
int32 retcode = 1;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 2;
int32 retcode = 4;
map<uint64, AvatarExpeditionInfo> expedition_info_map = 1;
}

View File

@ -3,9 +3,9 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
enum AvatarExpeditionState {
AVATAR_EXPEDITION_NONE = 0;
AVATAR_EXPEDITION_DOING = 1;
AVATAR_EXPEDITION_FINISH_WAIT_REWARD = 2;
AVATAR_EXPEDITION_CALLBACK_WAIT_REWARD = 3;
AVATAR_EXPEDITION_LOCKED = 4;
AVATAR_EXPEDITION_STATE_NONE = 0;
AVATAR_EXPEDITION_STATE_DOING = 1;
AVATAR_EXPEDITION_STATE_FINISH_WAIT_REWARD = 2;
AVATAR_EXPEDITION_STATE_CALLBACK_WAIT_REWARD = 3;
AVATAR_EXPEDITION_STATE_LOCKED = 4;
}

View File

@ -4,14 +4,9 @@ option java_package = "emu.grasscutter.net.proto";
import "AvatarFetterInfo.proto";
// CmdId: 1777
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarFetterDataNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1685;
}
map<uint64, AvatarFetterInfo> fetter_info_map = 1;
}

View File

@ -2,16 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1704
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarFetterLevelRewardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1624;
}
uint64 avatar_guid = 1;
uint64 avatar_guid = 15;
uint32 fetter_level = 2;
}

View File

@ -2,17 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1606
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarFetterLevelRewardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1704;
}
int32 retcode = 1;
uint64 avatar_guid = 2;
uint32 fetter_level = 3;
uint32 reward_id = 4;
int32 retcode = 14;
uint64 avatar_guid = 12;
uint32 fetter_level = 10;
uint32 reward_id = 11;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1232
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarFightPropNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1300;
}
uint64 avatar_guid = 1;
map<uint32, float> fight_prop_map = 2;
uint64 avatar_guid = 3;
map<uint32, float> fight_prop_map = 6;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1217
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarFightPropUpdateNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1201;
}
uint64 avatar_guid = 1;
map<uint32, float> fight_prop_map = 2;
map<uint32, float> fight_prop_map = 6;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1681
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarFlycloakChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1759;
}
uint64 avatar_guid = 1;
uint32 flycloak_id = 2;
uint64 avatar_guid = 12;
uint32 flycloak_id = 14;
}

View File

@ -2,15 +2,9 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1670
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarGainCostumeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1734;
}
uint32 costume_id = 1;
uint32 costume_id = 15;
}

View File

@ -2,15 +2,9 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1615
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarGainFlycloakNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1604;
}
uint32 flycloak_id = 1;
uint32 flycloak_id = 2;
}

View File

@ -2,13 +2,13 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
import "TrialAvatarInfo.proto";
import "AvatarFetterInfo.proto";
import "AvatarExpeditionState.proto";
import "AvatarExcelInfo.proto";
import "PropValue.proto";
import "AvatarSkillInfo.proto";
import "AvatarEquipAffixInfo.proto";
import "AvatarExcelInfo.proto";
import "AvatarExpeditionState.proto";
import "AvatarFetterInfo.proto";
import "AvatarSkillInfo.proto";
import "PropValue.proto";
import "TrialAvatarInfo.proto";
message AvatarInfo {
uint32 avatar_id = 1;

View File

@ -5,20 +5,15 @@ option java_package = "emu.grasscutter.net.proto";
import "PlayerDieType.proto";
import "ServerBuff.proto";
// CmdId: 1235
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarLifeStateChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1242;
}
uint64 avatar_guid = 1;
uint32 life_state = 2;
uint32 source_entity_id = 3;
string attack_tag = 4;
PlayerDieType die_type = 5;
uint32 move_reliable_seq = 6;
repeated ServerBuff server_buff_list = 7;
uint64 avatar_guid = 8;
uint32 life_state = 15;
uint32 source_entity_id = 1;
string attack_tag = 10;
PlayerDieType die_type = 11;
uint32 move_reliable_seq = 7;
repeated ServerBuff server_buff_list = 6;
}

View File

@ -2,16 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1676
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarPromoteGetRewardReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1701;
}
uint64 avatar_guid = 1;
uint32 promote_level = 2;
uint64 avatar_guid = 12;
uint32 promote_level = 8;
}

View File

@ -2,18 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1613
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarPromoteGetRewardRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1764;
}
int32 retcode = 1;
int32 retcode = 11;
uint64 avatar_guid = 2;
uint32 promote_level = 3;
uint32 reward_id = 4;
uint32 promote_level = 14;
uint32 reward_id = 1;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1711
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarPromoteReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1692;
}
uint64 guid = 1;
uint64 guid = 9;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1668
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarPromoteRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1728;
}
int32 retcode = 1;
uint64 guid = 2;
int32 retcode = 15;
uint64 guid = 7;
}

View File

@ -2,16 +2,10 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1255
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarPropNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1212;
}
uint64 avatar_guid = 1;
map<uint32, int64> prop_map = 2;
uint64 avatar_guid = 4;
map<uint32, int64> prop_map = 1;
}

View File

@ -2,20 +2,14 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1030
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarSkillChangeNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1091;
}
uint64 avatar_guid = 1;
uint32 entity_id = 2;
uint32 skill_depot_id = 3;
uint32 avatar_skill_id = 4;
uint32 old_level = 5;
uint32 cur_level = 6;
uint64 avatar_guid = 4;
uint32 entity_id = 15;
uint32 skill_depot_id = 5;
uint32 avatar_skill_id = 2;
uint32 old_level = 10;
uint32 cur_level = 7;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AvatarSkillInfo {
uint32 pass_cd_time = 1;
repeated uint32 full_cd_time_list = 2;

View File

@ -4,7 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "AvatarSkillInfo.proto";
// CmdId: 1035
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarSkillInfoNotify {
uint64 guid = 1;
uint64 guid = 4;
map<uint32, AvatarSkillInfo> skill_map = 2;
}

View File

@ -2,8 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1085
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarSkillMaxChargeCountNotify {
uint64 avatar_guid = 1;
uint64 avatar_guid = 15;
uint32 skill_id = 2;
uint32 max_charge_count = 3;
uint32 max_charge_count = 1;
}

View File

@ -2,18 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1027
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarSkillUpgradeReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1026;
}
uint64 avatar_guid = 1;
uint32 avatar_skill_id = 2;
uint32 old_level = 3;
uint32 avatar_skill_id = 5;
uint32 old_level = 10;
}

View File

@ -2,19 +2,13 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1007
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarSkillUpgradeRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1024;
}
int32 retcode = 1;
uint64 avatar_guid = 2;
uint32 avatar_skill_id = 3;
uint32 old_level = 4;
uint32 cur_level = 5;
int32 retcode = 3;
uint64 avatar_guid = 10;
uint32 avatar_skill_id = 2;
uint32 old_level = 5;
uint32 cur_level = 7;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AvatarTeam {
repeated uint64 avatar_guid_list = 1;
string team_name = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message AvatarTeamResonanceInfo {
uint32 entity_id = 1;
uint64 avatar_guid = 2;

View File

@ -4,15 +4,10 @@ option java_package = "emu.grasscutter.net.proto";
import "AvatarTeam.proto";
// CmdId: 1713
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarTeamUpdateNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1642;
}
map<uint32, AvatarTeam> avatar_team_map = 1;
repeated uint64 temp_avatar_guid_list = 2;
map<uint32, AvatarTeam> avatar_team_map = 6;
repeated uint64 temp_avatar_guid_list = 9;
}

View File

@ -2,18 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1041
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarUnlockTalentNotify {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1089;
}
uint64 avatar_guid = 1;
uint32 entity_id = 2;
uint32 talent_id = 3;
uint32 skill_depot_id = 4;
uint32 entity_id = 15;
uint32 talent_id = 13;
uint32 skill_depot_id = 14;
}

View File

@ -2,18 +2,12 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1680
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarUpgradeReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1691;
}
uint32 item_id = 1;
uint32 count = 2;
uint64 avatar_guid = 3;
uint32 item_id = 9;
uint32 count = 12;
uint64 avatar_guid = 14;
}

View File

@ -2,20 +2,14 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1779
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarUpgradeRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1720;
}
int32 retcode = 1;
uint64 avatar_guid = 2;
uint32 old_level = 3;
uint32 cur_level = 4;
map<uint32, float> old_fight_prop_map = 5;
map<uint32, float> cur_fight_prop_map = 6;
int32 retcode = 6;
uint64 avatar_guid = 15;
uint32 old_level = 5;
uint32 cur_level = 7;
map<uint32, float> old_fight_prop_map = 2;
map<uint32, float> cur_fight_prop_map = 4;
}

View File

@ -2,17 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1728
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AvatarWearFlycloakReq {
enum CmdId {
option allow_alias = true;
ENET_CHANNEL_ID = 0;
NONE = 0;
ENET_IS_RELIABLE = 1;
IS_ALLOW_CLIENT = 1;
CMD_ID = 1635;
}
uint64 avatar_guid = 1;
uint32 flycloak_id = 2;
uint64 avatar_guid = 11;
uint32 flycloak_id = 9;
}

View File

@ -2,17 +2,11 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
// CmdId: 1770
// EnetChannelId: 0
// EnetIsReliable: true
message AvatarWearFlycloakRsp {
enum CmdId {
option allow_alias = true;
NONE = 0;
ENET_CHANNEL_ID = 0;
ENET_IS_RELIABLE = 1;
CMD_ID = 1709;
}
int32 retcode = 1;
uint64 avatar_guid = 2;
uint32 flycloak_id = 3;
int32 retcode = 13;
uint64 avatar_guid = 8;
uint32 flycloak_id = 2;
}

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message Birthday {
uint32 month = 1;
uint32 day = 2;

View File

@ -2,7 +2,6 @@ syntax = "proto3";
option java_package = "emu.grasscutter.net.proto";
message BlockInfo {
uint32 block_id = 1;
uint32 data_version = 2;

Some files were not shown because too many files have changed in this diff Show More