import { assetManager, Button, color, sys } from 'cc'; import { Label } from 'cc'; import { EventTouch } from 'cc'; import { instantiate } from 'cc'; import { EditBox } from 'cc'; import { _decorator, Component, Node } from 'cc'; import { Prefab } from 'cc'; import { isValid } from 'cc'; import { GBundle, GPath, UIID } from './ConfigRes'; import { UILayer } from '../../mx/module/ui/UIManager'; import { ItemNumType, OtherDataType, StatisticsType } from './GameData'; import { GEvent } from '../../mx/module/event/GEvent'; import { TableNames } from './ConfigTableData'; import { BattleType, ChapterDataManager, ChapterDifficulty } from '../manager/ChapterDataManager'; import { IBattleSkill } from '../ui/BattleGame/BattleDataManager'; import MTools from '../../mx/tools/MTools'; import { LangType } from '../../mx/module/lang/Lang'; import { sdkConfig } from '../sdk/sdkConfig'; const { ccclass, property } = _decorator; @ccclass('GM') export class GM extends Component { static Instance: GM; static ShowGM = false; static show() { this.ShowGM = !this.ShowGM; if (GM.Instance && isValid(GM.Instance.node)) { GM.Instance.node.active = this.ShowGM; return; } if (this.ShowGM) { void this._showAsync(); } } private static async _showAsync(): Promise { if (GM.Instance && isValid(GM.Instance.node)) { GM.Instance.node.active = this.ShowGM; return; } const res = await gg.res.getNodeAsync(GPath.UIPrefab, 'gm', GBundle.First); if (!res?.isValid) { console.warn('[GM] gm prefab 加载失败'); return; } if (GM.Instance && isValid(GM.Instance.node)) { gg.res.putNode(res); GM.Instance.node.active = this.ShowGM; return; } gg.ui.showNode(res, UILayer.DeBug); GM.Instance = res.getComponent(GM); if (GM.Instance) GM.Instance.node.active = this.ShowGM; } @property(EditBox) eb_prama: EditBox; @property(Node) ui_quickBtns: Node; @property(Node) ui_paramBtns: Node; @property(Node) ui_help: Node; @property(Label) lb_help: Label; content: Node; btnGM: Node; btnClear: Button; btnClose: Button; btnHelp: Button; protected onLoad(): void { this.content = this.node.find("content"); this.btnGM = this.node.find("btnGM"); this.btnClear = this.content.find("ui_content/ui_head/btnClear").getComponent(Button); this.btnClose = this.content.find("ui_content/ui_head/btnClose").getComponent(Button); this.btnHelp = this.content.find("ui_content/ui_head/btnHelp").getComponent(Button); } protected onEnable(): void { this.btnGM.on(Button.EventType.CLICK, this.onOpenGM, this); this.btnClear.node.on(Button.EventType.CLICK, this.onClear, this); this.btnClose.node.on(Button.EventType.CLICK, this.onClose, this); this.btnHelp.node.on(Button.EventType.CLICK, this.onHelp, this); this.ui_help.on(Button.EventType.CLICK, this.onHelpUI, this); this.btnGM.active = false; this.onOpenGM(); this.initBtnEvents(); this.lb_help.string = this._helpStr; this.ui_help.active = false; } protected onDisable(): void { this.btnGM.off(Button.EventType.CLICK, this.onOpenGM, this); this.btnClear.node.off(Button.EventType.CLICK, this.onClear, this); this.btnClose.node.off(Button.EventType.CLICK, this.onClose, this); this.btnHelp.node.off(Button.EventType.CLICK, this.onHelp, this); this.ui_help.off(Button.EventType.CLICK, this.onHelpUI, this); this.ui_quickBtns.children.map(x => x.off(Node.EventType.TOUCH_END, this.onQuickBtnClick, this)); this.ui_paramBtns.children.map(x => x.off(Node.EventType.TOUCH_END, this.onParamBtnClick, this)); } initBtnEvents() { for (let i = 0; i < this.quickBtns.length; i++) { let btn: Node = null; if (i < this.ui_quickBtns.children.length) btn = this.ui_quickBtns.children[i]; else btn = instantiate(this.ui_quickBtns.children[0]); btn.active = true; btn.name = this.quickBtns[i]; btn.setParent(this.ui_quickBtns); btn.getComponentInChildren(Label).string = this.quickBtns[i]; btn.getComponentInChildren(Label).outlineColor = color().fromHEX(this.colors[i % this.colors.length]); btn.on(Node.EventType.TOUCH_END, this.onQuickBtnClick, this); } for (let i = 0; i < this.paramBtns.length; i++) { let btn = null; if (i < this.ui_paramBtns.children.length) btn = this.ui_paramBtns.children[i]; else btn = instantiate(this.ui_paramBtns.children[0]); btn.active = true; let [name, desc] = this.paramBtns[i].split("|"); btn.name = name; btn.setParent(this.ui_paramBtns); btn.getChildByName("lb1").getComponent(Label).string = name; btn.getChildByName("lb1").getComponent(Label).outlineColor = color().fromHEX(this.colors[i % this.colors.length]); btn.getChildByName("lb2").getComponent(Label).string = "参数:" + desc; btn.on(Node.EventType.TOUCH_END, this.onParamBtnClick, this); } this.scheduleOnce(() => { this.refreshparamBtns() }, 1) } refreshparamBtns() { // for (let i = 0; i < this.ui_paramBtns.children.length; i++) { let btn = this.ui_paramBtns.children[i]; if (btn.name == "设置金钱") { let myMoney = gg.data.getItemNum(ItemNumType.money) btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myMoney; } else if (btn.name == "设置体力") { let myEnergy = gg.data.getItemNum(ItemNumType.vigour) btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myEnergy; } else if (btn.name == "设置钻石") { let myDiamond = gg.data.getItemNum(ItemNumType.diamond) btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myDiamond; } else if (btn.name == "设置关卡解锁") { let maxChapter = gg.data.doc.chapter btn.getChildByName("lb2").getComponent(Label).string = "参数:" + maxChapter; } else if (btn.name == "设置玩家局内血量") { let myHp = gg.game.playerHp btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myHp; } else if (btn.name == "关卡初始银币") { let initSilver = gg.game.playerCoinNum btn.getChildByName("lb2").getComponent(Label).string = "参数:" + initSilver; } else if (btn.name == "关卡怪物倍数") { let initMonsterNum = gg.game.monsterNumScale btn.getChildByName("lb2").getComponent(Label).string = "参数:" + initMonsterNum; } else if (btn.name == "设置玩家武器") { let myWeapon = gg.game.playerWeaponIdArray.join("|") btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myWeapon; } else if (btn.name == "设置玩家技能") { //技能的id gg.game.playerSkillIdArray let mySkill = "" for (let i = 0; i < gg.game.playerSkillIdArray.length; i++) { mySkill = mySkill + gg.game.playerSkillIdArray[i].id + '|' } btn.getChildByName("lb2").getComponent(Label).string = "参数:" + mySkill; } else if (btn.name == "设置玩家技能组") { let mySkillGroup = '' for (let i = 0; i < gg.game.playerSkillGroupIdArray.length; i++) { let groupList = gg.game.playerSkillGroupIdArray[i] for (let j = 0; j < groupList.length; j++) { if (j == groupList.length - 1) { mySkillGroup = mySkillGroup + groupList[j].id + '|' } else { mySkillGroup = mySkillGroup + groupList[j].id + ',' } } } btn.getChildByName("lb2").getComponent(Label).string = "参数:" + mySkillGroup; } else if (btn.name == "设置玩家武器组") { let myWeaponGroup = '' for (let i = 0; i < gg.game.playerWeaponGroupIdArray.length; i++) { let groupList = gg.game.playerWeaponGroupIdArray[i] for (let j = 0; j < groupList.length; j++) { if (j == groupList.length - 1) { myWeaponGroup = myWeaponGroup + groupList[j].weaponid + '|' } else { myWeaponGroup = myWeaponGroup + groupList[j].weaponid + ',' } } } btn.getChildByName("lb2").getComponent(Label).string = "参数:" + myWeaponGroup; }else if(btn.name == "设置倍速"){ btn.getChildByName("lb2").getComponent(Label).string = "参数:" + gg.game.tetriGameSpeed; }else if(btn.name == "设置怪物的攻击和血量百分比"){ btn.getChildByName("lb2").getComponent(Label).string = "参数:" + gg.game.monsterAttackPercent*100 + '%'; }else if(btn.name == "设置无重力墙权重值"){ btn.getChildByName("lb2").getComponent(Label).string = "参数:" + gg.game.noGravityWallProbability; } } } onClear() { gg.ui.closeAllPanel(); GEvent.Ins.emit(GEvent.GameRestart); gg.game.reset('GM重置'); } onOpenGM() { this.content.active = true; this.btnGM.active = false; } onHelp() { this.ui_help.active = !this.ui_help.active; } onHelpUI() { this.ui_help.active = false; } onClose() { GM.show(); // this.content.active = false; // this.btnGM.active = true; } isShowFps = true; colors = ["#21F018", "#05DBF8", "#EF9EFF", "#FFFF00", "#FFE09E", "#E8FF9E", "#47CA14", "#3CDCF1", "#E0FF00", "#20FA80"]; quickBtns = [ "关卡障碍物关闭", "关卡障碍物开启", "关卡怪物倍数清除", "清除血量和障碍物", '清除副本次数难度全开', "今日首次登录(每日重置)", "复制存档", "设置武器等级", "设置武器和技能", '设置方块手指释放处掉落', '设置关卡不出怪' ]; paramBtns = [ "设置金钱|金币数量", "设置体力|体力数量", "设置钻石|钻石数量", "设置关卡解锁|关卡解锁", "设置玩家局内血量|血量数量", "设置玩家等级|玩家等级", "关卡初始银币|银币数量", '设置玩家存档|设置玩家存档', "设置无重力墙权重值|越大越容易出现无重力墙", "设置倍速|最高3倍", "设置怪物的攻击和血量百分比|攻击和血量" ]; onQuickBtnClick(event: EventTouch) { switch (event.target.name) { case "关闭广告": gg.sdk.showAd = false; break; case "显示广告": gg.sdk.showAd = true; break; case "关卡障碍物关闭": gg.game.isShowObstacle = false; break; case "关卡障碍物开启": gg.game.isShowObstacle = true; break; case "关卡怪物倍数清除": gg.game.monsterNumScale = 1; break; case "玩家技能清除": gg.game.playerSkillIdArray = []; break; case "玩家武器清除": gg.game.playerWeaponIdArray = []; break; case "清除血量和障碍物": gg.game.playerHp = 0; gg.game.playerCoinNum = 0; break; case "清除玩家技能组和武器组": gg.game.playerSkillGroupIdArray = []; gg.game.playerWeaponGroupIdArray = []; gg.game.setPlayerWeaponGroupIdArray = false; gg.game.setPlayerSkillGroupIdArray = false; break; case "清除副本次数难度全开": //BoxChallengeCount gg.data.setStatistics(StatisticsType.BoxChallengeCount, 0) //抽卡挑战模式 gg.data.setStatistics(StatisticsType.gachaChallengeModeCount, 0) gg.data.setStatistics(StatisticsType.InfiniteChallengeCount, 0) //道具挑战次数 gg.data.setStatistics(StatisticsType.PropChallengeCount, 0) gg.data.setStatistics(StatisticsType.WeaponChallengeCount, 0) //BoxModelLevel gg.data.setStatistics(StatisticsType.BoxModelLevel, 5) gg.data.setStatistics(StatisticsType.InfiniteModelLevel, 5) gg.data.setStatistics(StatisticsType.PropModelLevel, 5) gg.data.setStatistics(StatisticsType.WeaponModelLevel, 5) //抽卡挑战模式 gg.data.setStatistics(StatisticsType.GachaChallengeModeLevel, 5) //Boss挑战次数 gg.data.setStatistics(StatisticsType.BossChallengeCount, 0) break; case "今日首次登录(每日重置)": gg.data.onFirstLoginToday(); gg.ui.showToast("今日首次登录(每日重置)成功"); GM.show(); break; case "复制存档": let data = JSON.stringify(gg.data.doc); //设置到剪贴板 MTools.CopyTextEvent(data); gg.ui.showToast("复制存档成功"); GM.show(); break; case "中文": gg.lang.Current = LangType.zh; GM.show(); break; case "英文": gg.lang.Current = LangType.en; GM.show(); break; case "打开内购": sdkConfig.isIAPVersion = true; GM.show(); break; case "关闭内购": sdkConfig.isIAPVersion = false; GM.show(); break; case "设置武器和技能": gg.ui.openPanel(UIID.PopGM, { data: 2 }); GM.show(); break; case "设置武器等级": gg.ui.openPanel(UIID.PopGM, { data: 1 }); GM.show(); break; case "设置方块手指释放处掉落": gg.game.isShowBlockDrop = true; break; case "设置关卡不出怪": gg.game.noMonsterShow = true; break; } this.refreshparamBtns() } onParamBtnClick(event: EventTouch) { switch (event.target.name) { case "设置道具数量": let id = Number(this.eb_prama.string.split(' ')[0]); let num = Number(this.eb_prama.string.split(' ')[1]); gg.data.setItemNum(id, num); gg.data.saveToServer(); break; case "设置金钱": gg.data.setItemNum(ItemNumType.money, Number(this.eb_prama.string)); gg.data.saveToServer(); break; case "设置体力": gg.data.setItemNum(ItemNumType.vigour, Number(this.eb_prama.string)); gg.data.saveToServer(); break; case "设置钻石": gg.data.setItemNum(ItemNumType.diamond, Number(this.eb_prama.string)); gg.data.saveToServer(); break; case "设置关卡解锁": gg.data.doc.chapter = Number(this.eb_prama.string); let max = ChapterDataManager.getAllChapterAccount(); if (gg.data.doc.chapter >= max) { gg.data.doc.chapter = max; } for (let i = 0; i < gg.data.doc.chapter - 1; i++) { let chapterId = i + 1; for (let j = 0; j < 3; j++) { let index = j; gg.data.project.setChapterStatus(chapterId, ChapterDifficulty.Normal, index, 1); // gg.data.project.setChapterStatus(chapterId, ChapterDifficulty.Hard, index, 1); // gg.data.project.setChapterStatus(chapterId, ChapterDifficulty.Hell, index, 1); } } gg.data.saveToServer(); break; case "设置玩家局内血量": gg.game.playerHp = Number(this.eb_prama.string); break; case "关卡初始银币": gg.game.playerCoinNum = Number(this.eb_prama.string); break; case "关卡怪物倍数": gg.game.monsterNumScale = Number(this.eb_prama.string); if (gg.game.monsterNumScale <= 0) { gg.game.monsterNumScale = 1; } else if (gg.game.monsterNumScale >= 20) { gg.game.monsterNumScale = 20; } console.log(gg.game.monsterNumScale); break; case "设置玩家武器": let array = this.eb_prama.string.split(","); gg.game.playerWeaponIdArray = array.map((item) => Number(item)); //删除不存在的武器目前武器ID是1到100 let arraynew = [] for (let i = 0; i < gg.game.playerWeaponIdArray.length; i++) { let id = gg.game.playerWeaponIdArray[i]; if (id >= 1 && id <= 100) { //去掉重复的 if (arraynew.indexOf(id) == -1) { arraynew.push(id); } } } gg.game.playerWeaponIdArray = arraynew; console.log(gg.game.playerWeaponIdArray); break; case "设置玩家技能": let array2 = this.eb_prama.string.split(","); gg.game.playerSkillIdArray = array2.map((item) => Number(item)); console.log(gg.game.playerSkillIdArray); let list = gg.data.table.getTableList(TableNames.Skill); //通过id 获取技能配置 // 生成对象 id: 601, type: 1, limit_num: 1 let objArray = [] for (let i = 0; i < gg.game.playerSkillIdArray.length; i++) { let id = gg.game.playerSkillIdArray[i]; //找出技能配置,如果没有这个技能就不加入数组,(如果这个技能的武器不存在也不加入数组之后处理) let skillConfig = list.find((item) => item.id == id); if (skillConfig) { //如果objArray已经有这个id的对象,就查看limit_num的值如果是1不加入,否则limit_num数量加1直到配置的数量上限 if (objArray.find((item) => item.id == skillConfig.id)) { //不添加 } else { let obj: IBattleSkill = { weaponId: skillConfig.weapon, id: skillConfig.id, type: skillConfig.type, limit_num: skillConfig.limit_num, }; objArray.push(obj); } } } gg.game.playerSkillIdArray = objArray console.log(gg.game.playerSkillIdArray); break; case "设置玩家技能组": gg.game.setPlayerSkillGroupIdArray = true; this.setSkillGroup(); break; case "设置玩家武器组": gg.game.setPlayerWeaponGroupIdArray = true; this.setWeaponGroup(); break; case "设置玩家武器升级": break; case "设置玩家等级": let curData = gg.data.getStringData(OtherDataType.UserLevelupData) if (curData == '') { gg.data.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0') curData = '0&10&0&0&0&0&0' } let curDataArray = curData.split('&'); let arrayPlayer = this.eb_prama.string curDataArray[0] = arrayPlayer; curDataArray[1] = (Number(curDataArray[1]) + Number(arrayPlayer)) + ''; curDataArray[2] = (Number(curDataArray[2]) + Number(arrayPlayer) * 10) + ''; curDataArray[3] = (Number(curDataArray[3]) + Number(arrayPlayer) * 50) + ''; gg.data.setStringData(OtherDataType.UserLevelupData, curDataArray.join('&')) GEvent.Ins.emit(GEvent.UpdateCombatPower); break; case "设置玩家存档": if (JSON.parse(this.eb_prama.string)) { gg.data.doc = JSON.parse(this.eb_prama.string); GM.show(); gg.ui.showToast("设置成功"); gg.data["_IsFirstLogin"] = false; gg.game.init(); GEvent.Ins.emit(GEvent.UpdateItemNum); } else { gg.ui.showToast("存档格式错误"); } break; case "设置通关怪物数量": sdkConfig.isDebugFastWinMonsterNum = Number(this.eb_prama.string); break; case "设置无重力墙权重值": if(this.eb_prama.string == ''){ }else{ gg.game.noGravityWallProbability = Number(this.eb_prama.string); } console.log(gg.game.noGravityWallProbability); break; case "设置倍速": if(this.eb_prama.string == ''){ }else{ gg.game.tetriGameSpeed = Number(this.eb_prama.string); if(gg.game.tetriGameSpeed>=3){ gg.game.tetriGameSpeed = 3; }else if(gg.game.tetriGameSpeed<=0){ gg.game.tetriGameSpeed = 1; } } console.log(gg.game.tetriGameSpeed); break; case "设置怪物的攻击和血量百分比": if(this.eb_prama.string == '' ){ }else{ gg.game.monsterAttackPercent = Number(this.eb_prama.string)/100; gg.game.monsterHpPercent = Number(this.eb_prama.string)/100; if(gg.game.monsterAttackPercent<=0){ gg.game.monsterAttackPercent = 1; gg.game.monsterHpPercent = 1; } } console.log(gg.game.monsterAttackPercent,gg.game.monsterHpPercent); break; } gg.data.saveLocal(); this.refreshparamBtns() } setWeaponGroup() { let array3 = this.eb_prama.string.split(","); let array33 = [] let array333 = [] //一维数组改二维数组, 3个一组,不足三个补齐三个 for (let i = 0; i < array3.length; i++) { if (Number(array3[i]) >= 1 && Number(array3[i]) <= 100) { array333.push(Number(array3[i])); if (i % 3 == 2) { if (array333.length == 3) { array33.push(array333); } array333 = [] } } } let allList = gg.data.project.getWeaponDataList() let objArray = [] for (let i = 0; i < array33.length; i++) { let objArray2 = [] let array = array33[i]; for (let j = 0; j < array.length; j++) { let id = array[j]; let obj = allList.find((item) => item.weaponid == id); if (obj) { objArray2.push(obj); } } if (objArray2.length == 3) { objArray.push(objArray2); } } gg.game.playerWeaponGroupIdArray = objArray; console.log(gg.game.playerWeaponGroupIdArray); } setSkillGroup() { let array4 = this.eb_prama.string.split(","); let array44 = [] let array333 = [] //一维数组改二维数组, 3个一组,不足三个补齐三个 for (let i = 0; i < array4.length; i++) { array333.push(Number(array4[i])); if (i % 3 == 2) { array44.push(array333); array333 = [] } } console.log(array44); let list44 = gg.data.table.getTableList(TableNames.Skill); //把数组id变成对象 // let obj = {}; // obj["id"] = skillConfig.id; // obj["type"] = skillConfig.type; // obj["limit_num"] = skillConfig.limit_num; // objArray.push(obj); let objArray2 = [] for (let i = 0; i < array44.length; i++) { let array333 = array44[i]; let objArray = [] for (let j = 0; j < array333.length; j++) { let id = array333[j]; let skillConfig = list44.find((item) => item.id == id); if (skillConfig) { let obj = {}; obj["id"] = skillConfig.id; obj["type"] = skillConfig.type; obj["limit_num"] = skillConfig.limit_num; objArray.push(obj); } } if (objArray.length == 3) { objArray2.push(objArray); } } gg.game.playerSkillGroupIdArray = objArray2; console.log(gg.game.playerSkillGroupIdArray); } private _helpStr = `GM 工具帮助说明: 一、快速按钮功能 1. 加10万金钱:直接给角色增加10万金钱 2. 下一任务:完成当前任务并关闭GM界面 3. 显示FPS-隐藏FPS:切换FPS显示状态 4. 暂停秒赚:暂停秒赚功能 5. 恢复秒赚:恢复秒赚功能 6. 关闭广告:禁用广告显示 7. 显示广告:启用广告显示 8. 删除仅存本地数据:清空仅存储在本地的数据 二、参数按钮功能及参数格式 1. 设置金钱:输入单个数值,如 "1000" 可设置金钱数量 2. 增加道具:输入格式 "道具ID 数量",如 "1001 5" 表示增加ID为1001的道具5个 3. 跳转指定任务:输入任务ID,如 "5" 可跳转到ID为5的任务 4. 播放剧情:输入剧情ID,如 "3" 可播放ID为3的剧情 5. 激活产业:输入产业ID,如 "2" 可激活ID为2的产业 6. 设置产业等级:输入格式 "产业ID 等级",如 "3 5" 表示设置ID为3的产业等级为5 7. 设置产业星级:输入格式 "产业ID 星级",如 "4 3" 表示设置ID为4的产业星级为3 8. 播放引导剧情:输入引导剧情ID,如 "1" 可播放ID为1的引导剧情 9. 设置宣传关卡:输入格式 "宣传类型 关卡等级",如 "1 2" 表示设置宣传类型1的关卡为2 10. 设置产业关卡:输入格式 "产业类型 关卡等级",如 "2 3" 表示设置产业类型2的关卡为3 使用方法: 1. 在编辑框输入对应参数 2. 点击相应功能按钮执行操作 `; }