s&box Package Code Search

Search C# source code, UI razor templates, shaders, and configs across s&box packages.

Showing code results for query: * (3 total matches found)
coomzy.reconnecter / Editor/ReconnecterEditorTool.cs
Editor library
using Sandbox;
using Editor;

public class ReconnecterBar : ToolbarGroup
{
	[Event("tools.headerbar.build", Priority = 150)]
	public static void OnBuildHeaderToolbar(HeadBarEvent e)
	{
		e.RightCenter.Add(new ReconnecterBar(null));
		e.RightCenter.AddSpacingCell(8);
	}

	public ReconnecterBar(Widget parent) : base(parent, "Reconnecter", null)
	{
		ToolTip = "Auto Reconnect Clients";
	}

	public override void Build()
	{
		AddToggleButton("Auto Reconnect Clients", "autorenew", () => ReconnecterEditor.autoReconnectEnabled, SetAutoReconnect);
		AddToggleButton("Allow Instance Launching", "person_add", () => ReconnecterEditor.allowLaunchInstance, SetAllowLaunchInstance);
		AddButton("Force Reconnect Clients", "group", ForceAutoReconnect);
	}

	public void SetAutoReconnect(bool enabled)
	{
		ReconnecterEditor.autoReconnectEnabled = enabled;
	}

	public void SetAllowLaunchInstance(bool enabled)
	{
		ReconnecterEditor.allowLaunchInstance = enabled;
	}

	public void ForceAutoReconnect()
	{
		ReconnecterEditor.CreateSessionText(true);
	}
}
coomzy.reconnecter / Editor/ReconnecterEditor.cs
Editor library
using Sandbox;
using Sandbox.Internal;
using System.Diagnostics;
using System.IO;

public static class ReconnecterEditor
{
	public static string packageFolders => $"{Project.Current.Package.Org.Ident}/{Project.Current.Package.Ident}";
	public static string dataFolder => Editor.FileSystem.Root.GetFullPath($"/data/{packageFolders}");

	public static bool autoReconnectEnabled
	{
		get
		{
			return GlobalToolsNamespace.EditorCookie.Get<bool>("reconnecter_enabled", true);
		}
		set
		{
			GlobalToolsNamespace.EditorCookie.Set<bool>("reconnecter_enabled", value);
		}
	}
	public static bool allowLaunchInstance
	{
		get
		{
			return GlobalToolsNamespace.EditorCookie.Get<bool>("reconnecter_allowLaunchInstance", true);
		}
		set
		{
			GlobalToolsNamespace.EditorCookie.Set<bool>("reconnecter_allowLaunchInstance", value);
		}
	}

	static ReconnecterEditor()
	{
		ReconnecterSystem.RegisterOnRequestWriteSession(CreateSessionText);
	}

	public static void CreateSessionText(bool force = false)
	{
		if (!autoReconnectEnabled && !force)
		{
			return;
		}

		string filePath = $"{dataFolder}/{ReconnecterSystem.SESSION_FILE_PATH}";

		string destinationDirectory = Path.GetDirectoryName(filePath);
		if (!Directory.Exists(destinationDirectory))
		{
			Directory.CreateDirectory(destinationDirectory);
		}

		File.WriteAllText(filePath, System.DateTime.UtcNow.ToString());
		//Log.Info($"CreateSessionText() filePath: {filePath}");
	}

	[Event("scene.play", Priority = int.MinValue)]
	public static void ScenePlay()
	{		
		ReconnecterSystem.OnPlayInEditor();

		if (!autoReconnectEnabled || !allowLaunchInstance)
		{
			return;
		}

		Process[] processes = Process.GetProcessesByName("sbox");
		bool isProcessRunning = processes.Length > 0;

		if (isProcessRunning)
		{
			return;
		}
		SpawnProcess();
	}

	public static void SpawnProcess()
	{
		var p = new Process();
		p.StartInfo.FileName = "sbox.exe";
		p.StartInfo.WorkingDirectory = System.Environment.CurrentDirectory;
		p.StartInfo.CreateNoWindow = true;
		p.StartInfo.RedirectStandardOutput = true;
		p.StartInfo.RedirectStandardError = true;
		p.StartInfo.UseShellExecute = false;

		p.StartInfo.ArgumentList.Add("-joinlocal");

		// This doesn't seem to work because it doesn't use Steam's Launch Options?
		p.StartInfo.ArgumentList.Add("-sw");

		p.Start();
	}
}
coomzy.reconnecter / Code/ReconnecterSystem.cs
Game library
using System;
using Sandbox;
using System.Linq;
using Sandbox.Network;

public class ReconnecterSystem : GameObjectSystem
{
	public static ReconnecterComponent instance { get; set; }
	public static DateTime? startTime { get; set; }

	public const string SESSION_FILE_PATH = "reconnecter_session.txt";

	public ReconnecterSystem(Scene scene) : base(scene)
	{
		if (!Application.IsDebug)
		{
			return;
		}

		if (startTime == null)
		{
			startTime = DateTime.UtcNow;
		}

		if (Game.IsEditor)
		{
			return;
		}

		Listen(Stage.FinishUpdate, 0, FinishUpdate, "ReconnecterSystem.FinishUpdate");
	}

	// Called from ReconnecterEditor, don't know a better way
	// It's called after ReconnecterSystem()
	public static void OnPlayInEditor()
	{
		if (instance != null)
		{
			instance.Destroy();
			instance = null;
		}

		if (instance == null)
		{
			var newGO = new GameObject(true);
			instance = newGO.Components.Create<ReconnecterComponent>();
			newGO.Flags = GameObjectFlags.DontDestroyOnLoad;
		}

		startTime = null;
	}

	public static void OnStartedHosting()
	{
		if (!Game.IsEditor)
        {
			return;
		}
		TryRequestWriteSession();
	}

	void FinishUpdate()
	{
		if (!FileSystem.Data.FileExists(SESSION_FILE_PATH))
		{
			return;
		}

		var sessionText = FileSystem.Data.ReadAllText(SESSION_FILE_PATH);
		if (!DateTime.TryParse(sessionText, out var lastSessionStart))
		{
			Log.Info($"Reconnecter failed to parse session text: {sessionText}");
			return;
		}

		if (lastSessionStart <= startTime.Value)
		{
			//Log.Info($"You're in the most active session");
			return;
		}

		Networking.Disconnect();
		Networking.Connect("local");
	}

	public static event Action<bool> OnRequestWriteSession;
	public static void RegisterOnRequestWriteSession(Action<bool> handler)
	{
		if (OnRequestWriteSession != null && OnRequestWriteSession.GetInvocationList().Contains(handler))
		{
			return;
		}

		OnRequestWriteSession += handler;
	}

	public static void TryRequestWriteSession()
	{
		OnRequestWriteSession?.Invoke(false);
	}

	[ConCmd("reconnect_clients")]
	public static void RequestWriteSession()
	{
		OnRequestWriteSession?.Invoke(true);
	}
}

public class ReconnecterComponent : Component, Component.INetworkListener
{
	public void OnActive(Connection channel)
	{
		if (channel == null || !channel.IsHost)
		{
			return;	
		}

		ReconnecterSystem.OnStartedHosting();
	}
}
Debug: View Raw JSON Response
{
    "TotalCount": 3,
    "Files": [
        {
            "Ident": "coomzy.reconnecter",
            "Path": "Editor/ReconnecterEditorTool.cs",
            "FileName": "ReconnecterEditorTool.cs",
            "PackageType": "library",
            "CodeKind": "Editor",
            "AssetVersionId": 73637,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing Editor;\r\n\r\npublic class ReconnecterBar : ToolbarGroup\r\n{\r\n\t[Event(\"tools.headerbar.build\", Priority = 150)]\r\n\tpublic static void OnBuildHeaderToolbar(HeadBarEvent e)\r\n\t{\r\n\t\te.RightCenter.Add(new ReconnecterBar(null));\r\n\t\te.RightCenter.AddSpacingCell(8);\r\n\t}\r\n\r\n\tpublic ReconnecterBar(Widget parent) : base(parent, \"Reconnecter\", null)\r\n\t{\r\n\t\tToolTip = \"Auto Reconnect Clients\";\r\n\t}\r\n\r\n\tpublic override void Build()\r\n\t{\r\n\t\tAddToggleButton(\"Auto Reconnect Clients\", \"autorenew\", () => ReconnecterEditor.autoReconnectEnabled, SetAutoReconnect);\r\n\t\tAddToggleButton(\"Allow Instance Launching\", \"person_add\", () => ReconnecterEditor.allowLaunchInstance, SetAllowLaunchInstance);\r\n\t\tAddButton(\"Force Reconnect Clients\", \"group\", ForceAutoReconnect);\r\n\t}\r\n\r\n\tpublic void SetAutoReconnect(bool enabled)\r\n\t{\r\n\t\tReconnecterEditor.autoReconnectEnabled = enabled;\r\n\t}\r\n\r\n\tpublic void SetAllowLaunchInstance(bool enabled)\r\n\t{\r\n\t\tReconnecterEditor.allowLaunchInstance = enabled;\r\n\t}\r\n\r\n\tpublic void ForceAutoReconnect()\r\n\t{\r\n\t\tReconnecterEditor.CreateSessionText(true);\r\n\t}\r\n}"
        },
        {
            "Ident": "coomzy.reconnecter",
            "Path": "Editor/ReconnecterEditor.cs",
            "FileName": "ReconnecterEditor.cs",
            "PackageType": "library",
            "CodeKind": "Editor",
            "AssetVersionId": 73637,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing Sandbox.Internal;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\n\r\npublic static class ReconnecterEditor\r\n{\r\n\tpublic static string packageFolders => $\"{Project.Current.Package.Org.Ident}/{Project.Current.Package.Ident}\";\r\n\tpublic static string dataFolder => Editor.FileSystem.Root.GetFullPath($\"/data/{packageFolders}\");\r\n\r\n\tpublic static bool autoReconnectEnabled\r\n\t{\r\n\t\tget\r\n\t\t{\r\n\t\t\treturn GlobalToolsNamespace.EditorCookie.Get<bool>(\"reconnecter_enabled\", true);\r\n\t\t}\r\n\t\tset\r\n\t\t{\r\n\t\t\tGlobalToolsNamespace.EditorCookie.Set<bool>(\"reconnecter_enabled\", value);\r\n\t\t}\r\n\t}\r\n\tpublic static bool allowLaunchInstance\r\n\t{\r\n\t\tget\r\n\t\t{\r\n\t\t\treturn GlobalToolsNamespace.EditorCookie.Get<bool>(\"reconnecter_allowLaunchInstance\", true);\r\n\t\t}\r\n\t\tset\r\n\t\t{\r\n\t\t\tGlobalToolsNamespace.EditorCookie.Set<bool>(\"reconnecter_allowLaunchInstance\", value);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic ReconnecterEditor()\r\n\t{\r\n\t\tReconnecterSystem.RegisterOnRequestWriteSession(CreateSessionText);\r\n\t}\r\n\r\n\tpublic static void CreateSessionText(bool force = false)\r\n\t{\r\n\t\tif (!autoReconnectEnabled && !force)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstring filePath = $\"{dataFolder}/{ReconnecterSystem.SESSION_FILE_PATH}\";\r\n\r\n\t\tstring destinationDirectory = Path.GetDirectoryName(filePath);\r\n\t\tif (!Directory.Exists(destinationDirectory))\r\n\t\t{\r\n\t\t\tDirectory.CreateDirectory(destinationDirectory);\r\n\t\t}\r\n\r\n\t\tFile.WriteAllText(filePath, System.DateTime.UtcNow.ToString());\r\n\t\t//Log.Info($\"CreateSessionText() filePath: {filePath}\");\r\n\t}\r\n\r\n\t[Event(\"scene.play\", Priority = int.MinValue)]\r\n\tpublic static void ScenePlay()\r\n\t{\t\t\r\n\t\tReconnecterSystem.OnPlayInEditor();\r\n\r\n\t\tif (!autoReconnectEnabled || !allowLaunchInstance)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tProcess[] processes = Process.GetProcessesByName(\"sbox\");\r\n\t\tbool isProcessRunning = processes.Length > 0;\r\n\r\n\t\tif (isProcessRunning)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tSpawnProcess();\r\n\t}\r\n\r\n\tpublic static void SpawnProcess()\r\n\t{\r\n\t\tvar p = new Process();\r\n\t\tp.StartInfo.FileName = \"sbox.exe\";\r\n\t\tp.StartInfo.WorkingDirectory = System.Environment.CurrentDirectory;\r\n\t\tp.StartInfo.CreateNoWindow = true;\r\n\t\tp.StartInfo.RedirectStandardOutput = true;\r\n\t\tp.StartInfo.RedirectStandardError = true;\r\n\t\tp.StartInfo.UseShellExecute = false;\r\n\r\n\t\tp.StartInfo.ArgumentList.Add(\"-joinlocal\");\r\n\r\n\t\t// This doesn't seem to work because it doesn't use Steam's Launch Options?\r\n\t\tp.StartInfo.ArgumentList.Add(\"-sw\");\r\n\r\n\t\tp.Start();\r\n\t}\r\n}"
        },
        {
            "Ident": "coomzy.reconnecter",
            "Path": "Code/ReconnecterSystem.cs",
            "FileName": "ReconnecterSystem.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 73637,
            "IsPrivate": false,
            "Code": "using System;\r\nusing Sandbox;\r\nusing System.Linq;\r\nusing Sandbox.Network;\r\n\r\npublic class ReconnecterSystem : GameObjectSystem\r\n{\r\n\tpublic static ReconnecterComponent instance { get; set; }\r\n\tpublic static DateTime? startTime { get; set; }\r\n\r\n\tpublic const string SESSION_FILE_PATH = \"reconnecter_session.txt\";\r\n\r\n\tpublic ReconnecterSystem(Scene scene) : base(scene)\r\n\t{\r\n\t\tif (!Application.IsDebug)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (startTime == null)\r\n\t\t{\r\n\t\t\tstartTime = DateTime.UtcNow;\r\n\t\t}\r\n\r\n\t\tif (Game.IsEditor)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tListen(Stage.FinishUpdate, 0, FinishUpdate, \"ReconnecterSystem.FinishUpdate\");\r\n\t}\r\n\r\n\t// Called from ReconnecterEditor, don't know a better way\r\n\t// It's called after ReconnecterSystem()\r\n\tpublic static void OnPlayInEditor()\r\n\t{\r\n\t\tif (instance != null)\r\n\t\t{\r\n\t\t\tinstance.Destroy();\r\n\t\t\tinstance = null;\r\n\t\t}\r\n\r\n\t\tif (instance == null)\r\n\t\t{\r\n\t\t\tvar newGO = new GameObject(true);\r\n\t\t\tinstance = newGO.Components.Create<ReconnecterComponent>();\r\n\t\t\tnewGO.Flags = GameObjectFlags.DontDestroyOnLoad;\r\n\t\t}\r\n\r\n\t\tstartTime = null;\r\n\t}\r\n\r\n\tpublic static void OnStartedHosting()\r\n\t{\r\n\t\tif (!Game.IsEditor)\r\n        {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tTryRequestWriteSession();\r\n\t}\r\n\r\n\tvoid FinishUpdate()\r\n\t{\r\n\t\tif (!FileSystem.Data.FileExists(SESSION_FILE_PATH))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar sessionText = FileSystem.Data.ReadAllText(SESSION_FILE_PATH);\r\n\t\tif (!DateTime.TryParse(sessionText, out var lastSessionStart))\r\n\t\t{\r\n\t\t\tLog.Info($\"Reconnecter failed to parse session text: {sessionText}\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (lastSessionStart <= startTime.Value)\r\n\t\t{\r\n\t\t\t//Log.Info($\"You're in the most active session\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tNetworking.Disconnect();\r\n\t\tNetworking.Connect(\"local\");\r\n\t}\r\n\r\n\tpublic static event Action<bool> OnRequestWriteSession;\r\n\tpublic static void RegisterOnRequestWriteSession(Action<bool> handler)\r\n\t{\r\n\t\tif (OnRequestWriteSession != null && OnRequestWriteSession.GetInvocationList().Contains(handler))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tOnRequestWriteSession += handler;\r\n\t}\r\n\r\n\tpublic static void TryRequestWriteSession()\r\n\t{\r\n\t\tOnRequestWriteSession?.Invoke(false);\r\n\t}\r\n\r\n\t[ConCmd(\"reconnect_clients\")]\r\n\tpublic static void RequestWriteSession()\r\n\t{\r\n\t\tOnRequestWriteSession?.Invoke(true);\r\n\t}\r\n}\r\n\r\npublic class ReconnecterComponent : Component, Component.INetworkListener\r\n{\r\n\tpublic void OnActive(Connection channel)\r\n\t{\r\n\t\tif (channel == null || !channel.IsHost)\r\n\t\t{\r\n\t\t\treturn;\t\r\n\t\t}\r\n\r\n\t\tReconnecterSystem.OnStartedHosting();\r\n\t}\r\n}"
        }
    ]
}