marineparkclient/assets/script/Model/ProxyNetDataMgr.ts
2023-08-15 11:09:12 +08:00

292 lines
13 KiB
TypeScript

import httpManager from '../../common/net/httpManager';
import { baseproto } from '../../common/net/pb/pbBase';
import { MsgGameStruct } from '../../common/net/protobufUtil';
import { StringToUint8Array as stoU8, Uint8ArrayToString, Uint8ArrayToString as utoStr } from '../../common/net/CovertUtil';
import { EventCenter } from '../../common/ui/uiEv/EventCenter';
import gameCfg from '../config/gameCfg';
import { MSG_Event } from '../DefineMsg/LogicMsg';
import { hallproto, tokenproto } from '../netPb/protobundle';
import DataManager from './data/DataManager';
import { buffType, fileCfgType, funcExpression, singInCfg } from './data/excelDefine';
import AccountManager from './data/AccountManager';
import { baseObj, objType, valueObj } from './data/baseObject';
import { Propbuff, PropCatch, PropLeaveUp, PropSignIn, propType, PropUnlock } from './data/propObject';
import ProxyClientDataMgr from './ProxyClientDataMgr';
/**
* 模型层
* 数据代理类
*/
export default class ProxyNetDataMgr {
private static instance: any;
public static ins(): ProxyNetDataMgr
{
this.instance = this.instance || new ProxyNetDataMgr()
return this.instance
}
gameNetHttp = new httpManager("game")//http
saveGameData:hallproto.CMD_GAMEINFO = hallproto.CMD_GAMEINFO.create();
getDataFromHttp(jsName:string,func:Function,param?:any)
{
let url = gameCfg.cfgUrl+"config/"+jsName
httpManager.getNormal(url,(respTxt)=>{
func(respTxt,jsName,param)
})
}
//预加载配置
downConfig()
{
let downCfgIdx = 1
let downMax = 6
function callBack(data:any,file:string,type?:any){
if(data)
{
if(type)
DataManager.ins().readConfigToObj(data,type)
downCfgIdx += 1
cc.sys.localStorage.setItem(file,data);
EventCenter.emit(MSG_Event.ReadStartCfg,downCfgIdx,downMax)
}
}
this.getDataFromHttp("express.txt",callBack,fileCfgType.ruleFunc)
this.getDataFromHttp("level.txt",callBack,fileCfgType.level)
this.getDataFromHttp("obj.txt",callBack,fileCfgType.obj)
this.getDataFromHttp("sale.txt",callBack,fileCfgType.sale)
this.getDataFromHttp("unlock.txt",callBack,fileCfgType.unlock)
//签到
this.getDataFromHttp("signIn.json",callBack)
}
//错误消息事件
checkMsgResp(resp:MsgGameStruct,mainId:number)
{
if(resp.mainId==-1)
EventCenter.emit(MSG_Event.Net_ERRO,"接受的数据不完整,请升级版本")
else if(resp.mainId==-2)
EventCenter.emit(MSG_Event.Net_ERRO,"网络相应超时,没有获取到登录数据")
else if(resp.mainId == 0)//包体错误
EventCenter.emit(MSG_Event.Net_ERRO,utoStr(resp.msgBody))
else if(resp.mainId==mainId)
return true;
return false;
}
//根据数据设置玩家数据
setUserGameInfoByData(info:hallproto.CMD_GAMEINFO)
{
let curGameInfo = AccountManager.ins().getGameInfo()
//设置资产信息
for(let idx=0;idx<info.meansData.length;++idx)
{
let meansDt = info.meansData[idx]
if(meansDt.id && meansDt.prop)
{
let obj = curGameInfo.findMeans(meansDt.id)//找到道具
if(!obj)continue;
let unlockProp = obj.getPropByType(propType.unlock)
let levelProp = obj.getPropByType(propType.level) as PropLeaveUp
if(obj.getObjType()==objType.value && meansDt.prop.num)
(obj as valueObj).setCount(<number>meansDt.prop.num);
if(unlockProp)//解锁参数
{
(unlockProp as PropUnlock).setUnLock(meansDt.prop.bUnlock);
(unlockProp as PropUnlock).setFee(meansDt.prop.unlockfee)
}
if(levelProp)//等级
{
levelProp.setLevel(meansDt.prop.level) ;
let buffProp = obj.getPropByType(propType.buff) as Propbuff
//当前buff
let exData = DataManager.ins().getLevelCfgByIdLv(meansDt.id,meansDt.prop.level);
if(exData&&exData._buff)
{
let jsonData = exData._buff
let idFun = <funcExpression>jsonData._idFun;//解锁条件id
if(idFun==funcExpression.addBuffCoinNum || idFun==funcExpression.addBuffCoinPer)
{
let num = 0
if (jsonData._param[0] instanceof Object)//excelJson,表达式
num = curGameInfo.m_gameFun.doExpressDecode(curGameInfo,jsonData._param[0],meansDt.id) as number
else
num = jsonData._param[0]
let bufftp = idFun ==funcExpression.addBuffCoinNum ? buffType.base:buffType.ratio
if(buffProp)
buffProp.setBuff(bufftp,num)
}
}
}
let ableCathes = meansDt.prop.catchFishes;
if(ableCathes && ableCathes.length>0)//可捕获
{
let catchProp = obj.getPropByType(propType.catch)
if(!catchProp)
{
obj.addProp(new PropCatch())
catchProp = obj.getPropByType(propType.catch)
}
for(let idj=0;idj<ableCathes.length;++idj)
{
(catchProp as PropCatch).addAbleId(ableCathes[idj])
}
}
}
}
}
//获取uid//微信的uid
getGameToken()
{
let gameToken = cc.sys.localStorage.getItem("gameToken")
if(!gameToken)//没有账号
{
//请求微信的授权登录uid
let wxUid = cc.sys.localStorage.getItem("gameUuid")
if (!wxUid)
{
let uuidTemp = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
wxUid = uuidTemp.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
cc.sys.localStorage.setItem("gameUuid",wxUid)
}
/////////////////////////////////////////////////////////////
EventCenter.emit(MSG_Event.Net_LoadingBegin)
let dataMsg = tokenproto.CMD_C2S_CLIENTINFO.create({uuid:wxUid})
let netMsg = tokenproto.CMD_C2S_CLIENTINFO.encode(dataMsg).finish()
this.gameNetHttp.setUrlPort(gameCfg.tokenUrl,"/token")
this.gameNetHttp.sendPostPbMessage(baseproto.ENUM_MAIN_ID.TOKEN_ID,tokenproto.ENUM_C2S_ID.TOKEN_BY_CLIENT,netMsg,(resp:MsgGameStruct)=>{
EventCenter.emit(MSG_Event.Net_LoadingEnd)
if(this.checkMsgResp(resp,baseproto.ENUM_MAIN_ID.TOKEN_ID))//获取到token
{
let tokenMsg = tokenproto.CMD_S2C_TOKEN_INFO.decode(resp.msgBody)
cc.sys.localStorage.setItem("gameToken",tokenMsg.tokenStr)
AccountManager.ins().initGameInfo()
EventCenter.emit(MSG_Event.Net_Token)
}
});
}
else
{
AccountManager.ins().initGameInfo()
EventCenter.emit(MSG_Event.Net_Token)
}
}
//获取游戏数据
getGameData()
{
let gameData = cc.sys.localStorage.getItem("gameData")
if(!gameData)//没有本地数据
{
EventCenter.emit(MSG_Event.Net_LoadingBegin)
//请求服务器上的数据
let gameToken = cc.sys.localStorage.getItem("gameToken")
this.gameNetHttp.setUrlPort(gameCfg.hallUrl,"/hall")
this.gameNetHttp.setTokenStr(gameToken)
/////////////////////////////////////////////////////////////
console.log("askGameData:"+gameCfg.hallUrl)
//this.gameNetHttp.setUrlPort(gameCfg.tokenUrl,"login")
this.gameNetHttp.sendPostPbMessage(baseproto.ENUM_MAIN_ID.HALL_ID,hallproto.ENUM_C2S_ID.GET_GAMEINFO,null,(resp:MsgGameStruct)=>{
EventCenter.emit(MSG_Event.Net_LoadingEnd)
if(this.checkMsgResp(resp,baseproto.ENUM_MAIN_ID.HALL_ID))//获取到token
{
if(resp.subId == hallproto.ENUM_S2C_ID.USERINFO_RESP)
{
ProxyNetDataMgr.ins().saveGameData = hallproto.CMD_GAMEINFO.decode(resp.msgBody)
let sInData = ProxyNetDataMgr.ins().saveGameData.singInData
if(!sInData)//没有签到属性
ProxyNetDataMgr.ins().saveGameData.singInData = hallproto.SingInData.create({weekOnetime:0,singInlist : []})
this.setUserGameInfoByData(ProxyNetDataMgr.ins().saveGameData)
cc.sys.localStorage.setItem("gameData",JSON.stringify(ProxyNetDataMgr.ins().saveGameData))//utoStr(resp.msgBody))
EventCenter.emit(MSG_Event.Net_GameData)
ProxyClientDataMgr.ins().unlockLevelUpDefault()//默认升级解锁
ProxyClientDataMgr.ins().startParkFee()
ProxyClientDataMgr.ins().goFishing()
}
}
});
}
else
{
ProxyNetDataMgr.ins().saveGameData = JSON.parse(gameData)
if(!ProxyNetDataMgr.ins().saveGameData.singInData)//没有签到属性
ProxyNetDataMgr.ins().saveGameData.singInData = hallproto.SingInData.create({weekOnetime:0,singInlist : []})
this.setUserGameInfoByData(ProxyNetDataMgr.ins().saveGameData)
EventCenter.emit(MSG_Event.Net_GameData)
ProxyNetDataMgr.ins().sendLocalGameDataToServer()
ProxyClientDataMgr.ins().unlockLevelUpDefault()//默认升级解锁
ProxyClientDataMgr.ins().startParkFee()
ProxyClientDataMgr.ins().goFishing()
}
}
//获取签到信息
getSingInInfo(){
let url = "http://"+gameCfg.hallUrl+"/hall?serverTm=0"
httpManager.getNormal(url,function(resp){
let serverTm = Number(resp)//服务器当前时间戳
let cfgSignIn = cc.sys.localStorage.getItem("signIn.json")
if(!cfgSignIn)
{
let desp = "读取签到配置错误,请重新登录更新配置"
console.log(desp)
EventCenter.emit(MSG_Event.TipsNormal,desp)
}
else
{
if(!resp)//没有获取到时间
{
let desp = "时间获取失败,请检测网络"
console.log(desp)
EventCenter.emit(MSG_Event.TipsNormal,desp)
return
}
cc.sys.localStorage.setItem("serverTime",resp)
//处理配置
let curGameInfo = AccountManager.ins().getGameInfo()
if(!curGameInfo)return;
let signInProp = curGameInfo.getPropByType(propType.signIn) as PropSignIn
let curdt = new Date()
curdt.setTime(serverTm)
signInProp.reset(curdt.getFullYear(),curdt.getMonth(),curdt.getDate())//当前年月日
let gameData = ProxyNetDataMgr.ins().saveGameData
let dataSignIn = gameData.singInData//签到数据
let jsData = JSON.parse(cfgSignIn)
for (const weekDay in jsData) {
signInProp.setReward(jsData[weekDay].id,jsData[weekDay].type,jsData[weekDay].reward,jsData[weekDay].desp)
}
if(dataSignIn)
signInProp.setSignInInfo(dataSignIn.weekOnetime as number,dataSignIn.singInlist)
EventCenter.emit(MSG_Event.Net_RespSignIn)
}
})
}
//保存到服务器
sendLocalGameDataToServer(){
this.gameNetHttp.setUrlPort(gameCfg.hallUrl,"/hall")
let gameToken = cc.sys.localStorage.getItem("gameToken")
this.gameNetHttp.setTokenStr(gameToken)
/////////////////////////////////////////////////////////////
console.log("sendLocalGameDataToServer:"+gameCfg.hallUrl)
let sendUint8 = hallproto.CMD_GAMEINFO.encode(ProxyNetDataMgr.ins().saveGameData).finish()
this.gameNetHttp.sendPostPbMessage(baseproto.ENUM_MAIN_ID.HALL_ID,hallproto.ENUM_C2S_ID.UPTO_GAMEINFO,sendUint8,(resp:MsgGameStruct)=>{
if(resp.mainId>0)
console.log("告诉服务器保存成功")
else if(resp.mainId==0)
console.log(utoStr(resp.msgBody))
else
console.log("网络相应超时 或者数据结构不正确")
});
}
}