You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
12 KiB
367 lines
12 KiB
|
1 week ago
|
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;
|
||
|
|
}
|