import { _decorator, Component, game } from 'cc'; import { BattleData } from '../battle/BattleData'; import { DataSystem } from '../core/data/DataSystem'; import { Http, HttpMethod } from '../core/net/Http'; import { HttpSystem } from '../core/net/HttpSystem'; import { ISJSB } from '../data/jsb/platform'; import { UserData } from '../data/UserData'; import { UserHeroData } from '../hero/UserHeroData'; const { ccclass, property, requireComponent } = _decorator; /** * GM工具 * @author 袁浩 */ @ccclass('GM') export class GM extends Component { private static thisObject: GM; public start() { GM.thisObject = this; game.addPersistRootNode(this.node);//常驻节点 let doAction = async (userID: number, cmdStr: string) => { let cmdList = cmdStr.split(/\s/); cmdList[0] = cmdList[0] || ""; cmdList[1] = cmdList[1] || ""; cmdList[2] = cmdList[2] || ""; cmdList[3] = cmdList[3] || ""; let cmd = cmdList[0].toLowerCase(); let key = cmdList[1]; let action = cmdList[2].toLowerCase(); let value = cmdList[3]; if (cmd == "log") { switch (key) { case "battle"://打印战斗日志 let length = this.battleLogs.length; if (action) { length = parseInt(action); } let logstr = ""; for (let i = this.battleLogs.length - length; i < this.battleLogs.length; i++) { const log = this.battleLogs[i]; logstr += (log + "\n"); } console.log(logstr); break; case "http"://开启关闭网络请求日志 HttpSystem.useDebugLog = !HttpSystem.useDebugLog; console.log(`网络请求日志${HttpSystem.useDebugLog ? '开启' : '关闭'}`); break; default: this.query(userID, cmdStr); break; } } else if (cmd == "skill") { switch (key) { case "clearcd": if (action == "sel") { console.log(`当前技能冷却可清除次数:${localStorage.getItem("ClearCdNum") || 3}`); } else if (action == "set") { localStorage.setItem("ClearCdNum", (parseInt(value) || 0) + "") console.log(`当前技能冷却可清除次数:${(parseInt(value) || 0)}`); } else if (action == "add") { let num = parseInt(localStorage.getItem("ClearCdNum") || "0"); num += parseInt(value); localStorage.setItem("ClearCdNum", num + ""); console.log(`当前技能冷却可清除次数:${num}`); } break; default: break; } } else if (cmd == "game") { if (key == "pause") { game.pause(); } else if (key == "resume") { game.resume(); } else if (key == "step") { if (!action) { game.step(); } else { let length = parseInt(action); for (let index = 0; index < length; index++) { game.step(); } } } } else { this.query(userID, cmdStr); } } globalThis.gm = (cmd: string) => { let userID = DataSystem.getData(UserData).id; if (!userID) { return "请先登录!"; } else if (cmd == "help") { console.log(` 目前共支持如下命令: 通用命令: log: 说明:日志相关功能 参数:battle、http 动作支持:无 示例:log battle 100(显示最近100条战斗日志)、log http(网络请求日志开启/关闭)、log day 0(显示服务器今日时间戳)、log day -1(显示服务器昨日时间戳)、log now(显示服务器当前时间戳) game: 说明:暂停/恢复游戏 参数:pause、resume、step 动作支持:无 示例:game pause、game resume、game step、game step 10(运行10帧) 游戏相关命令: user: 说明:设置用户数据 参数:money(粮草)、diamond(元宝)、bonus(红包币)、prestige(威望)、id(玩家编号)、camp(所属阵营)、level(当前正在战斗的关卡) 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) hero: 说明:设置英雄 参数:英雄编号 动作支持:add(增加)、remove(减少)、sel(查询) herochip: 说明:设置英雄碎片 参数:英雄编号 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) recruittimes: 说明:设置每日招募剩余次数 参数:单抽还是十连抽,1、10 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) bank: 说明:设置存钱罐数据 参数:bonus(红包币)、lastTime(最后一次领取时间,时间戳,秒) 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) drawtimes: 说明:设置每日抽奖剩余次数 参数:free、video(免费次数、视频次数) 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) task: 说明:设置任务相关数据 参数:lastTime(任务数据最后一次更新时间)、active(活跃度)、yesterdayRewardNum(昨天的奖励数量(红包币)) 动作支持:add(增加)、set(设置)、remove(减少)、sel(查询) 示例:gm("user money set 100")、gm("hero 111001 add") `); } else { doAction(userID, cmd); } return `执行 ${cmd}`; } } private async query(userID: number, cmdStr: string) { let http = this.getComponent(Http) || this.addComponent(Http); http.useLog = false; let result = await http.send("/api/td_jj/gm", { node: "tool", userID: userID, cmd: cmdStr }, HttpMethod.GET, false, false); if (result) { console.log(result.data.message); switch (result.cmd) { case "user": let userData = DataSystem.getData(UserData); if (result.data.action != "sel") { userData[result.data.key] = result.data.value; let battleData = DataSystem.getData(BattleData); battleData && (battleData.mission = userData.level); } break; case "hero": if (result.data.action != "sel") { http.useLog = true; DataSystem.getData(UserHeroData).pull(http); } break; case "herochip": if (result.data.action != "sel") { http.useLog = true; DataSystem.getData(UserHeroData).pull(http); } break; case "bank": break; default: break; } } } private battleLogs: string[] = []; private addBattleLog(log: string): void { this.battleLogs.push(log); } public static addBattleLog(log: string) { if (!ISJSB()) { GM.thisObject.addBattleLog(log); } } }