diff --git a/README.md b/README.md
index 5c46b58df..96da94e79 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_HE.md b/docs/README_HE.md
index abf6e8ed9..e98882d10 100644
--- a/docs/README_HE.md
+++ b/docs/README_HE.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_NL.md b/docs/README_NL.md
index 2c9fe607a..b620a149c 100644
--- a/docs/README_NL.md
+++ b/docs/README_NL.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_es-ES.md b/docs/README_es-ES.md
index cf3be13d3..661ee86ff 100644
--- a/docs/README_es-ES.md
+++ b/docs/README_es-ES.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_fil-PH.md b/docs/README_fil-PH.md
index 569e41721..57e2198fa 100644
--- a/docs/README_fil-PH.md
+++ b/docs/README_fil-PH.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_fr-FR.md b/docs/README_fr-FR.md
index fe45df2ac..ff6dfec4f 100644
--- a/docs/README_fr-FR.md
+++ b/docs/README_fr-FR.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_id-ID.md b/docs/README_id-ID.md
index baa086ade..ccac54424 100644
--- a/docs/README_id-ID.md
+++ b/docs/README_id-ID.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_it-IT.md b/docs/README_it-IT.md
index 1d30929da..138c1eb7e 100644
--- a/docs/README_it-IT.md
+++ b/docs/README_it-IT.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_ja-JP.md b/docs/README_ja-JP.md
index 89d323eff..e117fab7f 100644
--- a/docs/README_ja-JP.md
+++ b/docs/README_ja-JP.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_ko-KR.md b/docs/README_ko-KR.md
index f6c8d2426..3f655b73b 100644
--- a/docs/README_ko-KR.md
+++ b/docs/README_ko-KR.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_pl-PL.md b/docs/README_pl-PL.md
index 8f4701357..406ee33f6 100644
--- a/docs/README_pl-PL.md
+++ b/docs/README_pl-PL.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_ru-RU.md b/docs/README_ru-RU.md
index a6273b20c..cf1e95e0a 100644
--- a/docs/README_ru-RU.md
+++ b/docs/README_ru-RU.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_vi-VN.md b/docs/README_vi-VN.md
index f89366947..7a6d22460 100644
--- a/docs/README_vi-VN.md
+++ b/docs/README_vi-VN.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md
index 5bc37d538..7f631f8aa 100644
--- a/docs/README_zh-CN.md
+++ b/docs/README_zh-CN.md
@@ -1,11 +1,11 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
[EN](../README.md) | [简中](README_zh-CN.md) | [繁中](README_zh-TW.md) | [FR](README_fr-FR.md) | [ES](README_es-ES.md) | [HE](README_HE.md) | [RU](README_ru-RU.md) | [PL](README_pl-PL.md) | [ID](README_id-ID.md) | [KR](README_ko-KR.md) | [FIL/PH](README_fil-PH.md) | [NL](README_NL.md) | [JP](README_ja-JP.md) | [IT](README_it-IT.md) | [VI](README_vi-VN.md)
-**请注意:** 欢迎成为本项目的贡献者。但在提交 PR 之前, 请仔细阅读 [代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。
+**注意:** 我们始终欢迎项目的贡献者。但在做贡献之前,请仔细阅读我们的[代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。
## 当前功能
@@ -16,92 +16,59 @@
* 祈愿
* 多人游戏 *部分* 可用
* 从控制台生成魔物
-* 物品 (接收或升级角色、武器等)
+* 背包功能(接收或升级物品、角色等)。
+
+## 快速安装指南
-## 快速设置指南
+**注意:** 如需帮助,请加入我们的[Discord](https://discord.gg/T5vZU6UyeG)。
-**注意:** 如需帮助请加入 [Discord](https://discord.gg/T5vZU6UyeG)
+### 快速开始(全自动)
-### 环境需求
+- 获取Java 17:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
+- 获取[MongoDB社区版](https://www.mongodb.com/try/download/community)
+- 获取游戏3.7正式版 (如果你没有3.7的客户端,可以在这里找到):https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md)
-* [Java SE - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
+- 下载[最新的Cultivation版本](https://github.com/Grasscutters/Cultivation/releases/latest)(使用以“.msi”为后缀的安装包)。
+- 以管理员身份打开Culivation,按右上角的下载按钮。
+- 点击“下载 Grasscutter 一体化”
+- 点击右上角的齿轮
+- 将游戏安装路径设置为你游戏所在的位置。
+- 将自定义Java路径设置为`C:\Program Files\Java\jdk-17\bin\java.exe`
+- 保持所有其它设置为默认值
- **注意:** 如果想仅**运行服务端**, 只下载 **jre** 即可
-
-* [MongoDB](https://www.mongodb.com/try/download/community) (推荐 4.0+)
-
-* 代理程序: [mitmproxy](https://mitmproxy.org/) (仅需 mitmdump;推荐使用), [Fiddler Classic](https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe) 等
-
-### 运行服务端
-
-**注意:** 从旧版本升级到新版本, 需要删除 `config.json` 使其重新生成
-
-1. 获取 `grasscutter.jar`
- - 从 [actions](https://github.com/Grasscutters/Grasscutter/actions) 下载,或 [自行编译](#构建)
-2. 在 JAR 文件根目录中创建 `resources` 文件夹并复制 `BinOutput` 和 `ExcelBinOutput` *(查看 [Wiki](https://github.com/Grasscutters/Grasscutter/wiki) 了解更多)*
-3. **确认 MongoDB 服务运行正常后**,使用命令行 `java -jar grasscutter.jar` 运行 Grasscutter。
-
-### 客户端连接
-
-½. 在服务器控制台 [创建账户](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting)
-
-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` 一键启动服务端并设置代理, 但设置 `JAVA_HOME` 环境变量并配置 `start_config.cmd`**
+- 点击“启动”按钮旁边的小按钮。
+- 点击“启动”按钮。
+- 随便想一个用户名登录,不需要密码。
### 构建
-Grasscutter 使用 Gradle 来处理依赖及编译。
+Grasscutter使用Gradle来处理依赖和构建。
-**前置依赖:**
+**前置:**
-- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
+- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)或更高版本
- [Git](https://git-scm.com/downloads)
##### Windows
```shell
-git clone https://github.com/Grasscutters/Grasscutter.git
+git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
-.\gradlew.bat # 建立开发环境
+.\gradlew.bat # 设置开发环境
.\gradlew jar # 编译
```
-##### Linux
+##### Linux(GNU)
```bash
-git clone https://github.com/Grasscutters/Grasscutter.git
+git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
chmod +x gradlew
./gradlew jar # 编译
```
-* 编译后的 JAR 文件会在源码根目录生成
+你可以在项目的根目录找到输出的jar。
-### 命令列表请到 [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands) 查看
+### 故障排除
-# 快速问题排除
-
-* 如果编译失败, 请检查 JDK 安装是否正确 (需要 JDK 17 并确认 JDK 的 bin 文件夹处于环境变量 `PATH` 中)
-* 客户端无法登录、连接、错误 4206 等其他问题... - 大部分情况是因为代理设置出现了*问题*。
- 如果使用 Fiddler,请确认 Fiddler 监听端口不是 `8888`
-* 启动顺序: MongoDB > Grasscutter > 代理程序 (mitmdump, Fiddler 等) > 客户端
+获取常见问题的解决方案或寻求帮助,请加入[我们的Discord服务器](https://discord.gg/T5vZU6UyeG)并进入“support”频道。
diff --git a/docs/README_zh-TW.md b/docs/README_zh-TW.md
index c4eb5b46d..578c0010d 100644
--- a/docs/README_zh-TW.md
+++ b/docs/README_zh-TW.md
@@ -1,5 +1,5 @@
![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)
-
+
![Discord - Grasscutter](https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge)
diff --git a/src/main/java/emu/grasscutter/command/commands/QuestCommand.java b/src/main/java/emu/grasscutter/command/commands/QuestCommand.java
index c3345520c..f4be5738c 100644
--- a/src/main/java/emu/grasscutter/command/commands/QuestCommand.java
+++ b/src/main/java/emu/grasscutter/command/commands/QuestCommand.java
@@ -112,7 +112,7 @@ public final class QuestCommand implements CommandHandler {
var shouldAdd = !loggedQuests.contains(questId);
if (shouldAdd) loggedQuests.add(questId);
- else loggedQuests.remove(questId);
+ else loggedQuests.remove(loggedQuests.indexOf(questId));
CommandHandler.sendMessage(
sender,
diff --git a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java
index 995c49700..8e30cc54c 100644
--- a/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java
+++ b/src/main/java/emu/grasscutter/data/excels/dungeon/DungeonData.java
@@ -32,6 +32,7 @@ public class DungeonData extends GameResource {
@Getter private int passRewardPreviewID;
@Getter private int statueCostID;
@Getter private int statueCostCount;
+ @Getter private int statueDrop;
// not part of DungeonExcelConfigData
@Getter private RewardPreviewData rewardPreviewData;
diff --git a/src/main/java/emu/grasscutter/game/drop/DropSystem.java b/src/main/java/emu/grasscutter/game/drop/DropSystem.java
index eea63cb5d..88baa66fb 100644
--- a/src/main/java/emu/grasscutter/game/drop/DropSystem.java
+++ b/src/main/java/emu/grasscutter/game/drop/DropSystem.java
@@ -80,6 +80,14 @@ public final class DropSystem extends BaseGameSystem {
return dropData.getDropId();
}
+ public List handleDungeonRewardDrop(int dropId, boolean doubleReward) {
+ if (!dropTable.containsKey(dropId)) return List.of();
+ var dropData = dropTable.get(dropId);
+ List items = new ArrayList<>();
+ processDrop(dropData, doubleReward ? 2 : 1, items);
+ return items;
+ }
+
public boolean handleMonsterDrop(EntityMonster monster) {
int dropId;
int level = monster.getLevel();
diff --git a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java
index 104d2f9c5..b4890abc1 100644
--- a/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java
+++ b/src/main/java/emu/grasscutter/game/dungeons/DungeonManager.java
@@ -134,7 +134,16 @@ public final class DungeonManager {
}
// Get and roll rewards.
- List rewards = new ArrayList<>(this.rollRewards(useCondensed));
+ List rewards =
+ player
+ .getServer()
+ .getDropSystem()
+ .handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed);
+ if (rewards.isEmpty()) {
+ // fallback to legacy drop system
+ Grasscutter.getLogger().debug("dungeon drop failed for {}", dungeonData.getId());
+ rewards = new ArrayList<>(this.rollRewards(useCondensed));
+ }
// Add rewards to player and send notification.
player.getInventory().addItems(rewards, ActionReason.DungeonStatueDrop);
player.sendPacket(new PacketGadgetAutoPickDropInfoNotify(rewards));
@@ -187,7 +196,7 @@ public final class DungeonManager {
amount += Utils.drawRandomListElement(candidateAmounts, entry.getProbabilities());
}
- // Double rewards in multiplay mode, if specified.
+ // Double rewards in multiply mode, if specified.
if (entry.isMpDouble() && this.getScene().getPlayerCount() > 1) {
amount *= 2;
}
diff --git a/src/main/java/emu/grasscutter/game/entity/GameEntity.java b/src/main/java/emu/grasscutter/game/entity/GameEntity.java
index 3ec77618d..c1c195a63 100644
--- a/src/main/java/emu/grasscutter/game/entity/GameEntity.java
+++ b/src/main/java/emu/grasscutter/game/entity/GameEntity.java
@@ -52,8 +52,8 @@ public abstract class GameEntity {
public abstract void initAbilities();
- public int getEntityType() {
- return this.getId() >> 24;
+ public EntityType getEntityType() {
+ return EntityIdType.toEntityType(this.getId() >> 24);
}
public abstract int getEntityTypeId();
diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java
index 0244d652d..34c6bda44 100644
--- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java
+++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java
@@ -14,6 +14,8 @@ import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo;
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo;
+import emu.grasscutter.scripts.constants.EventType;
+import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp;
import emu.grasscutter.utils.Utils;
@@ -57,6 +59,13 @@ public final class GadgetGatherObject extends GadgetContent {
GameItem item = new GameItem(itemData, 1);
player.getInventory().addItem(item, ActionReason.Gather);
+ getGadget()
+ .getScene()
+ .getScriptManager()
+ .callEvent(
+ new ScriptArgs(
+ getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId()));
+
getGadget()
.getScene()
.broadcastPacket(
diff --git a/src/main/java/emu/grasscutter/game/props/EntityIdType.java b/src/main/java/emu/grasscutter/game/props/EntityIdType.java
index 7d546dbb9..4c333bad9 100644
--- a/src/main/java/emu/grasscutter/game/props/EntityIdType.java
+++ b/src/main/java/emu/grasscutter/game/props/EntityIdType.java
@@ -1,5 +1,8 @@
package emu.grasscutter.game.props;
+import java.util.HashMap;
+import java.util.Map;
+
public enum EntityIdType {
AVATAR(0x01),
MONSTER(0x02),
@@ -12,10 +15,27 @@ public enum EntityIdType {
private final int id;
+ private static final Map map = new HashMap<>();
+
+ static {
+ map.put(EntityIdType.AVATAR.getId(), EntityType.Avatar);
+ map.put(EntityIdType.MONSTER.getId(), EntityType.Monster);
+ map.put(EntityIdType.NPC.getId(), EntityType.NPC);
+ map.put(EntityIdType.GADGET.getId(), EntityType.Gadget);
+ map.put(EntityIdType.REGION.getId(), EntityType.Region);
+ map.put(EntityIdType.WEAPON.getId(), EntityType.Equip);
+ map.put(EntityIdType.TEAM.getId(), EntityType.Team);
+ map.put(EntityIdType.MPLEVEL.getId(), EntityType.MPLevel);
+ }
+
EntityIdType(int id) {
this.id = id;
}
+ public static EntityType toEntityType(int entityId) {
+ return map.getOrDefault(entityId, EntityType.None);
+ }
+
public int getId() {
return id;
}
diff --git a/src/main/java/emu/grasscutter/game/props/EntityType.java b/src/main/java/emu/grasscutter/game/props/EntityType.java
index cf06ebae5..63e4240cf 100644
--- a/src/main/java/emu/grasscutter/game/props/EntityType.java
+++ b/src/main/java/emu/grasscutter/game/props/EntityType.java
@@ -75,6 +75,7 @@ public enum EntityType implements IntValueEnum {
Screen(64),
EchoShell(65),
UIInteractGadget(66),
+ Region(98),
PlaceHolder(99);
private static final Int2ObjectMap map = new Int2ObjectOpenHashMap<>();
diff --git a/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java b/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java
index 46a5ccf15..0a4139b1e 100644
--- a/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java
+++ b/src/main/java/emu/grasscutter/game/quest/content/ContentFinishPlot.java
@@ -1,10 +1,10 @@
package emu.grasscutter.game.quest.content;
+import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_PLOT;
+
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.*;
-import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_PLOT;
-
@QuestValueContent(QUEST_CONTENT_FINISH_PLOT)
public class ContentFinishPlot extends BaseContent {
@Override
diff --git a/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java b/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java
index 157b65337..ba2fafb58 100644
--- a/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java
+++ b/src/main/java/emu/grasscutter/game/quest/content/ContentNotFinishPlot.java
@@ -1,10 +1,10 @@
package emu.grasscutter.game.quest.content;
+import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_NOT_FINISH_PLOT;
+
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.*;
-import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_NOT_FINISH_PLOT;
-
@QuestValueContent(QUEST_CONTENT_NOT_FINISH_PLOT)
public class ContentNotFinishPlot extends BaseContent {
@Override
@@ -13,6 +13,6 @@ public class ContentNotFinishPlot extends BaseContent {
var talkData = quest.getMainQuest().getTalks().get(params[0]);
var subQuest = quest.getMainQuest().getChildQuestById(params[0]);
return (talkData == null && subQuest != null || condition.getParamStr().equals(paramStr))
- && condition.getParam()[0] == params[0];
+ && condition.getParam()[0] == params[0];
}
}
diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java
index 6f46aaae0..bf459cb4d 100644
--- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java
+++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java
@@ -629,7 +629,7 @@ public class SceneScriptManager {
getScene().getEntities().values().stream()
.filter(
e ->
- e.getEntityType() == EntityType.Avatar.getValue()
+ e.getEntityType() == EntityType.Avatar
&& region.getMetaRegion().contains(e.getPosition()))
.toList();
entities.forEach(region::addEntity);
@@ -644,6 +644,7 @@ public class SceneScriptManager {
.trace("Call EVENT_ENTER_REGION_{}", region.getMetaRegion().config_id);
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_ENTER_REGION, region.getConfigId())
+ .setEventSource(EntityType.Avatar.getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(targetId));
@@ -660,6 +661,7 @@ public class SceneScriptManager {
if (region.entityHasLeft()) {
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_LEAVE_REGION, region.getConfigId())
+ .setEventSource(EntityType.Avatar.getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(region.getFirstEntityId()));
@@ -810,8 +812,7 @@ public class SceneScriptManager {
.stream()
.filter(
t ->
- !t.getCondition().isEmpty()
- && t.getCondition().substring(29).equals(String.valueOf(params.param1))
+ t.getName().substring(13).equals(String.valueOf(params.param1))
&& (t.getSource().isEmpty()
|| t.getSource().equals(params.getEventSource())))
.collect(Collectors.toSet());
diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java
index dd975f6a3..f967d3101 100644
--- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java
+++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java
@@ -18,6 +18,7 @@ import emu.grasscutter.game.quest.enums.QuestContent;
import emu.grasscutter.game.quest.enums.QuestState;
import emu.grasscutter.game.world.SceneGroupInstance;
import emu.grasscutter.net.proto.EnterTypeOuterClass;
+import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.constants.GroupKillPolicy;
import emu.grasscutter.scripts.data.SceneGroup;
@@ -152,18 +153,17 @@ public class ScriptLib {
logger.debug("[LUA] Call SetWorktopOptions with {}", printTable(table));
var callParams = this.callParams.getIfExists();
var group = this.currentGroup.getIfExists();
- if(callParams == null || group == null){
+ if (callParams == null || group == null) {
return 1;
}
var configId = callParams.param1;
var entity = getSceneScriptManager().getScene().getEntityByConfigId(configId);
-
- int[] worktopOptions = new int[table.length()];
- for(int i = 1 ;i<=table.length() ;i++){
+ var worktopOptions = new int[table.length()];
+ for (int i = 1; i<=table.length(); i++) {
worktopOptions[i-1] = table.get(i).optint(-1);
}
- if(!(entity instanceof EntityGadget gadget)|| worktopOptions.length == 0){
+ if (!(entity instanceof EntityGadget gadget) || worktopOptions.length == 0) {
return 2;
}
@@ -172,9 +172,11 @@ public class ScriptLib {
}
worktop.addWorktopOptions(worktopOptions);
-
- var scene = getSceneScriptManager().getScene();
- scene.broadcastPacket(new PacketWorktopOptionNotify(gadget));
+ var scene = this.getSceneScriptManager().getScene();
+ // Done in order to synchronize with addEntities in Scene.class.
+ synchronized (this.getSceneScriptManager().getScene()) {
+ scene.broadcastPacket(new PacketWorktopOptionNotify(gadget));
+ }
return 0;
}
@@ -401,7 +403,7 @@ public class ScriptLib {
val old = variables.getOrDefault(var, value);
variables.put(var, value);
- getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old));
+ getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old).setEventSource(var));
return 0;
}
@@ -416,7 +418,7 @@ public class ScriptLib {
variables.put(var, old + value);
logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
old, old+value);
- getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old));
+ getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old).setEventSource(var));
return LuaValue.ZERO;
}
@@ -609,6 +611,11 @@ public class ScriptLib {
logger.debug("[LUA] Call CreateGadget with {}",
printTable(table));
var configId = table.get("config_id").toint();
+ //TODO: figure out what creating gadget configId 0 does
+ if (configId == 0){
+ Grasscutter.getLogger().warn("Tried to CreateGadget with config_id 0: {}", printTable(table));
+ return 0;
+ }
var group = getCurrentGroup();
@@ -703,7 +710,7 @@ public class ScriptLib {
return EntityType.None.getValue();
}
- return entity.getEntityType();
+ return entity.getEntityType().getValue();
}
public int GetQuestState(int entityId, int questId){
@@ -738,11 +745,11 @@ public class ScriptLib {
val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId);
- if(entity == null || entity.getEntityType() != entityType){
+ if(entity == null || entity.getEntityType().getValue() != entityType){
return 1;
}
- getSceneScriptManager().getScene().removeEntity(entity);
+ getSceneScriptManager().getScene().removeEntity(entity, VisionType.VISION_TYPE_REMOVE);
return 0;
}
@@ -816,17 +823,17 @@ public class ScriptLib {
//TODO implement
return 0;
}
- public int IsPlayerAllAvatarDie(int sceneUid){
+ public boolean IsPlayerAllAvatarDie(int sceneUid){
logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid);
- var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityIdType.AVATAR.getId()).toList();
+ var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityType.Avatar).toList();
for (GameEntity p : playerEntities){
var player = (EntityAvatar)p;
if(player.isAlive()){
- return 0;
+ return false;
}
}
//TODO check
- return 1;
+ return true;
}
public int sendShowCommonTipsToClient(String title, String content, int closeTime) {
@@ -862,6 +869,11 @@ public class ScriptLib {
//TODO implement var6 object has int success, int fail, bool fail_on_wipe
return 0;
}
+ public int StopChallenge(int var1, int var2){
+ logger.warn("[LUA] Call unimplemented StopChallenge with {} {}", var1, var2);
+ //TODO implement
+ return 0;
+ }
public int CreateEffigyChallengeMonster(int var1, int[] var2){
logger.warn("[LUA] Call unimplemented CreateEffigyChallengeMonster with {} {}", var1, var2);
//TODO implement