Bläddra i källkod

【功能】背景音乐和消除音效添加

mojunshou 7 månader sedan
förälder
incheckning
1df071e022

BIN
assets/bundle/common/audios/bgm.mp3


+ 14 - 0
assets/bundle/common/audios/bgm.mp3.meta

@@ -0,0 +1,14 @@
+{
+  "ver": "1.0.0",
+  "importer": "audio-clip",
+  "imported": true,
+  "uuid": "823a3999-4c5e-490d-8f57-bb5b3eb0a73f",
+  "files": [
+    ".json",
+    ".mp3"
+  ],
+  "subMetas": {},
+  "userData": {
+    "downloadMode": 0
+  }
+}

BIN
assets/bundle/common/audios/eliminate.mp3


+ 14 - 0
assets/bundle/common/audios/eliminate.mp3.meta

@@ -0,0 +1,14 @@
+{
+  "ver": "1.0.0",
+  "importer": "audio-clip",
+  "imported": true,
+  "uuid": "241b1952-df73-4999-a18f-d5062371b047",
+  "files": [
+    ".json",
+    ".mp3"
+  ],
+  "subMetas": {},
+  "userData": {
+    "downloadMode": 0
+  }
+}

+ 7 - 42
assets/bundle/gui/eliminate/eliminate.prefab

@@ -8332,7 +8332,7 @@
     "fileId": "73oZ8ZhqJGBI++XkOlV678"
   },
   {
-    "__type__": "cc.Button",
+    "__type__": "8d645yObX1FvJfk2sbi0rxp",
     "_name": "",
     "_objFlags": 0,
     "__editorExtras__": {},
@@ -8343,49 +8343,14 @@
     "__prefab": {
       "__id__": 342
     },
-    "clickEvents": [],
-    "_interactable": true,
-    "_transition": 3,
-    "_normalColor": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_hoverColor": {
-      "__type__": "cc.Color",
-      "r": 211,
-      "g": 211,
-      "b": 211,
-      "a": 255
-    },
-    "_pressedColor": {
-      "__type__": "cc.Color",
-      "r": 255,
-      "g": 255,
-      "b": 255,
-      "a": 255
-    },
-    "_disabledColor": {
-      "__type__": "cc.Color",
-      "r": 124,
-      "g": 124,
-      "b": 124,
-      "a": 255
-    },
-    "_normalSprite": null,
-    "_hoverSprite": null,
-    "_pressedSprite": null,
-    "_disabledSprite": null,
-    "_duration": 0.1,
-    "_zoomScale": 1.2,
-    "_target": null,
+    "once": false,
+    "interval": 1000,
+    "effect": null,
     "_id": ""
   },
   {
     "__type__": "cc.CompPrefabInfo",
-    "fileId": "fegyrkZA5FWKq5304vFMZX"
+    "fileId": "a3K0KTnztBkIqRZFhBZyoA"
   },
   {
     "__type__": "cc.PrefabInfo",
@@ -12602,8 +12567,8 @@
     "lab_addScore": {
       "__id__": 263
     },
-    "autoBtn": {
-      "__id__": 341
+    "autoBtnNode": {
+      "__id__": 324
     },
     "doubleSpeedBtn": {
       "__id__": 361

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 1464
assets/bundle/gui/eliminate/prefab/popup/VerifyPopup.prefab


+ 0 - 13
assets/bundle/gui/eliminate/prefab/popup/VerifyPopup.prefab.meta

@@ -1,13 +0,0 @@
-{
-  "ver": "1.1.50",
-  "importer": "prefab",
-  "imported": true,
-  "uuid": "6ca6d306-4f73-45b3-aa52-7f59d56a1f2a",
-  "files": [
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {
-    "syncNodeName": "VerifyPopup"
-  }
-}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 1585
assets/bundle/gui/eliminate/prefab/popup/wechatPayment.prefab


+ 0 - 13
assets/bundle/gui/eliminate/prefab/popup/wechatPayment.prefab.meta

@@ -1,13 +0,0 @@
-{
-  "ver": "1.1.50",
-  "importer": "prefab",
-  "imported": true,
-  "uuid": "afc1bffe-e3c2-4fbf-b9bc-9559e097da75",
-  "files": [
-    ".json"
-  ],
-  "subMetas": {},
-  "userData": {
-    "syncNodeName": "WechatPayment"
-  }
-}

+ 1 - 1
assets/bundle/gui/eliminate/prefab/redPacketWithdrawal.prefab

@@ -4988,7 +4988,7 @@
         "__id__": 213
       }
     ],
-    "_active": true,
+    "_active": false,
     "_components": [
       {
         "__id__": 219

+ 11 - 6
assets/script/game/common/manager/ADHandler.ts

@@ -2,7 +2,7 @@
  * @Author: mojunshou 1637302775@qq.com
  * @Date: 2025-04-11 10:14:44
  * @LastEditors: mojunshou 1637302775@qq.com
- * @LastEditTime: 2025-04-25 10:00:57
+ * @LastEditTime: 2025-04-25 15:27:07
  * @Description: 
  */
 // ADHandler.ts
@@ -128,22 +128,27 @@ export class ADHandler {
         smc.game.GameModel.isShowAd = false;
         console.log("[广告] 激励视频关闭", state)
         smc.game.GameModel.isDone = state;
-        if (smc.game.GameModel.viewType != "" && smc.game.GameModel.viewType != "pass_reward") {
-            oops.message.dispatchEvent(GameEvent.updateGameState, "playing");
-        }
         if (state) {
+            //看完了可以领取奖励
+            ServerHandler.inst.getVideorReward();
             if (smc.game.GameModel.viewType === "speed_reward") {
                 //直接成功-增加时长
                 oops.message.dispatchEvent(GameEvent.DoubleSpeedOpenSuccess);
                 smc.game.GameModel.viewType = "";
-                return;
             }
             //如果是复活,分数减半
             if (smc.game.GameModel.viewType === "revive_reward") {
+                smc.game.GameModel.viewType = "";
                 oops.message.dispatchEvent(GameEvent.RestartGame);
             }
-            ServerHandler.inst.getVideorReward();
+        } else {
+            //通关奖励,没看完也能过下一关
+            if (smc.game.GameModel.viewType == "pass_reward") {
+                smc.game.GameModel.viewType = "";
+                ServerHandler.inst.getNextLevel();
+            }
         }
+        oops.message.dispatchEvent(GameEvent.updateGameState, "playing"); //要判断是暂停才可以继续
     };
 }
 window["ADHandler"] = ADHandler;

+ 25 - 4
assets/script/game/common/manager/ServerHandler.ts

@@ -2,7 +2,7 @@
  * @Author: mojunshou 1637302775@qq.com
  * @Date: 2025-04-11 10:16:41
  * @LastEditors: mojunshou 1637302775@qq.com
- * @LastEditTime: 2025-04-25 11:08:49
+ * @LastEditTime: 2025-04-25 15:03:43
  * @Description: 
  */
 // ServerHandler.ts
@@ -74,9 +74,9 @@ export class ServerHandler {
         account.accountName = data.nickname;
         account.headUrl = data.headImgUrl;
         account.isLogined = data.isBand;
-        account.curLevel = data.currentLevelInfo.level;
-        game.curScore = data.currentLevelInfo.score;
-        game.targetScore = data.currentLevelConf.score;
+        account.curLevel = data.currentLevelInfo.level || 0;
+        game.curScore = data.currentLevelInfo.score || 0;
+        game.targetScore = data.currentLevelConf.score || 0;
         game.curLevelConfig = data.currentLevelConf;
         game.costInfo = data.handlingChargeConf;
         game.eventType = data.currentLevelConf.eventType || "";
@@ -335,6 +335,7 @@ export class ServerHandler {
         smc.game.GameModel.changeWxCoin = result.changes['1005'] || 0;
         smc.account.AccountModel.hbCoin = result.props["1004"] || 0;
         smc.account.AccountModel.wxCoin = result.props["1005"] || 0;
+        smc.game.GameModel.skipAdCount = result.props["1008"] || 0;//广告跳过次数
         oops.message.dispatchEvent(GameEvent.showCoinAnimation);
     }
 
@@ -581,6 +582,26 @@ export class ServerHandler {
         // smc.game.GameModel.fee = result.fee;
     }
 
+
+
+    //保存当前关卡信息
+    saveCurLevelInfo() {
+        const param = {
+            url: ProtocolEvent.SaveCurrentLevelInfo,
+            param: {
+                level: smc.account.AccountModel.curLevel,
+                skipCount: smc.game.GameModel.curScore,
+            },
+            callback: this.buildCallback('ServerHandler.inst.onSaveCurLevelInfo', 'ServerHandler.inst.onRequestFail')
+        }
+        this.sendMsgToServer(param);
+    }
+
+    onSaveCurLevelInfo(str: string) {
+        console.log('[服务器] 保存当前关卡信息返回', str);
+        let result = JSON.parse(str);
+    }
+
     onRequestFail(code: number, str: string) {
         console.log('[服务器] 请求失败', code, str);
     }

+ 1 - 2
assets/script/game/view/DoubleRewardsView.ts

@@ -2,7 +2,7 @@
  * @Author: mojunshou 1637302775@qq.com
  * @Date: 2025-03-21 11:57:43
  * @LastEditors: mojunshou 1637302775@qq.com
- * @LastEditTime: 2025-04-25 11:10:04
+ * @LastEditTime: 2025-04-25 15:03:54
  * @Description: 惊喜翻倍弹窗
  */
 import { _decorator, instantiate, Label, Node, Prefab, UITransform } from 'cc';
@@ -84,7 +84,6 @@ export class DoubleRewardsView extends VMParent {
         ADHandler.inst.showAd(AD_TYPE.Double_Close);
         DCHandler.inst.reportData(2000401);
         DCHandler.inst.reportData(2000403);
-        smc.game.GameModel.skipAdCount++;
     }
 
 

+ 76 - 55
assets/script/game/view/EliminateViewComp.ts

@@ -2,7 +2,7 @@
  * @Author: mojunshou 1637302775@qq.com
  * @Date: 2025-03-20 15:01:09
  * @LastEditors: mojunshou 1637302775@qq.com
- * @LastEditTime: 2025-04-25 11:12:46
+ * @LastEditTime: 2025-04-25 16:03:04
  * @Description: 消除游戏主场景
  */
 import { _decorator, Button, Color, EventTouch, instantiate, JsonAsset, v3, Label, Node, Prefab, randomRangeInt, Sprite, tween, UITransform, Vec2, Vec3, Widget } from "cc";
@@ -121,8 +121,8 @@ export class EliminateViewComp extends CCComp {
     @property({ type: Label, displayName: "每次放置添加的分数" })
     private lab_addScore: Label = null!;
 
-    @property({ type: Button, displayName: "自动按钮" })
-    private autoBtn: Button = null!;
+    @property({ type: Node, displayName: "自动按钮节点" })
+    private autoBtnNode: Node = null!;
     //二倍速按钮
     @property({ type: Button, displayName: "二倍速按钮" })
     private doubleSpeedBtn: Button = null!;
@@ -257,16 +257,15 @@ export class EliminateViewComp extends CCComp {
         this.initData();
         this.setData();
         this.addEventList();
-        // smc.account.AccountModel.curLevel = 1;
         if (this.guideStep === 0 && smc.account.AccountModel.curLevel == 1) {
             this.startGuideMode()
         } else {
             this.guideNode.active = false;
             this.initGrid();
         }
-        //更新福利点
         this.updateWelfarePoint();
         DCHandler.inst.reportData(3000005);
+        oops.audio.playMusicLoop("common/audios/bgm");
     }
 
 
@@ -275,7 +274,6 @@ export class EliminateViewComp extends CCComp {
         oops.message.on(GameEvent.DoubleSpeedOpenSuccess, this.doubleSpeedOpenSuccess, this);
         oops.message.on(GameEvent.openView, this.openView, this);
         oops.message.on(GameEvent.showCoinAnimation, this.showCoinAnimation, this);
-        // oops.message.on(GameEvent.Resurrection, this.onResurrection, this);
         oops.message.on(GameEvent.updateHbAndWxCoin, this.updateCoin, this);
         oops.message.on(GameEvent.StartAutoGame, this.startAutoGame, this);
         oops.message.on(GameEvent.updateGameState, this.updateGameState, this);
@@ -288,7 +286,11 @@ export class EliminateViewComp extends CCComp {
                 this.gameState = GameState.PAUSED;
                 break;
             case "playing":
-                this.gameState = GameState.PLAYING;
+                this.scheduleOnce(() => {
+                    if (this.gameState == GameState.PAUSED) {
+                        this.gameState = GameState.PLAYING;
+                    }
+                }, 0.5)
                 break;
         }
     }
@@ -306,16 +308,16 @@ export class EliminateViewComp extends CCComp {
     //初始化按钮状态
     private initButtonState(state: boolean) {
         //自动按钮默认关闭
-        if (this.autoBtn) {
+        if (this.autoBtnNode) {
             //关闭
-            const on = this.autoBtn.node.getChildByName("on");
+            const on = this.autoBtnNode.getChildByName("on");
             on ? on.active = state : null;
-            const off = this.autoBtn.node.getChildByName("off");
+            const off = this.autoBtnNode.getChildByName("off");
             off ? off.active = !state : null;
         }
         //第一关隐藏二倍速和自动放置按钮
         const curLevel = smc.account.AccountModel.curLevel;
-        this.autoBtn.node.active = curLevel > 1;
+        this.autoBtnNode.active = curLevel > 1;
         this.doubleSpeedBtn.node.active = curLevel > 1;
     }
 
@@ -327,7 +329,6 @@ export class EliminateViewComp extends CCComp {
         this.targetScore = 0;
         this.money = 0;
         this.cash = 0;
-        this.autoState = false;
         this.operateFlag = true
         this.shouldResetEliminateCount = true;
         this.currentCombo = 0;
@@ -341,11 +342,11 @@ export class EliminateViewComp extends CCComp {
                 this.eliminateInterval = smc.game.GameModel.curLevelConfig.eliminateScope || [];
             }
         }
-        this.score = smc.game.GameModel.curScore;
-        this.money = smc.account.AccountModel.wxCoin;
-        this.cash = smc.account.AccountModel.hbCoin;
-        this.targetScore = smc.game.GameModel.targetScore;
-        // this.targetScore = 1000;
+        this.gameState = GameState.PLAYING;
+        this.score = smc.game.GameModel.curScore || 0;
+        this.money = smc.account.AccountModel.wxCoin || 0;
+        this.cash = smc.account.AccountModel.hbCoin || 0;
+        this.targetScore = smc.game.GameModel.targetScore || 0;
         this.popupType = smc.game.GameModel.popupType;
         this.lab_score.string = this.score.toString();
         this.lab_wxCoin.string = Format.formatWxCoin(this.money);
@@ -354,9 +355,7 @@ export class EliminateViewComp extends CCComp {
         //金砖数量要加1
         const num = smc.account.AccountModel.goldCoin
         this.lab_goldNum.string = `${num + 1}`;
-        this.gameState = GameState.PLAYING;
         this.randomList = this.getRandomUniqueInts();
-
         const curLevel = smc.account.AccountModel.curLevel;
         DCHandler.inst.reportData(3000500, curLevel);
     }
@@ -370,7 +369,7 @@ export class EliminateViewComp extends CCComp {
 
     //开始自动游戏
     startAutoGame() {
-        this.btn_auto();
+        this.autoGame();
     }
 
 
@@ -1219,28 +1218,8 @@ export class EliminateViewComp extends CCComp {
                 }
 
 
-
-                // 计算放置的格子数量
-                const placedGridCount = this.editingData.gridList.length;
-                // 获取中心位置用于显示分数
-                let centerPos = new Vec3(0, 0, 0);
-                if (this.editingData.gridList.length > 0 && this.editingData.gridList[0].gridNode) {
-                    centerPos = this.editingData.gridList[0].gridNode.getWorldPosition().clone();
-                    if (this.editingData.gridList.length > 1) {
-                        // 计算所有格子的平均位置作为中心点
-                        for (let i = 1; i < this.editingData.gridList.length; i++) {
-                            const gridNode = this.editingData.gridList[i].gridNode;
-                            if (gridNode) {
-                                centerPos.add(gridNode.getWorldPosition());
-                            }
-                        }
-                        const validGridCount = this.editingData.gridList.filter(grid => grid.gridNode).length;
-                        centerPos.x /= validGridCount;
-                        centerPos.y /= validGridCount;
-                    }
-                }
                 // 显示放置得分动画(显示一次,包含总格子数)
-                this.showScoreAnimation(centerPos, placedGridCount);
+                this.showScoreAnimation();
                 // 放置方块到网格
                 this.editingData.gridList.forEach(grid => {
                     grid.status = CellState.FILLED;
@@ -1356,9 +1335,33 @@ export class EliminateViewComp extends CCComp {
     }
 
     // 显示分数增加动画
-    showScoreAnimation(position: Vec3, score: number) {
+    showScoreAnimation() {
         if (!this.lab_addScore) return;
 
+
+        // 计算放置的格子数量
+        const placedGridCount = this.editingData.gridList.length;
+        // 获取中心位置用于显示分数
+        let centerPos = new Vec3(0, 0, 0);
+        if (this.editingData.gridList.length > 0 && this.editingData.gridList[0].gridNode) {
+            centerPos = this.editingData.gridList[0].gridNode.getWorldPosition().clone();
+            if (this.editingData.gridList.length > 1) {
+                // 计算所有格子的平均位置作为中心点
+                for (let i = 1; i < this.editingData.gridList.length; i++) {
+                    const gridNode = this.editingData.gridList[i].gridNode;
+                    if (gridNode) {
+                        centerPos.add(gridNode.getWorldPosition());
+                    }
+                }
+                const validGridCount = this.editingData.gridList.filter(grid => grid.gridNode).length;
+                centerPos.x /= validGridCount;
+                centerPos.y /= validGridCount;
+            }
+        }
+
+        let score = placedGridCount;
+        let position = centerPos
+
         // 计算得分(未消除时的得分)
         const calculatedScore = score * this.placementBaseScore;
 
@@ -1487,7 +1490,6 @@ export class EliminateViewComp extends CCComp {
             const num = this.isDoubleSpeed ? this.doubleNum : 1;
             gridEliminateList.forEach((gridData) => {
                 if (gridData.gridNode?.children[0]) {
-                    // const startPos = gridData.gridNode.getWorldPosition();
                     tween(gridData.gridNode.children[0])
                         .to(0.2 / num, { scale: new Vec3(0.5, 0.5) })
                         .call(() => {
@@ -1497,6 +1499,7 @@ export class EliminateViewComp extends CCComp {
                         .start()
                 }
             })
+            oops.audio.playEffect("common/audios/eliminate")
 
             this.scheduleOnce(() => {
                 // 计算分数:每行/列的基础分 + 每个额外格子的分数
@@ -1531,16 +1534,19 @@ export class EliminateViewComp extends CCComp {
                             const randomNum = randomRangeInt(minNum, maxNum + 1);
                             //这个数可以被总消除次数整除那就可以弹广告
                             if (this.eliminateTotal % randomNum === 0) {
-                                // oops.gui.open(UIID.DoubleSpeed);
                                 //如果有自动就暂停自动
-                                this.gameState = GameState.PAUSED;
-                                if (smc.game.GameModel.skipAdConfig != 1) {
-                                    if (smc.game.GameModel.skipAdCount % smc.game.GameModel.skipAdConfig == 0) {
+                                if (this.autoState) {
+                                    this.gameState = GameState.PAUSED;
+                                }
+                                if (smc.game.GameModel.skipAdConfig != -1) {
+                                    if (smc.game.GameModel.skipAdCount > 0 && smc.game.GameModel.skipAdCount % smc.game.GameModel.skipAdConfig == 0) {
                                         smc.game.GameModel.viewType = "double_reward";
                                         ADHandler.inst.showAd(AD_TYPE.Double_Receive);
                                     } else {
                                         ServerHandler.inst.getDoubleSurprise();
                                     }
+                                } else {
+                                    ServerHandler.inst.getDoubleSurprise();
                                 }
                             }
                         }
@@ -1897,6 +1903,7 @@ export class EliminateViewComp extends CCComp {
     //更新游戏分数
     updateGameScore() {
         this.lab_score.string = this.score.toString();
+        smc.game.GameModel.curScore = this.score;
         if (this.score >= this.targetScore) {
             this.gameState = GameState.GAME_PASS;
             //弹出通关奖励界面
@@ -1971,7 +1978,22 @@ export class EliminateViewComp extends CCComp {
 
 
     //自动放置,不让点击方块
-    private btn_auto() {
+    private btn_auto(event: EventTouch) {
+        //这要有一个tweeen 放大缩小效果
+        // if (this.autoBtnNode) {
+        //     tween(this.autoBtnNode)
+        //         .to(0.1, { scale: v3(1.2, 1.2) })
+        //         .call(() => {
+        //             this.autoBtnNode.scale_x = 1;
+        //             this.autoBtnNode.scale_y = 1;
+        //         })
+        //         .start();
+        // }
+        this.autoGame();
+    }
+
+
+    private autoGame() {
         this.autoState = !this.autoState;
         this.initButtonState(this.autoState);
         if (this.autoState) {
@@ -1997,13 +2019,14 @@ export class EliminateViewComp extends CCComp {
 
     // 执行自动放置
     executeAutoPlace() {
+        console.log("自动放置状态", this.autoState);
+        console.log("当前游戏状态", this.gameState);
         if (!this.autoState || this.gameState !== GameState.PLAYING) {
             return
         }
         const bestPlacement = this.findBestPlacement()
         if (!bestPlacement) {
             // 所有方块都无法放置,游戏结束
-            this.autoState = false;
             this.gameState = GameState.GAME_OVER;
             this.gameOver()
             return
@@ -2145,12 +2168,13 @@ export class EliminateViewComp extends CCComp {
         const originPos = brickData.brickNode.getWorldPosition()
         brickData.brickNode.setParent(this.moveNode)
         brickData.brickNode.setWorldPosition(originPos);
-
+        //显示增加分数
         // 动画放置方块
         tween(brickData.brickNode)
             .to(this.autoMoveTime, { worldPosition: centerPos })
             .call(() => {
                 // ✅ 更新格子状态(像手动放置那样)
+                this.showScoreAnimation();
                 this.editingData.gridList.forEach(gridData => {
                     gridData.status = CellState.FILLED
                     gridData.type = brickData.type;
@@ -2162,13 +2186,11 @@ export class EliminateViewComp extends CCComp {
 
                 // ✅ 补充新的砖块
                 this.addBrick(brickData.index)
-
                 // ✅ 消除检查逻辑保持和手动一致
                 this.scheduleOnce(() => {
                     this.gridEliminate().then(() => {
                         this.prompt(false).then((promptFlag) => {
                             if (!promptFlag) {
-                                this.autoState = false
                                 this.gameOver()
                             }
                         })
@@ -2199,7 +2221,7 @@ export class EliminateViewComp extends CCComp {
             return
         }
         if (!this.autoState) {
-            this.btn_auto();
+            this.autoGame();
             //改按钮状态
             this.autoState = true;
             this.initButtonState(this.autoState);
@@ -2239,7 +2261,7 @@ export class EliminateViewComp extends CCComp {
         this.initData();
         this.setData();
         this.reopenGrid();
-        // this.initButtonState(this.autoState);
+        this.initButtonState(this.autoState);
         this.updateWelfarePoint();
     }
 
@@ -2297,7 +2319,6 @@ export class EliminateViewComp extends CCComp {
         }
     }
 
-
     btn_text() {
         // const param = {
         //     "showReward": [

+ 0 - 21
assets/script/game/view/VerifyView.ts

@@ -1,21 +0,0 @@
-/*
- * @Author: mojunshou 1637302775@qq.com
- * @Date: 2025-03-21 18:43:41
- * @LastEditors: mojunshou 1637302775@qq.com
- * @LastEditTime: 2025-03-21 18:44:05
- * @Description: 第三方安全验证界面
- */
-import { _decorator } from 'cc';
-import { GameComponent } from "db://oops-framework/module/common/GameComponent";
-
-const { ccclass, property } = _decorator;
-
-/** 显示对象控制 */
-@ccclass('VerifyView')
-export class VerifyView extends GameComponent {
-    protected start() {
-
-    }
-
-
-}

+ 0 - 9
assets/script/game/view/VerifyView.ts.meta

@@ -1,9 +0,0 @@
-{
-  "ver": "4.0.24",
-  "importer": "typescript",
-  "imported": true,
-  "uuid": "2d69113f-78cc-4ee2-b15e-3a3d1853a3ba",
-  "files": [],
-  "subMetas": {},
-  "userData": {}
-}