Repository: kinomonke/BetterComputerCommands
Pull request #1: cleaned up code & added joinrng command
Author: login: defaultuser0-nerd
Created: 2025-03-16T20:17:52Z | Merged: 2025-03-20T21:34:25Z

cleaned up some of the code and join random code command (joinrng)

also changed photonnetwork.inroom to networksystem.instance.inroom

me like mod 


Diff:
diff --git a/BetterComputerCommands.csproj b/BetterComputerCommands.csproj
new file mode 100644
index 0000000..62fb42a
--- /dev/null
+++ b/BetterComputerCommands.csproj
@@ -0,0 +1,288 @@
+﻿<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+	  <TargetFramework>netstandard2.1</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Reference Include="0Harmony">
+      <HintPath>$(BepInExAssemblyPath)\0Harmony.dll</HintPath>
+    </Reference>
+    <Reference Include="Assembly-CSharp">
+      <HintPath>$(GameAssemblyPath)\Assembly-CSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="Assembly-CSharp-firstpass">
+      <HintPath>$(GameAssemblyPath)\Assembly-CSharp-firstpass.dll</HintPath>
+    </Reference>
+    <Reference Include="BakeryRuntimeAssembly">
+      <HintPath>$(GameAssemblyPath)\BakeryRuntimeAssembly.dll</HintPath>
+    </Reference>
+    <Reference Include="BepInEx">
+      <HintPath>$(BepInExAssemblyPath)\BepInEx.dll</HintPath>
+    </Reference>
+    <Reference Include="BepInEx.Harmony">
+      <HintPath>$(BepInExAssemblyPath)\BepInEx.Harmony.dll</HintPath>
+    </Reference>
+    <Reference Include="Bepinject">
+      <HintPath>$(PluginsPath)\Bepinject-Auros\Bepinject.dll</HintPath>
+    </Reference>
+    <Reference Include="Cinemachine">
+      <HintPath>$(GameAssemblyPath)\Cinemachine.dll</HintPath>
+    </Reference>
+    <Reference Include="ComputerInterface">
+      <HintPath>$(PluginsPath)\ComputerInterface\ComputerInterface.dll</HintPath>
+    </Reference>
+    <Reference Include="Mono.Security">
+      <HintPath>$(GameAssemblyPath)\Mono.Security.dll</HintPath>
+    </Reference>
+    <Reference Include="Oculus.Platform">
+      <HintPath>$(GameAssemblyPath)\Oculus.Platform.dll</HintPath>
+    </Reference>
+    <Reference Include="Oculus.VR">
+      <HintPath>$(GameAssemblyPath)\Oculus.VR.dll</HintPath>
+    </Reference>
+    <Reference Include="Photon3Unity3D">
+      <HintPath>$(GameAssemblyPath)\Photon3Unity3D.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonRealtime">
+      <HintPath>$(GameAssemblyPath)\PhotonRealtime.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonUnityNetworking">
+      <HintPath>$(GameAssemblyPath)\PhotonUnityNetworking.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonUnityNetworking.Utilities">
+      <HintPath>$(GameAssemblyPath)\PhotonUnityNetworking.Utilities.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonVoice">
+      <HintPath>$(GameAssemblyPath)\PhotonVoice.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonVoice.API">
+      <HintPath>$(GameAssemblyPath)\PhotonVoice.API.dll</HintPath>
+    </Reference>
+    <Reference Include="PhotonVoice.PUN">
+      <HintPath>$(GameAssemblyPath)\PhotonVoice.PUN.dll</HintPath>
+    </Reference>
+    <Reference Include="PlayFab">
+      <HintPath>$(GameAssemblyPath)\PlayFab.dll</HintPath>
+    </Reference>
+    <Reference Include="System.EnterpriseServices">
+      <HintPath>$(GameAssemblyPath)\System.EnterpriseServices.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceModel.Internals">
+      <HintPath>$(GameAssemblyPath)\System.ServiceModel.Internals.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Animation.Rigging">
+      <HintPath>$(GameAssemblyPath)\Unity.Animation.Rigging.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Burst">
+      <HintPath>$(GameAssemblyPath)\Unity.Burst.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Burst.Unsafe">
+      <HintPath>$(GameAssemblyPath)\Unity.Burst.Unsafe.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.InputSystem">
+      <HintPath>$(GameAssemblyPath)\Unity.InputSystem.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Mathematics">
+      <HintPath>$(GameAssemblyPath)\Unity.Mathematics.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Timeline">
+      <HintPath>$(GameAssemblyPath)\Unity.Timeline.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.XR.Interaction.Toolkit">
+      <HintPath>$(GameAssemblyPath)\Unity.XR.Interaction.Toolkit.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AccessibilityModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AccessibilityModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AIModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AIModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AndroidJNIModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AndroidJNIModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AnimationModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AnimationModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ARModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ARModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AssetBundleModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AssetBundleModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.AudioModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.AudioModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ClothModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ClothModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ClusterInputModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ClusterInputModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ClusterRendererModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ClusterRendererModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.CoreModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.CoreModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.CrashReportingModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.CrashReportingModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.DirectorModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.DirectorModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.DSPGraphModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.DSPGraphModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.GameCenterModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.GameCenterModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.GridModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.GridModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.HotReloadModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.HotReloadModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ImageConversionModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ImageConversionModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.IMGUIModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.IMGUIModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.InputLegacyModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.InputLegacyModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.InputModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.InputModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.JSONSerializeModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.JSONSerializeModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.LocalizationModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.LocalizationModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ParticleSystemModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ParticleSystemModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.PerformanceReportingModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.PerformanceReportingModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.Physics2DModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.Physics2DModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.PhysicsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.PhysicsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ProfilerModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ProfilerModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.ScreenCaptureModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.ScreenCaptureModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SharedInternalsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SharedInternalsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SpatialTracking">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SpatialTracking.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SpriteMaskModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SpriteMaskModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SpriteShapeModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SpriteShapeModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.StreamingModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.StreamingModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SubstanceModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SubstanceModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.SubsystemsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.SubsystemsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.TerrainModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.TerrainModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.TerrainPhysicsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.TerrainPhysicsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.TextRenderingModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.TextRenderingModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.TilemapModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.TilemapModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.TLSModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.TLSModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UI">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UI.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UIElementsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UIElementsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UIModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UIModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UmbraModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UmbraModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityAnalyticsModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityAnalyticsModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityConnectModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityConnectModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityTestProtocolModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityTestProtocolModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityWebRequestAssetBundleModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityWebRequestAudioModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityWebRequestAudioModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityWebRequestModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityWebRequestModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityWebRequestTextureModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityWebRequestTextureModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UnityWebRequestWWWModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.VehiclesModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.VehiclesModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.VFXModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.VFXModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.VideoModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.VideoModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.VRModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.VRModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.WindModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.WindModule.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.XR.LegacyInputHelpers">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.XR.LegacyInputHelpers.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.XRModule">
+      <HintPath>$(GameAssemblyPath)\UnityEngine.XRModule.dll</HintPath>
+    </Reference>
+    <Reference Include="websocket-sharp">
+      <HintPath>$(GameAssemblyPath)\websocket-sharp.dll</HintPath>
+    </Reference>
+    <Reference Include="Zenject">
+      <HintPath>$(PluginsPath)\Extenject\Zenject.dll</HintPath>
+    </Reference>
+    <Reference Include="Zenject-usage">
+      <HintPath>$(PluginsPath)\Extenject\Zenject-usage.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+</Project>
diff --git a/BetterComputerCommands.sln b/BetterComputerCommands.sln
new file mode 100644
index 0000000..5b5b01f
--- /dev/null
+++ b/BetterComputerCommands.sln
@@ -0,0 +1,25 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.11.35327.3
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterComputerCommands", "BetterComputerCommands.csproj", "{1404659F-8B2E-4EE1-83B6-0AAF66A9B623}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{1404659F-8B2E-4EE1-83B6-0AAF66A9B623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1404659F-8B2E-4EE1-83B6-0AAF66A9B623}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1404659F-8B2E-4EE1-83B6-0AAF66A9B623}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1404659F-8B2E-4EE1-83B6-0AAF66A9B623}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {27EC17F6-70CD-4A36-819E-5CBF0D1CD8D3}
+	EndGlobalSection
+EndGlobal
diff --git a/ComputerInterface/CommandManager.cs b/ComputerInterface/CommandManager.cs
index c673d92..1be76a4 100644
--- a/ComputerInterface/CommandManager.cs
+++ b/ComputerInterface/CommandManager.cs
@@ -4,6 +4,8 @@
 using Photon.Pun;
 using UnityEngine;
 using System;
+using System.Text;
+using GorillaNetworking;
 
 namespace ComputerModExample //i wont explain what this stuff does i'm really bad at it theres decent documentation on how to use/create commands at: https://github.com/DecalFree/GorillaInterface
 {
@@ -24,78 +26,49 @@ public void Initialize()
 
             RegisterCommand(new Command(name: "ping", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
+                if (NetworkSystem.Instance.InRoom) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
                 {
-                    return "Ping is: " + PhotonNetwork.GetPing() + "ms \n Your reigon: " + PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper();
+                    return $"Ping is: {PhotonNetwork.GetPing()}ms \nYour region: {PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper()}";
                 }
                 else
                 {
                     return "Not in a room!";
                 }
             }));
+
             RegisterCommand(new Command(name: "fps", argumentTypes: null, args => //frames per second
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
-                else
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
+                return "FPS (for this frame) is: " + (1f / Time.deltaTime);
             }));
+
             RegisterCommand(new Command(name: "playerid", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
-                else
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
+                return "Your player ID is: " + NetworkSystem.Instance.LocalPlayer.UserId;
             }));
+
             RegisterCommand(new Command(name: "credit", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
-                else
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
+                return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
             }));
 
             RegisterCommand(new Command(name: "time", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
-                else
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
+                return "Your local date and time is: " + DateTime.UtcNow;
             }));
 
             RegisterCommand(new Command(name: "appversion", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
-                else
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
+                return "Current app version is: " + GorillaComputer.instance.version;
             }));
 
             RegisterCommand(new Command(name: "master", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
+                if (NetworkSystem.Instance.InRoom)
                 {
-                    return PhotonNetwork.IsMasterClient.ToString();
+                    if (NetworkSystem.Instance.IsMasterClient)
+                        return "You're master!";
+                    else
+                        return "You aren't master!";
                 }
                 else
                 {
@@ -105,49 +78,57 @@ public void Initialize()
 
             RegisterCommand(new Command(name: "players", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "There are" + PhotonNetwork.CountOfPlayers.ToString() + "online.";
-                }
-                else
-                {
-                    return PhotonNetwork.CountOfPlayers.ToString();
-                }
+                return "There are " + NetworkSystem.Instance.GlobalPlayerCount() + " globally online.";
             }));
+
             RegisterCommand(new Command(name: "help", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Command List: (see 'help2' for more commands)\nfps\nplayerid\nping\ntime\nplayers"; //1, 2, 3, 4, 5
-                }
-                else
-                {
-                    return "Command List: (see 'help2' for more commands)\nfps\nplayerid\nping\ntime\nplayers";
-                }
+                return "Command List: (see 'help2' for more commands)\nfps\nplayerid\nping\ntime\nplayers";
             }));
 
             RegisterCommand(new Command(name: "help2", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Command List:\nplayers\nmaster\nappversion\ntime\ncredit"; // 1, 2, 3, 4, 5
-                }
-                else
+                return "Command List:\nplayers\nmaster\nappversion\ntime\ncredit";
+            })); 
+
+            RegisterCommand(new Command(name: "help3", argumentTypes: null, args =>
+            {
+                return "Command List:\njoinrng";
+            })); // for help commands, 5 per help.
+
+            static string rngsstring() // creates a 5 char string
+            {
+                System.Random rng = new System.Random();
+                const string chars = "QWERTYUIOPASDFGHJKLZXCVBNM";
+                var _string = new StringBuilder(5);
+
+                for (int i = 0; i < 5; i++)
                 {
-                    return "Command List:\nplayers\nmaster\nappversion\ntime\ncredit";
+                    _string.Append(chars[rng.Next(chars.Length)]);
                 }
-            })); // for help commands, 5 per help.
-            RegisterCommand(new Command(name: "creation", argumentTypes: null, args =>
+
+                return _string.ToString();
+            }
+            RegisterCommand(new Command(name: "joinrng", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
+                if (NetworkSystem.Instance.InRoom)
                 {
-                    return "still figuring this one out, sorry!";
+                    PhotonNetworkController.Instance.AttemptToJoinSpecificRoom(rngsstring(), JoinType.Solo); // joining that random string that we created
+                    return $"Leaving {NetworkSystem.Instance.CurrentRoom} and joining random room";
                 }
-                else // sorry king defaultuser0 (efaultuber0) 
+                else
                 {
-                    return "still figuring this one out, sorry!";
+                    PhotonNetworkController.Instance.AttemptToJoinSpecificRoom(rngsstring(), JoinType.Solo);
+                    return "Joining random room";
                 }
+            }));
+
+            RegisterCommand(new Command(name: "creation", argumentTypes: null, args =>
+            {
+                // lol i saw that comment 
+                return "still figuring this one out, sorry!";
             })); // when i get this it will go in help3 :)
+
             void RegisterCommand(Command cmd)
             {
                 var token = _commandHandler.AddCommand(cmd);
@@ -162,7 +143,7 @@ void UnregisterAllCommands()
                 }
             }
 
-        void UnregCommands()
+            void UnregCommands()
             {
                 UnregisterAllCommands();
             }
diff --git a/ComputerInterface/MainInstaller.cs b/ComputerInterface/MainInstaller.cs
index 2e5e811..3b1c951 100644
--- a/ComputerInterface/MainInstaller.cs
+++ b/ComputerInterface/MainInstaller.cs
@@ -16,7 +16,7 @@ public override void InstallBindings()
             // notice how I use BindInterfacesAndSelfTo
             // since MyModCommandManager inherits the IInitializable interface
             // the class gets instantiated even if no other class needs it
-            Container.BindInterfacesAndSelfTo<PingCommand>().AsSingle();
+            Container.BindInterfacesAndSelfTo<CustomCommands>().AsSingle();
         }
     }
 }
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..be681c6
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Project>
+	<PropertyGroup>
+		<GamePath>D:\SteamLibrary\steamapps\common\Gorilla Tag</GamePath>
+		<GameAssemblyPath>$(GamePath)\Gorilla Tag_Data\Managed</GameAssemblyPath>
+		<BepInExAssemblyPath>$(GamePath)\BepInEx\core</BepInExAssemblyPath>
+		<PluginsPath>$(GamePath)\BepInEx\plugins</PluginsPath>
+	</PropertyGroup>
+	<PropertyGroup Condition="'$(CI)'=='TRUE'">
+		<GameAssemblyPath>.\Libs</GameAssemblyPath>
+		<BepInExAssemblyPath>.\Libs</BepInExAssemblyPath>
+		<PluginsPath>.\Libs</PluginsPath>
+		<WarningLevel>0</WarningLevel>
+	</PropertyGroup>
+</Project>
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000..fce5015
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Project>
+	<Target Name="CopyToPlugins" AfterTargets="Build" Condition="'$(CI)'!='TRUE'">
+		<Copy SourceFiles="$(TargetPath)" DestinationFiles="$(PluginsPath)\$(ProjectName)\$(TargetFileName)" />
+		<Message Text="Copied to Plugins" Importance="high"/>
+	</Target>
+</Project>
diff --git a/HarmonyPatches.cs b/HarmonyPatches.cs
deleted file mode 100644
index 7d4d9ca..0000000
--- a/HarmonyPatches.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-﻿using System.Reflection;
-using HarmonyLib;
-
-namespace CustomGamemode
-{
-    /// <summary>
-    /// This class handles applying harmony patches to the game.
-    /// You should not need to modify this class.
-    /// </summary>
-    public class HarmonyPatches
-    {
-        private static Harmony instance;
-
-        public static bool IsPatched { get; private set; }
-        public const string InstanceId = PluginInfo.GUID;
-
-        internal static void ApplyHarmonyPatches()
-        {
-            if (!IsPatched)
-            {
-                if (instance == null)
-                {
-                    instance = new Harmony(InstanceId);
-                }
-
-                instance.PatchAll(Assembly.GetExecutingAssembly());
-                IsPatched = true;
-            }
-        }
-
-        internal static void RemoveHarmonyPatches()
-        {
-            if (instance != null && IsPatched)
-            {
-                instance.UnpatchSelf();
-                IsPatched = false;
-            }
-        }
-    }
-}
diff --git a/Patches/ExamplePatch.cs b/Patches/ExamplePatch.cs
deleted file mode 100644
index 0bdca40..0000000
--- a/Patches/ExamplePatch.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Text;
-using HarmonyLib;
-
-namespace CustomGamemode.Patches
-{
-    /// <summary>
-    /// This is an example patch, made to demonstrate how to use Harmony. You should remove it if it is not used.
-    /// </summary>
-    [HarmonyPatch(typeof(GorillaLocomotion.Player))]
-    [HarmonyPatch("Awake", MethodType.Normal)]
-    internal class ExamplePatch
-    {
-        private static void Postfix(GorillaLocomotion.Player __instance)
-        {
-            Console.WriteLine(__instance.maxJumpSpeed);
-        }
-    }
-}
diff --git a/Plugin.cs b/Plugin.cs
index 699fe19..bfbfb6b 100644
--- a/Plugin.cs
+++ b/Plugin.cs
@@ -7,9 +7,7 @@ namespace CustomGamemode
     [BepInPlugin(PluginInfo.GUID, PluginInfo.Name, PluginInfo.Version)]
     public class Plugin : BaseUnityPlugin
     {
-        private void Awake()
-        {
+        private void Awake() =>
             Zenjector.Install<MainInstaller>().OnProject();
-        }
     }
 }
diff --git a/PluginInfo.cs b/PluginInfo.cs
index 605ceef..1eceb91 100644
--- a/PluginInfo.cs
+++ b/PluginInfo.cs
@@ -7,6 +7,6 @@ internal class PluginInfo
     {
         public const string GUID = "com.kino.gorillatag.bettercomputercommands";
         public const string Name = "BetterComputerCommands";
-        public const string Version = "1.0.1";
+        public const string Version = "1.0.2";
     }
 }


Reviews:
user: login: DecalFree
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-16T22:16:24Z
user: login: defaultuser0-nerd
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-16T22:29:41Z

Review comments:
diff_hunk: @@ -24,76 +26,44 @@ public void Initialize()
 
             RegisterCommand(new Command(name: "ping", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
+                if (NetworkSystem.Instance.InRoom) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
                 {
-                    return "Ping is: " + PhotonNetwork.GetPing() + "ms \n Your reigon: " + PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper();
+                    return "Ping is: " + PhotonNetwork.GetPing() + "ms \n Your region: " + PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper();
                 }
                 else
                 {
                     return "Not in a room!";
                 }
             }));
+
             RegisterCommand(new Command(name: "fps", argumentTypes: null, args => //frames per second
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
-                else
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
+                return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
             }));
+
             RegisterCommand(new Command(name: "playerid", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
-                else
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
+                return "Your player ID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
             }));
+
             RegisterCommand(new Command(name: "credit", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
-                else
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
+                return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
             }));
 
             RegisterCommand(new Command(name: "time", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
-                else
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
+                return "Your local date and time is: " + DateTime.UtcNow.ToString();
             }));
 
             RegisterCommand(new Command(name: "appversion", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
-                else
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
+                return "Current app version is: " + PhotonNetwork.AppVersion.ToString();
             }));
 
             RegisterCommand(new Command(name: "master", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
+                if (!NetworkSystem.Instance.InRoom)
                 {
                     return PhotonNetwork.IsMasterClient.ToString();
                 }
path: ComputerInterface/CommandManager.cs
user: login: DecalFree
body: This doesn't make sense, why when you are in a room it will just return that you aren't?
created_at: 2025-03-16T22:16:24Z
author_association: NONE
diff_hunk: @@ -24,76 +26,44 @@ public void Initialize()
 
             RegisterCommand(new Command(name: "ping", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
+                if (NetworkSystem.Instance.InRoom) //inspired by lunakittyyys easyping mod (https://github.com/lunakittyyy/EasyPing)
                 {
-                    return "Ping is: " + PhotonNetwork.GetPing() + "ms \n Your reigon: " + PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper();
+                    return "Ping is: " + PhotonNetwork.GetPing() + "ms \n Your region: " + PhotonNetwork.CloudRegion.Replace("/*", "").ToUpper();
                 }
                 else
                 {
                     return "Not in a room!";
                 }
             }));
+
             RegisterCommand(new Command(name: "fps", argumentTypes: null, args => //frames per second
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
-                else
-                {
-                    return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
-                }
+                return "FPS (for this frame) is: " + (1f / Time.deltaTime).ToString();
             }));
+
             RegisterCommand(new Command(name: "playerid", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
-                else
-                {
-                    return "Your PlayerID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
-                }
+                return "Your player ID is: " + (PhotonNetwork.LocalPlayer.UserId).ToString();
             }));
+
             RegisterCommand(new Command(name: "credit", argumentTypes: null, args =>
             {
-                if (PhotonNetwork.InRoom == true)
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
-                else
-                {
-                    return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
-                }
+                return "Commands made by kino \nping command inspired by lunakittyyys easyping mod | github.com/lunakittyyy/EasyPing";
             }));
 
             RegisterCommand(new Command(name: "time", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
-                else
-                {
-                    return "Your local date and time is" + DateTime.UtcNow.ToString();
-                }
+                return "Your local date and time is: " + DateTime.UtcNow.ToString();
             }));
 
             RegisterCommand(new Command(name: "appversion", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
-                else
-                {
-                    return "Current app version is:" + PhotonNetwork.AppVersion.ToString();
-                }
+                return "Current app version is: " + PhotonNetwork.AppVersion.ToString();
             }));
 
             RegisterCommand(new Command(name: "master", argumentTypes: null, args =>
             {
-                if (!PhotonNetwork.InRoom == true)
+                if (!NetworkSystem.Instance.InRoom)
                 {
                     return PhotonNetwork.IsMasterClient.ToString();
                 }
path: ComputerInterface/CommandManager.cs
user: login: defaultuser0-nerd
body: I never noticed that - it completely went over my head
created_at: 2025-03-16T22:29:41Z
author_association: CONTRIBUTOR

PR comments:
user: login: DecalFree
created_at: 2025-03-16T21:46:22Z
body: There are some changes that can be made to make this more efficient and up to par on future networking changes.

For instance, `PhotonNetwork.LocalPlayer` can be replaced by `NetworkSystem.Instance.LocalPlayer`, `PhotonNetwork.AppVersion` can be replaced by `GorillaComputer.instance.version`, and `PhotonNetwork.CountOfPlayers` can be replaced by `NetworkSystem.Instance.GlobalPlayerCount()`
author_association: NONE
user: login: defaultuser0-nerd
created_at: 2025-03-16T23:21:35Z
body: kinda fucked up that commit whoops
should be fine tho
author_association: CONTRIBUTOR
user: login: kinomonke
created_at: 2025-03-17T15:34:43Z
body: we will hope 🙏🙏
author_association: OWNER
user: login: kinomonke
created_at: 2025-03-17T15:35:06Z
body: when i release the next version (will probably have some of ur code) u will get credits dw
edit: to the both of you
author_association: OWNER