using System; using System.Text; using UnityEngine; using System.Linq; using System.Xml.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System.Text.RegularExpressions; using System.IO; using vnxbqy.UI; using LitJson; /// /// UI辅助类 /// public static class UIHelper { public static readonly string no_breaking_space = "\u00A0"; //Text文本框输入空格自动换行问题 替换编码 #region UI通用 public static void SetIconWithMoneyType(this Image _image, int moneyType) { if (_image == null) return; string iconKey = StringUtility.Contact("Money_Type_", moneyType); _image.SetSprite(iconKey); } public static void SetSmallIconWithMoneyType(this Image _image, int moneyType) { if (_image == null) return; string iconKey = StringUtility.Contact("SmallMoney", moneyType); _image.SetSprite(iconKey); } /// /// 分离字符串插入空格 /// public static string GetSuitNameByName(string attrName) { string suitStr = ""; for (int i = 0; i < attrName.Length; i++) { if (i != attrName.Length - 1) { if (attrName.Length == 2) { suitStr = StringUtility.Contact(suitStr, attrName[i], " "); } else if (attrName.Length == 3) { suitStr = StringUtility.Contact(suitStr, attrName[i], " "); } else { suitStr = StringUtility.Contact(suitStr, attrName[i]); } } else { suitStr = StringUtility.Contact(suitStr, attrName[i]); } } return suitStr; } // 基于itemColor 下,ColorEx做二级区分 public static void SetItemBackGround(this Image _image, int itemColor, int ColorEx = 0) { if (_image == null) { return; } _image.SetSprite(string.Format("Common_Public_ItemColor{0}{1}", itemColor, ColorEx)); } /// /// 剩余时间 /// /// 格式 年-月-日 小时:分钟:秒 /// 毫秒 /// private static Regex TimeRegex = new Regex(@"([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)", RegexOptions.Singleline); public static int GetSurplusSeconds(string startTime, int seconds) { string start = GetTime(startTime); if (start.Equals(string.Empty)) { return 0; } DateTime s = Convert.ToDateTime(start); DateTime t = s.AddTicks(seconds * TimeSpan.TicksPerSecond); DateTime n = TimeUtility.ServerNow; TimeSpan span = t - n; return Mathf.Max(0, (int)span.TotalSeconds); } public static string GetTime(string startTime) { if (!TimeRegex.IsMatch(startTime)) { return string.Empty; } Match match = TimeRegex.Match(startTime); int year = int.Parse(match.Groups[1].Value); int month = int.Parse(match.Groups[2].Value); int day = int.Parse(match.Groups[3].Value); int h = int.Parse(match.Groups[4].Value); int mi = int.Parse(match.Groups[5].Value); int sc = int.Parse(match.Groups[6].Value); return string.Format("{0}-{1}-{2} {3}:{4}:{5}", year, month, day, h, mi, sc); } /// /// 获取消逝的时间 /// /// /// public static string GetFadeTime(uint lastTime) { DateTime n = TimeUtility.ServerNow; TimeSpan span = n - TimeUtility.GetTime(lastTime); if (span.TotalDays > 1) return Math.Floor(span.TotalDays) + Language.Get("L1074"); else if (span.TotalHours > 1) return Math.Floor(span.TotalHours) + Language.Get("L1072"); else if (span.TotalMinutes > 1) return Math.Floor(span.TotalMinutes) + Language.Get("L1073"); else return 1 + Language.Get("L1073"); } /// /// 根据属性获取玩家数据 /// /// /// public static ulong GetPropertyValue(PropertyType type) { switch (type) { case PropertyType.LV: return PlayerDatas.Instance.baseData.LV; case PropertyType.POWER: return (ulong)PlayerDatas.Instance.baseData.STR; case PropertyType.AGILITY: return (ulong)PlayerDatas.Instance.baseData.PHY; case PropertyType.PHYSIQUE: return (ulong)PlayerDatas.Instance.baseData.CON; case PropertyType.MENTALITY: return (ulong)PlayerDatas.Instance.baseData.PNE; case PropertyType.HP: return PlayerDatas.Instance.extersion.MaxHP; case PropertyType.ATK: return (ulong)PlayerDatas.Instance.extersion.MAXATK; case PropertyType.DEF: return (ulong)PlayerDatas.Instance.extersion.DEF; case PropertyType.HIT: return (ulong)PlayerDatas.Instance.extersion.HIT; case PropertyType.MISS: return (ulong)PlayerDatas.Instance.extersion.Miss; case PropertyType.ATKSPEED: return (ulong)PlayerDatas.Instance.extersion.battleValEx1; case PropertyType.CritChance: return (ulong)PlayerDatas.Instance.extersion.SuperHitRate; case PropertyType.CritHurt: return (ulong)PlayerDatas.Instance.extersion.SuperHit; case PropertyType.CritResis: return (ulong)PlayerDatas.Instance.extersion.SuperHitReduce; case PropertyType.HeartHit: return (ulong)PlayerDatas.Instance.extersion.luckHitRate; case PropertyType.HeartHurt: return (ulong)PlayerDatas.Instance.extersion.luckHitVal; case PropertyType.HeartResis: return (ulong)PlayerDatas.Instance.extersion.LuckyHitRateReduce; case PropertyType.SkillHurt: return (ulong)PlayerDatas.Instance.extersion.SkillAtkRate; case PropertyType.PVPAddHurt: return (ulong)PlayerDatas.Instance.extersion.DamagePVP; case PropertyType.PVPReduceHurt: return PlayerDatas.Instance.GetPlayerDataByType((PlayerDataType)191); case PropertyType.LifeReply: return (ulong)PlayerDatas.Instance.extersion.HPRestorePer; case PropertyType.HurtReflect: return (ulong)PlayerDatas.Instance.extersion.DamageBackRate; case PropertyType.MoveSpeed: return (ulong)PlayerDatas.Instance.extersion.SpeedValue; case PropertyType.PetAddHurt: return (ulong)PlayerDatas.Instance.extersion.PetDamPer; case PropertyType.RealHurt: return (ulong)PlayerDatas.Instance.extersion.realATK; case PropertyType.RealResis: return (ulong)PlayerDatas.Instance.extersion.realDEF; case PropertyType.DefyDef: return (ulong)PlayerDatas.Instance.extersion.IgnoreDefRate; case PropertyType.DefyDefResis: return (ulong)PlayerDatas.Instance.extersion.IgnoreDefRateReduce; case PropertyType.DefChance: return (ulong)PlayerDatas.Instance.extersion.DamChanceDef; case PropertyType.BloodHurt: return (ulong)PlayerDatas.Instance.extersion.BleedDamage; case PropertyType.AktReplyBlood: return (ulong)PlayerDatas.Instance.extersion.BattleValEx2; case PropertyType.Stun: return (ulong)PlayerDatas.Instance.extersion.FaintRate; case PropertyType.CtrlResis: return (ulong)PlayerDatas.Instance.extersion.FaintDefRate; case PropertyType.AddFinalHurt: return (ulong)PlayerDatas.Instance.extersion.FinalHurt; case PropertyType.ReduceFinalHurt: return (ulong)PlayerDatas.Instance.extersion.FinalHurtReduce; case PropertyType.PVPAddHurtPer: return (ulong)PlayerDatas.Instance.extersion.DamagePerPVP; case PropertyType.PVPReduceHurtPer: return (ulong)PlayerDatas.Instance.extersion.DamagePerPVPReduce; case PropertyType.DleHitChance: return (ulong)PlayerDatas.Instance.extersion.ComboDamPerRate; case PropertyType.DleHurt: return (ulong)PlayerDatas.Instance.extersion.ComboDamPer; case PropertyType.ReduceSkillHurtPercent: return (ulong)PlayerDatas.Instance.extersion.skillAtkRateReduce; case PropertyType.NpcHurtAddPer: return (ulong)PlayerDatas.Instance.extersion.NpcHurtAddPer; case PropertyType.Luck: return (ulong)PlayerDatas.Instance.extersion.luckValue; case PropertyType.Mater: return (ulong)PlayerDatas.Instance.baseData.mater; case PropertyType.Wood: return (ulong)PlayerDatas.Instance.baseData.wood; case PropertyType.Water: return (ulong)PlayerDatas.Instance.baseData.water; case PropertyType.Fire: return (ulong)PlayerDatas.Instance.baseData.fire; case PropertyType.Earth: return (ulong)PlayerDatas.Instance.baseData.earth; case PropertyType.ReduceCrit: return (ulong)PlayerDatas.Instance.baseData.reduceCrit; case PropertyType.ReduceHeartHurtPer: return (ulong)PlayerDatas.Instance.baseData.reduceHeartHurt; case PropertyType.ReduceFinalHurtPer: return (ulong)PlayerDatas.Instance.baseData.reduceFinalHurt; case PropertyType.AtkPercent: case PropertyType.CritHurtPercent: case PropertyType.DodgePercent: return (ulong)ModelCenter.Instance.GetModel().GetReikiPropertyValue((int)type); case PropertyType.SkillAddPerA: return (ulong)PlayerDatas.Instance.baseData.skillAddPerA; case PropertyType.SkillAddPerB: return (ulong)PlayerDatas.Instance.baseData.skillAddPerB; case PropertyType.SkillAddPerC: return (ulong)PlayerDatas.Instance.baseData.skillAddPerC; case PropertyType.SkillAddPerD: return (ulong)PlayerDatas.Instance.baseData.skillAddPerD; case PropertyType.SkillAddPerE: return (ulong)PlayerDatas.Instance.baseData.skillAddPerE; case PropertyType.SkillAddPerF: return (ulong)PlayerDatas.Instance.baseData.skillAddPerF; case PropertyType.SkillAddPerG: return (ulong)PlayerDatas.Instance.baseData.skillAddPerG; case PropertyType.SkillReducePerA: return (ulong)PlayerDatas.Instance.baseData.skillReducePerA; case PropertyType.SkillReducePerB: return (ulong)PlayerDatas.Instance.baseData.skillReducePerB; case PropertyType.SkillReducePerC: return (ulong)PlayerDatas.Instance.baseData.skillReducePerC; case PropertyType.SkillReducePerD: return (ulong)PlayerDatas.Instance.baseData.skillReducePerD; case PropertyType.SkillReducePerE: return (ulong)PlayerDatas.Instance.baseData.skillReducePerE; case PropertyType.SkillReducePerF: return (ulong)PlayerDatas.Instance.baseData.skillReducePerF; case PropertyType.SkillReducePerG: return (ulong)PlayerDatas.Instance.baseData.skillReducePerG; case PropertyType.ReduceSkillCDPer: return (ulong)PlayerDatas.Instance.extersion.battleValEx3; case PropertyType.AddFinalHurtPer: return (ulong)PlayerDatas.Instance.extersion.FunalHurtPer; case PropertyType.AddNormalHurt: return (ulong)PlayerDatas.Instance.baseData.NormalHurt; case PropertyType.AddNormalHurtPer: return (ulong)PlayerDatas.Instance.baseData.NormalHurtPer; case PropertyType.AddSkillHurt: return (ulong)PlayerDatas.Instance.baseData.FabaoHurt; case PropertyType.AddSkillHurtPer: return (ulong)PlayerDatas.Instance.baseData.FabaoHurtPer; case PropertyType.AddPVEHurt: return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.DamagePVE); } return 0; } /// /// 换行 /// /// /// private static Regex NewLineRegex = new Regex(@"", RegexOptions.Singleline); public static string ReplaceNewLine(string val) { return val.Replace(@"", "\n"); } public static double numto2Decimals(double value) { //为什么要value * 1000/10 这么写,特殊的数字会有问题,比如36.80000,会(int)(value * 100)被计算为3679 //测试下只有30几点8000的才会这样 return (int)(value * 1000 / 10) / 100.00; } /// /// 大数值转化 最多两个小数 不四舍五入 /// private static StringBuilder _textBuilder = new StringBuilder(); public static string ReplaceLargeNum(double num) { _textBuilder.Length = 0; double hm = numto2Decimals(num / 100000000.0); if (hm >= 100) { _textBuilder.Append((int)hm); _textBuilder.Append(Language.Get("L1070")); return _textBuilder.ToString(); } else if (hm >= 10) { _textBuilder.Append(hm.ToString("0.##")); _textBuilder.Append(Language.Get("L1070")); return _textBuilder.ToString(); } if (hm >= 1) { _textBuilder.Append(hm.ToString("0.##")); _textBuilder.Append(Language.Get("L1070")); return _textBuilder.ToString(); } double tt = numto2Decimals(num / 10000.0); if (tt >= 100) { _textBuilder.Append((int)tt); _textBuilder.Append(Language.Get("L1071")); return _textBuilder.ToString(); } else if (tt >= 10) { _textBuilder.Append(tt.ToString("0.##")); _textBuilder.Append(Language.Get("L1071")); return _textBuilder.ToString(); } else if (tt >= 1 && num >= 10000) { _textBuilder.Append(tt.ToString("0.##")); _textBuilder.Append(Language.Get("L1071")); return _textBuilder.ToString(); } if (_textBuilder.Length == 0) { _textBuilder.Append(num.ToString("0.##")); } return _textBuilder.ToString(); } #region round的代码注释 //public static string ReplaceLargeNum(double num) //{ // _textBuilder.Length = 0; // float hm = (float)Math.Round(num / 100000000, 2); // if (hm >= 100) // { // hm = (int)Math.Round(num / 100000000); // _textBuilder.Append(hm); // _textBuilder.Append(Language.Get("L1070")); // return _textBuilder.ToString(); // } // else if (hm >= 10) // { // hm = (float)Math.Round(num / 100000000, 1); // _textBuilder.Append(hm); // _textBuilder.Append(Language.Get("L1070")); // return _textBuilder.ToString(); // } // if (hm >= 1) // { // _textBuilder.Append(hm); // _textBuilder.Append(Language.Get("L1070")); // return _textBuilder.ToString(); // } // float tt = (float)Math.Round(num / 10000, 2); // if (tt >= 100) // { // tt = (float)Math.Round(num / 10000); // _textBuilder.Append(tt); // _textBuilder.Append(Language.Get("L1071")); // return _textBuilder.ToString(); // } // else if (tt >= 10) // { // tt = (float)Math.Round(num / 10000, 1); // _textBuilder.Append(tt); // _textBuilder.Append(Language.Get("L1071")); // return _textBuilder.ToString(); // } // else if (tt >= 1 && num >= 10000) // { // _textBuilder.Append(tt); // _textBuilder.Append(Language.Get("L1071")); // return _textBuilder.ToString(); // } // if (_textBuilder.Length == 0) // { // tt = (float)Math.Round(num, 2); // _textBuilder.Append(tt); // } // return _textBuilder.ToString(); //} #endregion public static string ReplaceXianYuanCoinsNum(double num) { StringBuilder sb = new StringBuilder(); float hm = (float)Math.Round(num / 100000000, 2); if (hm >= 100) { hm = (int)Math.Round(num / 100000000); sb.Append(hm); sb.Append(Language.Get("L1070")); return sb.ToString(); } else if (hm >= 10) { hm = (float)Math.Round(num / 100000000, 1); sb.Append(hm); sb.Append(Language.Get("L1070")); return sb.ToString(); } else if (hm >= 1) { sb.Append(hm); sb.Append(Language.Get("L1070")); return sb.ToString(); } float tt = (float)Math.Round(num / 10000, 2); if (tt >= 100) { tt = (float)Math.Round(num / 10000); sb.Append(tt); sb.Append(Language.Get("L1071")); return sb.ToString(); } if (sb.Length == 0) { tt = (float)Math.Round(num, 2); sb.Append(tt); } return sb.ToString(); } public static float ReplacePercentage(float num, int isPer, int decimals = 1) { if (isPer == 1 || isPer == 2) { return (float)Math.Round(num / 100, decimals); } else { return (int)num; } } static Regex s_SpecialCharacterRegex = new Regex("[()()@!#$%^&*[]|_]"); static Regex s_AsciiCharacterRegex = new Regex("[\x00-\x1F]|[\x21-\x2F]|[\x3A-\x40]|[\x5B-\x60]|[\x7B-\x7E]"); public static bool HasSpecialCharac(string str) { if (s_SpecialCharacterRegex.IsMatch(str)) { return true; } if (s_AsciiCharacterRegex.IsMatch(str)) { return true; } return false; } public static string GetColorNameByItemColor(int itemColor) { switch (itemColor) { case 1: return Language.Get("Market_Text_42"); case 2: return Language.Get("Market_Text_43"); case 3: return Language.Get("Market_Text_44"); case 4: return Language.Get("Market_Text_45"); case 5: return Language.Get("Market_Text_46"); case 6: case 7: case 8: return Language.Get("Market_Text_47"); case 9: return Language.Get("Market_Text_471"); } return ""; } #endregion #region 文字色值 public static readonly Color s_BrightPinkColor = new Color32(246, 64, 141, 255); public static readonly Color s_BrightRedColor = new Color32(255, 3, 3, 255); public static readonly Color s_BrightPurpleColor = new Color32(218, 72, 213, 255); public static readonly Color s_BrightBlueColor = new Color32(0, 107, 227, 255); //006BE3FF public static readonly Color s_BrightOrangeColor = new Color32(255, 103, 1, 255); //FF6701FF public static readonly Color s_BrightWhiteColor = new Color32(104, 104, 104, 255); //686868 public static readonly Color s_BrightGreenColor = new Color32(16, 157, 6, 255); //109d06 public static readonly Color s_DarkPinkColor = new Color32(255, 124, 124, 255); public static readonly Color s_DarkRedColor = new Color32(250, 1, 1, 255); public static readonly Color s_DarkPurpleColor = new Color32(236, 75, 246, 255); public static readonly Color s_DarkBlueColor = new Color32(49, 206, 251, 255);//31cefb public static readonly Color s_DarkOrangeColor = new Color32(248, 152, 59, 255); public static readonly Color s_DarkWhiteColor = new Color32(247, 247, 247, 255); public static readonly Color s_DarkGreenColor = new Color32(53, 225, 34, 255); //35e122 public static readonly Color s_NavyBrown = new Color32(64, 28, 6, 255);//401c06 public static readonly Color s_Black = new Color32(0, 0, 0, 255); public static readonly Color s_NavyYellow = new Color32(255, 239, 71, 255); public static readonly Color s_LightGreen = new Color32(141, 220, 17, 255);//8ddc11 public static readonly Color s_LightYellow = new Color32(255, 244, 205, 255); //fff4cd public static readonly Color s_Gray = new Color32(204, 204, 204, 255); public static readonly Color s_Gold = new Color32(255, 239, 71, 255);//ffef47 public static readonly Color s_EarthYellow = new Color32(248, 152, 59, 255);//f8983b public static readonly Color s_BrightDanLV0 = new Color32(102, 102, 102, 255); //666666 public static readonly Color s_BrightDanLV1 = new Color32(148, 96, 255, 255); //9460ff public static readonly Color s_BrightDanLV2 = new Color32(0, 102, 255, 255); //0066ff public static readonly Color s_BrightDanLV3 = new Color32(0, 179, 55, 255); //00b337 public static readonly Color s_BrightDanLV4 = new Color32(255, 102, 0, 255); //ff6600 public static readonly Color s_BrightDanLV5 = new Color32(255, 0, 0, 255); //ff0000 public static readonly Color s_BrightDanLV6 = new Color32(255, 0, 246, 255); //ff00f6 public static readonly Color s_GrayDanLV0 = new Color32(221, 221, 221, 255); //dddddd public static readonly Color s_GrayDanLV1 = new Color32(121, 153, 255, 255); //7999ff public static readonly Color s_GrayDanLV2 = new Color32(0, 198, 255, 255); //00c6ff public static readonly Color s_GrayDanLV3 = new Color32(102, 255, 0, 255); //66ff00 public static readonly Color s_GrayDanLV4 = new Color32(255, 144, 0, 255); //ff9000 public static readonly Color s_GrayDanLV5 = new Color32(255, 0, 0, 255); //ff0000 public static readonly Color s_GrayDanLV6 = new Color32(240, 0, 255, 255); //f000ff public static Color GetDanLVColor(int danLv, bool bright = false) { var crossDanLVConfig = CrossServerArenaConfig.Get(danLv); if (crossDanLVConfig != null) { switch (crossDanLVConfig.DanType) { case 0: return bright ? s_BrightDanLV0 : s_GrayDanLV0; case 1: return bright ? s_BrightDanLV1 : s_GrayDanLV1; case 2: return bright ? s_BrightDanLV2 : s_GrayDanLV2; case 3: return bright ? s_BrightDanLV3 : s_GrayDanLV3; case 4: return bright ? s_BrightDanLV4 : s_GrayDanLV4; case 5: return bright ? s_BrightDanLV5 : s_GrayDanLV5; case 6: return bright ? s_BrightDanLV6 : s_GrayDanLV6; } } return Color.white; } public static string AppendDanLVNameColor(int danLv, bool bright = false) { var crossDanLVConfig = CrossServerArenaConfig.Get(danLv); if (crossDanLVConfig == null) { return string.Empty; } var name = crossDanLVConfig.Name; switch (crossDanLVConfig.DanType) { case 0: return StringUtility.Contact("", name, ""); case 1: return StringUtility.Contact("", name, ""); case 2: return StringUtility.Contact("", name, ""); case 3: return StringUtility.Contact("", name, ""); case 4: return StringUtility.Contact("", name, ""); case 5: return StringUtility.Contact("", name, ""); case 6: return StringUtility.Contact("", name, ""); } return name; } public static Color GetUIColor(int itemColor, bool bright = false) { switch (itemColor) { case 0: return GetUIColor(TextColType.White, bright); case 1: return GetUIColor(TextColType.White, bright); case 2: return GetUIColor(TextColType.Blue, bright); case 3: return GetUIColor(TextColType.Purple, bright); case 4: return GetUIColor(TextColType.Orange, bright); case 5: return GetUIColor(TextColType.Red, bright); case 6: case 7: case 8: return GetUIColor(TextColType.Pink, bright); case 9: return GetUIColor(TextColType.Green, bright); } return GetUIColor(TextColType.White, bright); } public static Color GetUIColor(TextColType type, bool bright = false) { switch (type) { case TextColType.None: case TextColType.White: return bright ? s_BrightWhiteColor : s_DarkWhiteColor; case TextColType.Blue: return bright ? s_BrightBlueColor : s_DarkBlueColor; case TextColType.Purple: return bright ? s_BrightPurpleColor : s_DarkPurpleColor; case TextColType.Orange: return bright ? s_BrightOrangeColor : s_DarkOrangeColor; case TextColType.Red: return bright ? s_BrightRedColor : s_DarkRedColor; case TextColType.Pink: return bright ? s_BrightPinkColor : s_DarkPinkColor; case TextColType.Green: return bright ? s_BrightGreenColor : s_DarkGreenColor; case TextColType.NavyBrown: return s_NavyBrown; case TextColType.DarkGreen: return s_BrightGreenColor; case TextColType.Black: return s_Black; case TextColType.NavyYellow: return s_NavyYellow; case TextColType.LightGreen: return s_LightGreen; case TextColType.LightYellow: return s_LightYellow; case TextColType.Gray: return s_Gray; } return bright ? s_BrightWhiteColor : s_DarkWhiteColor; } private static Regex m_TextColorRegex = new Regex("(.*)", RegexOptions.Singleline); public static string AppendColor(TextColType type, string msg, bool bright = false) { if (m_TextColorRegex.IsMatch(msg) && msg.ToLower().StartsWith("")) { Match match = m_TextColorRegex.Match(msg); msg = match.Groups[1].Value; } switch (type) { case TextColType.None: case TextColType.White: return StringUtility.Contact("", msg, ""); case TextColType.Blue: return StringUtility.Contact("", msg, ""); case TextColType.Purple: return StringUtility.Contact("", msg, ""); case TextColType.Orange: return StringUtility.Contact("", msg, ""); case TextColType.Red: return StringUtility.Contact("", msg, ""); case TextColType.Pink: return StringUtility.Contact("", msg, ""); case TextColType.Green: return StringUtility.Contact("", msg, ""); case TextColType.NavyBrown: return StringUtility.Contact("", msg, ""); case TextColType.DarkGreen: return StringUtility.Contact("", msg, ""); case TextColType.Black: return StringUtility.Contact("", msg, ""); case TextColType.LightYellow: return StringUtility.Contact("", msg, ""); case TextColType.LightGreen: return StringUtility.Contact("", msg, ""); case TextColType.Gray: return StringUtility.Contact("", msg, ""); } return msg; } //needName 指境界0是否需要名称 public static string GetRealmName(int realmLv, bool bright = false, bool needName = false) { if (realmLv <= 0 && !needName) { return string.Empty; } var config = RealmConfig.Get(realmLv); if (config == null) { return string.Empty; } return GetRealmColorByLv(realmLv, config.Name, bright); } //strFormat附加 境界名以外的文字 //needName 指境界0是否需要名称 public static string GetRealmNameEx(int realmLv, string strFormat, bool bright = false, bool needName = false) { if (realmLv <= 0 && !needName) { return string.Empty; } var config = RealmConfig.Get(realmLv); if (config == null) { return string.Empty; } return GetRealmColorByLv(realmLv, string.Format(strFormat, config.Name), bright); } public static string GetRealmColorByLv(int realmLv, string msg, bool bright = false) { var config = RealmConfig.Get(realmLv); if (config == null) { return string.Empty; } switch (config.Quality) { case 1: return StringUtility.Contact("", msg, ""); case 2: return StringUtility.Contact("", msg, ""); case 3: return StringUtility.Contact("", msg, ""); case 4: return StringUtility.Contact("", msg, ""); case 5: return StringUtility.Contact("", msg, ""); case 6: return StringUtility.Contact("", msg, ""); default: return msg; } } public static string AppendColor(int itemColor, string msg, bool bright = false) { switch (itemColor) { case 0: case 1: return AppendColor(TextColType.White, msg, bright); case 2: return AppendColor(TextColType.Blue, msg, bright); case 3: return AppendColor(TextColType.Purple, msg, bright); case 4: return AppendColor(TextColType.Orange, msg, bright); case 5: return AppendColor(TextColType.Red, msg, bright); case 6: case 7: case 8: return AppendColor(TextColType.Pink, msg, bright); case 9: return AppendColor(TextColType.Green, msg, bright); } return msg; } public static int GetItemColor(int _id, Dictionary> _dict = null) { int _itemColor = 0; var _itemCfg = ItemConfig.Get(_id); if (_itemCfg != null) { _itemColor = _itemCfg.ItemColor; if (_itemCfg.Type == 113 && _dict != null) { _itemColor = ItemLogicUtility.Instance.GetItemQuality(_itemCfg.ID, _dict); } } return _itemColor; } public static Color GetPropertyColor(int property) { switch ((PropertyType)property) { case PropertyType.Mater: return s_Gold; case PropertyType.Wood: return s_LightGreen; case PropertyType.Water: return s_DarkBlueColor; case PropertyType.Fire: return s_GrayDanLV5; case PropertyType.Earth: return s_EarthYellow; } return s_NavyBrown; } #endregion #region 计算战斗力 public static readonly string FightPowerFormula = "FightpowerFormula"; public static int GetFightPower(Dictionary _propertyDict) { Equation.Instance.Clear(); if (_propertyDict == null || _propertyDict.Count == 0) { return 0; } foreach (var _key in _propertyDict.Keys) { PlayerPropertyConfig cfg = PlayerPropertyConfig.Get(_key); if (cfg != null) { if (_key == 7) { Equation.Instance.AddKeyValue("MinAtk", _propertyDict[_key]); Equation.Instance.AddKeyValue("MaxAtk", _propertyDict[_key]); } else if (_key == 24) { Equation.Instance.AddKeyValue("PetMinAtk", _propertyDict[_key]); Equation.Instance.AddKeyValue("PetMaxAtk", _propertyDict[_key]); } else { ulong attrValue = (ulong)_propertyDict[_key]; var fightParm = GetFightPowerParmByAttrId(_key); if (_key == 11) { var playerLv = PlayerDatas.Instance.baseData.LV; var paramConfig = FightPowerParamConfig.Get(playerLv); Equation.Instance.AddKeyValue("AtkSpeedParameter", paramConfig.AtkSpeedParameter); } else { if (fightParm != 0) { attrValue = attrValue * (ulong)fightParm; } } Equation.Instance.AddKeyValue(cfg.Parameter, attrValue); } } } FuncConfigConfig funcCfg = FuncConfigConfig.Get(FightPowerFormula); return Equation.Instance.Eval(funcCfg.Numerical1); } public static int GetFightPowerParmByAttrId(int attrId) { int playerLv = PlayerDatas.Instance.baseData.LV; FightPowerParamConfig paramConfig = FightPowerParamConfig.Get(playerLv); PlayerPropertyConfig cfg = PlayerPropertyConfig.Get(attrId); if (paramConfig == null || cfg == null) return 0; switch (cfg.Parameter) { case "Hit": return paramConfig.Hit; case "Miss": return paramConfig.Miss; case "IgnoreDefRate": return paramConfig.IgnoreDefRate; case "DamChanceDef": return paramConfig.DamChanceDef; case "FaintRate": return paramConfig.FaintRate; case "LuckyHitRateReduce": return paramConfig.LuckyHitRateReduce; case "SkillAtkRate": return paramConfig.SkillAtkRate; case "SkillAtkRateReduce": return paramConfig.SkillAtkRateReduce; case "DamagePerPVP": return paramConfig.DamagePerPVP; case "DamagePerPVPReduce": return paramConfig.DamagePerPVPReduce; case "DamBackPer": return paramConfig.DamBackPer; case "IgnoreDefRateReduce": return paramConfig.IgnoreDefRateReduce; case "FaintDefRate": return paramConfig.FaintDefRate; case "AtkSpeedParameter": return paramConfig.AtkSpeedParameter; case "JobAHurtAddPer": return paramConfig.JobAHurtAddPer; case "JobBHurtAddPer": return paramConfig.JobBHurtAddPer; case "JobCHurtAddPer": return paramConfig.JobCHurtAddPer; case "JobAAtkReducePer": return paramConfig.JobAAtkReducePer; case "JobBAtkReducePer": return paramConfig.JobBAtkReducePer; case "JobCAtkReducePer": return paramConfig.JobCAtkReducePer; case "SuperHitRate": return paramConfig.SuperHitRate; case "LuckyHitRate": return paramConfig.LuckyHitRate; case "SuperHitRateReduce": return paramConfig.SuperHitRateReduce; case "FinalHurtPer": return paramConfig.FinalHurtPer; case "FinalHurtReducePer": return paramConfig.FinalHurtReducePer; case "NPCHurtAddPer": return paramConfig.NPCHurtAddPer; case "NormalHurtPer": return paramConfig.NormalHurtPer; case "FabaoHurtPer": return paramConfig.FabaoHurtPer; case "AffairSpeedPer": return paramConfig.AffairSpeedPer; case "FamilyBossHurtPer": return paramConfig.FamilyBossHurtPer; case "FamilyWarHPPer": return paramConfig.FamilyWarHPPer; case "FamilyWarAtkPer": return paramConfig.FamilyWarAtkPer; case "FamilySitExpPer": return paramConfig.FamilySitExpPer; case "BossFinalHurtPer": return paramConfig.BossFinalHurtPer; } return 0; } #endregion #region 得到金钱数量根据金钱类型 //货币单位的显示,越南盾显示逗号 public static string GetMoneyFormat(long money) { return money.ToString("#,0"); } //仅用于显示 仙玉和灵石的特殊处理,存在负数情况,如GM惩罚扣除货币 public static int GetMoneyCntEx(int moneyType) { switch (moneyType) { case 1: { return (int)(PlayerDatas.Instance.baseData.diamond - PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default5)); } case 2: { return (int)(PlayerDatas.Instance.baseData.bindDiamond - PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default6)); } } return 0; } public static ulong GetMoneyCnt(int moneyType) { switch (moneyType) { case 1: { return PlayerDatas.Instance.baseData.diamond; } case 2: { return PlayerDatas.Instance.baseData.bindDiamond; } case 3: { return PlayerDatas.Instance.baseData.allCopper; } case 18: { return (ulong)PlayerDatas.Instance.extersion.honorValue; } case 25: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.CDBPlayerRefresh_TreasureScore); //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.CDBPlayerRefresh_TreasureScore); } case 24: { return (ulong)PlayerDatas.Instance.extersion.runeChip; } case 15: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.UnionLiven); //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.UnionLiven); } case 17: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.FBHelpPoint); //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.FBHelpPoint); } case 27: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.CDBPlayerRefresh_Danjing); //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.CDBPlayerRefresh_Danjing); } case 28: { return PlayerDatas.Instance.extersion.soulDust; //废弃了用44 } case 29: { return PlayerDatas.Instance.extersion.soulSplinters; } case 30: { return PlayerDatas.Instance.extersion.soulCore; } case 32: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default4); } case 34: { return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default13); } case 35: { //功德点 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default14); } case 37: { //机缘点 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default17); } case 39: { //成就积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default19); } case 40: { //万界积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default20); } case 41: { //符印精华 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.RuneSplinters); } case 43: { //凭证积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default34); } case 44: { //聚魂精华 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default35); } case 45: { //骑宠积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default37); } case 46: { //古宝养成货币 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default38); } case 47: { //天道币 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default39); } case 48: { //推金币次数 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default40); } case 49: { //仙缘积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default42); } case 50: { //幻境阁积分 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default43); } case 99: { return PlayerDatas.Instance.baseData.ExAttr11; } } return 0; } #endregion #region 得到装备位对应的部位名称 public static string GetEquipPlaceName(int place) { if (GeneralDefine.equipPlaceNameDict.ContainsKey(place)) { return GeneralDefine.equipPlaceNameDict[place]; } return ""; } #endregion #region 服务端发过来文字显示不出来问题 public static string ServerStringTrim(string str) { if (!string.IsNullOrEmpty(str)) { str = str.Replace("\0", ""); str = str.Replace("\x00", ""); return str; } else { return string.Empty; } } #endregion //账号:706907@1@hyyngame@s30,服务器ID:30 public static int GetServerIDByAccount(string account) { string[] strArray = account.Split('@'); if (strArray.Length < 2) { //判断长度2不是一个实际长度,一般都是大于2 return 0; } if (strArray[strArray.Length - 1].Length < 2) return 0; int id = 0; int.TryParse(strArray[strArray.Length - 1].Substring(1), out id); return id; } #region 获取间隔奖励 public static int GetIntervalAward(ICollection _keys, int _present) { foreach (var _key in _keys) { if (_present <= _key) { return _key; } } return _keys.Last(); } #endregion public static string GetGrade(int _star) { switch (_star) { case 5: return "S"; case 4: return "A"; case 3: return "B"; case 2: return "C"; case 1: return "D"; } return "D"; } public static string TrimContentToServer(string content) { content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty); content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty); content = content.Replace("=", string.Empty); content = content.Replace(" ", string.Empty); return content; } public static bool SatisfyNameLength(string name, out int error) { error = 0; //bool pureChinese = Regex.IsMatch(name, "^[\u4e00-\u9fa5]+$"); //var chsCount = GetChsCount(name); int length = Encoding.Default.GetBytes(name).Length; var maxlength = 20; var minlength = 3; if (length > maxlength) { error = 1; } else if (length < minlength) { error = 2; } return error == 0; } public static int GetChsCount(string name) { var count = 0; for (int i = 0; i < name.Length; i++) { if (Regex.IsMatch(name[i].ToString(), "[\u4e00-\u9fa5]")) { count++; } } return count; } public static string GetEquipSuitName(int itemId, bool bright = false) { if (ItemLogicUtility.Instance.IsSuitEquip(itemId)) { var itemConfig = ItemConfig.Get(itemId); return AppendColor(TextColType.Green, EquipModel.GetSuitName(itemConfig.LV), bright); } return string.Empty; } public static string GetItemName(int itmeId, bool bright = false) { var itemConfig = ItemConfig.Get(itmeId); if (itemConfig == null) { return string.Empty; } return StringUtility.Contact(GetEquipSuitName(itmeId, bright), itemConfig.ItemName); } public static string GetStar(int star) { switch (star) { case 5: return "S"; case 4: return "A"; case 3: return "B"; case 2: return "C"; case 1: return "D"; } return string.Empty; } //转为s1,s2,s3格式 public static string GetServers(string serverIDRangeInfo) { var serverList = new List(); if (string.IsNullOrEmpty(serverIDRangeInfo) || serverIDRangeInfo == "[]") { return "all"; } var serverArray = JsonMapper.ToObject(serverIDRangeInfo); for (int i = 0; i < serverArray.Length; i++) { int startID = serverArray[i][0]; int endID = serverArray[i][1]; for (int j = startID; j <= endID; j++) { var serverName = ServerListCenter.Instance.GetServerName(j); serverList.Add(serverName); //太长会导致界面顶点数超过65000 if (serverList.Count > 1000) return string.Join(", ", serverList.ToArray()); } } return string.Join(", ", serverList.ToArray()); } }