diff --git a/Novetus/Novetus.Bootstrapper/LocalFuncs.cs b/Novetus/Novetus.Bootstrapper/LocalFuncs.cs
index fbe5d71..7fca77b 100644
--- a/Novetus/Novetus.Bootstrapper/LocalFuncs.cs
+++ b/Novetus/Novetus.Bootstrapper/LocalFuncs.cs
@@ -1,5 +1,7 @@
#region Usings
+#if !BASICLAUNCHER
using NLog;
+#endif
using Novetus.Core;
using System;
using System.Diagnostics;
diff --git a/Novetus/Novetus.Bootstrapper/Novetus.Bootstrapper.csproj b/Novetus/Novetus.Bootstrapper/Novetus.Bootstrapper.csproj
index 9333d5f..7b04ba0 100644
--- a/Novetus/Novetus.Bootstrapper/Novetus.Bootstrapper.csproj
+++ b/Novetus/Novetus.Bootstrapper/Novetus.Bootstrapper.csproj
@@ -43,166 +43,16 @@
app.manifest
-
- ..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll
-
-
- ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll
- True
- True
-
-
- ..\packages\NLog.5.1.0\lib\net46\NLog.dll
-
-
- ..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll
- True
- True
-
-
- ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
-
-
- ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll
- True
- True
-
-
- ..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll
- True
- True
-
-
- ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll
- True
- True
-
-
- ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll
- True
- True
-
-
- ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll
- True
- True
-
-
- ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll
- True
- True
-
-
- ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll
- True
- True
-
-
- ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll
- True
- True
-
-
- ..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll
- True
- True
-
-
- ..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll
- True
- True
-
-
- ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll
-
-
- ..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll
- True
- True
-
-
- ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll
- True
- True
-
-
- ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
-
-
- ..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll
- True
- True
-
-
- ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll
- True
- True
-
-
- ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll
-
-
- ..\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll
- True
- True
-
-
- ..\packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll
- True
- True
-
-
- ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
- True
- True
-
-
- ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll
- True
- True
-
-
- ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll
- True
- True
-
-
- ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll
- True
- True
-
-
- ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll
- True
- True
-
-
- ..\packages\System.Text.Encodings.Web.7.0.0\lib\net462\System.Text.Encodings.Web.dll
-
-
- ..\packages\System.Text.Json.7.0.3\lib\net462\System.Text.Json.dll
-
-
- ..\packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll
- True
- True
-
-
- ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll
-
-
- ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll
-
@@ -211,11 +61,6 @@
-
- ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll
- True
- True
-
@@ -243,7 +88,6 @@
-
SettingsSingleFileGenerator
Settings.Designer.cs
diff --git a/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs b/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs
index f9a93e3..de63396 100644
--- a/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs
+++ b/Novetus/Novetus.Bootstrapper/NovetusLaunch.cs
@@ -1,5 +1,7 @@
#region Usings
+#if !BASICLAUNCHER
using NLog;
+#endif
using Novetus.Core;
using System;
using System.IO;
@@ -24,11 +26,6 @@ namespace Novetus.Bootstrapper
Directory.CreateDirectory(GlobalPaths.LogDir);
}
- var config = new NLog.Config.LoggingConfiguration();
- var logfile = new NLog.Targets.FileTarget("logfile") { FileName = GlobalPaths.LogDir + "\\Bootstrapper-log-" + DateTime.Today.ToString("MM-dd-yyyy") + ".log" };
- config.AddRuleForAllLevels(logfile);
- LogManager.Configuration = config;
-
Application.Run(new NovetusLaunchForm());
}
}
diff --git a/Novetus/Novetus.Bootstrapper/NovetusLaunchForm.cs b/Novetus/Novetus.Bootstrapper/NovetusLaunchForm.cs
index 54603d4..37f045d 100644
--- a/Novetus/Novetus.Bootstrapper/NovetusLaunchForm.cs
+++ b/Novetus/Novetus.Bootstrapper/NovetusLaunchForm.cs
@@ -1,4 +1,6 @@
-using NLog;
+#if !BASICLAUNCHER
+using NLog;
+#endif
using Novetus.Core;
using System;
using System.Drawing;
diff --git a/Novetus/Novetus.Bootstrapper/packages.config b/Novetus/Novetus.Bootstrapper/packages.config
deleted file mode 100644
index 387d921..0000000
--- a/Novetus/Novetus.Bootstrapper/packages.config
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Novetus/NovetusCore/Classes/UHWIDEngine.cs b/Novetus/NovetusCore/Classes/UHWIDEngine.cs
index 205586c..c6a9487 100644
--- a/Novetus/NovetusCore/Classes/UHWIDEngine.cs
+++ b/Novetus/NovetusCore/Classes/UHWIDEngine.cs
@@ -5,76 +5,21 @@ using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
#endregion
//https://github.com/davcs86/csharp-uhwid
-//merged into one class
+//using only cpu id.
namespace Novetus.Core
{
#region UHWIDEngine
public static class UHWIDEngine
{
- public static string SimpleUid { get; private set; }
-
- public static string AdvancedUid { get; private set; }
-
- static UHWIDEngine()
- {
- var volumeSerial = DiskId.GetDiskId();
- var cpuId = CpuId.GetCpuId();
- var windowsId = WindowsId.GetWindowsId();
- SimpleUid = volumeSerial + cpuId;
- AdvancedUid = SimpleUid + windowsId;
- }
- }
- #endregion
-
- #region DiskId
- internal class DiskId
- {
- public static string GetDiskId()
- {
- return GetDiskId("");
- }
- private static string GetDiskId(string diskLetter)
- {
- //Find first drive
- if (string.IsNullOrEmpty(diskLetter))
- {
- foreach (var compDrive in DriveInfo.GetDrives())
- {
- if (compDrive.IsReady)
- {
- diskLetter = compDrive.RootDirectory.ToString();
- break;
- }
- }
- }
- if (!string.IsNullOrEmpty(diskLetter) && diskLetter.EndsWith(":\\"))
- {
- //C:\ -> C
- diskLetter = diskLetter.Substring(0, diskLetter.Length - 2);
- }
- var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""" + diskLetter + @":""");
- disk.Get();
-
- var volumeSerial = disk["VolumeSerialNumber"].ToString();
- disk.Dispose();
-
- return volumeSerial;
- }
- }
- #endregion
-
- #region CpuId
- internal static class CpuId
- {
-
[DllImport("user32", EntryPoint = "CallWindowProcW", CharSet = CharSet.Unicode, SetLastError = true,
- ExactSpelling = true)]
+ ExactSpelling = true)]
private static extern IntPtr CallWindowProcW([In] byte[] bytes, IntPtr hWnd, int msg, [In, Out] byte[] wParam,
- IntPtr lParam);
+ IntPtr lParam);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
@@ -82,6 +27,16 @@ namespace Novetus.Core
const int PAGE_EXECUTE_READWRITE = 0x40;
+ public static string AdvancedUid { get; private set; }
+
+ static UHWIDEngine()
+ {
+ var cpuId = GetCpuId();
+ Regex rx = new Regex(@"[A-Za-z.]");
+ var ver = rx.Replace(GlobalVars.ProgramInformation.Version, "");
+ AdvancedUid = SecurityFuncs.Encode(cpuId + ver);
+ }
+
public static string GetCpuId()
{
var sn = new byte[8];
@@ -145,36 +100,4 @@ namespace Novetus.Core
}
}
#endregion
-
- #region WindowsId
- internal class WindowsId
- {
- public static string GetWindowsId()
- {
- var windowsInfo = "";
- var managClass = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem");
-
- var managCollec = managClass.Get();
-
- var is64Bits = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"));
-
- foreach (var o in managCollec)
- {
- var managObj = (ManagementObject)o;
- windowsInfo = managObj.Properties["Caption"].Value + Environment.UserName + (string)managObj.Properties["Version"].Value;
- break;
- }
- windowsInfo = windowsInfo.Replace(" ", "");
- windowsInfo = windowsInfo.Replace("Windows", "");
- windowsInfo = windowsInfo.Replace("windows", "");
- windowsInfo += (is64Bits) ? " 64bit" : " 32bit";
-
- //md5 hash of the windows version
- var md5Hasher = MD5.Create();
- var wi = md5Hasher.ComputeHash(Encoding.Default.GetBytes(windowsInfo));
- var wiHex = BitConverter.ToString(wi).Replace("-", "");
- return wiHex;
- }
- }
- #endregion
}
\ No newline at end of file
diff --git a/Novetus/NovetusCore/StorageAndFunctions/FileManagement.cs b/Novetus/NovetusCore/StorageAndFunctions/FileManagement.cs
index 09c3646..3511b26 100644
--- a/Novetus/NovetusCore/StorageAndFunctions/FileManagement.cs
+++ b/Novetus/NovetusCore/StorageAndFunctions/FileManagement.cs
@@ -13,7 +13,9 @@ using System.Windows.Forms;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Linq;
+#if !BASICLAUNCHER
using System.Text.Json;
+#endif
#endregion
namespace Novetus.Core
diff --git a/Novetus/NovetusCore/StorageAndFunctions/Util.cs b/Novetus/NovetusCore/StorageAndFunctions/Util.cs
index 6957c4a..92329a1 100644
--- a/Novetus/NovetusCore/StorageAndFunctions/Util.cs
+++ b/Novetus/NovetusCore/StorageAndFunctions/Util.cs
@@ -10,7 +10,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
+#if !BASICLAUNCHER
using NLog;
+#endif
using System.Text.RegularExpressions;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
@@ -504,9 +506,10 @@ namespace Novetus.Core
return Task.Delay(milliseconds);
#endif
}
-
public static void LogPrint(string text, int type = 1)
{
+ //TODO, remove nlog support for bootstrapper completely. this is a temp fix.
+#if !BASICLAUNCHER
Logger log = LogManager.GetCurrentClassLogger();
switch (type)
@@ -521,6 +524,7 @@ namespace Novetus.Core
log.Info(text);
break;
}
+#endif
}
public static void LogExceptions(Exception ex)
diff --git a/changelog.txt b/changelog.txt
index aed73a3..99f9fa6 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,6 +1,14 @@
-EDGE Snapshot v23.8574.19965.1
+
+Enhancements:
+- Added proper metatable protection on all affected clients. (2006S-2010L)
+----------------------------------------------------------------------------
+EDGE Snapshot v23.8700.30967.1
Notes:
- Novetus' license has switched to the GPL 3.0.
+- 💙
+
+Enhancements:
+- Improved tripcode generation to fix various issues.
Fixes:
- Fixed tripcodes not working
diff --git a/scripts/game/2006S-Shaders/CSMPFunctions.lua b/scripts/game/2006S-Shaders/CSMPFunctions.lua
index 2ede04c..fea13c9 100644
--- a/scripts/game/2006S-Shaders/CSMPFunctions.lua
+++ b/scripts/game/2006S-Shaders/CSMPFunctions.lua
@@ -465,3 +465,45 @@ _G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2006S/CSMPFunctions.lua b/scripts/game/2006S/CSMPFunctions.lua
index fed6757..812794a 100644
--- a/scripts/game/2006S/CSMPFunctions.lua
+++ b/scripts/game/2006S/CSMPFunctions.lua
@@ -465,3 +465,45 @@ _G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2007E-Shaders/CSMPFunctions.lua b/scripts/game/2007E-Shaders/CSMPFunctions.lua
index c8ca043..fbddbaf 100644
--- a/scripts/game/2007E-Shaders/CSMPFunctions.lua
+++ b/scripts/game/2007E-Shaders/CSMPFunctions.lua
@@ -523,3 +523,45 @@ _G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2007E/CSMPFunctions.lua b/scripts/game/2007E/CSMPFunctions.lua
index d2474dc..418ca2e 100644
--- a/scripts/game/2007E/CSMPFunctions.lua
+++ b/scripts/game/2007E/CSMPFunctions.lua
@@ -523,3 +523,45 @@ _G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2007M-Shaders/CSMPFunctions.lua b/scripts/game/2007M-Shaders/CSMPFunctions.lua
index 24d5090..2562b3b 100644
--- a/scripts/game/2007M-Shaders/CSMPFunctions.lua
+++ b/scripts/game/2007M-Shaders/CSMPFunctions.lua
@@ -578,4 +578,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2007M/CSMPFunctions.lua b/scripts/game/2007M/CSMPFunctions.lua
index c8cde72..db3abe9 100644
--- a/scripts/game/2007M/CSMPFunctions.lua
+++ b/scripts/game/2007M/CSMPFunctions.lua
@@ -579,3 +579,45 @@ _G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2008M/CSMPFunctions.lua b/scripts/game/2008M/CSMPFunctions.lua
index 095b613..5de80a1 100644
--- a/scripts/game/2008M/CSMPFunctions.lua
+++ b/scripts/game/2008M/CSMPFunctions.lua
@@ -697,4 +697,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2009E-HD/CSMPFunctions.lua b/scripts/game/2009E-HD/CSMPFunctions.lua
index ec70627..c95ab2d 100644
--- a/scripts/game/2009E-HD/CSMPFunctions.lua
+++ b/scripts/game/2009E-HD/CSMPFunctions.lua
@@ -791,4 +791,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2009E/CSMPFunctions.lua b/scripts/game/2009E/CSMPFunctions.lua
index a171848..ae5d933 100644
--- a/scripts/game/2009E/CSMPFunctions.lua
+++ b/scripts/game/2009E/CSMPFunctions.lua
@@ -791,4 +791,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2009L/CSMPFunctions.lua b/scripts/game/2009L/CSMPFunctions.lua
index 46c398a..27c966a 100644
--- a/scripts/game/2009L/CSMPFunctions.lua
+++ b/scripts/game/2009L/CSMPFunctions.lua
@@ -797,4 +797,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/game/2010L/CSMPFunctions.lua b/scripts/game/2010L/CSMPFunctions.lua
index cdab3e7..517a26d 100644
--- a/scripts/game/2010L/CSMPFunctions.lua
+++ b/scripts/game/2010L/CSMPFunctions.lua
@@ -798,4 +798,46 @@ end
_G.CSServer=CSServer
_G.CSConnect=CSConnect
_G.CSSolo=CSSolo
-_G.CSStudio=CSStudio
\ No newline at end of file
+_G.CSStudio=CSStudio
+
+-- credit to KeyboardCombination
+local succ = pcall(function() --check if the metatables are already read only lol
+ local canChange = getmetatable(game.Close);
+ canChange.__metatable = canChange.__metatable
+end)
+
+if not succ then
+ return;
+end
+
+function readonlytable(table)
+ return setmetatable({}, {
+ __index = table,
+ __newindex = function(table, key, value)
+ error("Attempt to modify read-only table")
+ end,
+ __metatable = false
+ });
+end
+
+function readonlytablechildren(table)
+ for i,v in pairs(table) do
+ if type(v)=="table" and table[i]~=_G._G then
+ readonlytablechildren(table[i])
+ table[i] = readonlytable(table[i])
+ end
+ if type(v)=="userdata" then
+ local mt = getmetatable(table[i])
+ if mt~=nil and mt~=false then
+ mt.__metatable=false
+ end
+ end
+ end
+end
+_G.rawset=nil
+readonlytablechildren(_G)
+_G._G = readonlytable(_G)
+mt = getmetatable(game.Changed)
+mt.__metatable=false
+mt = getmetatable("curse you roblox")
+mt.__metatable=false
\ No newline at end of file
diff --git a/scripts/launcher/info.ini b/scripts/launcher/info.ini
index fce8d45..f30735a 100644
--- a/scripts/launcher/info.ini
+++ b/scripts/launcher/info.ini
@@ -10,5 +10,5 @@ ExtendedVersionNumber=True
//ExtendedVersionTemplate=%version% Snapshot v23.%build%.%revision%.%extended-revision%
ExtendedVersionTemplate=EDGE Snapshot v23.%build%.%revision%.%extended-revision%
ExtendedVersionRevision=1
-InitialBootup=True
+InitialBootup=False
IsLite=False
diff --git a/scripts/launcher/splashes-special.txt b/scripts/launcher/splashes-special.txt
index 244e55b..8ea221d 100644
--- a/scripts/launcher/splashes-special.txt
+++ b/scripts/launcher/splashes-special.txt
@@ -1,5 +1,6 @@
Happy New Year!|Have a happy %year%!|1/1
RIP Erik Cassel|Erik Cassel, was a co-founder, administrator%newline%and former VP of Engineering of Roblox.|2/11
+Blueheart Forever.|Dedicated to Pepper and Sophie.|4/14
smoke weed every day|blaze it|4/20
Happy Birthday, Bitl!|Bitl is the developer of Novetus and RBXLegacy.|6/10
Happy Pride Month!|6/1-6/30-6/7-6/15
diff --git a/scripts/launcher/splashes.txt b/scripts/launcher/splashes.txt
index a23213c..7923d3e 100644
--- a/scripts/launcher/splashes.txt
+++ b/scripts/launcher/splashes.txt
@@ -270,4 +270,6 @@ Supports USB C!
NOW. UNDER. MILITARY. COMMAND.
ONE MILLION DOLLARS!
It's the new wave of the future!
-In the face of extermination, say "FUCK YOU"!|Dedicated to Pepper
\ No newline at end of file
+In the face of extermination, say "FUCK YOU"!|Dedicated to Pepper
+roblox for steam deck when|Just fuckin play novetus
+you're still standing here, despite everything|Dedicated to Pepper
\ No newline at end of file