using Thousandto.Code.Center;
using Thousandto.Plugins.Common;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Thousandto.Core.RootSystem;
using Thousandto.Core.Base;
using System.Text;
using Thousandto.Code.Global;
using Thousandto.Cfg.Data;
using System.IO;
using Thousandto.Code.Logic.LocalPlayerBT;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 聊天节点,跟每一个控件相关
    /// </summary>
    public class ChatNode
    {
        private class MyWords
        {
            public static string Join_now = DeclareMessageString.Get(DeclareMessageString.C_CHATNODE_JOIN_IN);//Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_LIJIJIARU);
        }

        public int Type;
        public string Param1// param --> type
        {
            //写成属性,是为了在Param1修改的时候重置_displayText的值,避免删除操作时_displayText没有变
            get { return _param1; }
            set { _param1 = value; _displayText = null; }
        }
        private string _param1;
        public string Param2;
        public string Param3;
        public string VoiceKey;   //如果是语音节点,则需要设置这个key
        public ItemBase ItemParam;

        public int LabelType;  //接收聊天信息后,设置显示的颜色
        public int ChannelID;  //频道id, 接收消息后才赋值
        public int Width;      //接收消息后赋值
        public int Height;     //接收消息后赋值
        public int ImgStartX;  //如果是图片类型,这里记录图片应该存放的坐标x起点
        //在第几行
        public int Line;
        public bool IgnoreInPrivateChat;    //当前节点不在私聊界面显示
        public bool ShowRedPoint;       //显示红点
        public bool IsChannelNode;      //是否频道节点
        public string Position;         //坐标节点,用来保存坐标值

        private ChatNode _baseChatNode;     //关联的node
        private GameObject _go;
        private static int _playAudioCounter;  //录音播放计数器, 全局静态的
        private int _curPlayerAudio;    //当前播放录音计数值

        //逻辑代码使用NGUI内容的中间转换类
        private IChatNodeTool _chatNodeTool;
        private bool _audioCoroRuning;  //语音协程正在运行,避免多次点击同一个语音导致播放异常的问题

        private string _displayText;
        private string _displayBBCodeText;
        public ulong specialId = 0;
        public bool isPrivateChatNode = false;
        public bool IsBeginNode = false;
        public bool IsEndNode = false;

        //当前节点转化成的ui
        public GameObject GO
        {
            get { return _go; }
            set
            {
                if (_go != null)
                {
                    Destory();
                }
                _go = value;
            }
        }

        public ChatNode BaseChatNode
        {
            get
            {
                return _baseChatNode;
            }
        }

        public ChatNode()
        {
            Type = (int)TNodeType.Text;
            Param1 = "";
            Param2 = "";
            Param3 = "";
            LabelType = -1;
            ChannelID = -1;
            GO = null;
            Line = 0;
            Width = 0;
            Height = 0;
            VoiceKey = "";
            _displayText = "";
            _displayBBCodeText = "";
            IgnoreInPrivateChat = false;
            IsChannelNode = false;
            ShowRedPoint = true;
            ItemParam = null;
            IsBeginNode = true;
            IsEndNode = true;
        }

        public ChatNode(ChatNode nd)
        {
            this.Type = nd.Type;
            this.Param1 = nd.Param1;
            this.Param2 = nd.Param2;
            this.Param3 = nd.Param3;
            this.Position = nd.Position;
            this.VoiceKey = nd.VoiceKey;
            this.LabelType = nd.LabelType;
            this.Line = nd.Line;
            this.ChannelID = nd.ChannelID;
            this.ImgStartX = nd.ImgStartX;
            this.Width = nd.Width;
            this.Height = nd.Height;
            this._displayText = "";
            this._displayBBCodeText = "";
            this.IgnoreInPrivateChat = nd.IgnoreInPrivateChat;
            this.IsChannelNode = nd.IsChannelNode;
            this._baseChatNode = nd;
            this.ShowRedPoint = nd.ShowRedPoint;
            this.specialId = nd.specialId;
            this.ItemParam = nd.ItemParam;
            this.IsBeginNode = nd.IsBeginNode;
            this.IsEndNode = nd.IsEndNode;
        }

        //显示红点
        public void EnableRedPoint(bool show)
        {
            if (show == ShowRedPoint)
            {
                return;
            }
            ShowRedPoint = show;
            if (_baseChatNode != null)
            {
                _baseChatNode.ShowRedPoint = show;
            }
        }

        //设置转换工具
        public void SetTool(IChatNodeTool tool)
        {
            _chatNodeTool = tool;
        }

        /// <summary>
        /// 建立gameObject对象,用来显示在界面上
        /// 不同节点类型,生成的GO是不同的
        /// </summary>
        public GameObject GenGO(MonoBehaviour label)
        {
            Destory();

            if (Type == (int)TNodeType.Image || Type == (int)TNodeType.Audio)
            {
                return null;
            }

            if (Type == (int)TNodeType.Item || Type == (int)TNodeType.Equipment)
            {
                int color = getItemOrEquipColorId();

                MonoBehaviour colorLabel = (MonoBehaviour)GameCenter.ChatSystem.GetLabelByColorID(color);
                if (colorLabel != null)
                {
                    label = colorLabel;
                }
                else
                {
                    //UnityEngine.Debug.LogError("没有找到对应的color label: color=" + color);
                    return null;
                }
            }

            if (Type == (int)TNodeType.Equipment)
            {

            }
            GO = GameObject.Instantiate(label.transform.gameObject) as GameObject;

            return GO;
        }

        /// <summary>
        /// 拷贝属性
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        public MonoBehaviour CopyLabelProperty(MonoBehaviour labelSkin, MonoBehaviour to)
        {
            MonoBehaviour from = null;
            if (Type == (int)TNodeType.Item || Type == (int)TNodeType.Equipment)
            {
                int color = getItemOrEquipColorId();

                MonoBehaviour colorLabel = (MonoBehaviour)GameCenter.ChatSystem.GetLabelByColorID(color);
                if (colorLabel != null)
                {
                    from = colorLabel;
                }
            }
            else
            {
                from = labelSkin;
            }
            return _chatNodeTool.CopyLabelProperty(from, to);
        }

        //获取颜色id
        private int getItemOrEquipColorId()
        {
            int itemId = 0;
            int.TryParse(getItemOrEquipIdStr(Param2), out itemId);

            switch (Type)
            {
                case (int)TNodeType.Item:
                case (int)TNodeType.Equipment:
                    if(ItemParam != null)
                    {
                        return ItemParam.Quality;
                    }
                    break;
            }

            return -1;
        }

        private string getItemOrEquipIdStr(string param2)
        {
            if (param2.Contains("_"))
            {
                string[] values = param2.Split('_');
                return values[0];
            }

            return param2;
        }

        /// <summary>
        /// 对已生成的go对象,添加必要的组件,已经相应点击函数
        /// </summary>
        public void AddCommponentToGO(bool enableClick = true)
        {
            if (_chatNodeTool == null)
            {
                //UnityEngine.Debug.LogError("chatNode工具类为null");
                return;
            }

            if (ChannelID == (int)ChatChanelType.PERSONAL)
            {
                _chatNodeTool.AddCommponentToGO(this, onClickLabel, enableClick);
            }
            else
                _chatNodeTool.AddCommponentToGO(this, null, enableClick);
        }

        /// <summary>
        /// 结束动画播放
        /// </summary>
        public void StopPlayAnim()
        {
            if (_chatNodeTool == null)
            {
                //UnityEngine.Debug.LogError("chatNode工具类为null");
                return;
            }
            _chatNodeTool.StopAnim();
        }


        /// <summary>
        /// 格式化输入字符串,用于发送消息
        /// </summary>
        /// <returns></returns>
        public string GetTransferText()
        {
            if (Type == (int)TNodeType.Private)
                return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
            else if (Type == (int)TNodeType.Text)
            {
                //                 string tmp = Param1.Replace("<", "&lt;");
                //                 tmp = tmp.Replace(">", "&gt;");
                return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
            }
            else if (Type == (int)TNodeType.CMD)
            {
                return Param1;
            }
            else
                return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
        }

        private string removeColorTag(string text, List<ChatColorFlag> colorflags)
        {
            int start = 0;
            int end = 0;
            Stack<ChatColorFlag> stack = null;
            if (colorflags != null)
            {
                colorflags.Clear();
                stack = new Stack<ChatColorFlag>();
            }
            StringBuilder sb = new StringBuilder();
            end = text.IndexOf("[", start);
            while (end >= 0)
            {
                var nextTag = text.IndexOf("[", end + 1);
                if (nextTag - end == 1)
                {
                    end = nextTag;
                    continue;
                }
                int offset = text.IndexOf("]", end) - end;
                if (offset < 0)
                {
                    break;
                }

                sb.Append(text.Substring(start, end - start));
                string colorTag = text.Substring(end, offset + 1);
                if (offset == 7)
                {
                    //不在颜色区间中
                    if (colorTag.CompareTo("[000000]") < 0 || colorTag.CompareTo("[ffffff]") > 0)
                    {
                        sb.Append(colorTag);
                    }
                    else
                    {
                        if (colorflags != null)
                        {
                            stack.Push(new ChatColorFlag() { ColorText = colorTag, Left = sb.Length });
                        }
                    }
                }
                else if (offset == 2)
                {
                    if (colorTag != "[-]")
                    {
                        sb.Append(colorTag);
                    }
                    else
                    {
                        if (colorflags != null)
                        {
                            var cr = stack.Pop();
                            cr.Right = sb.Length;
                            colorflags.Add(cr);
                        }
                    }
                }
                else
                    sb.Append(colorTag);

                start = end + offset + 1;

                end = text.IndexOf("[", start);
            }

            sb.Append(text.Substring(start));

            if (colorflags != null)
            {
                //说明有些颜色没有结束符--加上他.
                while (stack.Count > 0)
                {
                    var cr = stack.Pop();
                    cr.Left = sb.Length;
                    colorflags.Add(cr);
                }
            }

            return sb.ToString();
        }

        /// <summary>
        /// 生成显示在界面上的内容
        /// </summary>
        /// <returns></returns>
        public string GetDisplayText(bool useForCalcWidth = true, bool ignoreUrl = true, List<ChatColorFlag> list = null)
        {
            if (!string.IsNullOrEmpty(_displayText) && useForCalcWidth)
            {
                return _displayText;
            }

            switch ((TNodeType)Type)
            {
                case TNodeType.CMD:
                case TNodeType.TextEx:
                case TNodeType.Text:
                    if (useForCalcWidth)
                    {
                        _displayText = removeColorTag(Param1, list);
                    }
                    else
                        _displayText = (Param1);
                    break;

                case TNodeType.PlayerEx:
                case TNodeType.Player:
                    //以防名字里面有颜色值
                    if (Param1 != null && Param1.CompareTo("000000") >= 0 &&
                        Param2.CompareTo("FFFFFF") <= 0)
                    {
                        _displayText = Param1;
                    }
                    else
                    {
                        _displayText = string.Format("[{0}]", Param1);
                    }
                    break;

                case TNodeType.ImageEx:
                case TNodeType.BigImage:
                case TNodeType.Image:
                    _displayText = Param1;
                    break;

                case TNodeType.Position:
                    {
                        //做了分割,不再加[] 括号
                        if (Param1.StartsWith("<"))
                        {
                            Param1 = Param1.Replace("<", string.Empty);
                            _displayText = Param1;
                        }
                        if (Param1.EndsWith(">"))
                        {
                            Param1 = Param1.Replace(">", string.Empty);
                            _displayText = Param1;
                        }
                        else
                        {
                            //if (Param1.Contains("[") && Param1.Contains("]"))
                            //{
                            //    int start = 0;
                            //    int end = 0;
                            //    int offset = 0;
                            //    start = Param1.IndexOf("[", start);
                            //    offset = Param1.IndexOf("]", end) - start;
                            //    Param1 = Param1.Substring(start + 1, offset - 1);
                            //}
                            int mapId = -1;
                            if (Param2.IndexOf("_") > 0)
                            {
                                string[] args = Param2.Split('_');
                                int.TryParse(args[0], out mapId);
                            }
                            else
                                int.TryParse(Param2, out mapId);
                            DeclareMapsetting map = DeclareMapsetting.Get(mapId);
                            if (map != null)
                            {
                                _displayText = string.Format(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_DIANJICHUANSONG), map.Name, Param1);
                            }
                            else
                            {
                                _displayText = string.Format("[{0}]", Param1);
                            }
                        }
                        break;
                    }
                case TNodeType.Private:
                    _displayText = Param1;
                    break;
                case TNodeType.Equipment:
                case TNodeType.Item:
                    _displayText = Param1;
                    break;

                case TNodeType.Team:
                    _displayText = "";
                    break;
                case TNodeType.Audio:
                    _displayText = string.Format("[Audio]{0}\'", Param2);
                    break;
                case TNodeType.Function:
                    var parseType = ParseFuncNode();
                    if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion || parseType == FuncNodeType.FuDiHelp)
                    {
                        if (string.IsNullOrEmpty(Param1))
                        {
                            _displayText = MyWords.Join_now;
                        }
                        else
                            _displayText = Param1;

                    }
                    else if (parseType == FuncNodeType.FunctionStartId)
                    {
                        if (useForCalcWidth || ignoreUrl)
                            _displayText = Param1;
                        else
                            _displayText = string.Format("[url={1}][u]{0}[/u][/url]", Param1, Param2);
                    }
                    else if (parseType == FuncNodeType.FightSoul)
                    {
                        //if(string.IsNullOrEmpty(Param1))
                        //{
                        //    int cfgId = int.Parse(Param2);
                        //    Param1 = "[" + DeclareFightingSoul.Get(cfgId).Name + "]";
                        //}

                        //if(useForCalcWidth)
                        //{
                        //    _displayText = Param1;
                        //}
                        //else
                        //{
                        //    int cfgId = int.Parse(Param2);
                        //    int qulity = DeclareFightingSoul.Get(cfgId).Quality;
                        //    var colorStr = ItemBase.GetQualityStrColor((QualityCode)qulity);
                        //    _displayText = string.Format("[{0}]{1}[-]", colorStr, Param1);
                        //}
                    }
                    else if (parseType == FuncNodeType.OpenUI)
                    {
                        _displayText = Param1;
                    }
                    else
                    {
                        _displayText = "";
                    }
                    break;

                default: break;
            }
            return _displayText;
        }

        public FuncNodeType ParseFuncNode()
        {
            if ((TNodeType)Type != TNodeType.Function)
            {
                return FuncNodeType.Default;
            }

            int funcNodeType = 0;
            if (int.TryParse(Param3, out funcNodeType))
            {
                FuncNodeType nodeType = (FuncNodeType)funcNodeType;
                return nodeType;
            }

            return FuncNodeType.Default;
        }

        public void SetDisplayText(string text)
        {
            switch ((TNodeType)Type)
            {
                case TNodeType.Equipment:
                case TNodeType.Item:
                    Param1 = text;
                    break;
                case TNodeType.Function:
                    var parseType = ParseFuncNode();
                    if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion)
                    {
                        Param1 = text;
                    }
                    break;
                case TNodeType.CMD:
                case TNodeType.TextEx:
                case TNodeType.Text:
                case TNodeType.PlayerEx:
                case TNodeType.Player:
                case TNodeType.ImageEx:
                case TNodeType.BigImage:
                case TNodeType.Image:
                case TNodeType.Position:
                case TNodeType.Private:
                case TNodeType.Team:
                case TNodeType.Audio:
                default:
                    Param1 = text;
                    break;
            }
        }

        /// <summary>
        /// 生成显示在界面上的内容
        /// contentUseDefaultColor: 0 读取配置颜色, 1 固定小聊天窗颜色, 2 固定大聊天窗颜色
        /// </summary>
        /// <returns></returns>
        public string GetDisplayTextBBCode(int contentUseDefaultColor = 1, bool ignoreUrl = false, int realChannelId = -1)
        {
            if (!string.IsNullOrEmpty(_displayBBCodeText))
            {
                return _displayBBCodeText;
            }

            if (LabelType == -1)
            {
                SetLabelType(ChannelID);
            }

            //使用固定配置的颜色,大小聊天窗,text文字颜色是固定的,不区分频道
            string color = GameCenter.ChatSystem.GetLabelColor(LabelType);
            //频道节点的颜色要区分频道
            if (!IsChannelNode && (TNodeType)Type == TNodeType.Text)
            {
                color = GameCenter.ChatSystem.GetLabelColor(LabelType, contentUseDefaultColor);

                //小聊天窗,并且不是系统和招募信息,显示蓝色字体
                if (contentUseDefaultColor == 1 &&
                    ChannelID != (int)ChatChanelType.SYSTEM &&
                    ChannelID != (int)ChatChanelType.JOINTEAM)
                    color = "00f4ff";
                if (contentUseDefaultColor == 2 && realChannelId == (int)ChatChanelType.SYSTEM)
                {
                    //如果是系统频道并且 contentUseDefaultColor == 2
                    color = "ffffff";//"1f7f1a";
                }
                if (contentUseDefaultColor == 2 && realChannelId == (int)ChatChanelType.ChuanWen)
                {
                    color = "f97602";
                }
            }
            //打开跑马灯的超链接
            ignoreUrl = true;
            string text = GetDisplayText(false, ignoreUrl);

            switch ((TNodeType)Type)
            {
                case TNodeType.Equipment:
                case TNodeType.Item:
                    int colorId = getItemOrEquipColorId();
                    color = ItemBase.GetQualityStrColor(colorId);
                    break;
                case TNodeType.Function:
                    int functionType = int.TryParse(Param3, out functionType) ? functionType : -1;
                    if (functionType == 7)
                    {
                        string[] strs = Param2.Split('_');
                        if (strs.Length >= 3)
                        {
                            color = strs[2];
                        }
                    }
                    break;
            }

            //不加下划线

            //var parseType = ParseFuncNode();
            //if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion)
            //{
            //    _displayBBCodeText = string.Format("[{0}][u]{1}[-][-]", color, text);
            //}
            //else

            //if (text.EndsWith("[-]") == false || text.StartsWith("[") == false)
            if ((TNodeType)Type == TNodeType.Position || (ChannelID == (int)ChatChanelType.JOINTEAM && (TNodeType)Type != TNodeType.Text
                && (TNodeType)Type != TNodeType.Player))
            {
                _displayBBCodeText = text;
            }
            else
            {
                if(IsBeginNode && IsEndNode)
                {
                    _displayBBCodeText = string.Format("[{0}]{1}[-]", color, text);
                }
                else if (IsBeginNode)
                {
                    _displayBBCodeText = string.Format("[{0}]{1}", color, text);
                }
                else if (IsEndNode)
                {
                    _displayBBCodeText = string.Format("{0}[-]", text);
                }
                else
                {
                    _displayBBCodeText = text;
                }
            }
            //else
            //_displayBBCodeText = text;

            return _displayBBCodeText;
        }


        /// <summary>
        /// 设置节点要显示的颜色风格
        /// </summary>
        /// <param name="channelId"></param>
        public void SetLabelType(int channelId)
        {
            if (ChannelID == -1 && channelId != -1)
            {
                ChannelID = channelId;
            }

            int type = GameCenter.ChatSystem.GetLabelTypeByChannel(ChannelID);

            //通过节点类型,获取字体类型,变颜色用
            switch ((TNodeType)Type)
            {
                case TNodeType.Position:
                    type = (int)TLabelType.Position;
                    break;
                case TNodeType.Player:
                    //type = (int)TLabelType.Player; // 名字节点颜色随频道颜色
                    break;
                case TNodeType.Equipment:
                    type = (int)TLabelType.Team;
                    break;
                case TNodeType.Item:
                    type = (int)TLabelType.Team;
                    break;
                case TNodeType.Function:
                    type = (int)TLabelType.Position;
                    break;
            }

            LabelType = type;
        }

        //相应点击事件
        public void TriggerClick(GameObject go)
        {
            onClickLabel(go);
        }

        IEnumerator playAudioIE(GameObject obj, ChatNode node)
        {
            if (_audioCoroRuning)
            {
                yield break;
            }
            _audioCoroRuning = true;
            int lenght = int.Parse(node.Param2);
            obj.transform.Find("RedPoint").gameObject.SetActive(false);
            //UnityEngine.Debug.LogError("Click audio ID,Length = " + Param1 + "," + Param2);
            GameObject indicateGo = obj.transform.Find("Left").gameObject;
            if (!indicateGo.activeSelf)
            {
                indicateGo = obj.transform.Find("Right").gameObject;
            }

            bool show = true;
            lenght *= 5;
            while (lenght > 0 && _curPlayerAudio == _playAudioCounter && GameCenter.ChatSystem.IsAudioPlaying())
            {
                show = !show;
                yield return new WaitForSeconds(0.2f);
                lenght--;
                if (node.GO != null)
                {
                    indicateGo.SetActive(show);
                }
            }

            if (node.GO != null)
            {
                indicateGo.SetActive(true);
            }

            //没有在录音时,恢复背景音乐
            if (!GameCenter.ChatSystem.IsRecording())
                GameCenter.ChatSystem.ResumeAllSound();

            _audioCoroRuning = false;
        }

        private void onAudioReceive()
        {
            GameCenter.ChatSystem.Coro.StartCoroutine(playAudioIE(GO, this));
        }

        private void onClickLabel(GameObject obj)
        {
            int id = 0;
            //UnityEngine.Debug.Log("Trigger click: " + (TNodeType)Type + " -> " + Param1);

            switch ((TNodeType)Type)
            {
                case TNodeType.Audio:
                    if (_audioCoroRuning)
                    {
                        GameCenter.ChatSystem.StopPlayingAudio();
                        return;
                    }
                    _playAudioCounter++;
                    _curPlayerAudio = _playAudioCounter;
                    EnableRedPoint(false);
                    GameCenter.ChatSystem.ReqVoiceData(VoiceKey, onAudioReceive);
                    break;
                case TNodeType.Image:
                case TNodeType.BigImage:
                case TNodeType.Private:     //return "[" + Locale.TextManager.Instance.GetText(5, "H") + "]" + Param1 + ":";
                case TNodeType.Text:
                case TNodeType.TextEx:
                    break;
                case TNodeType.Position:
                    {
                        if (GameCenter.GameSceneSystem.GetLocalPlayer().IsDead())
                        {
                            GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.Die_CanNotOperate));
                            return;
                        }
                        int mapId = int.TryParse(Param2, out mapId) ? mapId : 0;
                        if (mapId != 0)
                        {
                            float x = 0;
                            float z = 0;
                            int param = 0;
                            string[] strs = Position.Split(',');
                            if (strs.Length >= 3)
                            {
                                x = float.TryParse(strs[0], out x) ? x : 0;
                                z = float.TryParse(strs[1], out z) ? z : 0;
                                param = int.TryParse(strs[2], out param) ? param : 0;
                            }
                            PlayerBT.crossBD.Write(mapId, new Vector3(x, 0, z), param);
                        }
                    }
                    break;
                case TNodeType.Player:      //return string.Format("[{0}]", Param1);                    
                case TNodeType.PlayerEx:
                    {
                        //ulong playerID = 0;
                        //ulong.TryParse(Param2, out playerID);
                        //if (playerID != 0)
                        //{
                        //    //                             ChatPrivateInfo info = new ChatPrivateInfo();
                        //    //                             info.ID = playerID;
                        //    //                             info.Name = Param1;
                        //    // 
                        //    //                             GameCenter.ChatPrivateSystem.AddChatPlayer(info);
                        //    //                             GameCenter.ChatPrivateSystem.Open(playerID);

                        //    GameCenter.PopMenuSystem.Open(playerID, Param1);
                        //}
                    }
                    break;
                case TNodeType.Equipment:   //return string.Format("[{0}]", Param1);
                    {
                        if(ItemParam != null)
                        {
                            GameCenter.LuaSystem.Adaptor.ShowItemTips(ItemParam, obj);
                        }
                    }
                    break;
                case TNodeType.Item:        //return string.Format("[{0}]", Param1);
                    {
                        if (int.TryParse(Param2, out id))
                        {
                            if (GO == null)
                            {
                                GameCenter.LuaSystem.Adaptor.ShowItemTips(id, obj, false);
                            }
                            else
                            {
                                GameCenter.LuaSystem.Adaptor.ShowItemTips(id, GO, false);
                            }
                        }
                    }
                    break;
                case TNodeType.Function:        //功能节点
                    {
                        if (GameCenter.GameSceneSystem.GetLocalPlayer().IsDead())
                        {
                            GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.Die_CanNotOperate));
                            return;
                        }

                        int funcType = 0;
                        if (int.TryParse(Param3, out funcType))
                        {
                            if (funcType == (int)FuncNodeType.Guild_Jion)
                            {
                                //UnityEngine.Debug.Log("快速加入帮会->" + Param2);
                                //string[] args = Param2.Split('_');
                                ulong guildId = 0;
                                if (ulong.TryParse(Param2, out guildId))
                                {
                                    LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
                                    if (lp != null && lp.GuildID != 0)
                                    {
                                        GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_YIYOUXIANMENG));
                                    }
                                    else
                                    {
                                        var info = GameCenter.MainFunctionSystem.GetFunctionInfo(FunctionStartIdCode.Guild);
                                        if (info != null)
                                        {
                                            if (info.IsEnable == false)
                                            {
                                                GameCenter.MsgPromptSystem.ShowPrompt(string.Format(DeclareMessageString.Get(DeclareMessageString.C_MAIN_GONGNENGWEIKAIQI), info.Cfg.FunctionName));
                                                return;
                                            }
                                        }
                                        else
                                        {
                                            return;
                                        }
                                        MSG_Guild.ReqJoinGuild msg = new MSG_Guild.ReqJoinGuild();
                                        msg.ids.Add(guildId);
                                        msg.Send();
                                    }
                                }
                                //int level = int.Parse(args[1]);

                                //GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHATNODE_APPLY_FINISH));
                            }
                            if (funcType == (int)FuncNodeType.Tean_Jion)
                            {
                                ulong teamId = 0;
                                if (ulong.TryParse(Param2, out teamId))
                                {
                                    if (GameCenter.LuaSystem.Adaptor.IsTeamExist())
                                    {
                                        GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.TEAM_YOUHAVEDTEAM));
                                    }
                                    else
                                    {
                                        MSG_Team.ReqApplyEnter msg = new MSG_Team.ReqApplyEnter();
                                        msg.teamId = (long)teamId;
                                        msg.Send();
                                    }
                                    //GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.C_CHATNODE_APPLY_FINISH));
                                }
                            }
                            if (funcType == (int)FuncNodeType.ToGuildNPC)
                            {
                                ulong npcId = 0;
                                if (ulong.TryParse(Param2, out npcId))
                                {
                                    //GameCenter.GuildSystem.OnEnterGuildMapTalkToNpc((int)npcId);
                                }
                            }
                            if (funcType == (int)FuncNodeType.FuDiHelp)
                            {
                                //福地支援
                                int cfgId = 0;
                                if (int.TryParse(Param2, out cfgId))
                                {
                                    LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
                                    if (lp != null && lp.ID != specialId)
                                    {
                                        //发送进入副本消息
                                        DeclareGuildBattleBoss cfg = DeclareGuildBattleBoss.Get(cfgId);
                                        if (cfg != null)
                                        {
                                            //请求该支援消息是否有效
                                            var req = new MSG_GuildActivity.ReqFudiCanHelp();
                                            req.cfgId = cfgId;
                                            req.Send();
                                        }
                                    }
                                }
                            }
                            if (funcType == (int)FuncNodeType.FunctionStartId)
                            {
                                if (Param2.IndexOf("_") > 0)
                                {
                                    string[] args = Param2.Split('_');
                                    int functionId = int.Parse(args[0]);
                                    int argParam = int.Parse(args[1]);
                                    GameCenter.MainFunctionSystem.DoFunctionCallBack(functionId, argParam);

                                }
                                else
                                {
                                    int functionId = int.Parse(Param2);

                                    ////专门护送
                                    //if(functionId == 2340000)
                                    //{
                                    //    GameCenter.HuSongSystem.SearchToNpc();
                                    //    return;
                                    //}

                                    GameCenter.MainFunctionSystem.DoFunctionCallBack(functionId, null);
                                }
                            }
                            if (funcType == (int)FuncNodeType.FightSoul)
                            {
                                int cfgId = int.Parse(Param2);
                                //FightSoulSystem.ShowTempItemTips(cfgId); 
                            }
                            if (funcType == (int)FuncNodeType.OpenUI)
                            {
                                string[] strs = Param2.Split('_');
                                if (strs.Length >= 2)
                                {
                                    int uiID = int.TryParse(strs[1], out uiID) ? uiID : 0;
                                    long param = long.TryParse(strs[0], out param) ? param : 0;
                                    if (param == 0)
                                    {
                                        GameCenter.MainFunctionSystem.DoFunctionCallBack(uiID);
                                    }
                                    else
                                    {
                                        GameCenter.MainFunctionSystem.DoFunctionCallBack(uiID, param);
                                    }
                                }
                            }
                        }
                    }
                    break;
                default: break;
            }
        }


        public void Destory()
        {
            if (_go == null)
            {
                return;
            }
            GameObject.Destroy(_go);
            _go = null;

            if (_chatNodeTool != null)
            {
                _chatNodeTool.Destory();
            }
        }

        /// <summary>
        /// 如果当前node是动画节点,则开始播放动画
        /// </summary>
        public void PlayAnim()
        {
            if ((Type != (int)TNodeType.Image && Type != (int)TNodeType.BigImage) || GO == null)
            {
                return;
            }

            if (_chatNodeTool != null)
            {
                _chatNodeTool.PlayAnim(this);
            }
        }
    }
}