/// <summary> /// 读取字节流(简版) /// </summary> protected override void toReadBytesSimple(BytesReadStream stream) { base.toReadBytesSimple(stream); this.clientVersion = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.clientVersion.readBytesSimple(stream); }
/// <summary> /// 读取字节流(简版) /// </summary> protected override void toReadBytesSimple(BytesReadStream stream) { this.loginInfo = (ClientLoginServerInfoData)stream.readDataSimpleNotNull(); if (stream.readBoolean()) { this.version = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.version.readBytesSimple(stream); } else { this.version = null; } if (stream.readBoolean()) { int areasLen = stream.readLen(); if (this.areas != null) { this.areas.clear(); this.areas.ensureCapacity(areasLen); } else { this.areas = new IntObjectMap <AreaClientData>(areasLen); } IntObjectMap <AreaClientData> areasT = this.areas; for (int areasI = areasLen - 1; areasI >= 0; --areasI) { AreaClientData areasV; if (stream.readBoolean()) { areasV = (AreaClientData)stream.readDataSimpleNotNull(); } else { areasV = null; } areasT.put(areasV.areaID, areasV); } } else { this.areas = null; } this.lastAreaID = stream.readInt(); if (stream.readBoolean()) { this.gameInfo = (ClientLoginServerInfoData)stream.readDataSimpleNotNull(); } else { this.gameInfo = null; } }
/// <summary> /// 回池 /// </summary> protected override void toRelease(DataPool pool) { this.loginInfo = null; this.version = null; this.areas = null; this.lastAreaID = 0; this.gameInfo = null; }
/// <summary> /// 读取字节流(完整版) /// </summary> protected override void toReadBytesFull(BytesReadStream stream) { base.toReadBytesFull(stream); stream.startReadObj(); this.clientVersion = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.clientVersion.readBytesFull(stream); stream.endReadObj(); }
private void hotfixNext(ClientVersionData vData) { //读取cdn版本 ResourceInfoControl.loadCDNVersion(vData.currentResourceVersion, sData => { //计算更新量 ResourceInfoControl.countNewVersionSize(sData, _versionRe); //只有配置 if (_versionRe.isOnlyConfig) { ResourceInfoControl.mergeVersion(sData); doVersionNext(false, () => { if (GameC.main != null) { //热更配置 GameC.main.reloadConfig(); GameC.main.hotfixOver(); } }); } //返回登录界面开始热更 else { VersionSaveData localVersionData = ResourceInfoControl.getVersion(); _downloadSize = StringUtils.toMBString(_versionRe.size); //需要强制更新 if (localVersionData.resourceVersion < vData.leastResourceVersion) { //更新资源选择,这里是在游戏内,必须弹窗确认 showAlert(Alert_GetNewResourceMust, () => { doHotFix(sData); }, exitGame); } else { //更新资源选择,这里是在游戏内,必须弹窗确认 showAlert(Alert_GetNewResource, () => { doHotFix(sData); }, () => { if (GameC.main != null) { GameC.main.hotfixOver(); } }); } } }); }
/** 客户端版本更新(true:为不需要更新) */ public bool clientHotfix(ClientVersionData vData) { if (ShineSetting.debugJumpResourceVersion || ShineSetting.localLoadWithOutBundle) { return(true); } //已处理过 if (_versionData != null && vData != null && _versionData.currentResourceVersion >= vData.currentResourceVersion) { return(true); } VersionSaveData localVersionData = ResourceInfoControl.getVersion(); if (vData == null) { Ctrl.log("离线游戏 或 服务器无此版本2"); vData = new ClientVersionData(); vData.version = localVersionData.version; vData.currentAppVersion = localVersionData.appVersion; // _versionData.leastAppVersion=localVersionData.currentAppVersion; vData.currentResourceVersion = localVersionData.resourceVersion; } _versionData = vData; if (!ShineSetting.isRelease) { return(true); } else { //最低app版本不足 if (localVersionData.appVersion < _versionData.leastAppVersion) { showAlert(Alert_GetNewAppMust, toGetNewApp, exitGame); return(false); } //有新的app if (localVersionData.appVersion < _versionData.currentAppVersion) { showAlert(Alert_GetNewApp, toGetNewApp, () => { hotfixNext(vData); }); return(false); } hotfixNext(vData); return(false); } }
/// <summary> /// Get info on all clients that are in the region /// </summary> /// <returns></returns> public List <ClientVersionData> GetClientVersions() { List <ClientVersionData> clients = new List <ClientVersionData>(); List <string> retStr = GD.Query("", "", "stats_session_data", "count(distinct region_id) as regcnt"); if (retStr.Count == 0) { return(clients); } int totalregions = totalregions = Convert.ToInt32(retStr[0]); int totalclients = 0; if (totalregions > 1) { retStr = GD.QueryFullData(" group by region_id, client_version order by region_id, count(*) desc;", "stats_session_data", "region_id, client_version, count(*) as cnt, avg(avg_sim_fps) as simfps"); for (int i = 0; i < retStr.Count; i += 4) { ClientVersionData udata = new ClientVersionData(); udata.region_id = UUID.Parse(retStr[i]); udata.version = retStr[i + 1]; udata.count = int.Parse(retStr[i + 2]); udata.fps = Convert.ToSingle(retStr[i + 3]); clients.Add(udata); } } else { retStr = GD.QueryFullData(" group by region_id, client_version order by region_id, count(*) desc;", "stats_session_data", "region_id, client_version, count(*) as cnt, avg(avg_sim_fps) as simfps"); for (int i = 0; i < retStr.Count; i += 4) { ClientVersionData udata = new ClientVersionData(); udata.region_id = UUID.Parse(retStr[i]); udata.version = retStr[i + 1]; udata.count = int.Parse(retStr[i + 2]); udata.fps = Convert.ToSingle(retStr[i + 3]); clients.Add(udata); totalclients += udata.count; } } return(clients); }
/// <summary> /// 读取字节流(简版) /// </summary> protected override void toReadBytesSimple(BytesReadStream stream) { if (stream.readBoolean()) { this.version = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.version.readBytesSimple(stream); } else { this.version = null; } this.redirectURL = stream.readUTF(); }
/// <summary> /// 复制(潜拷贝) /// </summary> protected override void toShadowCopy(BaseData data) { if (!(data is ClientLoginResultData)) { return; } ClientLoginResultData mData = (ClientLoginResultData)data; this.loginInfo = mData.loginInfo; this.version = mData.version; this.areas = mData.areas; this.lastAreaID = mData.lastAreaID; this.gameInfo = mData.gameInfo; }
/// <summary> /// 复制(潜拷贝) /// </summary> protected override void toShadowCopy(BaseData data) { if (!(data is ClientVersionData)) { return; } ClientVersionData mData = (ClientVersionData)data; this.type = mData.type; this.leastAppVersion = mData.leastAppVersion; this.currentAppVersion = mData.currentAppVersion; this.leastResourceVersion = mData.leastResourceVersion; this.currentResourceVersion = mData.currentResourceVersion; this.version = mData.version; }
/// <summary> /// 读取字节流(完整版) /// </summary> protected override void toReadBytesFull(BytesReadStream stream) { stream.startReadObj(); if (stream.readBoolean()) { this.version = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.version.readBytesFull(stream); } else { this.version = null; } this.redirectURL = stream.readUTF(); stream.endReadObj(); }
/** 获取版本号成功(有可能返回空) */ public void onGetVersionSuccess(ClientVersionData vData, string redirectURL) { _getVersionSended = false; _versionData = vData; //有值 if (!string.IsNullOrEmpty(redirectURL)) { //重定向url LocalSetting.loginHttpURL = redirectURL; //再次发送 sendGetVersion(); } else { SystemControl.netChangeFunc -= onNetChanged; _stepTool.completeStep(GetVersion); } }
protected virtual void stepLoadResource() { if (ShineSetting.debugJumpResourceVersion || ShineSetting.localLoadWithOutBundle) { versionUpdateOver(); return; } //本地版本数据 VersionSaveData localVersionData = ResourceInfoControl.getVersion(); //离线游戏 或 服务器无此版本 if (_versionData == null) { Ctrl.log("离线游戏 或 服务器无此版本"); _versionData = new ClientVersionData(); _versionData.version = localVersionData.version; _versionData.currentAppVersion = localVersionData.appVersion; // _versionData.leastAppVersion=localVersionData.currentAppVersion; _versionData.currentResourceVersion = localVersionData.resourceVersion; // _versionData.leastResourceVersion=localVersionData.leastResourceVersion; doVersionNext(true); return; } //最低app版本不足 if (localVersionData.appVersion < _versionData.leastAppVersion && ShineSetting.isRelease) { showAlert(Alert_GetNewAppMust, toGetNewApp, exitGame); return; } //有新的app if (localVersionData.appVersion < _versionData.currentAppVersion && ShineSetting.isRelease) { showAlert(Alert_GetNewApp, toGetNewApp, () => { continueCurrentApp(localVersionData); }); return; } continueCurrentApp(localVersionData); }
/// <summary> /// 是否数据一致 /// </summary> protected override bool toDataEquals(BaseData data) { ClientVersionData mData = (ClientVersionData)data; if (this.type != mData.type) { return(false); } if (this.leastAppVersion != mData.leastAppVersion) { return(false); } if (this.currentAppVersion != mData.currentAppVersion) { return(false); } if (this.leastResourceVersion != mData.leastResourceVersion) { return(false); } if (this.currentResourceVersion != mData.currentResourceVersion) { return(false); } if (this.version != mData.version) { return(false); } return(true); }
/// <summary> /// 读取字节流(完整版) /// </summary> protected override void toReadBytesFull(BytesReadStream stream) { stream.startReadObj(); BaseData loginInfoT = stream.readDataFullNotNull(); if (loginInfoT != null) { if (loginInfoT is ClientLoginServerInfoData) { this.loginInfo = (ClientLoginServerInfoData)loginInfoT; } else { this.loginInfo = new ClientLoginServerInfoData(); if (!(loginInfoT.GetType().IsAssignableFrom(typeof(ClientLoginServerInfoData)))) { stream.throwTypeReadError(typeof(ClientLoginServerInfoData), loginInfoT.GetType()); } this.loginInfo.shadowCopy(loginInfoT); } } else { this.loginInfo = null; } if (stream.readBoolean()) { this.version = (ClientVersionData)stream.createData(ClientVersionData.dataID); this.version.readBytesFull(stream); } else { this.version = null; } if (stream.readBoolean()) { int areasLen = stream.readLen(); if (this.areas != null) { this.areas.clear(); this.areas.ensureCapacity(areasLen); } else { this.areas = new IntObjectMap <AreaClientData>(areasLen); } IntObjectMap <AreaClientData> areasT = this.areas; for (int areasI = areasLen - 1; areasI >= 0; --areasI) { AreaClientData areasV; if (stream.readBoolean()) { BaseData areasVT = stream.readDataFullNotNull(); if (areasVT != null) { if (areasVT is AreaClientData) { areasV = (AreaClientData)areasVT; } else { areasV = new AreaClientData(); if (!(areasVT.GetType().IsAssignableFrom(typeof(AreaClientData)))) { stream.throwTypeReadError(typeof(AreaClientData), areasVT.GetType()); } areasV.shadowCopy(areasVT); } } else { areasV = null; } } else { areasV = null; } areasT.put(areasV.areaID, areasV); } } else { this.areas = null; } this.lastAreaID = stream.readInt(); if (stream.readBoolean()) { BaseData gameInfoT = stream.readDataFullNotNull(); if (gameInfoT != null) { if (gameInfoT is ClientLoginServerInfoData) { this.gameInfo = (ClientLoginServerInfoData)gameInfoT; } else { this.gameInfo = new ClientLoginServerInfoData(); if (!(gameInfoT.GetType().IsAssignableFrom(typeof(ClientLoginServerInfoData)))) { stream.throwTypeReadError(typeof(ClientLoginServerInfoData), gameInfoT.GetType()); } this.gameInfo.shadowCopy(gameInfoT); } } else { this.gameInfo = null; } } else { this.gameInfo = null; } stream.endReadObj(); }
/// <summary> /// 复制(深拷贝) /// </summary> protected override void toCopy(BaseData data) { if (!(data is ClientLoginResultData)) { return; } ClientLoginResultData mData = (ClientLoginResultData)data; if (mData.loginInfo != null) { this.loginInfo = (ClientLoginServerInfoData)mData.loginInfo.clone(); } else { this.loginInfo = null; nullObjError("loginInfo"); } if (mData.version != null) { this.version = (ClientVersionData)BytesControl.createData(ClientVersionData.dataID); this.version.copy(mData.version); } else { this.version = null; } if (mData.areas != null) { if (this.areas != null) { this.areas.clear(); this.areas.ensureCapacity(mData.areas.size()); } else { this.areas = new IntObjectMap <AreaClientData>(mData.areas.size()); } IntObjectMap <AreaClientData> areasT = this.areas; if (!mData.areas.isEmpty()) { AreaClientData[] areasVValues = mData.areas.getValues(); for (int areasVI = areasVValues.Length - 1; areasVI >= 0; --areasVI) { AreaClientData areasV = areasVValues[areasVI]; if (areasV != null) { AreaClientData areasU; if (areasV != null) { areasU = (AreaClientData)areasV.clone(); } else { areasU = null; } areasT.put(areasU.areaID, areasU); } } } } else { this.areas = null; } this.lastAreaID = mData.lastAreaID; if (mData.gameInfo != null) { this.gameInfo = (ClientLoginServerInfoData)mData.gameInfo.clone(); } else { this.gameInfo = null; } }
/// <summary> /// 回池 /// </summary> protected override void toRelease(DataPool pool) { base.toRelease(pool); this.clientVersion = null; }