| 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,  | 
| }  | 
|   | 
|   | 
|   |