项目公共方法

/// <summary>
///    公共方法类
//
/// date: 2015-5-3
/// </summary>

static public class GameUtils
{
    /// <summary>
    /// 两点距离
    /// </summary>
    static public float GetDistance(Vector3 from, Vector3 to)
    {
        from.y = 0;
        to.y = 0;
        return Vector3.Distance(from, to);
    }

    /// <summary>
    /// 获取两点的方向向量
    /// </summary>
    static public Vector3 GetDirect(Vector3 from, Vector3 to)
    {
        from.y = 0;
        to.y = 0;

        Vector3 temp = to - from;
        temp.Normalize();
        return temp;
    }

    /// <summary>
    /// 左右方向
    /// </summary>
    static public Vector3 Get2DDirect(Vector3 from, Vector3 to)
    {
        Vector3 temp = to - from;
        if (Vector3.Dot(CameraMgr.Instance.transform.right, temp.normalized) > 0)
            return CameraMgr.Instance.transform.right;
        else
            return -CameraMgr.Instance.transform.right;
    }

    /// <summary>
    /// 左右方向
    /// </summary>
    static public Vector3 DirectTo2D(Vector3 dir)
    {
        if (Vector3.Dot(CameraMgr.Instance.transform.right, dir.normalized) > 0)
            return CameraMgr.Instance.transform.right;
        else
            return -CameraMgr.Instance.transform.right;
    }

    /// <summary>
    /// 获取对象的指定挂点
    /// </summary>
    static public bool GetHangPoint(GameObject src, string name, out Transform parent)
    {
        Transform[] trans = src.GetComponentsInChildren<Transform>();
        for (int i = trans.Length - 1; i >= 0; --i)
        {
            if (trans[i].name == name)
            {
                parent = trans[i];
                return true;
            }
        }

        parent = src.transform;
        return false;
    }

    /// <summary>
    /// 可触碰目标的距离
    /// </summary>
    /// <param name="origin"></param>
    /// <param name="target"></param>
    /// <returns></returns>
    static public float GetRoleTouchDistance(CharacterBase origin, CharacterBase target)
    {
        if (origin == null || target == null)
            return 99999;

        return GameUtils.GetDistance(origin.transform.position, target.transform.position); //- target.Radius;
    }

    /// <summary>
    /// 专用于技能施放时自动跑向目标的检测
    /// </summary>
    /// <param name="origin"></param>
    /// <param name="target"></param>
    /// <returns></returns>
    static public bool CheckAutoRunDistance(CharacterBase origin, CharacterBase target, float skillDis)
    {
        if (origin == null || target == null)
            return true;

        float dis = GameUtils.GetDistance(origin.transform.position, target.transform.position); //- target.Radius;
        float rad = origin.Radius + target.Radius;
        //MyLog.EditorLog("origin.Radius=" + origin.Radius + ",target.Radius=" + target.Radius);
        //MyLog.EditorLog("skillDis=" + skillDis);

        if (skillDis > 2 && skillDis < 5) //对近战技能距离判定作优化
        {
            if (skillDis > rad)
                skillDis = rad;
            if (skillDis < 2)
                skillDis = 2;
        }
        return dis >= skillDis;
    }

    /// <summary>
    /// 获取怪物ID
    /// </summary>
    static public int GetSourceID(List<IntAttr> attrList)
    {
        IntAttr attr = attrList.Find(p => p.type == (int)ENTITY_ATTR_ID.ENTITY_ATTR_RESID);
        if (attr != null)
        {
            return attr.value;
        }

        return 0;
    }

    /// <summary>
    /// 获取模型资源
    /// </summary>
    static public int GetResID(List<IntAttr> attrList)
    {
        IntAttr job = attrList.Find(p => p.type == (int)PLAYER_ATTR_ID.PLAYER_ATTR_JOB);
        IntAttr camp = attrList.Find(p => p.type == (int)ENTITY_ATTR_ID.ENTITY_ATTR_CAMPID);
        IntAttr order = attrList.Find(p => p.type == (int)ENTITY_ATTR_ID.ENTITY_ATTR_ORDER);
        if (job != null && camp != null && order != null)
        {
            return GetResID(job.value, camp.value, order.value);
        }

        return 0;
    }

    /// <summary>
    /// 获取模型资源
    /// </summary>
    static public int GetResID(int job, int camp, int order)
    {
        int index = camp * 10000 + job * 100 + order;
        RoleAdvancedTable table = TableManager.GetTableData((int)TableID.RoleAdvancedTableID, index) as RoleAdvancedTable;
        if (table != null)
            return table.ModelId;
        else
            return camp * 10000 + job * 100;
    }

    /// <summary>
    /// 获取职业
    /// </summary>
    static public int GetProfession(List<IntAttr> attrList)
    {
        IntAttr job = attrList.Find(p => p.type == (int)PLAYER_ATTR_ID.PLAYER_ATTR_JOB);
        IntAttr camp = attrList.Find(p => p.type == (int)ENTITY_ATTR_ID.ENTITY_ATTR_CAMPID);
        if (job != null && camp != null)
        {
            return GetProfession(job.value, camp.value);
        }

        return 0;
    }

    /// <summary>
    /// 获取职业
    /// </summary>
    static public int GetProfession(int job, int camp)
    {
        return camp * 100 + job;
    }

    /// <summary>
    /// 获得等级
    /// </summary>
    static public int GetLevel(List<IntAttr> attrList)
    {
        IntAttr attr = attrList.Find(p => p.type == (int)ENTITY_ATTR_ID.ENTITY_ATTR_LEVEL);
        if (attr != null)
        {
            return attr.value;
        }

        return 0;
    }

    /// <summary>
    /// 删除所有子物体 author(wxh)
    /// </summary>
    static public void DelAllChild(GameObject parentTarget)
    {
        if (parentTarget == null || parentTarget.transform == null)
            return;

        Transform TF = null;
        int i = 0;
        for (i = 0; i < parentTarget.transform.childCount; i++)
        {
            TF = parentTarget.transform.GetChild(i);
            TF.gameObject.SetActive(false);
            Object.DestroyObject(TF.gameObject);
        }

        parentTarget.transform.DetachChildren();
    }

    /// <summary>
    /// 删除下标从 author(wxh)
    /// </summary>
    static public void DelFromToInedx(GameObject parentTarget, int from, int to)
    {
        if (parentTarget == null || parentTarget.transform == null)
            return;

        Transform TF = null;
        int i = 0;
        List<Transform> list = new List<Transform>(); ;
        for (i = from; i < to; i++)
        {
            TF = parentTarget.transform.GetChild(i);
            TF.gameObject.SetActive(false);
            list.Add(TF);
            Object.DestroyObject(TF.gameObject);
        }
        if (list.Count > 0)
        {
            for (i = 0; i < list.Count; i++)
            {
                Object.DestroyObject(list[i].gameObject);
            }
        }
        parentTarget.transform.DetachChildren();
    }

    /// <summary>
    /// 时间转换 author(wxh) 12:00:00
    /// </summary>
    static public string FormatTime(int t)
    {
        int hour = t / 3600;
        int min = (t % 3600) / 60;
        int sec = t % 60;
        return System.String.Format("{0:D2}:{1:D2}:{2:D2}", hour, min, sec);
    }

    static public string FormatFashionTime(int t)
    {
        int day = t / 86400;
        int hour = (t % 86400) / 3600;
        int min = ((t % 86400) % 3600) / 60;
        if (day >= 0)
        {
            return string.Format(StringConst.FASHION_DAY_HOUR, day, hour);
        }
        else
        {
            if (hour >= 0)
            {
                return string.Format(StringConst.FASHION_HOUR, hour);
            }
            else
            {
                return string.Format(StringConst.FASHION_MINUTE, min);
            }
        }
    }

    static public string FormatLimittActivityTime(int t)
    {
        int day = t / 86400;
        int hour = (t % 86400) / 3600;
        int min = ((t % 86400) % 3600) / 60;
        return string.Format(StringConst.lIMIT_ACTIVITY_TIME, day, hour, min);
    }

    static public string FashionTableTime(int t)
    {
        if (t == -1)
        {
            return StringConst.ACHIEVE_LONG;
        }
        else
        {
            if (t >= 24)
            {
                return string.Format(StringConst.FASHION_DAY, t / 24);
            }
            else
            {
                return string.Format(StringConst.FASHION_HOUR, t % 24);
            }
        }

    }

    /// <summary>
    /// 格式化Buff时间
    /// </summary>
    static public string FormatBuffTime(float t)
    {
        int hour = (int)t / 3600;
        int min = (int)(t % 3600) / 60;
        int sec = (int)t % 60;
        if (hour > 0)
        {
            return hour.ToString() + StringConst.TIME_HOUR;
        }
        else if (min > 0)
        {
            return min.ToString() + StringConst.TIME_MINUTE;
        }
        else
        {
            return sec.ToString() + StringConst.TIME_SECOND;
        }
    }

    static public string FormatLoginWaitTime(float t)
    {
        int hour = (int)t / 3600;
        int min = (int)(t % 3600) / 60;
        int sec = (int)t % 60;
        if (hour > 0)
        {
            return hour.ToString() + StringConst.TIME_HOUR + min.ToString() + StringConst.TIME_MINUTE + sec.ToString() + StringConst.TIME_SECOND;
        }
        else if (min > 0)
        {
            return min.ToString() + StringConst.TIME_MINUTE + sec.ToString() + StringConst.TIME_SECOND;
        }
        else
        {
            return sec.ToString() + StringConst.TIME_SECOND;
        }
    }

    /// <summary>
    /// 时间转换 author(wxh) 2016-01-01
    /// </summary>
    static public string dateTime(int second)
    {
        return new DateTime(1970, 01, 01, 8, 0, 0).AddSeconds(second).ToString("yyyy-MM-dd");
    }

    /// <summary>
    /// 详细的时间 2016-01-01-24:00:00
    /// </summary>
    static public string TimeDetail(int second)
    {
        return new DateTime(1970, 01, 01, 8, 0, 0).AddSeconds(second).ToString("yyyy-MM-dd-HH:mm:ss");
    }

    /// <summary>
    /// 0变00
    /// </summary>
    static public string OneToDouble(int num)
    {
        if (num < 10)
        {
            return string.Format("0{0}", num);
        }
        else
        {
            return string.Format("{0}", num);
        }
    }

    /// <summary>
    /// 服务器时间与传入时间的差值
    /// </summary>
    static public int SubServerTime(int second)
    {
        return (int)(TimerMgr.ServerTime - second);
    }

    /// <summary>
    /// 取得服务器时间
    /// </summary>
    static public DateTime GetServerDate()
    {
        return new DateTime(1970, 01, 01, 8, 0, 0).AddSeconds(TimerMgr.ServerTime);
    }

    /// <summary>
    /// 克隆物体 author(wxh)
    /// </summary>
    static public GameObject CloneGameObj(GameObject cloneTarget)
    {
        if (cloneTarget == null) return null;
        GameObject newGameObj = GameObject.Instantiate(cloneTarget) as GameObject;
        return newGameObj;
    }

    /// <summary>
    /// 判断人物是否在摄像机范围内
    /// </summary>
    static public bool CharIsInCameraRange(CharacterBase c)
    {
        Rect screenrct = new Rect(0, 0, Screen.width, Screen.height);
        Vector3 v = Vector3.zero;
        if (CameraMgr.Instance != null)
        {
            v = CameraMgr.Instance.gameObject.GetComponent<Camera>().WorldToScreenPoint(c.transform.position);
        }
        else
        {
            return false;
        }

        return screenrct.Contains(v);

    }

    /// <summary>
    /// 怪物和角色间是否有阻挡
    /// </summary>
    static public bool IsBlockInPlayerMonster(CharacterBase player, CharacterBase monster, float dis = 0)
    {
        Vector3 dir;
        float disPlayermonster = 0;
        Vector3 v1 = new Vector3(player.transform.position.x, player.transform.position.y + player.Height, player.transform.position.z);//player
        Vector3 v2 = new Vector3(monster.transform.position.x, monster.transform.position.y + monster.Height, monster.transform.position.z);//enemy
        //int layermask = 1 << GameLayers.FenceMask | 1 << GameLayers.FloorMask | 1 << GameLayers.ObstaclesMask
        //| 1 << GameLayers.AirWallMask | 1 << GameLayers.SceneMask;
        int layermask = 1 << GameLayers.FenceMask | 1 << GameLayers.FloorMask | 1 << GameLayers.ObstaclesMask | 1 << GameLayers.SceneMask;

        dir = Vector3.Normalize(v2 - v1);
        if (dis == 0)
        {
            disPlayermonster = GameUtils.GetDistance(v1, v2);
        }
        else
        {
            disPlayermonster = dis;
        }
        //RaycastHit hitInfo;
        if (disPlayermonster > 1 && Physics.Raycast(v1, dir, disPlayermonster, layermask))
        {
            //MyLog.EditorLog("hitInfo=" + hitInfo.collider);
            return true;
        }
        return false;
    }

    /// <summary>
    /// 怪物是否在角色的左右一个范围内
    /// </summary>
    static public bool IsMonsterInPlayerAngle(CharacterBase player, CharacterBase monster, float angle)
    {
        float cosangle = Mathf.Cos(angle * Mathf.Deg2Rad);

        Vector3 dir = monster.transform.position - player.transform.position;
        dir.Normalize();
        Vector2 Dir2D = new Vector2(dir.x, dir.z);
        Vector2 play2Ddir = new Vector2(player.transform.forward.x, player.transform.forward.z);
        float result = Vector2.Dot(Dir2D, play2Ddir);// 求夹角

        if (result >= cosangle && result > 0)
        {
            return true;
        }
        return false;
    }

    /// <summary>
    ///  求夹角,为了显示怪物ui的箭头,世界坐标
    /// </summary>
    static public float GetAngle(CharacterBase player, CharacterBase monster)
    {
        float result;
        Vector3 p1 = monster.transform.position;
        Vector3 p2 = player.transform.position;
        p1.y = 0;
        p2.y = 0;


        Vector3 dir = p1 - p2;
        dir.Normalize();
        Vector2 Dir2D = new Vector2(dir.x, dir.z);

        Vector2 camera2Ddir = new Vector2(CameraMgr.Instance.transform.forward.x, CameraMgr.Instance.transform.forward.z);
        if (Vector3.Dot(CameraMgr.Instance.transform.right, dir) > 0)//右边
        {
            result = -Mathf.Acos(Vector2.Dot(Dir2D, camera2Ddir)) / Mathf.Deg2Rad;// 求夹角
        }
        else//左边
        {
            result = Mathf.Acos(Vector2.Dot(Dir2D, camera2Ddir)) / Mathf.Deg2Rad;// 求夹角
        }
        return result;
    }

    /// <summary>
    /// 是否在时间段内
    /// </summary>
    static public bool TimeIsInRange(float currenttime, float starttime, float endtime)
    {
        if (currenttime >= starttime && currenttime < endtime)
        {
            return true;
        }
        return false;
    }

    /// <summary>
    /// #ffccdd转成Color
    /// </summary>
    static public Color HtmlToColor(string html)
    {
        int red, green, blue = 0;
        char[] rgb;
        html = html.TrimStart('#');
        html = Regex.Replace(html.ToLower(), "[g-zG-Z]", "");

        rgb = html.ToCharArray();
        red = Convert.ToInt32(rgb[0].ToString() + rgb[1].ToString(), 16);
        green = Convert.ToInt32(rgb[2].ToString() + rgb[3].ToString(), 16);
        blue = Convert.ToInt32(rgb[4].ToString() + rgb[5].ToString(), 16);

        Color color = new Color(red / 255f, green / 255f, blue / 255f);
        return color;
    }

    /// <summary>
    /// Color转换成16进制
    /// </summary>
    static public string ColorTo16(Color color)
    {
        string result = "";
        string r = Convert.ToString((int)(color.r * 255), 16);
        string g = Convert.ToString((int)(color.g * 255), 16);
        string b = Convert.ToString((int)(color.b * 255), 16);

        if (r.Length == 1)
        {
            r = "0" + r;
        }

        if (g.Length == 1)
        {
            g = "0" + g;
        }

        if (b.Length == 1)
        {
            b = "0" + b;
        }

        result = r + g + b;
        return result;
    }

    /// <summary>
    /// 是否是player召唤的monster
    /// </summary>
    static public bool MonsterOwerIsLocalPlayer(long pid)
    {
        CharacterBase charbse = GameRemoteController.Instance.GetCharacterByPID(pid, CharacterType.Monster);
        if (charbse != null && charbse.ownpid == LocalPlayer.Instance.pid)
            return true;

        charbse = GameRemoteController.Instance.GetCharacterByPID(pid, CharacterType.Servant);
        if (charbse != null && charbse.ownpid == LocalPlayer.Instance.pid)
            return true;

        return false;
    }

    /// <summary>
    /// 判断配置表的专精和人物的专精是否匹配
    /// </summary>
    static public bool IsMasteryMatch(int tableMastery, int playerMastery)
    {
        int i = 1 << playerMastery;
        if ((tableMastery & i) > 0)
            return true;
        else
            return false;
    }

    /// <summary>
    /// 判断该功能是否开放
    /// </summary>
    /// <param name="level">等级需求</param>
    static public bool IsFunctionOpen(int level)
    {
        if (LocalPlayer.Instance.Attribute.Level >= level)
            return true;
        else
            return false;
    }

    /// <summary>
    /// 判断技能是否达到最高等级
    /// </summary>
    /// <param name="skill">等级需求</param>
    static public bool IsSkillMaxLevel(SkillTable skill)
    {
        if (LocalPlayer.Instance.SkillVOList.ContainsKey(skill.skill_id))
        {
            if (LocalPlayer.Instance.SkillVOList[skill.skill_id].SkillLevel >= skill.max_level)
                return true;
        }
        return false;
    }

    /// <summary>
    /// 获取头像
    /// </summary>
    static public int GetHeadIcon(int campId, int job, CharacterType type)
    {
        int tableId = campId * 100 + job;
        return GetHeadIcon(tableId, type);
    }

    /// <summary>
    /// 获取头像
    /// </summary>
    static public int GetHeadIcon(int jobid, CharacterType type)
    {
        int id = 0;
        switch (type)
        {
            case CharacterType.OtherPlayer:
            case CharacterType.Player:
                NewCharacterTable table = TableManager.GetTableData((int)TableID.NewCharacterTableID, jobid) as NewCharacterTable;
                if (table != null)
                {
                    id = table.IconId;
                }
                break;
            case CharacterType.Monster:
                MonsterTable m_monsterInfo = null;
                m_monsterInfo = TableManager.GetTableData((int)TableID.MonsterTableID, jobid) as MonsterTable;
                if (m_monsterInfo != null)
                {
                    id = m_monsterInfo.nHeadIcon;
                }
                break;
            case CharacterType.NPC:
                NpcListTable m_info = TableManager.GetTableData((int)TableID.NpcListTableID, jobid) as NpcListTable;
                if (m_info != null)
                {
                    id = m_info.IconId;
                }
                break;
            case CharacterType.Servant:
                MercenaryTable sInfo = TableManager.GetTableData((int)TableID.MercenaryTableID, jobid) as MercenaryTable;
                if (sInfo != null)
                {
                    id = sInfo.nIcon;
                }
                break;
            default:
                break;
        }
        return id;
    }

    /// <summary>
    /// 金币是否足够
    /// </summary>
    static public bool PlayerGoldIsEnough(int need)
    {
        if (LocalPlayer.Instance != null)
        {
            return LocalPlayer.Instance.Attribute.Gold >= need;
        }
        return false;
    }

    /// <summary>
    /// 元宝是否足够
    /// </summary>
    static public bool PlayerJewelIsEnough(int need)
    {
        if (LocalPlayer.Instance != null)
        {
            return LocalPlayer.Instance.Attribute.Jewel >= need;
        }
        return false;
    }

    /// <summary>
    /// 玩家金钱是否充足
    /// </summary>
    static public bool PlayerMoneyIsEnough(GameCoin type, int need)
    {
        bool result = false;

        if (LocalPlayer.Instance != null)
        {
            switch (type)
            {
                case GameCoin.Gold: result = LocalPlayer.Instance.Attribute.Gold >= need; break;
                case GameCoin.Diamond: result = LocalPlayer.Instance.Attribute.Jewel >= need; break;
                case GameCoin.Crystal: result = LocalPlayer.Instance.Attribute.Crystal >= need; break;
            }
        }

        return result;
    }

    /// <summary>
    /// 提示金币不足,TODO:需要跳转到充值界面等功能
    /// </summary>
    static public void TipsForGoldNotEnough(bool isgold)
    {
        string str;
        string comfirm = StringConst.COMMON_CONFIRM;
        string cancel = StringConst.COMMON_CANCEL;
        string title = StringConst.COMMON_WARN;
        if (isgold)
        {
            NoticeMgr.Instance.GetNoticeString(7001, out str);
        }
        else
        {
            NoticeMgr.Instance.GetNoticeString(7002, out str);
        }
        WindowMgr.OpenConfirmWindow(comfirm, cancel, title, str, null, null);
    }

    /// <summary>
    /// 获得品质字符串
    /// </summary>
    static public string GetQualityString(int id)
    {
        if (id == 0)
            id = 1;
        string str = Equipment.EQUIP_COLOR[id] + (TableManager.GetTableData((int)TableID.QualityTableID, id) as QualityTable).qualitydes + "[-]";

        return str;
    }

    /// <summary>
    /// 得到坐骑在坐骑表里的index id
    /// </summary>
    static public int GetMountId(int type, int quality)
    {
        return type * 10000 + quality;
    }

    /// <summary>
    /// 坐骑品质属性表id
    /// </summary>
    static public int GetMountAttrId(int type, int quality)
    {
        return type * 1000 + quality;
    }

    static public int GetMountAttrLevel(int level)
    {
        return level * 100;
    }

    /// <summary>
    /// 获得场景里GameObject的完整路径
    /// </summary>
    static public string GetFullName(Transform trans, Transform endTrans = null)
    {
        string fullName = trans.name;

        while (trans.parent != null && (endTrans == null || endTrans != trans))
        {
            trans = trans.parent;
            fullName = trans.name + "/" + fullName;
        }

        return fullName;
    }

    static public string GetFullNameWinParOrClone(Transform trans)
    {
        string fullName = trans.name;

        while (trans.parent != null && trans.GetComponent<WindowBase>() == null && (!trans.name.EndsWith("(Clone)") || trans.name == fullName))
        {
            trans = trans.parent;
            fullName = trans.name + "/" + fullName;
        }

        return fullName;
    }

    /// <summary>
    /// 字符串转int数组
    /// </summary>
    static public int[] String2ArrayInt(string str, string strSign)
    {
        string[] strArr = str.Split(new string[] { strSign }, System.StringSplitOptions.None);
        int[] ret = new int[strArr.Length];
        for (int i = 0; i < strArr.Length; i++)
        {
            ret[i] = int.Parse(strArr[i]);
        }

        return ret;
    }

    /// <summary>
    /// 字符串转float数组
    /// </summary>
    static public float[] String2ArrayFloat(string str, string strSign)
    {
        string[] strArr = str.Split(new string[] { strSign }, System.StringSplitOptions.None);
        float[] ret = new float[strArr.Length];
        for (int i = 0; i < strArr.Length; i++)
        {
            ret[i] = float.Parse(strArr[i]);
        }

        return ret;
    }

    /// <summary>
    /// 字符串按分隔符拆分后转换为Vector3
    /// </summary>
    static public Vector3 String2Pos(string str, string strSign)
    {
        Vector3 pos = Vector3.zero;
        float[] posXYZ = String2ArrayFloat(str, strSign);
        pos.x = posXYZ[0];
        pos.y = posXYZ[1];
        if (posXYZ.Length > 2)
        {
            pos.z = posXYZ[2];
        }
        else
        {
            pos.z = 0;
        }
        return pos;
    }

    /// <summary>
    /// 检测字符串内是否有除字母,数字,中文外的其他字符
    /// </summary>
    static public bool CheckHasSymbol(string word)
    {
        for (int i = 0; i < word.Length; i++)
        {
            char c = Convert.ToChar(word[i]);

            //正则检测是否是字母,数字,中文
            Regex rx = new Regex("^[a-zA-Z0-9\u4e00-\u9fa5]$");
            if (!rx.IsMatch(word[i].ToString()))
            {
                return true;
            }
        }

        return false;
    }

    /// <summary>
    /// 检测字符串长度
    /// </summary>
    /// <param name="length">最大长度,中文=2个长度</param>
    static public bool CheckStringLength(string word, int length)
    {
        int count = 0;
        Regex rx = new Regex("^[\u4e00-\u9fa5]$");
        for (int i = 0; i < word.Length; i++)
        {
            if (rx.IsMatch(word[i].ToString()))
            {
                count += 2;
            }
            else
            {
                count += 1;

            }
        }

        return count <= length;
    }


    /// <summary>
    /// 设置标签按钮图片的点击状态 约定图片名字相同,尾数为2表示点击状态,为1表示非点击状态
    /// </summary>
    static public void SetClickState(UISprite sp, bool isClick)
    {
        string spName = sp.spriteName.Substring(0, sp.spriteName.Length - 1);
        string replaceStr = sp.spriteName.Substring(sp.spriteName.Length - 1, 1);
        if (isClick)
        {
            sp.spriteName = spName + replaceStr.Replace("1", "2");
        }
        else
        {
            sp.spriteName = spName + replaceStr.Replace("2", "1");
        }
    }

    /// <summary>
    /// 设置按钮的置灰
    /// </summary>
    static public void SetBtnGray(UISprite targetSprite, bool toGray)
    {
        GrayUIExchangeMgr.Instance.ChangeUISpriteToGray(targetSprite, toGray);
        targetSprite.GetComponent<BoxCollider>().enabled = !toGray;
    }

    /// <summary>
    /// 清除所有人的头顶连杀图标
    /// </summary>
    static public void ClearAllHudIcon()
    {
        if (GameCoreController.Instance == null || LocalPlayer.Instance == null)
            return;
        List<CharacterBase> roles = GameCoreController.Instance.GetAllOtherPlayers();

        for (int i = 0; i < roles.Count; i++)
            (roles[i] as OtherPlayer).HudSetMultiKillIcon(0);
        LocalPlayer.Instance.HudSetMultiKillIcon(0);
    }

    /// <summary>
    /// 获取随从品质表
    /// </summary>
    static public int GetServantProply(int id, int nQuality)
    {
        return id * 100 + nQuality;
    }

    /// <summary>
    /// 获取随从类型
    /// </summary>
    static public int GetServantType(int id)
    {

        return id % 100000000;
    }

    /// <summary>
    /// 获取随从职业专精表id
    /// </summary>
    static public int GetServntJobTb(int job, int Spcei)
    {
        return job * 100 + Spcei;
    }

    /// <summary>
    /// 获取随从属性表
    /// </summary>
    static public int GetServantAtrrID(int nMercenaryAttrId, int star, int level)
    {

        return nMercenaryAttrId * 1000 + level;
    }

    /// <summary>
    /// 根据随从品质返回对应的颜色
    /// </summary>
    static public Color GetColor(int colorIndex)
    {
        Color servantColor = new Color(); ;
        switch (colorIndex)
        {
            case 1:
                servantColor = HtmlToColor("f1f1f1");
                break;
            case 2:
                servantColor = HtmlToColor("41e914");
                break;
            case 3:
                servantColor = HtmlToColor("17beea");
                break;
            case 4:
                servantColor = HtmlToColor("c613ec");
                break;
            case 5:
                servantColor = HtmlToColor("f09a14");
                break;

        }
        return servantColor;
    }

    /// <summary>
    /// 获得两点之间的等分点
    /// </summary>
    static public List<Vector3> GetBetweenPoints(Vector3 startPos, Vector3 endPos, int count)
    {
        if (count <= 0) return null;

        List<Vector3> posList = new List<Vector3>();
        Vector3 seVec = endPos - startPos;
        for (int i = 0; i < count; i++)
        {
            Vector3 vec = startPos + ((float)(i + 1) / (count + 1)) * seVec;
            posList.Add(vec);
        }

        return posList;
    }

    /// <summary>
    /// 大数显示,大于一万的,显示xx.x万
    /// </summary>
    static public string NumberToString(int num)
    {
        if (num > 10000)
            return string.Format("{0:#.#}{1}", (float)num / 10000.0f, StringConst.COMMON_TNE_THOUSAND);
        else
            return num.ToString();
    }

    /// <summary>
    ///buff排序
    /// </summary>
    static public int SortBuff(Buffer a, Buffer b)
    {

        if (a.BuffTable.show_type < b.BuffTable.show_type)
            return -1;
        else if (a.BuffTable.show_type > b.BuffTable.show_type)
            return 1;
        else
        {
            if (a.BuffBirth > b.BuffBirth)
                return -1;
            else if (a.BuffBirth < b.BuffBirth)
                return 1;
            else
                return 0;
        }
    }

    /// <summary>
    /// 根据品质来排序
    /// </summary>
    static public int SortQuality(ServantData x, ServantData y)
    {
        if ((int)x.ServerState > (int)y.ServerState)
        {
            return -1;
        }
        else if ((int)x.ServerState == (int)y.ServerState)
        {
            if (x.ServantTb.rarity > y.ServantTb.rarity)
            {
                return -1;
            }
            else if (x.ServantTb.rarity == y.ServantTb.rarity)
            {
                if (x.ServantTb.nMercenaryId < y.ServantTb.nMercenaryId)
                {
                    return -1;
                }
                else if (x.ServantTb.nMercenaryId < y.ServantTb.nMercenaryId)
                {
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            else
            {
                return 1;
            }
        }
        else
        {
            return 1;
        }



    }

    /// <summary>
    /// 设置模型Texture尺寸
    /// </summary>
    static public int SetModelTextureSize(int joyType)
    {
        int size = 0;
        switch (joyType)
        {
            case 101:
                size = 528;
                break;
            case 102:
                size = 607;
                break;
            case 104:
                size = 528;
                break;
            case 105:
                size = 530;
                break;
            case 107:
                size = 815;
                break;
            case 201:
                size = 785;
                break;
            case 202:
                size = 624;
                break;
            case 203:
                size = 779;
                break;
            case 205:
                size = 827;
                break;
            case 207:
                size = 743;
                break;
        }
        return size;
    }

    /// <summary>
    /// 设置模型Texture位置
    /// </summary>
    static public Vector3 SetModelTexturePos(int joyType)
    {
        Vector3 pos = Vector3.zero;
        switch (joyType)
        {
            case 101:
                pos = new Vector3(41.82f, -23.38f, 0);
                break;
            case 102:
                pos = new Vector3(41.82f, -23.38f, 0);
                break;
            case 104:
                pos = new Vector3(49.1f, -26.15f, 0);
                break;
            case 105:
                pos = new Vector3(49.1f, -26f, 0);
                break;
            case 107:
                pos = new Vector3(49.1f, 38.13f, 0);
                break;
            case 201:
                pos = new Vector3(56.23f, 9.55f, 0);
                break;
            case 202:
                pos = new Vector3(43.2f, 2.9f, 0);
                break;
            case 203:
                pos = new Vector3(56.23f, 13.93f, 0);
                break;
            case 205:
                pos = new Vector3(56.23f, 22f, 0);
                break;
            case 207:
                pos = new Vector3(56.23f, 13.93f, 0);
                break;
        }
        return pos;
    }

    /// <summary>
    /// 获得随从品阶中文
    /// </summary>
    static public String GetServantQualityOrder(int quality)
    {
        string s = "";
        switch (quality)
        {
            case 1:
                s = StringConst.SERVANT_QUALITY_WHITE;
                break;
            case 2:
                s = StringConst.SERVANT_QUALITY_GREEN;
                break;
            case 3:
                s = StringConst.SERVANT_QUALITY_BLUE;
                break;
            case 4:
                s = StringConst.SERVANT_QUALITY_POPPON; ;
                break;
            case 5:
                s = StringConst.SERVANT_QUALITY_YELLOW;
                break;
        }
        return s;
    }

    /// <summary>
    /// 获得随从技能中文
    /// </summary>
    static public String GetServantSkillLock(int quality)
    {
        string s = "";
        switch (quality)
        {
            case 1:
                s = string.Format(StringConst.SERVANT_SERVANT_QUALITY, StringConst.SERVANT_QUALITY_WHITE);
                break;
            case 2:
                s = string.Format(StringConst.SERVANT_SERVANT_QUALITY, StringConst.SERVANT_QUALITY_GREEN);
                break;
            case 3:
                s = string.Format(StringConst.SERVANT_SERVANT_QUALITY, StringConst.SERVANT_QUALITY_BLUE);
                break;
            case 4:
                s = string.Format(StringConst.SERVANT_SERVANT_QUALITY, StringConst.SERVANT_QUALITY_POPPON);
                break;
            case 5:
                s = string.Format(StringConst.SERVANT_SERVANT_QUALITY, StringConst.SERVANT_QUALITY_YELLOW);
                break;
        }
        return s;
    }

    /// <summary>
    /// 获得随从专精
    /// </summary>
    static public string GetServantMastery(int mastery)
    {
        string s = "";
        switch (mastery)
        {
            case 1:
                s = "tanke";
                break;
            case 2:
                s = "zhiliao";
                break;
            case 3:
                s = "shanghaishuchu";
                break;
        }
        return s;
    }

    /// <summary>
    /// 获取物品提示框
    /// </summary>
    /// <param name="parent">Item的父物体</param>
    /// <param name="localPos">Item的本地位置</param>
    /// <param name="baseDepth">Item要求的最低深度</param>
    /// <returns></returns>
    static private LegacyBottomBaseItem GetTipBlockItem(GameObject parent, Vector3 localPos, int baseDepth, bool showSelect)
    {
        ResourceID id = ResourceID.Block_Block;
        if (showSelect) id = ResourceID.Block_SelectBlock;
        GameObject itemGo = ResourceMgr.LoadAsset(id, typeof(GameObject), true) as GameObject;
        itemGo = NGUITools.AddChild(parent, itemGo);
        itemGo.transform.localPosition = localPos;
        itemGo.SetActive(true);

        LegacyBottomBaseItem item = itemGo.GetComponent<LegacyBottomBaseItem>();
        UIWidget[] widgets = itemGo.GetComponentsInChildren<UIWidget>(true);
        for (int i = 0; i < widgets.Length; i++)
        {
            widgets[i].depth += baseDepth;
        }

        return item;
    }

    static public LocalBottomBaseItem GetTipBlockItem(GameObject parent, Vector3 localPos, int baseDepth)
    {
        return GetTipBlockItem(parent, localPos, baseDepth, false) as LocalBottomBaseItem;
    }

    static public LegacyBottomBaseItem GetTipSelectBlockItem(GameObject parent, Vector3 localPos, int baseDepth)
    {
        return GetTipBlockItem(parent, localPos, baseDepth, true);
    }

    /// <summary>
    /// 获得制定npc的半身像
    /// </summary>
    static public Texture GetNpcBustTex(int npcId)
    {
        NpcListTable nlt = TableManager.GetTableData((int)TableID.NpcListTableID, npcId) as NpcListTable;
        AvatarTable at = TableManager.GetTableData((int)TableID.AvatarTableID, nlt.avatarID) as AvatarTable;
        //MyLog.EditorLog("Textures/NPCBust/" + at.bustID + ".png");
        Texture tex = ResourceMgr.LoadAsset("Textures/NPCBust/" + at.bustID + ".png", at.bustID, typeof(Texture), true, true) as Texture;
        return tex;
    }

    /// <summary>
    /// 计算物体周围的一个随机点
    /// </summary>
    /// <param name="trans">以当前物体为中心的周围</param>
    /// <param name="minAngel">最小的角度,物体正前方为0,左为负,右为正</param>
    /// <param name="maxAngle">最大的角度,物体正前方为0,左为负,右为正</param>
    /// <param name="minDis">最小的距离</param>
    /// <param name="maxDis">最大的距离</param>
    static public Vector3 CaculateAroundRandomPos(Transform trans, float minAngel, float maxAngle, float minDis, float maxDis)
    {
        float rDis = UnityEngine.Random.Range(minDis, maxDis);
        float angle = UnityEngine.Random.Range(minAngel, maxAngle);
        float radians = Mathf.Deg2Rad * angle;
        Vector3 localPos = new Vector3();
        localPos.x = rDis * Mathf.Sin(radians);
        localPos.z = rDis * Mathf.Cos(radians);

        Vector3 worldPos = trans.TransformPoint(localPos);

        return worldPos;
    }

    /// <summary>
    /// 取得一个点半径周围内的一个点
    /// </summary>
    /// <param name="centerPos"></param>
    /// <param name="radius"></param>
    /// <returns></returns>
    static public Vector3 CaculateAroundRandomPos(Vector3 centerPos, float radius)
    {
        float angle = UnityEngine.Random.Range(0, 360);
        float radians = Mathf.Deg2Rad * angle;
        Vector3 localPos = new Vector3();
        localPos.x = radius * Mathf.Sin(radians);
        localPos.z = radius * Mathf.Cos(radians);

        Vector3 worldPos = centerPos + localPos;

        return worldPos;
    }

    /// <summary>
    /// 更改选中的目标
    /// </summary>
    static public void ChangeTarget(long pid)
    {
        CharacterBase characterBase = GameCoreController.Instance.GetCharacterByPID(pid, CharacterType.Any);
        if (characterBase != null)
        {
            LocalPlayer.Instance.LockEnemyByHand(characterBase);
        }
    }

    /// <summary>
    /// 检测玩家是否死亡状态并提示
    /// </summary>
    static public bool CheckDieTips()
    {
        if (LocalPlayer.Instance.IsDead || LocalPlayer.Instance.IsGhost)
        {
            WindowMgr.OpenInformWindow(InformType.FixNoticeType, StringConst.COMMON_DIE_LIMIT_TIPS);
            return true;
        }
        return false;
    }

    /// <summary>
    /// 根据NPCID进行寻路操作
    /// </summary>
    static public void FindPathByNpcId(int npcId, PathDelegate arrival, bool openProgress, params object[] args)
    {
        NpcListTable npc = TableManager.GetTableData((int)TableID.NpcListTableID, npcId) as NpcListTable;
        if (npc == null)
        {
            MyLog.EditorLogError("Npc不存在    " + npcId);
            return;
        }
        SceneInfoForClient mapInfo = ResourceMgr.LoadMapInfo(npc.MapId) as SceneInfoForClient;
        NPCInfo info = mapInfo.Npcs.Find(p => p.NPCID == npcId);
        if (info == null)
        {
            MyLog.EditorLogError("地图 " + npc.MapId + " 中不存在Npc " + npcId + " " + npc.NpcName);
            return;
        }

        Transform tf = new GameObject().transform;
        tf.position = info.Position;
        tf.eulerAngles = info.Rotation;
        Vector3 funPos = GameUtils.CaculateAroundRandomPos(tf, -60, 60, 1, 1);
        MonoBehaviour.Destroy(tf.gameObject);

        if (openProgress)
        {
            LocalPlayer.Instance.AutoMoveToWithProgress(npc.MapId, funPos, arrival, args);
        }
        else
        {
            LocalPlayer.Instance.AutoMoveTo(npc.MapId, funPos, arrival, args);
        }
    }

    /// <summary>
    /// 取得玩家模型的资源ID
    /// </summary>
    static public int GetPlayerModelResId(AvatarTable avatar, int resId, EquipmentPart part, int value)
    {
        if (value > 10000) return value;

        int resModel = 0;
        int index = value;
        if (resId > 10000)
        {
            resId /= 100;
        }
        switch (part)
        {
            case EquipmentPart.Head:
                index = resId * 1000 + value;
                resModel = avatar.headModel;
                break;
            case EquipmentPart.Body:
                index = resId * 1000 + 100 + value;
                resModel = avatar.bodyModel;
                break;
            case EquipmentPart.Weapon:
            case EquipmentPart.SecWeapon:
                return value;
        }

        RoleModeTable table = TableManager.GetTableData((int)TableID.RoleModeTableID, index) as RoleModeTable;
        if (table != null)
        {
            resModel = table.resourcesId;

        }
        else if (value != 0)
        {
            MyLog.EditorLogError("RoleModelTable isn't exist:" + index);
        }

        return resModel;
    }

    /// <summary>
    /// 通过ItemID,获得到模型ID
    /// </summary>
    static public int GetModelIDByItemID(int itemID, EquipmentPart part)
    {
        EquipTable tb = TableManager.GetTableData((int)TableID.EquipTableID, itemID) as EquipTable;
        if (tb == null)
        {
            return 0;
        }

        switch (part)
        {
            case EquipmentPart.Head: return tb.head_model;
            case EquipmentPart.Body: return tb.body_model;
            case EquipmentPart.Weapon:
            case EquipmentPart.SecWeapon:
                return tb.item_model;
        }

        return 0;
    }

    /// <summary>
    /// 属性描述字符串分割
    /// </summary>
    static public string AttrDescSplit(string str, bool isLine)
    {
        StringBuilder stru = new StringBuilder();
        string[] strarr = str.Split(';');
        if (!string.IsNullOrEmpty(str) && strarr.Length == 0)
        {
            strarr[0] = str;
        }
        for (int i = 0; i < strarr.Length; i++)
        {
            if (strarr.Length >= 1)
            {
                string[] arr = strarr[i].Split(',');
                if (arr.Length > 1)
                {
                    stru.Append(GetItemAttrDesc((EquipAttrName)int.Parse(arr[0])));
                    stru.Append("+");
                    stru.Append(arr[1]);
                    stru = isLine ? stru.Append("\n") : stru.Append(" ");
                }
            }
        }
        return stru.ToString();
    }

    /// <summary>
    /// 服务器点与Unity坐标点的转换
    /// </summary>
    static public Vector3 GetServerPoint(Coord coord)
    {
        return new Vector3(coord.x, coord.z, coord.y);
    }

    #region 物品Item工具Func

    /// <summary>
    /// 获得物品大类描述
    /// </summary>
    static public string GetItemBaseTypeDesc(ItemType type)
    {
        string result = "";
        switch (type)
        {
            case ItemType.BAG_TYPE_ALL:
                result = StringConst.BAG_TYPE_ALL;
                break;
            case ItemType.BAG_TYPE_EQUIP:
                result = StringConst.BAG_TYPE_EQUIP;
                break;
            case ItemType.BAG_TYPE_CONSUMABLE:
                result = StringConst.BAG_TYPE_CONSUMABLE;
                break;
            case ItemType.BAG_TYPE_MATERIAL:
                result = StringConst.BAG_TYPE_MATERIAL;
                break;
            case ItemType.BAG_TYPE_CHIP:
                result = StringConst.BAG_TYPE_CHIP;
                break;
            case ItemType.BAG_TYPE_TREASURE:
                result = StringConst.BAG_TYPE_TREASURE;
                break;
        }
        return result;
    }

    /// <summary>
    /// 获得字段描述
    /// </summary>
    static public string GetItemAttrDesc(EquipAttrName att)
    {
        string result = "";
        switch (att)
        {
            case EquipAttrName.None:
                result = "基础属性:";
                break;
            case EquipAttrName.ARMOR:
                result = StringConst.ENTITY_ATTR_ARMOR;
                break;
            case EquipAttrName.ATTACK_SPEED:
                result = StringConst.ENTITY_ATTR_ATTACK_SPEED;
                break;
            case EquipAttrName.PHY_ATTACK_INTENSITY:
                result = StringConst.ENTITY_ATTR_PHY_ATTACK_INTENSITY;
                break;
            case EquipAttrName.MAGIC_ATTACK_INTENSITY:
                result = StringConst.ENTITY_ATTR_MAGIC_ATTACK_INTENSITY;
                break;
            case EquipAttrName.MAGIC_RESISTANCE:
                result = StringConst.ENTITY_ATTR_MAGIC_RESISTANCE;
                break;
            case EquipAttrName.HP:
                result = StringConst.ENTITY_ATTR_HP;
                break;
            case EquipAttrName.STRENGTH:
                result = StringConst.ENTITY_ATTR_STRENGTH;
                break;
            case EquipAttrName.AGILITY:
                result = StringConst.ENTITY_ATTR_AGILITY;
                break;
            case EquipAttrName.WIT:
                result = StringConst.ENTITY_ATTR_WIT;
                break;
            case EquipAttrName.STAMINA:
                result = StringConst.ENTITY_ATTR_STAMINA;
                break;
            case EquipAttrName.DODGE:
                result = StringConst.ENTITY_ATTR_DODGE;
                break;
            case EquipAttrName.WITHSTAND:
                result = StringConst.ENTITY_ATTR_WITHSTAND;
                break;
            case EquipAttrName.BLOCK:
                result = StringConst.ENTITY_ATTR_BLOCK;
                break;
            case EquipAttrName.CRIT:
                result = StringConst.ENTITY_ATTR_CRIT;
                break;
            case EquipAttrName.TENACITY:
                result = StringConst.ENTITY_ATTR_TENACITY;
                break;
            case EquipAttrName.LESSENCD_RATE:
                result = StringConst.ENTITY_ATTR_LESSENCD_RATE;
                break;
            case EquipAttrName.PROFICIENT:
                result = StringConst.ENTITY_ATTR_PROFICIENT;
                break;
            default: result = "";
                break;
        }

        return result;
    }

    /// <summary>
    /// 获得字段描述(区分是否是特殊属性)
    /// </summary>
    static public bool GetItemAttrDesc(EquipAttrName att, ref string result)
    {
        switch (att)
        {
            case EquipAttrName.None:
                result = StringConst.TIP_ATTRIBUTE_BASEATTR;
                return false;
            case EquipAttrName.ARMOR:
            case EquipAttrName.ATTACK_SPEED:
            case EquipAttrName.PHY_ATTACK_INTENSITY:
            case EquipAttrName.MAGIC_ATTACK_INTENSITY:
            case EquipAttrName.MAGIC_RESISTANCE:
            case EquipAttrName.HP:
            case EquipAttrName.STRENGTH:
            case EquipAttrName.AGILITY:
            case EquipAttrName.WIT:
            case EquipAttrName.STAMINA:
                result = GameUtils.GetItemAttrDesc(att);
                return false;
            case EquipAttrName.DODGE:
            case EquipAttrName.WITHSTAND:
            case EquipAttrName.BLOCK:
            case EquipAttrName.CRIT:
            case EquipAttrName.TENACITY:
            case EquipAttrName.LESSENCD_RATE:
            case EquipAttrName.PROFICIENT:
                result = GameUtils.GetItemAttrDesc(att);
                return true;
            default: result = "";
                return false;
        }
    }

    /// <summary>
    /// 获得装备类型
    /// </summary>
    static public string GetItemGoodTypeDesc(GoodsType type)
    {
        switch (type)
        {
            case GoodsType.GOODS_CLOTH:
                return StringConst.GOODS_CLOTH;
            case GoodsType.GOODS_LEATHER:
                return StringConst.GOODS_LEATHER;
            case GoodsType.GOODS_LOCKER:
                return StringConst.GOODS_LOCKER;
            case GoodsType.GOODS_BOARDER:
                return StringConst.GOODS_BOARDER;
            case GoodsType.GOODS_WEAPON:
                return StringConst.GOODS_WEAPON;
            case GoodsType.GOODS_ACCESSORY:
                return StringConst.GOODS_ACCESSORY;
            case GoodsType.GOODS_FASHION:
                return StringConst.GOODS_FASHION;
            case GoodsType.GOODS_PACKAGE:
                return StringConst.GOODS_PACKAGE;
            case GoodsType.GOODS_CONSUMABLE:
                return StringConst.GOODS_CONSUMABLE;
            case GoodsType.GOODS_JEWELRY:
                return StringConst.GOODS_JEWELRY;
            case GoodsType.GOODS_GLYPHS:
                return StringConst.GOODS_GLYPHS;
            case GoodsType.GOODS_TASKER:
                return StringConst.GOODS_TASKER;
            case GoodsType.GOODS_MATERIAL:
                return StringConst.GOODS_MATERIAL;
            case GoodsType.GOODS_GOOD:
                return StringConst.GOODS_GOOD;
            case GoodsType.GOODS_RECIPE:
                return StringConst.GOODS_RECIPE;
            case GoodsType.GOODS_KEY:
                return StringConst.GOODS_KEY;
            case GoodsType.GOODS_OTHER:
                return StringConst.GOODS_OTHER;
            case GoodsType.GOODS_MOUNT_CHIP:
                return StringConst.GOODS_MOUNT_CHIP;
            case GoodsType.GOODS_PET_CHIP:
                return StringConst.GOODS_PET_CHIP;
            case GoodsType.GOODS_SUITE_CHIP:
                return StringConst.GOODS_SUITE_CHIP;
            case GoodsType.GOODS_MOUNT_EXP:
                return StringConst.GOODS_MOUNT_EXP;
            case GoodsType.GOODS_PET_EXPITEM:
                return StringConst.GOODS_PET_EXPITEM;
            case GoodsType.GOODS_GOLD:
                return StringConst.GOODS_GOLD;
            case GoodsType.GOODS_DIAMOND:
                return StringConst.GOODS_DIAMOND;
            case GoodsType.GOODS_RUNES:
                return StringConst.GOODS_RUNES;
            case GoodsType.GOODS_SERVANT_CHIP:
                return StringConst.GOODS_SERVANT_CHIP;
            case GoodsType.GOODS_CHESTS:
                return StringConst.GOODS_CHESTS;
            case GoodsType.GOODS_SERVANT_TREASURE:
                return StringConst.GOODS_SERVANT_TREASURE;
            case GoodsType.GOODS_TREASURE_MAP:
                return StringConst.GOODS_TREASURE_MAP;
            case GoodsType.GOODS_MEDICINE:
                return StringConst.GOODS_MEDICINE;
            case GoodsType.GOODS_FOOD_BLOOD:
                return StringConst.GOODS_FOOD_BLOOD;
            case GoodsType.GOODS_FOOD_MAGIC:
                return StringConst.GOODS_FOOD_MAGIC;
            case GoodsType.GOODS_STATEMEDICINE:
                return StringConst.GOODS_STATEMEDICINE;
            case GoodsType.GOODS_HEIRLOOM:
                return StringConst.GOODS_HEIRLOOM;
            case GoodsType.GOODS_FRIEND:
                return StringConst.GOODS_FRIEND;
            case GoodsType.GOODS_CRYSTAL:
                return StringConst.GOODS_CRYSTAL;
            case GoodsType.GOODS_MONEYBUFF:
                return StringConst.GOODS_MONEYBUFF;
            case GoodsType.GOODS_EXPBUFF:
                return StringConst.GOODS_EXPBUFF;
            case GoodsType.GOODS_FXBUFF:
                return StringConst.GOODS_FXBUFF;
            case GoodsType.GOODS_BLOOD_PACKAGE:
                return StringConst.GOODS_BLOOD_PACKAGE;
            case GoodsType.GOODS_MAGIC_PACKAGE:
                return StringConst.GOODS_MAGIC_PACKAGE;
            case GoodsType.GOODS_BLOOD_INSTANT:
                return StringConst.GOODS_BLOOD_INSTANT;
            case GoodsType.GOODS_MAGIC_INSTANT:
                return StringConst.GOODS_MAGIC_INSTANT;
            case GoodsType.GOODS_BLOOD_CONTINUED:
                return StringConst.GOODS_BLOOD_CONTINUED;
            case GoodsType.GOODS_MAGIC_CONTINUED:
                return StringConst.GOODS_MAGIC_CONTINUED;
            case GoodsType.GOODS_STATEMEDICINE_SHORT:
                return StringConst.GOODS_STATEMEDICINE_SHORT;
            case GoodsType.GOODS_STATEMEDICINE_LONG:
                return StringConst.GOODS_STATEMEDICINE_LONG;
            case GoodsType.GOODS_SINGLE_SWORD:
                return StringConst.GOODS_SINGLE_SWORD;
            case GoodsType.GOODS_DRAGGER:
                return StringConst.GOODS_DRAGGER;
            case GoodsType.GOODS_SINGLE_MACE:
                return StringConst.GOODS_SINGLE_MACE;
            case GoodsType.GOODS_SINGLE_AXW:
                return StringConst.GOODS_SINGLE_AXW;
            case GoodsType.GOODS_STAFF:
                return StringConst.GOODS_STAFF;
            case GoodsType.GOODS_BOW:
                return StringConst.GOODS_BOW;
            case GoodsType.GOODS_GUN:
                return StringConst.GOODS_GUN;
            case GoodsType.GOODS_SHIELD:
                return StringConst.GOODS_SHIELD;
            case GoodsType.GOODS_BOTHHAND_SWORD:
                return StringConst.GOODS_BOTHHAND_SWORD;
            case GoodsType.GOODS_BOTHHAND_AXE:
                return StringConst.GOODS_BOTHHAND_AXE;
            case GoodsType.GOODS_BOTHHAND_MACE:
                return StringConst.GOODS_BOTHHAND_MACE;
            case GoodsType.GOODS_BOOK:
                return StringConst.GOODS_BOOK;
            case GoodsType.GOODS_LIGHT:
                return StringConst.GOODS_LIGHT;
            default: return "";
        }
    }

    /// <summary>
    /// 获得装备子类
    /// </summary>
    static public string GetItemSubTypeDesc(SubType type)
    {
        switch (type)
        {
            case SubType.NONE:
                return "";
            case SubType.BAG_HEAD:
                return StringConst.BAG_HEAD;
            case SubType.BAG_HAND:
                return StringConst.BAG_HAND;
            case SubType.BAG_BODY:
                return StringConst.BAG_BODY;
            case SubType.BAG_PANTS:
                return StringConst.BAG_PANTS;
            case SubType.BAG_GLOVE:
                return StringConst.BAG_GLOVE;
            case SubType.BAG_LEG:
                return StringConst.BAG_LEG;
            case SubType.BAG_DECORATION:
                return StringConst.BAG_DECORATION;
            case SubType.BAG_FASHION:
                return StringConst.BAG_FASHION;
            case SubType.BAG_BOTHHAND:
                return StringConst.BAG_BOTHHAND;
            case SubType.BAG_SINGLE:
                return StringConst.BAG_SINGLE;
            case SubType.BAG_DEPUTY:
                return StringConst.BAG_DEPUTY;
            default: return "";
        }
    }

    /// <summary>
    /// 获得阵营
    /// </summary>
    static public string GetCampStr(int campID)
    {
        if ((CampType)campID == CampType.Horde)
        {
            return StringConst.BFIELD_HORDE;
        }
        else if ((CampType)campID == CampType.Alliance)
        {
            return StringConst.BFIELD_ALLIA;
        }

        return "";
    }

    /// <summary>
    /// 获得金币数量
    /// </summary>
    static public int GetGoldNum(GameCoin type)
    {
        int result = 0;

        if (LocalPlayer.Instance != null)
        {
            switch (type)
            {
                case GameCoin.Gold: result = LocalPlayer.Instance.Attribute.Gold; break;
                case GameCoin.Diamond: result = LocalPlayer.Instance.Attribute.Jewel; break;
                case GameCoin.Crystal: result = LocalPlayer.Instance.Attribute.Crystal; break;
            }
        }

        return result;
    }

    /// <summary>
    /// 获得相应金币图标
    /// </summary>
    static public string GetGlodTypeName(int type)
    {
        string result = "icon_0002";
        switch ((GameCoin)type)
        {
            case GameCoin.Gold: result = "icon_0002"; break;
            case GameCoin.Diamond: result = "icon_0039"; break;
            case GameCoin.Honor: result = "icon_0037"; break;
            case GameCoin.GuildPersonalDonate: result = "icon_0036"; break;
            case GameCoin.ReputationValue: result = "icon_0002"; break;
            case GameCoin.GoodTeacherValue: result = "icon_0002"; break;
            case GameCoin.Crystal: result = "icon_shuijin"; break;
        }

        return result;
    }


    /// <summary>
    /// 填充文字
    /// </summary>
    static public void FillStrVal(ref string str1, ref string str2)
    {
        int length1 = str1.Length;
        int length2 = str2.Length;

        int max = Mathf.Abs(length1 - length2);
        if (length1 > length2)
        {
            for (int i = 0; i < max; i++)
            {
                str2 += " ";
            }
        }
        else
        {
            for (int i = 0; i < max; i++)
            {
                str1 += " ";
            }
        }
    }

    /// <summary>
    /// 获得金币称谓
    /// </summary>
    /// <returns></returns>
    static public string GetGoldName(int type)
    {
        string result = "";
        switch ((GameCoin)type)
        {
            case GameCoin.Gold: result = StringConst.GOODS_GOLD; break;
            case GameCoin.Diamond: result = StringConst.GOODS_DIAMOND; break;
            case GameCoin.Honor: result = StringConst.SHOP_TIP_HONORCOIN; break;
            case GameCoin.GuildPersonalDonate: result = StringConst.SHOP_TIP_GUILDCOIN; break;
            case GameCoin.ReputationValue: result = StringConst.SHOP_TIP_REPUTATIONCOIN; break;
            case GameCoin.GoodTeacherValue: result = StringConst.SHOP_TIP_APPRENTICECOIN; break;
            case GameCoin.Crystal: result = StringConst.GOODS_CRYSTAL; break;
        }

        return result;
    }

    /// <summary>
    /// 获得部位图标的图集
    /// </summary>
    static public string GetBodySpriteName(BodyPart part)
    {
        string str = "";

        switch (part)
        {
            case BodyPart.PLAYER_HEAD: str = "pic_222"; break;
            case BodyPart.PLAYER_HAND: str = "pic_217"; break;
            case BodyPart.PLAYER_BODY: str = "pic_216"; break;
            case BodyPart.PLAYER_GLOVE: str = "pic_218"; break;
            case BodyPart.PLAYER_PANTS: str = "pic_223"; break;
            case BodyPart.PLAYER_FOOT: str = "pic_219"; break;
            case BodyPart.PLAYER_MAINHAND: str = "pic_221"; break;
            case BodyPart.PLAYER_DEPUTY: str = "pic_220"; break;
        }

        return str;
    }

    /// <summary>
    /// 获得职业偏向类型的图标名称
    /// </summary>
    static public string GetJobTypeSpName(int job)
    {
        string result = "";

        switch (job)
        {
            case 1: result = "tanke-xiao"; break;
            case 2: result = "zhiliao-xiao"; break;
            case 3: result = "shanghaishuchu-wuli"; break;
            case 4: result = "shanghaishuchu-mofa"; break;
        }

        return result;
    }

    /// <summary>
    /// 通过对比数量获得相应格式的信息
    /// </summary>
    static public string NumCompare(int curNum, int needNum)
    {
        string str = "";
        if (curNum < needNum)
        {
            string color = ColorTo16(GameConst.UITextColors[UITextColor.NormalRed]);
            str = string.Format("[{0}]{1}[-]/{2}[-]", color, curNum, needNum);
            return str;
        }
        else
        {
            string color = ColorTo16(GameConst.UITextColors[UITextColor.NormalGreen]);
            str = string.Format("[{0}]{1}[-]/{2}[-]", color, curNum, needNum);
            return str;
        }
    }

    /// <summary>
    /// 获得玩家当前的专精
    /// </summary>
    static public int GetCurrentMastery()
    {
        if (LocalPlayer.Instance == null)
        {
            return 0;
        }

        int currentJob = LocalPlayer.Instance.Job;
        int currentLv = LocalPlayer.Instance.Attribute.Level;
        int currentFocus = currentJob * 100 + LocalPlayer.Instance.Attribute.Mastery;
        return currentFocus;
    }

    /// <summary>
    /// 获得当前玩家职业类所有专精,专精为0
    /// </summary>
    static public int GetCurrentComMast()
    {
        if (LocalPlayer.Instance == null)
        {
            return 0;
        }

        int currentJob = LocalPlayer.Instance.Job;
        int currentFocus = currentJob * 100;
        return currentFocus;
    }

    /// <summary>
    /// 通过道具类型获得相对应的装备槽
    /// </summary>
    static public int GetEquipSameIndex(SubType type)
    {
        int index = 0;

        switch (type)
        {
            case SubType.BAG_HEAD:
            case SubType.BAG_HAND:
            case SubType.BAG_BODY:
            case SubType.BAG_PANTS:
            case SubType.BAG_GLOVE:
            case SubType.BAG_LEG:
                index = (int)type - 1;
                break;
            case SubType.BAG_BOTHHAND:
            case SubType.BAG_SINGLE:
                index = 8;
                break;
            case SubType.BAG_DEPUTY:
                index = 9;
                break;
        }

        return index;
    }

    /// <summary>
    /// 获得打折的资源名称
    /// </summary>
    static public string GetDisCountName(int discount)
    {
        string str = "";
        switch (discount)
        {
            case 1: str = "icon_00190"; break;
            case 2: str = "icon_00191"; break;
            case 3: str = "icon_00192"; break;
            case 4: str = "icon_00193"; break;
            case 5: str = "icon_00194"; break;
            case 6: str = "icon_00195"; break;
            case 7: str = "icon_00196"; break;
            case 8: str = "icon_00197"; break;
            case 9: str = "icon_00198"; break;
            default: break;
        }

        return str;
    }

    /// <summary>
    /// 获取服务器状态的图标
    /// </summary>
    static public string GetServerState(ServerBase data)
    {
        string result = "";

        if (data == null)
        {
            return result;
        }

        if (data.IsMaintain)
        {
            result = "icon_00133";
        }
        else
        {
            switch (data.ServerState)
            {
                case 0: result = "icon_00131"; break;
                case 1: result = "icon_00130"; break;
            }
        }

        return result;
    }

    /// <summary>
    /// 获取服务器状态的图标
    /// </summary>
    static public string GetServerLineState(int state)
    {
        string result = "";
        switch (state)
        {
            case 0: result = "icon_00131"; break;
            case 1: result = "icon_00130"; break;
        }

        return result;
    }

    /// <summary>
    /// 获得装备品质颜色
    /// </summary>
    static public Color GetEquipQualityColor(int quality)
    {
        switch (quality)
        {
            case 0: return GameConst.UITextColors[UITextColor.NormalRed];
            case 1: return GameConst.UITextColors[UITextColor.Equip_Quality_White];
            case 2: return GameConst.UITextColors[UITextColor.Equip_Quality_Green];
            case 3: return GameConst.UITextColors[UITextColor.Equip_Quality_Blue];
            case 4: return GameConst.UITextColors[UITextColor.Equip_Quality_Purple];
            case 5: return GameConst.UITextColors[UITextColor.Equip_Quality_Orange];
            case 9: return GameConst.UITextColors[UITextColor.Equip_Quality_Heirloom];
            default:
                return GameConst.UITextColors[UITextColor.Equip_Quality_White];
        }
    }

    /// <summary>
    /// 获得品质名称
    /// </summary>
    static public string GetQualityChinese(int quality)
    {
        switch (quality)
        {
            case 1: return StringConst.EQUIP_QUALITY_TYPE1;
            case 2: return StringConst.EQUIP_QUALITY_TYPE2;
            case 3: return StringConst.EQUIP_QUALITY_TYPE3;
            case 4: return StringConst.EQUIP_QUALITY_TYPE4;
            case 5: return StringConst.EQUIP_QUALITY_TYPE5;
            default:
                return StringConst.EQUIP_QUALITY_TYPE1;
        }
    }

    /// <summary>
    /// 获得带有颜色BBC的品质字符串
    /// </summary>
    static public string GetQualityWithColor(int quality)
    {
        string result = "";
        string color = ColorTo16(GetEquipQualityColor(quality));
        result = string.Format("[{0}]{1}[-]", color, GetQualityChinese(quality));
        return result;
    }

    /// <summary>
    /// 获得该品质下的字体
    /// </summary>
    static public string GetStrWithColor(string value, int quality)
    {
        string result = "";
        string color = ColorTo16(GetEquipQualityColor(quality));
        result = string.Format("[{0}]{1}[-]", color, value);
        return result;
    }

    /// <summary>
    /// 返回颜色的BBCode
    /// </summary>
    static public string GetColorBBCode(string value, UITextColor color)
    {
        string colorStr = ColorTo16(GameConst.UITextColors[color]);
        return string.Format("[{0}]{1}[-]", colorStr, value);
    }

    /// <summary>
    /// 获得物品的详细描述
    /// </summary>
    static public string GetItemInfo(ItemBase itemData)
    {
        StringBuilder buidler = new StringBuilder();

        if (itemData == null || itemData.ItemTB == null)
        {
            return "";
        }

        //1.物品描述
        if (itemData.GoodType == GoodsType.GOODS_CHESTS)
        {
            ResBoxInfo temp = null;
            if (ItemMgr.Instance.BoxInfo.TryGetValue(itemData.ItemId, out temp))
            {
                if (temp != null)
                {
                    if (!temp.desc.Contains("{0}"))
                    {
                        //不存在占位符
                        buidler.Append(temp.desc.Replace("\\n", "\n"));
                        buidler.Append("\n");
                    }
                    else
                    {
                        //存在占位符,进行筛选
                        StringBuilder builder = new StringBuilder();

                        if (temp.box_type == 6)
                        {
                            //专精类可选择宝箱
                            int currentFocus = GameUtils.GetCurrentMastery();
                            int currentTwo = GameUtils.GetCurrentComMast();
                            int length = temp.award_info.Count;
                            for (int i = 0; i < length; i++)
                            {
                                if (temp.award_info[i].item_mastery != currentFocus && temp.award_info[i].item_mastery != currentTwo)
                                {
                                    continue;
                                }

                                ItemTable item = TableManager.GetTableData((int)TableID.ItemTableID, temp.award_info[i].item_id) as ItemTable;
                                if (item == null)
                                {
                                    continue;
                                }

                                builder.Append(GameUtils.GetStrWithColor(item.item_name, item.item_quality));
                                builder.Append("×");
                                builder.Append(temp.award_info[i].item_count);
                                builder.Append("\n");
                            }

                            string str = builder.ToString();
                            if (str.Length > 0)
                            {
                                str = str.Substring(0, str.Length - 1);
                            }

                            buidler.Append(string.Format(temp.desc, str));
                            buidler.Append("\n");
                        }
                        else
                        {
                            //一般可选择宝箱
                            int length = temp.award_info.Count;
                            for (int i = 0; i < length; i++)
                            {
                                ItemTable item = TableManager.GetTableData((int)TableID.ItemTableID, temp.award_info[i].item_id) as ItemTable;
                                if (item == null)
                                {
                                    continue;
                                }

                                builder.Append(GameUtils.GetStrWithColor(item.item_name, item.item_quality));

                                if (temp.box_type != 2 && temp.box_type != 5 && temp.box_type != 7)
                                {
                                    builder.Append("×");
                                    builder.Append(temp.award_info[i].item_count);
                                }
                                builder.Append("\n");
                            }

                            string str = builder.ToString();
                            if (str.Length > 0)
                            {
                                str = str.Substring(0, str.Length - 1);
                            }
                            buidler.Append(string.Format(temp.desc, str));
                            buidler.Append("\n");
                        }
                    }
                }
            }
            else
            {
                MyLog.EditorLogError("No Box Cached Data,id=" + itemData.ItemId);
                BagDataMgr.Instance.ReqBoxInfo(itemData.ItemId);
            }
        }
        else if (!"0".Equals(itemData.ItemTB.item_des) && string.IsNullOrEmpty(itemData.ItemTB.item_des))
        {
            buidler.Append(itemData.ItemTB.item_des);
            buidler.Append("\n");
        }

        //2.物品等级
        /*
        if (itemData.ItemTB.item_level != 0)
        {
            buidler.Append(string.Format(StringConst.BAG_TIP_OBJLEVEL, itemData.ItemTB.item_level));
            buidler.Append("\n");
        }*/

        //3.物品使用等级
        if (itemData.ItemTB.use_level != 0)
        {
            buidler.Append(string.Format(StringConst.BAG_TIP_NEEDLEVEL, itemData.ItemTB.use_level));
            buidler.Append("\n");
        }

        //4.物品所属部位、专精、职业、阵营
        if (itemData.BaseType == ItemType.BAG_TYPE_EQUIP)
        {
            //装备部位
            if (itemData.GoodSubType != SubType.NONE)
            {
                buidler.Append(StringConst.BAG_TIP_EQUIPSED_BODYPART);
                buidler.Append(GameUtils.GetItemSubTypeDesc(itemData.GoodSubType));
                buidler.Append("\n");
            }

            //适用职业
            if (!GameUtils.JudgeIsWeapon(itemData.GoodType))
            {
                string[] jobs = itemData.ItemTB.occupation.Trim().Split(';');
                if (!"0".Equals(itemData.ItemTB.occupation.Trim()) && jobs.Length > 0)
                {
                    buidler.Append(StringConst.BAG_TIP_EQUIPSED_JOB);
                    for (int i = 0; i < jobs.Length; i++)
                    {
                        if (!string.IsNullOrEmpty(jobs[i]))
                        {
                            int tt = int.Parse(jobs[i].Trim());
                            buidler.Append(GameConst.JobName[tt]);
                        }

                        if (i < jobs.Length - 1)
                        {
                            buidler.Append("、");
                        }
                    }
                    buidler.Append("\n");
                }
            }

            //适用专精
            List<string> matery = new List<string>(itemData.ItemTB.specialization.Trim().Split(';'));
            if (!"0".Equals(itemData.ItemTB.specialization.Trim()) && matery.Count > 0)
            {
                buidler.Append(StringConst.BAG_TIP_EQUIPSED_MASTERY);
                for (int i = 0; i < matery.Count; i++)
                {
                    if (!string.IsNullOrEmpty(matery[i]))
                    {
                        int tt = int.Parse(matery[i].Trim());
                        buidler.Append(GameConst.MasteryName[tt]);
                    }

                    if (i < matery.Count - 1)
                    {
                        buidler.Append("、");
                    }
                }

                buidler.Append("\n");
            }
        }
        else
        {
            if (itemData.BaseType == ItemType.BAG_TYPE_CONSUMABLE && itemData.GoodType == GoodsType.GOODS_FASHION)
            {
                //时装适用职业
                if (!GameUtils.JudgeIsWeapon(itemData.GoodType))
                {
                    string[] jobs = itemData.ItemTB.occupation.Trim().Split(';');
                    if (!"0".Equals(itemData.ItemTB.occupation.Trim()) && jobs.Length > 0)
                    {
                        buidler.Append(StringConst.BAG_TIP_EQUIPSED_JOB);
                        for (int i = 0; i < jobs.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(jobs[i]))
                            {
                                int tt = int.Parse(jobs[i].Trim());
                                buidler.Append(GameConst.JobName[tt]);
                            }

                            if (i < jobs.Length - 1)
                            {
                                buidler.Append("、");
                            }
                        }
                        buidler.Append("\n");
                    }
                }

                //时装适用阵营
                if (itemData.ItemTB.camp_limit != 0)
                {
                    buidler.Append(StringConst.BAG_TIP_CAMP_LIMIT);
                    buidler.Append(GameUtils.GetCampStr(itemData.ItemTB.camp_limit));
                    buidler.Append("\n");
                }

                //时装适用专精
                List<string> matery = new List<string>(itemData.ItemTB.specialization.Trim().Split(';'));
                if (!"0".Equals(itemData.ItemTB.specialization.Trim()) && matery.Count > 0)
                {
                    buidler.Append(StringConst.BAG_TIP_EQUIPSED_MASTERY);
                    for (int i = 0; i < matery.Count; i++)
                    {
                        if (!string.IsNullOrEmpty(matery[i]))
                        {
                            int tt = int.Parse(matery[i].Trim());
                            buidler.Append(GameConst.MasteryName[tt]);
                        }

                        if (i < matery.Count - 1)
                        {
                            buidler.Append("、");
                        }
                    }

                    buidler.Append("\n");
                }
            }

            //5.物品类型
            if (itemData.GoodType != GoodsType.NONE)
            {
                buidler.Append(StringConst.BAG_TIP_ITEMTYPE);
                buidler.Append(GameUtils.GetItemGoodTypeDesc(itemData.GoodType));
                buidler.Append("\n");
            }

            //6.物品用途
            if (!"0".Equals(itemData.ItemTB.purpose))
            {
                buidler.Append(StringConst.BAG_TIP_ITEMUSE);
                buidler.Append(itemData.ItemTB.purpose);
            }
        }

        return buidler.ToString();
    }

    /// <summary>
    /// 添加基础属性框
    /// </summary>
    static public string AddBaseAttr(int value, EquipAttrName att, bool fit = true)
    {
        StringBuilder result = new StringBuilder();
        string tempStr = "";
        bool isSpecial = GameUtils.GetItemAttrDesc(att, ref tempStr);
        tempStr = string.Format("{0}: +{1}", tempStr, value);

        if (fit)
        {
            result.Append(isSpecial ? GameUtils.GetColorBBCode(tempStr, UITextColor.NormalGreen) : tempStr);
        }
        else
        {
            result.Append(GameUtils.GetColorBBCode(tempStr, UITextColor.NormalGray));
        }

        return result.ToString();
    }

    /// <summary>
    /// 获得装备详细属性
    /// </summary>
    static public string GetEquipAttr(ItemBase data)
    {
        StringBuilder tempStr = new StringBuilder();

        if (data == null || data.ItemTB == null || !(data is EquipmentItemData))
        {
            return tempStr.ToString();
        }

        EquipmentItemData tempData = data as EquipmentItemData;

        Dictionary<EquipAttrName, int> fit = new Dictionary<EquipAttrName, int>();
        Dictionary<EquipAttrName, int> notFit = new Dictionary<EquipAttrName, int>();

        foreach (var pair in tempData.EquipAttrDic)
        {
            if (GameUtils.JudgeAttrFitPlayer((int)pair.Key))
            {
                fit.Add(pair.Key, pair.Value);
            }
            else
            {
                notFit.Add(pair.Key, pair.Value);
            }
        }

        foreach (var pair in fit)
        {
            tempStr.Append(AddBaseAttr(pair.Value, pair.Key, true));
            tempStr.Append("\n");
        }

        foreach (var pair in notFit)
        {
            tempStr.Append(AddBaseAttr(pair.Value, pair.Key, false));
            tempStr.Append("\n");
        }

        return tempStr.ToString();
    }

    /// <summary>
    /// 通过DripTable中的ID获得掉落包中的物品
    /// </summary>
    static public DropPackageTable GetDropData(int dropID)
    {
        DropTable tb = TableManager.GetTableData((int)TableID.DropTableID, dropID) as DropTable;
        if (tb == null || tb.drop_package.Length == 0)
        {
            return null;
        }

        DropPackageTable package = TableManager.GetTableData((int)TableID.DropPackageTableID, tb.drop_package[0].drop_id * 10) as DropPackageTable;

        return package;
    }

    /// <summary>
    /// 获得VIP称号名称
    /// </summary>
    static public string GetVIPName(int VIP)
    {
        string result = "";
        VipInfoTable tb = TableManager.GetTableData((int)TableID.VipInfoTableID, VIP) as VipInfoTable;
        if (tb != null)
        {
            result = tb.name;
        }

        return result;
    }

    /// <summary>
    /// 获取vip等级下的图标名称
    /// </summary>
    /// <param name="lv">等级</param>
    /// <param name="type">类型,1为四个字的,2位两个字的</param>
    /// <returns></returns>
    static public string GetVIPIconName(int lv, int type)
    {
        string result = "";
        VipInfoTable tb = TableManager.GetTableData((int)TableID.VipInfoTableID, lv) as VipInfoTable;
        if (tb == null)
        {
            MyLog.EditorLogError("vip数据表有误  " + lv);
        }
        else
        {
            result = tb.icon;
            if (type == 2)
            {
                result += "2";
            }
        }

        return result;
    }

    /// <summary>
    /// 判断VIP等级是否符合
    /// </summary>
    static public bool JudgeVIPEnough(VIP_POWER_TYPE vip)
    {
        bool result = false;

        VipInfoTable tb = TableManager.GetTableData((int)TableID.VipInfoTableID, LocalPlayer.Instance.Attribute.VipLevel) as VipInfoTable;
        if (tb != null)
        {
            string[] content = tb.power_list.Replace(" ", "").Split(',');
            for (int i = 0; i < content.Length; i++)
            {
                int id = int.Parse(content[i]);
                VipPowerTable st = TableManager.GetTableData((int)TableID.VipPowerTableID, id) as VipPowerTable;
                if (st != null && st.type == (int)vip)
                {
                    result = true;
                    break;
                }
            }
        }

        return result;
    }

    /// <summary>
    /// 判断装备上是否有宝石
    /// </summary>
    static public bool JudgeHasGem(ItemBase data)
    {
        bool result = false;
        if (data == null || data.ItemTB == null || data.ItemBsUpdate == null)
        {
            return result;
        }

        if (data.ItemBsUpdate.holeList.Count > 0)
        {
            for (int i = 0; i < data.ItemBsUpdate.holeList.Count; i++)
            {
                if (data.ItemBsUpdate.holeList[i].gemId > 0)
                {
                    result = true;
                    break;
                }
            }
        }

        return result;
    }

    /// <summary>
    /// 判断属性是否符合玩家
    /// </summary>
    static public bool JudgeAttrFitPlayer(int attrID)
    {
        bool result = false;
        int player = GetCurrentMastery();

        string arr = string.Format("{0}", attrID);
        SpecializationTable speTb = TableManager.GetTableData((int)TableID.SpecializationTableID, player) as SpecializationTable;
        if (speTb == null)
        {
            return result;
        }

        string[] attrs = speTb.effect_attr.Split(';');

        for (int i = 0; i < attrs.Length; i++)
        {
            if (attrs[i] == arr)
            {
                result = true;
                break;
            }
        }

        return result;
    }

    /// <summary>
    /// 判断玩家当前专精是否符合
    /// </summary>
    static public bool JudgeSpecialization(int special)
    {
        if (LocalPlayer.Instance == null)
        {
            return false;
        }

        int currentJob = LocalPlayer.Instance.Job;
        int currentLv = LocalPlayer.Instance.Attribute.Level;
        int currentFocus = currentJob * 100 + LocalPlayer.Instance.Attribute.Mastery;

        return currentFocus == special;
    }

    /// <summary>
    /// 判断是否是武器
    /// </summary>
    static public bool JudgeIsWeapon(GoodsType type)
    {
        if ((int)type > 500 || (type) == GoodsType.GOODS_WEAPON)
        {
            return true;
        }

        return false;
    }

    /// <summary>
    /// 判断是否是装备
    /// </summary>
    static public bool JudgeIsEquip(ItemBase data)
    {
        bool result = false;

        if (data == null || data.ItemTB == null)
        {
            return result;
        }

        result = data.GoodSubType != SubType.NONE;

        return result;
    }

    /// <summary>
    /// 判断当前物品是否适合玩家
    /// </summary>
    static public bool JudgeIsFitPlayer(int itemID)
    {
        if (LocalPlayer.Instance == null)
        {
            return false;
        }

        ItemTable tempTb = TableManager.GetTableData((int)TableID.ItemTableID, itemID) as ItemTable;
        if (tempTb == null)
        {
            MyLog.EditorLogError(string.Format("当前ItemID:{0}不存在!", itemID));
            return false;
        }

        //1.判断使用等级
        int level = tempTb.use_level;

        if (LocalPlayer.Instance.Attribute.Level < level)
        {
            return false;
        }

        //2.判断是否符合自己的职业或者专精
        if ((ItemType)tempTb.type == ItemType.BAG_TYPE_EQUIP)
        {
            if (!GameUtils.JudgeIsWeapon((GoodsType)tempTb.item_type))
            {
                //如果是武器就进行专精判断,否则进行职业判断
                string[] jobs = tempTb.occupation.Trim().Split(';');
                if (!"0".Equals(tempTb.occupation.Trim()) && jobs.Length > 0)
                {
                    bool hasSelfJob = false;
                    for (int i = 0; i < jobs.Length; i++)
                    {
                        if (!string.IsNullOrEmpty(jobs[i]))
                        {
                            int tt = int.Parse(jobs[i].Trim());
                            if (LocalPlayer.Instance.Attribute.Job == tt)
                            {
                                hasSelfJob = true;
                                break;
                            }
                        }
                    }

                    if (!hasSelfJob)
                    {
                        return false;
                    }
                }
            }
            else
            {
                List<string> matery = new List<string>(tempTb.specialization.Trim().Split(';'));
                if (!"0".Equals(tempTb.specialization.Trim()) && matery.Count > 0)
                {
                    //当前专精
                    int currentMastery = GameUtils.GetCurrentMastery();

                    bool hasSelfMastery = false;
                    for (int i = 0; i < matery.Count; i++)
                    {
                        if (!string.IsNullOrEmpty(matery[i]))
                        {
                            int tt = int.Parse(matery[i].Trim());
                            if (currentMastery == tt)
                            {
                                hasSelfMastery = true;
                                break;
                            }
                        }
                    }

                    if (!hasSelfMastery)
                    {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    /// <summary>
    /// 判断当前物品是否符合职业
    /// </summary>
    static public bool JudgeIsFitJob(ItemBase item)
    {
        if (item == null || item.ItemTB == null || LocalPlayer.Instance == null)
        {
            return false;
        }

        if ("0".Equals(item.ItemTB.occupation.Trim()))
        {
            return true;
        }

        //进行职业判断
        bool result = false;
        string[] jobs = item.ItemTB.occupation.Trim().Split(';');
        if (jobs.Length > 0)
        {
            for (int i = 0; i < jobs.Length; i++)
            {
                if (!string.IsNullOrEmpty(jobs[i]))
                {
                    int tt = int.Parse(jobs[i].Trim());
                    if (LocalPlayer.Instance.Attribute.Job == tt)
                    {
                        result = true;
                        break;
                    }
                }
            }
        }

        return result;
    }

    /// <summary>
    /// 判断当前物品是否符合专精
    /// </summary>
    static public bool JudgeIsFitSpecilization(ItemBase tb)
    {
        if (tb == null || tb.ItemTB == null)
        {
            return false;
        }

        if ("0".Equals(tb.ItemTB.specialization.Trim()))
        {
            return true;
        }

        //进行职业判断
        bool result = false;
        List<string> matery = new List<string>(tb.ItemTB.specialization.Trim().Split(';'));
        if (matery.Count > 0)
        {
            //当前专精
            int currentMastery = GameUtils.GetCurrentMastery();

            for (int i = 0; i < matery.Count; i++)
            {
                if (!string.IsNullOrEmpty(matery[i]))
                {
                    int tt = int.Parse(matery[i].Trim());
                    if (currentMastery == tt)
                    {
                        result = true;
                        break;
                    }
                }
            }
        }

        return result;
    }

    /// <summary>
    /// 判断当前专精是否可以用两把一样的武器
    /// </summary>
    static public bool JudgeCanUseSameWeapon()
    {
        int currentMastery = GameUtils.GetCurrentMastery();
        SpecializationTable tb = TableManager.GetTableData((int)TableID.SpecializationTableID, currentMastery) as SpecializationTable;

        if (tb == null)
        {
            return false;
        }
        else
        {
            return tb.main_hand == tb.weapon_hand;
        }
    }

    /// <summary>
    /// 判断主副手武器是否符合专精
    /// </summary>
    static public bool JudgeSpecialization(ItemBase item)
    {
        if (item == null || item.ItemTB == null)
        {
            return false;
        }

        int currentFocus = GameUtils.GetCurrentMastery();

        //2.专精符合
        SpecializationTable tb = TableManager.GetTableData((int)TableID.SpecializationTableID, currentFocus) as SpecializationTable;

        if (item.GoodSubType == (SubType)tb.main_hand || item.GoodSubType == (SubType)tb.weapon_hand)
        {
            return true;
        }

        return false;
    }

    /// <summary>
    /// 判断一件装备是否符合玩家穿戴需求
    /// </summary>
    static public bool JudegEquipFitPlayer(ItemBase item, bool compareLevel = false)
    {
        bool result = false;

        if (LocalPlayer.Instance == null || item == null || item.ItemTB == null || item.BaseType != ItemType.BAG_TYPE_EQUIP)
        {
            return false;
        }

        if (compareLevel)
        {
            //如果需要进行等级比对
            int level = item.ItemTB.use_level;

            if (LocalPlayer.Instance.Attribute.Level < level)
            {
                return false;
            }
        }

        if (!GameUtils.JudgeIsWeapon(item.GoodType))
        {
            //是装备直接比对职业
            if (GameUtils.JudgeIsFitJob(item))
            {
                result = true;
            }
            else
            {
                result = false;
            }
        }
        else
        {
            //是武器直接比对专精
            if (GameUtils.JudgeIsFitSpecilization(item))
            {
                result = true;
            }
            else
            {
                result = false;
            }
        }

        return result;
    }

    /// <summary>
    /// 判断一件装备是否是身上穿的
    /// </summary>
    static public bool JudgeEquipIsSuit(ItemBase data)
    {
        bool result = false;

        if (data == null || data.ItemTB == null || data.ItemBsUpdate == null)
        {
            return result;
        }

        List<ItemBase> list = BagDataMgr.Instance.GetCurrentSuitList();
        for (int i = 0; i < list.Count; i++)
        {
            if (list[i].UniqueMark == data.UniqueMark)
            {
                result = true;
                break;
            }
        }

        return result;
    }

    /// <summary>
    /// 计算装备战斗力
    /// </summary>
    static public int CalculateEquipPower(ItemBase data, bool hasGem = true)
    {
        float result = 0;

        if (data == null || data.ItemTB == null || data.ItemBsUpdate == null)
        {
            return (int)result;
        }

        EquipmentItemData tempData = data as EquipmentItemData;

        //1.计算基础属性产生的战斗力
        foreach (var pair in tempData.EquipAttrDic)
        {
            if (!JudgeAttrFitPlayer((int)pair.Key))
            {
                continue;
            }

            CoefficientTable tb = TableManager.GetTableData((int)TableID.CoefficientTableID, (int)pair.Key) as CoefficientTable;

            if (tb != null)
            {
                result += pair.Value * tb.propvalue / 10000f;
            }
        }

        //2.计算附魔产生的战斗力
        EquipEnchantTable ttb = TableManager.GetTableData((int)TableID.EquipEnchantTableID, tempData.ItemBsUpdate.enchantid) as EquipEnchantTable;
        if (ttb != null)
        {
            result += ttb.nFightPower;
        }

        //3.计算宝石产生的战斗力
        List<ProtoHole> holes = tempData.ItemBsUpdate.holeList;
        for (int i = 0; i < holes.Count; i++)
        {
            if (holes[i].gemId != 0)
            {
                GemTable tb = TableManager.GetTableData((int)TableID.GemTableID, holes[i].gemId) as GemTable;
                if (tb != null)
                {
                    result += tb.nFightPower;
                }
            }
        }

        //4.计算技能产生的战斗力
        if (hasGem)
        {
            List<int> charAttrTb = tempData.ItemBsUpdate.skilllist;
            for (int i = 0; i < charAttrTb.Count; i++)
            {
                EffectTriggerTable effect = TableManager.GetTableData((int)TableID.EffectTriggerTableID, charAttrTb[i]) as EffectTriggerTable;
                if (effect != null)
                {
                    result += effect.nFightPower;
                }
            }
        }

        return Mathf.RoundToInt(result);
    }

    /// <summary>
    /// 检测是否有空包裹
    /// </summary>
    static public bool CheckNullPackage()
    {
        bool result = false;
        Dictionary<int, ItemBase> packageItems = BagDataMgr.Instance.GetItemsData.PackageItems;

        if (packageItems.Count <= 0)
        {
            return result;
        }

        for (int i = 0; i < 6; i++)
        {
            if (!packageItems.ContainsKey(i))
            {
                result = true;
                break;
            }
        }

        return result;
    }

    /// <summary>
    /// 检测物品是否符合使用等级
    /// </summary>
    /// <returns></returns>
    static public bool CheckItemNeedLevel(ItemBase data)
    {
        bool result = false;
        if (LocalPlayer.Instance == null || data == null || data.ItemTB == null)
        {
            return result;
        }

        if (LocalPlayer.Instance.Attribute.Level >= data.ItemTB.use_level)
        {
            result = true;
        }

        return result;
    }

    #endregion

    /// <summary>
    /// Gets the physical address.
    /// </summary>
    /// <returns>The physical address.</returns>
    static public string GetPhysicalAddress()
    {
        //NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces();

        //foreach (NetworkInterface ni in nis)
        //{
        //    string addr = ni.GetPhysicalAddress().ToString();

        //    MyLog.EditorLog("mac = " + ni.GetPhysicalAddress().ToString());
        //    if (!string.IsNullOrEmpty(addr))
        //        return addr;
        //}

        return "null";
    }

    /// <summary>
    /// Gets the rand signature.
    /// </summary>
    /// <returns>The rand signature.</returns>
    static public string GetRandSignature()
    {
        string sign = PlayerPrefs.GetString("RegSignature");

        if (string.IsNullOrEmpty(sign))
        {
            sign = UnityEngine.Random.value.ToString();
            PlayerPrefs.SetString("RegSignature", sign);
        }
        //MyLog.EditorLog("sign="+sign);
        return sign;
    }

    /// <summary>
    /// 自动寻路到指定地图的出生点
    /// </summary>
    static public void AutoMoveToMapBornPos(int mapId, PathDelegate arrival, params object[] args)
    {
        if (SceneMgr.Instance.SceneInfo.MapID != mapId)
        {
            SceneInfoForClient mapInfo = ResourceMgr.LoadMapInfo(mapId) as SceneInfoForClient;
            Vector3 mapBornPos = mapInfo.Borns.Find(p => p.Camp == (CampType)LocalPlayer.Instance.Attribute.CampID).Pos;
            LocalPlayer.Instance.AutoMoveTo(mapId, mapBornPos, arrival, args);
        }
    }

    /// <summary>
    /// 从当前地图中找一个合适的传送门
    /// </summary>
    /// <param name="mapId"></param>
    /// <returns></returns>
    static public PortalInfo GetCurrMapPortal(int mapId)
    {
        for (int i = 0; i < SceneMgr.Instance.SceneInfo.MapInfo.Portals.Count; i++)
        {
            PortalInfo port = SceneMgr.Instance.SceneInfo.MapInfo.Portals[i];
            ScenePortalTable tab = TableManager.GetTableData((int)TableID.ScenePortalTableID, port.ID) as ScenePortalTable;

            if (tab == null)
            {
                MyLog.EditorLogWarning("ScenePortalTable is null, id = " + port.ID);
                continue;
            }
            if (tab.nMapId == mapId)
            {
                return port;
            }
        }
        for (int i = 0; i < SceneMgr.Instance.SceneInfo.MapInfo.Portals.Count; i++)
        {
            PortalInfo port = SceneMgr.Instance.SceneInfo.MapInfo.Portals[i];
            ScenePortalTable tab = TableManager.GetTableData((int)TableID.ScenePortalTableID, port.ID) as ScenePortalTable;

            if (tab == null)
            {
                MyLog.EditorLogWarning("ScenePortalTable is null, id = " + port.ID);
                continue;
            }
            if (tab.navigate == LocalPlayer.Instance.Attribute.CampID)
                return port;
        }
        return null;
    }

    static public void SetCamera(bool Login)
    {
        if (Camera.main == null)
        {
            return;
        }
        if (Login)
        {
            Camera.main.orthographic = true;//正交
            Camera.main.orthographicSize = 5;
            Camera.main.nearClipPlane = 0.3f;
            Camera.main.farClipPlane = 1000f;
        }
        else
        {
            Camera.main.orthographic = false;//正交
            Camera.main.fieldOfView = 47;
            Camera.main.nearClipPlane = 0.3f;
            Camera.main.farClipPlane = 1000f;
        }
    }

    /// <summary>
    /// 获得战斗力美术字体
    /// </summary>
    /// <param name="number"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    static public string GetPowerNumberString(int number, PowerWord.PowerWordType type)
    {
        string numStr = number.ToString();
        StringBuilder str = new StringBuilder();
        int value;
        for (int i = 0; i < numStr.Length; i++)
        {
            value = 0;
            value += ((int)type + numStr[i]) - 48;
            str.Append(value);
        }
        return str.ToString();
    }

    /// <summary>
    /// 获得物品品质框名称
    /// </summary>
    /// <param name="quality"></param>
    /// <returns></returns>
    static public string GetItemQualityBG(int quality)
    {
        return "itembg_00" + quality;
    }

    static public int ClampIndex(int val, int min, int max)
    {
        if (val < min)
        {
            val = min;
        }

        if (val > max)
        {
            val = max;
        }

        return val;
    }

    static public int ClampIndex(int val, int min)
    {
        if (val < min)
        {
            val = min;
        }

        return val;
    }

    /// <summary>
    /// 获得专精下的战场定位图标
    /// </summary>
    /// <param name="job"></param>
    /// <returns></returns>
    public static string GetSpecPosSpriteName(int spec)
    {
        //SpecializationTable st = TableManager.GetTableData((int)TableID.SpecializationTableID, job) as SpecializationTable;
        if (spec == 4)
        {
            spec = 3;
        }
        return GameConst.BattlePos32[spec];
    }

    /// <summary>
    /// 根据稀有度获取稀有度Icon SpriteName
    /// </summary>
    /// <param name="rarity"></param>
    /// <returns></returns>
    public static string GetRarityInconName(int rarity)
    {
        if (rarity < 1 || rarity > 5)
            return "";
        return "icon_0020" + (rarity - 1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值