import { _decorator, Component, Node, sys } from 'cc'; import { Singleton } from '../../mx/tools/Singleton'; import MTools from '../../mx/tools/MTools'; import { sdkConfig } from '../sdk/sdkConfig'; import { Monster } from '../ui/BattleGame/Monster'; import { MonsterType } from '../manager/MonsterDataManager'; import { IBattleSkill } from '../ui/BattleGame/BattleDataManager'; import { SkillDataManager } from '../manager/SkillDataManager'; const { ccclass, property } = _decorator; /** * 玩家记录上报 */ export class PlayerRecordReporting extends Singleton { /**测试数据 */ TData: TData = new TData(); /** * 初始化测试数据 * @param level 关卡数 * @param type 游戏类型(0-普通,1-新玩) * @param difficulty 难度 * @param version 版本号 * @param power 关卡推荐战力 * @param playerInfo 玩家信息:[攻击力,暴击率,冷却,战力] * @param weaponInfo 装备的武器信息:[[武器id,武器等级]...] * @param failCount 失败次数 * @param inicoin 初始银币数 */ async initTestData(level: number, type: number, difficulty: number, version: string, power: number, playerInfo: number[], weaponInfo: number[][], failCount: number, inicoin: number) { this.TData.uid = gg.data.doc.uid; if (gg.sdk.pf) { this.TData.uid = await ZYSDK.ZYSDK.getUserId() + ""; } if (sys.isBrowser || this.TData.uid == "") MTools.getStableName().then(name => { this.TData.uid = name; }); this.TData.gid = sdkConfig.config.pointData.gid; this.TData.level = level; this.TData.type = type; this.TData.difficulty = difficulty; this.TData.version = version; this.TData.suggestStrength = power; this.TData.playerStrength = playerInfo[3]; this.TData.playerAttack = playerInfo[0]; this.TData.playerCritRate = playerInfo[1]; this.TData.playerCoolDown = playerInfo[2]; this.TData.playerWeapon = weaponInfo; this.TData.playNum = failCount; this.TData.iniCoin = inicoin; this.TData.content = []; } /**每10秒添加一组测试数据 * @param mo [新出怪物数量,怪物总血量,玩家伤害累计值,新增银币数,场上怪物数量,场上怪物剩余血量之和,第几波,银币剩余数量,障碍物使用个数,移除障碍物个数,雷击次数] * @param pr 出现的武器和技能品质:[[武器id,品质]... ] * @param ad 广告统计,广告类型(0-银币,1-刷新,2-全要,3-再抽) * @param ot [障碍物使用个数,雷击次数] */ private addRecord(mo: number[], pr: TSkill[], ad: number[], rw: number[][]) { let data = new TContent(); data.mo = mo; data.pr = pr; data.ad = ad; data.rw = rw; this.TData.content.push(data); // console.log("每10秒添加的测试数据", data); } /**发送测试数据 * @param result 结局 :0 成功;1 失败;2 重玩;3 退出 * @param time 关卡实际时长(不包含看广告和暂停) * @param onSuccess 发送成功回调 * @param onFail 发送失败回调 */ upToServer(result: number, time: number, onSuccess: Function, onFail: Function) { return; this.TData.result = result; this.TData.playTime = Number(time.toFixed(2)); // 测试数据发送概率 if (!gg.sdk.upTestData) return; // 创建 XMLHttpRequest 对象 const xhr = new XMLHttpRequest(); // 配置请求 //xhr.open('POST', 'https://mmvtest.criver.world/user/submit/record', true); // 自己远程测试 xhr.open('POST', 'https://hkcx.ioe-times.com/api/bfnly/submit/record', true); // 线上版本 //xhr.open('POST', 'http://172.16.50.210:8080/api/bfnly/submit/record', true); // 局域网本地测试 // 设置请求头(如果需要) xhr.setRequestHeader('Content-Type', 'application/json'); // 定义回调函数 xhr.onload = function () { if (xhr.status >= 200 && xhr.status < 300) { // 请求成功 console.log(JSON.parse(xhr.responseText)); //gg.ui.showToast("数据提交成功"); if (onSuccess) onSuccess(); } else { // 请求失败 console.error('请求失败:', xhr.statusText); if (onFail) onFail(); } }; xhr.onerror = function () { console.error('请求出错'); }; let str = JSON.stringify(this.TData); //console.log("发送测试数据", str); // 发送请求 // xhr.send(JSON.stringify({ data: this.timeArray, level: GameManager.Ins.levelDifficulty })); xhr.send(str); } //#region 战斗数据记录相关 /**添加每次刷新技能的数据 */ addSkillRefreshData(type: number, arr: any[], isRefresh: boolean) { return; this.CurentSkillArr = arr; if (type == MonsterType.GoldenBoss) { for (let i = 0; i < arr.length; i++) { let d: ITableWeapon2 = arr[i]; this.CurentSkillPushArr.push([d.weaponid, -1, d.quality, isRefresh ? 1 : 0, 0]); } } else { for (let i = 0; i < arr.length; i++) { if (typeof arr[i] == 'number') { this.CurentSkillPushArr.push([-1, -1, -1, arr[i], isRefresh ? 1 : 0, 0]); continue; } let d: IBattleSkill = arr[i]; let quality = SkillDataManager.getSkillDataById(d.id).quality; this.CurentSkillPushArr.push([d.weaponId, d.id, quality, 0, isRefresh ? 1 : 0, 0]); } } } /**完成技能选择数据 */ finishAddSkillData(selectIndex: number[], refreshCount = 0) { return if (refreshCount > 0) { this.CurentSkillData.va = refreshCount; } for (let i = 0; i < selectIndex.length; i++) { let index = selectIndex[i]; this.CurentSkillPushArr[index][5] = 1; } this.CurentSkillData.ca.push(this.CurentSkillPushArr); } /**添加一次技能选择数据 */ addSkillData(type: number, boxIdex: number = -1) { return; if (boxIdex > 0) { this.BoxIndex += boxIdex; boxIdex = this.BoxIndex; } let t = gg.game.CurentBattle.BattleTime; this.CurentSkillData = new TSkill(); this.CurentSkillData.id = boxIdex; this.CurentSkillData.ty = type; this.CurentSkillData.ci = Number(t.toFixed(2)); this.WeaponSkillQuality.push(this.CurentSkillData); this.CurentSkillPushArr = []; } /**添加战斗记录数据 */ addRecordData() { return; //当前银币数 this.RemainCoinNum = gg.game.CurentBattle.CurentCoinNum; //场上怪物数量(结算 UI 打开时战斗节点可能已销毁,MonsterSpawner 需做空保护) let sp = gg.game.CurentBattle.MonsterSpawner; this.MonsterNum = sp ? sp.getAllMonsterCount() : 0; //场上怪物剩余血量之和 this.MonsterHpTotal = 0; if (sp) { for (let value of sp.getAllMonster()) { let m = value.getComponent(Monster); if (m) this.MonsterHpTotal += m.hp; } } this.CurrentWaveNum = gg.game.CurentBattle.CurentWaveNum; //[新出怪物数量,怪物总血量,玩家伤害累计值,新增银币数,场上怪物数量,场上怪物剩余血量之和,第几波,银币剩余数量,障碍物使用个数,移除障碍物个数,雷击次数] let mo = []; mo.push(this.MonsterAppearNum); mo.push(this.MonsterTotalHp); mo.push(this.PlayerDamageTotal); mo.push(this.NewCoinNum); mo.push(this.MonsterNum); mo.push(this.MonsterHpTotal); mo.push(this.CurrentWaveNum); mo.push(this.RemainCoinNum); mo.push(this.ObstaclesUseNum); mo.push(this.RemoveObstaclesNum); mo.push(this.LightningNum); let mapData = gg.game.CurentBattle.DamageStatistics.getWeaponDamageMap(); mapData.forEach((value, key) => { this.DamageStatistics.push([key, value]); }); let pr = this.WeaponSkillQuality; let ad = this.AdClickNum; let rw = this.DamageStatistics; this.addRecord(mo, pr, ad, rw); this.clearRecordData(); } clearRecordData() { this.MonsterAppearNum = 0; this.MonsterTotalHp = 0; this.PlayerDamageTotal = 0; this.NewCoinNum = 0; this.MonsterNum = 0; this.RemainCoinNum = 0; this.ObstaclesUseNum = 0; this.RemoveObstaclesNum = 0; this.LightningNum = 0; this.WeaponSkillQuality = []; this.AdClickNum = []; this.DamageStatistics = []; } /**宝箱索引 */ BoxIndex = 0; /**怪物出现数量 */ MonsterAppearNum = 0; /**怪物总血量 */ MonsterTotalHp = 0; /**玩家伤害累计值 */ PlayerDamageTotal = 0; /**新增银币数 */ NewCoinNum = 0; /**场上怪物数量 */ MonsterNum = 0; /**场上怪物剩余血量之和 */ MonsterHpTotal = 0; /**当前波数 */ CurrentWaveNum = 0; /**剩余银币数 */ RemainCoinNum = 0; /**障碍物使用个数 */ ObstaclesUseNum = 0; /**障碍物移除个数 */ RemoveObstaclesNum = 0; /**雷击次数 */ LightningNum = 0; /**出现的武器和技能品质*/ WeaponSkillQuality: TSkill[] = []; /**广告统计,广告类型(0-银币,1-刷新,2-全要,3-转盘再抽,4-转盘重抽,5-地图提示,6-复活) */ AdClickNum: number[] = []; /**从开始到此时各武器伤害累计值 [[武器id,伤害累计值]... ] */ DamageStatistics: number[][] = []; /**当前正在记录的技能数据 */ CurentSkillData: TSkill = null; /**当前刷新的技能或者武器数组 */ CurentSkillArr: any[] = []; /**当前刷新的技能处理后的数组 */ CurentSkillPushArr: number[][] = []; //#endregion } /** * 测试数据 */ export class TData { /**测试数据uid */ uid = ""; /**测试数据游戏id */ gid = ""; /**测试数据等级 */ level = 1; /**关卡类型 */ type = 1; /**难度 */ difficulty: number = 0; /**版本号 */ version: string = ""; /**结局 :0 成功;1 失败;2 重玩;3 退出 */ result = 0; /**关卡推荐战力值 */ suggestStrength: number = 0; /**玩家战力值 */ playerStrength: number = 0; /**玩家攻击力 */ playerAttack: number = 0; /*玩家暴击概率*/ playerCritRate: number = 0 /**玩家攻击冷却 */ playerCoolDown: number = 0; /**玩家装备的武器 [[武器id,武器等级]... ] */ playerWeapon: number[][] = []; /**关卡重玩次数 */ playNum = 0; /**关卡时长 */ playTime = 0; /**关卡初始银币数 */ iniCoin: number = 0; /**测试数据内容 (每5秒的数据统计) */ content: TContent[] = []; } export class TContent { /**[新出怪物数量,怪物总血量,玩家伤害累计值,新增银币数,场上怪物数量,场上怪物剩余血量之和,第几波,银币剩余数量,障碍物使用个数,移除障碍物个数,雷击次数] */ mo: number[] = []; /**技能出现与选择数据 */ pr: TSkill[] = []; /**广告统计,广告类型(0-银币,1-刷新,2-全要,3-转盘再抽,4-转盘重抽,5-地图提示,6-复活) */ ad: number[] = []; /**从开始到此时各武器伤害累计值 [[武器id,伤害累计值]... ] */ rw: number[][] = []; } export class TSkill { /**编号:-1无,目前只有宝箱用这个字段存索引 */ id: number = -1; /**类型:0-宝箱,1-转盘,2-boss */ ty: number = 0; /**出现时间 */ ci: number = 0; /**通用参数 */ va: any; /**技能数据 [[[武器id,技能id,品质,银币,是否刷新,是否选择]... ]...] */ ca: number[][][] = []; } /**用户信息 */ export interface IUserInfo { /**玩家昵称 */ nickName: string; /**玩家头像 */ avatarUrl: string; /**性别 */ gender: string; /**国家 */ country: string; /**省份 */ province: string; /**城市 */ city: string; /**语言 */ language: string; }