using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sog; using ProtoCSStruct; using LitJson; using Sog.Lang; namespace Game { public static class PlayerUtils { /// /// 在玩牌的玩家不能退出,保证结算的时候玩家在线 /// 进入赛场的玩家也不能退出,保证比赛每张桌子都坐满,没有玩家一直等待 /// /// /// public static bool PlayerCanOffline(PlayerOnGame player) { if (player.BattleID != 0) { return false; } return true; } public static bool UTF8IsContainSpecialChar(string str) { if (str == null || str.Length == 0) { return false; } try { byte[] bytes = Encoding.GetEncoding("utf-8").GetBytes(str); foreach (var b in bytes) { if (UTF8IsStartWithOver3Byte(b)) { return true; } } } catch (Exception e) { TraceLog.Error("PlayerUtils.UTF8IsContainSpecialChar exception {0}" , e.Message); } return false; } //临时代码,判断 是否包含有超过3字节的utf8编码 public static bool UTF8IsStartWithOver3Byte(byte b) { int unsignByte = b; return (0xf0 <= unsignByte && unsignByte <= 0xf7) ||//4字节开头 (0xf8 <= unsignByte && unsignByte <= 0xfb) ||//5字节开头 (0xfc <= unsignByte && unsignByte <= 0xfd);//6字节开头 } public static int CheckRenameValid(string name) { if (name == null) { return -1; } string str = name.Trim(' '); if (string.IsNullOrEmpty(str)) { return -2; } if (name.Length >= 1) { //首尾不能是空格 if (name[0] == ' ' || name[^1] == ' ') { return -3; } } // c#中char是utf-16编码, 长度是2个字节 // utf-16只有2字节, 4字节两种存储格式, 0xD800 ~ 0xDCFF // utf-16编码的字符ToCharArray()后, unicode大于0xFFFF部分会占据4个字节, 从而1个字符string[i]变成2个char foreach (char ch in name) { // 非ascii码范围内的字符都允许, 注意数据库必须设置utf8mb4 // ascii码中符号只允许空格, 字母, 数字, 避免特殊字符触发bug if (ch <= 0xff) { if (ch == 0x20 // 空格 || (ch >= 0x30 && ch <= 0x39) //数字 || (ch >= 0x41 && ch <= 0x5a) //大写字母 || (ch >= 0x61 && ch <= 0x7a) //小写字母 ) { continue; } TraceLog.Trace("PlayerUtils.CheckRenameValid invalid char {0}", ch); return -4; } } //if (UTF8IsContainSpecialChar(name)) //{ // return -8; //} return 0; } public static void OnNewDayStart(PlayerOnGame player, bool notifyClient) { player.Trace("PlayerUtils.OnNewDayStart uid {0}", player.UserID); } public static void MakeQueryRoleResFromPlayer(ref CSQueryRoleRes csroleRes, PlayerOnGame player) { player.RoleData.OtherData.GmLevel = 0; var cfg = GameServerUtils.GetServerConfig(); if (cfg.isAllGM == 1 || (cfg.gmUid != null && cfg.gmUid.Contains(player.UserID))) { player.RoleData.OtherData.GmLevel = 1; } if (player.RoleData.OtherData.ClosePayChanel != cfg.closePayChanel) { player.RoleData.OtherData.ClosePayChanel = cfg.closePayChanel; } csroleRes.RoleBase = player.RoleBase; csroleRes.RoleData = player.RoleData; csroleRes.GagChatEndTime = player.GagChatEndTime; //特殊处理一下,删除不需要发给客户端的数据 csroleRes.UnimportanceData = player.unimportanceData; csroleRes.UnimportanceData.DBBagChangeRecordList.Clear(); // 生成展示属性 csroleRes.PropView.CopyFrom(ref player.RoleData.Knight.PropView); } public static string GetServerCurVersionForPlayer(PlatformType platform) { var servercfg = GameServerUtils.GetServerConfig(); if (servercfg.curVersion.Contains("|")) { var versionSplit = servercfg.curVersion.Split('|'); if (platform == PlatformType.PlatformType_IOS) { return versionSplit[1]; } else { return versionSplit[0]; } } return servercfg.curVersion; } //是否是最新的apk public static bool IsLatestApkVersion(PlayerOnGame player) { PlayerSession playerSession = GameServerUtils.GetPlayerTableOp().GetPlayerSession(player.SessionID); if(playerSession == null) { return false; } if(String.IsNullOrEmpty(playerSession.ApkVersion)) { return false; } string strserverVersion = GetServerCurVersionForPlayer(playerSession.Platform); long playerApk = AppVersion.ToIntVersion(playerSession.ApkVersion); long serverVersion = AppVersion.ToIntVersion(strserverVersion); ushort playerCode = AppVersion.GetCodeFromVersion(playerApk); ushort serverCode = AppVersion.GetCodeFromVersion(serverVersion); if(playerCode >= serverCode) { return true; } return false; } public static string GetPlayerLanguageStr(PlayerOnGame player, string content) { return LanguageUtils.GetLanguageString(content, player.Lang); } // 代币 public static string GetCurrencyJson(PlayerOnGame player) { JsonData currency = new JsonData(); currency[ItemId.Gold] = player.GetGold(); currency[ItemId.Diamond] = player.GetDiamond(); return currency.ToJson(); } //战役进度 public static JsonData GetBattleInfoJson(PlayerOnGame player) { JsonData battleInfo = new JsonData(); return battleInfo; } // 英雄等级TopX //public static bool CheckIsSysUnlock(PlayerOnGame player, SystemUnlockId id) //{ // return IsUnlockSys(player, (int)id); //} //public static bool IsUnlockSys(PlayerOnGame player, int id) //{ // var cfg = GameServerUtils.GetServerConfig(); // if (cfg.bCloseCheckSysUnlock) // { // return true; // } // var desc = UnlockSystemDescMgr.Instance.GetConfig(id); // if (desc == null) // { // return false; // } // int taskId = desc.unlockCondition[0]; // int level = desc.unlockCondition[1]; // bool c1 = taskId == 0 || TaskEXSvc.IsFinishTask(player, taskId); // bool c2 = level == 0 || player.GetLevel() >= level; // return c1 && c2; //} //处理系统解锁 public static void DealSystemeOpenNotify(PlayerOnGame player, bool notifyOpen = true) { } public static void OnSystemUnlock(PlayerOnGame player, ref IDValue32 iv, bool notifyOpen = true) { } public static void GetRoleBaseInfo(PlayerOnGame target, ref RoleBaseInfo roleBaseInfo) { ref DBRoleData roleData = ref target.RoleData; roleBaseInfo.Uid = target.RoleBase.Uid; roleBaseInfo.Level = target.RoleBase.Level; roleBaseInfo.Gender = target.RoleBase.Gender; roleBaseInfo.Icon.SetString(target.RoleBase.Icon.ToString()); roleBaseInfo.Nick.SetString(target.RoleBase.Nick.ToString()); roleBaseInfo.IconFrameId = target.GetIconFrame(); roleBaseInfo.Power = (int)target.RoleBase.Power; } //处理系统解锁 public static void OnVipLevelUpUnlockSystem(PlayerOnGame player) { } //获取战斗版本号 public static int GetPlayerBattleVersion(PlayerOnGame player) { return player.battleVersion; } public static void DealCSRenameReq(PlayerOnGame player, ref CSRenameReq req) { //校验Name SSNameQueryReq ssreq = new SSNameQueryReq(); ssreq.AccountID = player.AccountInfo.AccountID; ssreq.StrName.SetString(req.NewName.GetString()); ssreq.HashName.SetString(HashHelper.SHA1String(ssreq.StrName.GetString())); ssreq.CreateIfNotExist = true; ssreq.PlayerSessionID = player.SessionID; ssreq.RealmId = player.RealmID; //客户端过来的请求 GameServerUtils.GetPacketSender().SendToNameServer((int)SSMsgID.NameQueryReq, ref ssreq, 0); } public static void DealSSRenameReq(PlayerOnGame player, ref SSGmChangeRoleNameReq req) { CSRenameRes res = new CSRenameRes(); res.NewName = req.Name; player.RoleData.OtherData.NewNick = req.Name; player.RoleBase.Nick = req.Name; player.MakeDirty(); //通知world PlayerNotify.NotifyWorldPlayerRolebaseChangeUpdate(player); PlayerNotify.NotifyPlayerShowInfoChange(player); GameServerUtils.GetPlayerDataSvc().UpdateRoleBriefToDB(player); //回应客户端 res.Ret = 0; res.RenameTimes = player.RoleData.OtherData.RenameTimes; player.SendToClient((int)CSGameMsgID.RenameRes, ref res); player.Trace("PlayUtils.DealSSRenameReq player uid {0} rename success newname {1}", player.UserID, req.Name); SSGmChangeRoleNameRes ress = new SSGmChangeRoleNameRes(); ress.Ret = 0; ress.Id = req.Id; ress.Name = req.Name; ress.Uid = req.Uid; GameServerUtils.GetPacketSender().SendToServerByID(GameServerUtils.GetWorldServerID(), (int)SSGameMsgID.GmChangeRoleNameRes, ref ress, player.UserID); } } }