s&box Package Code Search
Search C# source code, UI razor templates, shaders, and configs across s&box packages.
link Raw Facepunch API Link: https://public.facepunch.com/sbox/code/search/1/?ident=coomzy.reconnecter&take=20
Showing code results for query:
*
(3 total matches found)
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);
}
}
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();
}
}
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}"
}
]
}