Initial commit: Client Doc docs Server Tools

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ud18010
2026-07-10 10:24:29 +08:00
co-authored by Cursor
commit 7e35d8da31
3374 changed files with 680813 additions and 0 deletions
+178
View File
@@ -0,0 +1,178 @@
using System;
using System.Threading;
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Diagnostics;
[InitializeOnLoad]
public static class CustomPlayModeHandler
{
static DateTime m_lastModified;
static bool m_enterPlayAfterServerReady;
static double m_waitServerStartTime;
const double WAIT_SERVER_TIMEOUT_SECONDS = 20.0;
static CustomPlayModeHandler()
{
string strLastTime = PlayerPrefs.GetString("LastModifiedTime");
if (strLastTime != null && strLastTime != "")
{
m_lastModified = DateTime.Parse(strLastTime);
//Debug.Log($"LastEditTime : {strLastTime}");
}
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
}
//[MenuItem("Tools/Run External Exe")]
public static void RunExe()
{
System.Diagnostics.Process pro;
string exePath = "../XDevNode/XNode.exe"; // 滻Ϊexeļ·
string curPath = System.IO.Directory.GetCurrentDirectory();
string runPath = $"{curPath}/{exePath}";//@"D:\UD\XWorld\XWorldClient\60s\..\XDevNode\XNode.exe";
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
info.FileName = runPath;
info.Arguments = "xid3278136192177 param2=488";//XID
info.WorkingDirectory = $"{curPath}/../XDevNode";
try
{
//Thread.Sleep(500);
pro = System.Diagnostics.Process.Start(info);
pro.EnableRaisingEvents = true;
//pro.Exited += new EventHandler(myProcess_Exited);
}
catch (System.ComponentModel.Win32Exception ex)
{
Console.WriteLine("ϵͳҲָļ/r{0}", ex.ToString());
return;
}
}
static bool IsProcessRunning(string processName)
{
// ȡͬ
Process[] processes = Process.GetProcessesByName(processName);
// ҵһ̣򷵻 true
return processes.Length > 0;
}
static void StartProcess(string executablePath)
{
RunExe();
}
private static void OnPlayModeStateChanged(PlayModeStateChange state)
{
if (state == PlayModeStateChange.ExitingEditMode)
{
if (!m_enterPlayAfterServerReady && !XWorldUtil.IsPcMiniGameGatewayReady())
{
UnityEngine.Debug.Log("PC MiniGame Gateway is not ready. Starting it before entering Play Mode...");
EditorApplication.isPlaying = false;
m_enterPlayAfterServerReady = true;
m_waitServerStartTime = EditorApplication.timeSinceStartup;
XWorldUtil.OpenLocalServerAll();
EditorApplication.update -= WaitForServerThenEnterPlay;
EditorApplication.update += WaitForServerThenEnterPlay;
return;
}
m_enterPlayAfterServerReady = false;
EditorApplication.update -= WaitForServerThenEnterPlay;
XWorldUtil.OpenLocalServerAll();
//luaǷб仯server lua
/*if (IsPathChange())
{
string srcPath = "../Lua/server";
string dstPath = "../XDevNode/Data/XWorld/Script";
Packager.CopyPath(srcPath, dstPath);
//Thread.Sleep(1000);
PlayerPrefs.SetString("LastModifiedTime", m_lastModified.ToString());
}//*/
//Debug.Log("ģʽִԶ߼");
UnityEngine.Debug.Log("PC MiniGame Gateway checked. Legacy XNode auto-start is disabled for this flow.");
string processName = "XNode";
string executablePath = "../XDevNode/XNode.exe";
if (false && !IsProcessRunning(processName))
{
StartProcess(executablePath);
}
else
{
UnityEngine.Debug.Log("Legacy XNode server startup skipped.");
//Console.WriteLine($"{processName} ѾС");
}
}
else if (state == PlayModeStateChange.ExitingPlayMode)
{
UnityEngine.Debug.Log("Exist Playing");
}
}
private static void WaitForServerThenEnterPlay()
{
if (XWorldUtil.IsPcMiniGameGatewayReady())
{
EditorApplication.update -= WaitForServerThenEnterPlay;
UnityEngine.Debug.Log("PC MiniGame Gateway is ready. Entering Play Mode.");
EditorApplication.EnterPlaymode();
return;
}
if (EditorApplication.timeSinceStartup - m_waitServerStartTime > WAIT_SERVER_TIMEOUT_SECONDS)
{
EditorApplication.update -= WaitForServerThenEnterPlay;
m_enterPlayAfterServerReady = false;
UnityEngine.Debug.LogError("Timed out waiting for PC MiniGame Gateway. Check XWorld/Server/Open Latest Log.");
}
}
public static bool IsPathChange()
{
if (m_lastModified == null)
{
m_lastModified = DateTime.Now;
UnityEngine.Debug.Log($"Now Time");
return true;
}
else
{
DateTime lastModified = m_lastModified;
lastModified = RecursiveLastEditTime("../Lua/server", lastModified);
if ((lastModified - m_lastModified).TotalSeconds > 1)
{
m_lastModified = lastModified;
UnityEngine.Debug.Log($"LastEditTime Change: {m_lastModified}");
return true;
}
}
return false;
}
static DateTime RecursiveLastEditTime(string path, DateTime lastTime)
{
string[] names = Directory.GetFiles(path);
string[] dirs = Directory.GetDirectories(path);
foreach (string filename in names)
{
DateTime lastModified = File.GetLastWriteTime(filename);
if (lastModified > lastTime)
lastTime = lastModified;
}
foreach (string dir in dirs)
{
if (dir.IndexOf(".svn") >= 0)
{
continue;
}
//paths.Add(dir.Replace('\\', '/'));
lastTime = RecursiveLastEditTime(dir, lastTime);
}
return lastTime;
}
}