292 lines
13 KiB
TypeScript
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("网络相应超时 或者数据结构不正确")
|
|
});
|
|
}
|
|
|
|
} |