using System.Collections;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
using UnityEditor;  
 | 
using System;  
 | 
using System.Text.RegularExpressions;  
 | 
using System.Threading;  
 | 
  
 | 
public class NetPackageWindow : EditorWindow  
 | 
{  
 | 
    public static NetPackageWindow window = null;  
 | 
  
 | 
    [UnityEditor.MenuItem("程序/封包查看工具 &1")]  
 | 
    static void Init()  
 | 
    {  
 | 
        window = GetWindow(typeof(NetPackageWindow), false, "封包查看工具") as NetPackageWindow;  
 | 
        window.Show();  
 | 
        window.autoRepaintOnSceneChange = true;  
 | 
    }  
 | 
  
 | 
    static int MAX_PACKAGE_COUNT = 200;  
 | 
  
 | 
    private Vector2 scrollPosition;  
 | 
    string stopRecBtnDetail = "暂停接收包";  
 | 
    bool professionalSkin;  
 | 
    string filterNetPkgStr;  
 | 
  
 | 
    private string simSendPkgDetail = "";  
 | 
    NetPackagetType m_CurrentType = NetPackagetType.All;  
 | 
  
 | 
    bool reveralFilter;  
 | 
    bool showHeartPackage;  
 | 
  
 | 
    bool showMainServerPackage;  
 | 
    bool showCrossServerPackage;  
 | 
    int maxShowPackageCount;  
 | 
  
 | 
    bool threading = true;  
 | 
    List<NetPackage> m_DrawPackages = new List<NetPackage>();  
 | 
    List<NetPackage> drawPackages {  
 | 
        get { lock (this) { return m_DrawPackages; } }  
 | 
        set {  
 | 
            lock (this)  
 | 
            {  
 | 
                m_DrawPackages = value;  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    private void OnDisable()  
 | 
    {  
 | 
        threading = false;  
 | 
  
 | 
        LocalSave.SetBool("NetPackageSkinPattern", professionalSkin);  
 | 
        LocalSave.SetInt("NetPackageShowMaxCount", maxShowPackageCount);  
 | 
        LocalSave.SetBool("CrossServerPackage", showCrossServerPackage);  
 | 
        LocalSave.SetBool("MainServerPackage", showMainServerPackage);  
 | 
        LocalSave.SetString("NetPkgToolFilterNetPackageString", filterNetPkgStr);  
 | 
        LocalSave.SetBool("NetPkgToolFilterNetPackageReveralFilter", reveralFilter);  
 | 
    }  
 | 
  
 | 
    private void OnEnable()  
 | 
    {  
 | 
        professionalSkin = LocalSave.GetBool("NetPackageSkinPattern", false);  
 | 
        maxShowPackageCount = LocalSave.GetInt("NetPackageShowMaxCount", 100);  
 | 
        showCrossServerPackage = LocalSave.GetBool("CrossServerPackage", true);  
 | 
        showMainServerPackage = LocalSave.GetBool("MainServerPackage", true);  
 | 
        filterNetPkgStr = LocalSave.GetString("NetPkgToolFilterNetPackageString");  
 | 
        reveralFilter = LocalSave.GetBool("NetPkgToolFilterNetPackageReveralFilter", false);  
 | 
  
 | 
        var thread = new Thread(OnThreading);  
 | 
        thread.IsBackground = true;  
 | 
        thread.Start();  
 | 
    }  
 | 
  
 | 
    public void CheckPackageShowState(NetPackage package)  
 | 
    {  
 | 
        if (m_CurrentType != NetPackagetType.All && m_CurrentType != package.type)  
 | 
        {  
 | 
            package.show = false;  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!showMainServerPackage && package.socketType == ServerType.Main)  
 | 
        {  
 | 
            package.show = false;  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!showCrossServerPackage && package.socketType == ServerType.CrossSever)  
 | 
        {  
 | 
            package.show = false;  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!showHeartPackage && Regex.IsMatch(package.name, ".*(OnlineReturn|ServerHeart|OnlineReply).*"))  
 | 
        {  
 | 
            package.show = false;  
 | 
            return;  
 | 
        }  
 | 
  
 | 
        if (!string.IsNullOrEmpty(filterNetPkgStr))  
 | 
        {  
 | 
            var contain = false;  
 | 
  
 | 
            try  
 | 
            {  
 | 
                contain = Regex.IsMatch(package.name, StringUtility.Contact(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));  
 | 
            }  
 | 
            catch (System.Exception ex)  
 | 
            {  
 | 
            }  
 | 
  
 | 
            if (reveralFilter && contain)  
 | 
            {  
 | 
                package.show = false;  
 | 
                return;  
 | 
            }  
 | 
            else if (!reveralFilter && !contain)  
 | 
            {  
 | 
                package.show = false;  
 | 
                return;  
 | 
            }  
 | 
        }  
 | 
  
 | 
        package.show = true;  
 | 
    }  
 | 
  
 | 
    private void OnThreading()  
 | 
    {  
 | 
        while (threading)  
 | 
        {  
 | 
            var packages = NetPkgCtl.GetPackages();  
 | 
            if (packages != null)  
 | 
            {  
 | 
                var showCount = 0;  
 | 
                for (int i = packages.Count - 1; i >= 0; i--)  
 | 
                {  
 | 
                    if (packages[i] == null)  
 | 
                    {  
 | 
                        packages.RemoveAt(i);  
 | 
                        continue;  
 | 
                    }  
 | 
  
 | 
                    showCount++;  
 | 
                    if (showCount >= maxShowPackageCount)  
 | 
                    {  
 | 
                        break;  
 | 
                    }  
 | 
  
 | 
                    CheckPackageShowState(packages[i]);  
 | 
                }  
 | 
            }  
 | 
  
 | 
            Thread.Sleep(50);  
 | 
        }  
 | 
    }  
 | 
  
 | 
    void OnGUI()  
 | 
    {  
 | 
        GUI.skin.customStyles[1].alignment = TextAnchor.UpperLeft;  
 | 
        GUI.skin.customStyles[1].fontStyle = FontStyle.Normal;  
 | 
        GUI.skin.customStyles[1].fixedWidth = 450;  
 | 
  
 | 
        GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black;  
 | 
  
 | 
        GUILayout.BeginVertical();  
 | 
  
 | 
        GUILayout.BeginHorizontal();  
 | 
  
 | 
        professionalSkin = !GUILayout.Toggle(!professionalSkin, "普通皮肤");  
 | 
        professionalSkin = GUILayout.Toggle(professionalSkin, "高级皮肤");  
 | 
  
 | 
        GUILayout.EndHorizontal();  
 | 
  
 | 
        GUILayout.BeginHorizontal();  
 | 
        maxShowPackageCount = EditorGUILayout.IntField("最大显示封包数:", maxShowPackageCount);  
 | 
        showHeartPackage = GUILayout.Toggle(showHeartPackage, "心跳包");  
 | 
        showMainServerPackage = GUILayout.Toggle(showMainServerPackage, "主服");  
 | 
        showCrossServerPackage = GUILayout.Toggle(showCrossServerPackage, "跨服");  
 | 
  
 | 
        m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.All, "全部") ? NetPackagetType.All : m_CurrentType;  
 | 
        m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.Server, "收包") ? NetPackagetType.Server : m_CurrentType;  
 | 
        m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.Client, "发包") ? NetPackagetType.Client : m_CurrentType;  
 | 
  
 | 
        GUILayout.EndHorizontal();  
 | 
  
 | 
        GUILayout.BeginHorizontal();  
 | 
  
 | 
        filterNetPkgStr = EditorGUILayout.TextField("关键字", filterNetPkgStr);  
 | 
        reveralFilter = GUILayout.Toggle(reveralFilter, "反向过滤");  
 | 
  
 | 
        GUILayout.EndHorizontal();  
 | 
  
 | 
        SimSendPkg();  
 | 
        scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false);  
 | 
  
 | 
        var packages = NetPkgCtl.GetPackages();  
 | 
        if (packages != null)  
 | 
        {  
 | 
            var count = 0;  
 | 
            for (int i = packages.Count - 1; i >= 0; i--)  
 | 
            {  
 | 
                var package = packages[i];  
 | 
                if (package != null)  
 | 
                {  
 | 
                    count++;  
 | 
                }  
 | 
  
 | 
                if (count >= maxShowPackageCount)  
 | 
                {  
 | 
                    break;  
 | 
                }  
 | 
  
 | 
                if (package.show)  
 | 
                {  
 | 
                    try  
 | 
                    {  
 | 
                        EditorGUILayout.BeginHorizontal();  
 | 
  
 | 
                        if (professionalSkin)  
 | 
                        {  
 | 
                            GUI.skin.button.normal.textColor = package.type == NetPackagetType.Client ? Color.yellow : Color.white;  
 | 
                        }  
 | 
                        else  
 | 
                        {  
 | 
                            GUI.skin.button.normal.textColor = package.type == NetPackagetType.Client ? Color.blue : Color.black;  
 | 
                        }  
 | 
  
 | 
                        if (GUILayout.Button(package.type == NetPackagetType.Client ? "CS" : "SC", GUILayout.Width(30)))  
 | 
                        {  
 | 
                            PackageDetailsWindow.packageTime = package.time;  
 | 
                            PackageDetailsWindow.packageName = package.name;  
 | 
                            PackageDetailsWindow.packageBytes = package.content;  
 | 
                            PackageDetailsWindow.packageDetails = package.fieldDetails;  
 | 
                        }  
 | 
  
 | 
                        GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black;  
 | 
                        var showName = StringUtility.Contact(package.time, "  ", package.name);  
 | 
                        EditorGUILayout.LabelField(showName, GUILayout.Width(260));  
 | 
                        EditorGUILayout.TextField(package.fields);  
 | 
  
 | 
                        EditorGUILayout.EndHorizontal();  
 | 
                    }  
 | 
                    catch (Exception ex)  
 | 
                    {  
 | 
  
 | 
                    }  
 | 
                }  
 | 
  
 | 
            }  
 | 
        }  
 | 
  
 | 
        GUILayout.EndScrollView();  
 | 
  
 | 
        GUILayout.BeginHorizontal();  
 | 
        if (GUILayout.Button(stopRecBtnDetail))  
 | 
        {  
 | 
            NetPkgCtl.stopRecieve = !NetPkgCtl.stopRecieve;  
 | 
            if (NetPkgCtl.stopRecieve)  
 | 
            {  
 | 
                stopRecBtnDetail = "开始接收包";  
 | 
            }  
 | 
            else  
 | 
            {  
 | 
                List<NetPackage> tempNetPkgLst = NetPkgCtl.GetTempPackages();  
 | 
                if (packages != null)  
 | 
                {  
 | 
                    packages.AddRange(tempNetPkgLst);  
 | 
  
 | 
                    while (packages.Count > MAX_PACKAGE_COUNT)  
 | 
                    {  
 | 
                        packages.RemoveAt(0);  
 | 
                    }  
 | 
                }  
 | 
  
 | 
                tempNetPkgLst.Clear();  
 | 
                stopRecBtnDetail = "暂停接收包";  
 | 
            }  
 | 
        }  
 | 
  
 | 
        if (GUILayout.Button("打印摘要"))  
 | 
        {  
 | 
            NetPkgCtl.WriteAllNetLog(false);  
 | 
        }  
 | 
  
 | 
        if (GUILayout.Button("打印详情"))  
 | 
        {  
 | 
            NetPkgCtl.WriteAllNetLog(true);  
 | 
        }  
 | 
  
 | 
        if (GUILayout.Button("清除"))  
 | 
        {  
 | 
            if (NetPkgCtl.GetPackages() != null)  
 | 
            {  
 | 
                NetPkgCtl.GetPackages().Clear();  
 | 
            }  
 | 
        }  
 | 
  
 | 
        GUILayout.EndHorizontal();  
 | 
        GUILayout.EndVertical();  
 | 
    }  
 | 
  
 | 
    private void SimSendPkg()  
 | 
    {  
 | 
        GUILayout.BeginHorizontal();  
 | 
        simSendPkgDetail = EditorGUILayout.TextField("模拟发包内容:", simSendPkgDetail);  
 | 
        if (GUILayout.Button("模拟发包"))  
 | 
        {  
 | 
            string sendPkgDetail = simSendPkgDetail.Replace(" ", "");  
 | 
            if (sendPkgDetail.Length % 2 != 0)  
 | 
            {  
 | 
                sendPkgDetail += " ";  
 | 
            }  
 | 
            byte[] sendBytes = new byte[sendPkgDetail.Length / 2];  
 | 
            for (int i = 0; i < sendBytes.Length; i++)  
 | 
            {  
 | 
                sendBytes[i] = Convert.ToByte(sendPkgDetail.Substring(i * 2, 2), 16);  
 | 
            }  
 | 
            GameNetSystem.Instance.SendInfo(sendBytes);  
 | 
        }  
 | 
        GUILayout.EndHorizontal();  
 | 
    }  
 | 
  
 | 
    private string NetPkgTypeString()  
 | 
    {  
 | 
        switch (m_CurrentType)  
 | 
        {  
 | 
            case NetPackagetType.All:  
 | 
                return "全部";  
 | 
            case NetPackagetType.Server:  
 | 
                return "收包";  
 | 
            case NetPackagetType.Client:  
 | 
                return "发包";  
 | 
            default:  
 | 
                return "全部";  
 | 
        }  
 | 
    }  
 | 
}  
 | 
  
 | 
public enum FilterType  
 | 
{  
 | 
    Filter = 0,  
 | 
    ReverFilter = 1,  
 | 
}  
 | 
  
 | 
  
 | 
  
 |