Script signing

This commit is contained in:
Bitl 2022-02-20 09:10:34 -07:00
parent cc49d31053
commit cecab706b5
8 changed files with 192 additions and 46 deletions

View File

@ -4,6 +4,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Linq;
@ -12,9 +15,51 @@ using System.Xml.Linq;
#region Script Functions
public class ScriptFuncs
{
#region Script Generator
#region Script Generator/Signer
public class Generator
{
public static void SignGeneratedScript(string scriptFileName, bool newSigFormat = false, bool encodeInBase64 = true)
{
string privateKeyPath = Path.GetDirectoryName(scriptFileName) + "//privatekey.txt";
if (File.Exists(privateKeyPath))
{
//init vars
string format = newSigFormat ? "--rbxsig%{0}%{1}" : "%{0}%{1}";
byte[] blob = Encoding.Default.GetBytes(File.ReadAllText(privateKeyPath));
if (encodeInBase64)
{
blob = Convert.FromBase64String(Encoding.Default.GetString(blob));
}
//create cryptography providers
var shaCSP = new SHA1CryptoServiceProvider();
var rsaCSP = new RSACryptoServiceProvider();
rsaCSP.ImportCspBlob(blob);
// sign script
string script = "\r\n" + File.ReadAllText(scriptFileName);
byte[] signature = rsaCSP.SignData(Encoding.Default.GetBytes(script), shaCSP);
// override file.
GlobalFuncs.FixedFileDelete(scriptFileName);
File.WriteAllText(scriptFileName, string.Format(format, Convert.ToBase64String(signature), script));
}
else
{
//create the signature file if it doesn't exist
var signingRSACSP = new RSACryptoServiceProvider(1024);
byte[] privateKeyBlob = signingRSACSP.ExportCspBlob(true);
signingRSACSP.Dispose();
// save our text file in the script's directory
File.WriteAllText(privateKeyPath, encodeInBase64 ? Convert.ToBase64String(privateKeyBlob) : Encoding.Default.GetString(privateKeyBlob));
// try signing again.
SignGeneratedScript(scriptFileName, encodeInBase64);
}
}
public static string GetScriptFuncForType(ScriptType type)
{
return GetScriptFuncForType(GlobalVars.UserConfiguration.SelectedClient, type);
@ -132,11 +177,19 @@ public class ScriptFuncs
}
}
File.WriteAllLines(
(GlobalVars.SelectedClientInfo.SeperateFolders ?
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + GlobalFuncs.GetClientSeperateFolderName(type) + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua":
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua"),
code);
string outputPath = (GlobalVars.SelectedClientInfo.SeperateFolders ?
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + GlobalFuncs.GetClientSeperateFolderName(type) + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua" :
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua");
File.WriteAllLines(outputPath, code);
bool shouldSign = GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%signgeneratedjoinscript%");
bool shouldUseNewSigFormat = GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%usenewsignformat%");
if (shouldSign)
{
SignGeneratedScript(outputPath, shouldUseNewSigFormat);
}
}
}
#endregion

View File

@ -161,6 +161,9 @@ partial class ClientinfoEditor
this.checkBox8 = new System.Windows.Forms.CheckBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.signScriptManuallyModernClientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.signgeneratedjoinscriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.usenewsignformatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.SuspendLayout();
//
@ -241,9 +244,9 @@ partial class ClientinfoEditor
//
this.checkBox6.Location = new System.Drawing.Point(10, 88);
this.checkBox6.Name = "checkBox6";
this.checkBox6.Size = new System.Drawing.Size(262, 21);
this.checkBox6.Size = new System.Drawing.Size(279, 21);
this.checkBox6.TabIndex = 20;
this.checkBox6.Text = "Fix scripts and map loading for 2007-Early 2008";
this.checkBox6.Text = "Generate scripts and fix map loading for 2007/2012+";
this.checkBox6.UseVisualStyleBackColor = true;
this.checkBox6.CheckedChanged += new System.EventHandler(this.CheckBox6CheckedChanged);
//
@ -278,7 +281,8 @@ partial class ClientinfoEditor
this.newToolStripMenuItem,
this.loadToolStripMenuItem,
this.saveToolStripMenuItem,
this.saveAsTextFileToolStripMenuItem});
this.saveAsTextFileToolStripMenuItem,
this.signScriptManuallyModernClientsToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
@ -286,21 +290,21 @@ partial class ClientinfoEditor
// newToolStripMenuItem
//
this.newToolStripMenuItem.Name = "newToolStripMenuItem";
this.newToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
this.newToolStripMenuItem.Size = new System.Drawing.Size(294, 22);
this.newToolStripMenuItem.Text = "New";
this.newToolStripMenuItem.Click += new System.EventHandler(this.NewToolStripMenuItemClick);
//
// loadToolStripMenuItem
//
this.loadToolStripMenuItem.Name = "loadToolStripMenuItem";
this.loadToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
this.loadToolStripMenuItem.Size = new System.Drawing.Size(294, 22);
this.loadToolStripMenuItem.Text = "Load";
this.loadToolStripMenuItem.Click += new System.EventHandler(this.LoadToolStripMenuItemClick);
//
// saveToolStripMenuItem
//
this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
this.saveToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
this.saveToolStripMenuItem.Size = new System.Drawing.Size(294, 22);
this.saveToolStripMenuItem.Text = "Save";
this.saveToolStripMenuItem.Click += new System.EventHandler(this.SaveToClientToolStripMenuItemClick);
//
@ -310,20 +314,20 @@ partial class ClientinfoEditor
this.textToolStripMenuItem,
this.iNIToolStripMenuItem});
this.saveAsTextFileToolStripMenuItem.Name = "saveAsTextFileToolStripMenuItem";
this.saveAsTextFileToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
this.saveAsTextFileToolStripMenuItem.Size = new System.Drawing.Size(294, 22);
this.saveAsTextFileToolStripMenuItem.Text = "Save As";
//
// textToolStripMenuItem
//
this.textToolStripMenuItem.Name = "textToolStripMenuItem";
this.textToolStripMenuItem.Size = new System.Drawing.Size(95, 22);
this.textToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.textToolStripMenuItem.Text = "Text";
this.textToolStripMenuItem.Click += new System.EventHandler(this.saveAsTextFileToolStripMenuItem_Click);
//
// iNIToolStripMenuItem
//
this.iNIToolStripMenuItem.Name = "iNIToolStripMenuItem";
this.iNIToolStripMenuItem.Size = new System.Drawing.Size(95, 22);
this.iNIToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.iNIToolStripMenuItem.Text = "INI";
this.iNIToolStripMenuItem.Click += new System.EventHandler(this.saveAsINIFileToolStripMenuItem_Click);
//
@ -348,7 +352,7 @@ partial class ClientinfoEditor
this.sharedToolStripMenuItem,
this.validateToolStripMenuItem});
this.tagsToolStripMenuItem.Name = "tagsToolStripMenuItem";
this.tagsToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
this.tagsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tagsToolStripMenuItem.Text = "Add Tags";
//
// clientToolStripMenuItem
@ -419,7 +423,7 @@ partial class ClientinfoEditor
this.debuggingToolStripMenuItem,
this.argsToolStripMenuItem});
this.variablesToolStripMenuItem.Name = "variablesToolStripMenuItem";
this.variablesToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
this.variablesToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.variablesToolStripMenuItem.Text = "Add Variables";
//
// generalToolStripMenuItem
@ -437,99 +441,101 @@ partial class ClientinfoEditor
this.joinportToolStripMenuItem,
this.validatedextrafilesToolStripMenuItem,
this.argstringToolStripMenuItem,
this.newguiToolStripMenuItem});
this.newguiToolStripMenuItem,
this.signgeneratedjoinscriptToolStripMenuItem,
this.usenewsignformatToolStripMenuItem});
this.generalToolStripMenuItem.Name = "generalToolStripMenuItem";
this.generalToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.generalToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.generalToolStripMenuItem.Text = "General";
//
// mapfileToolStripMenuItem
//
this.mapfileToolStripMenuItem.Name = "mapfileToolStripMenuItem";
this.mapfileToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.mapfileToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.mapfileToolStripMenuItem.Text = "%mapfile%";
this.mapfileToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// mapfiledToolStripMenuItem
//
this.mapfiledToolStripMenuItem.Name = "mapfiledToolStripMenuItem";
this.mapfiledToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.mapfiledToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.mapfiledToolStripMenuItem.Text = "%mapfiled%";
this.mapfiledToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// mapfilecToolStripMenuItem
//
this.mapfilecToolStripMenuItem.Name = "mapfilecToolStripMenuItem";
this.mapfilecToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.mapfilecToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.mapfilecToolStripMenuItem.Text = "%mapfilec%";
this.mapfilecToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// luafileToolStripMenuItem
//
this.luafileToolStripMenuItem.Name = "luafileToolStripMenuItem";
this.luafileToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.luafileToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.luafileToolStripMenuItem.Text = "%luafile%";
this.luafileToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// ipToolStripMenuItem
//
this.ipToolStripMenuItem.Name = "ipToolStripMenuItem";
this.ipToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.ipToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.ipToolStripMenuItem.Text = "%ip%";
this.ipToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// addonscriptpathToolStripMenuItem
//
this.addonscriptpathToolStripMenuItem.Name = "addonscriptpathToolStripMenuItem";
this.addonscriptpathToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.addonscriptpathToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.addonscriptpathToolStripMenuItem.Text = "%addonscriptpath%";
this.addonscriptpathToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// scripttypeToolStripMenuItem
//
this.scripttypeToolStripMenuItem.Name = "scripttypeToolStripMenuItem";
this.scripttypeToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.scripttypeToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.scripttypeToolStripMenuItem.Text = "%scripttype%";
this.scripttypeToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// versionToolStripMenuItem
//
this.versionToolStripMenuItem.Name = "versionToolStripMenuItem";
this.versionToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.versionToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.versionToolStripMenuItem.Text = "%version%";
this.versionToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// doublequoteToolStripMenuItem
//
this.doublequoteToolStripMenuItem.Name = "doublequoteToolStripMenuItem";
this.doublequoteToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.doublequoteToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.doublequoteToolStripMenuItem.Text = "%doublequote%";
this.doublequoteToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// joinportToolStripMenuItem
//
this.joinportToolStripMenuItem.Name = "joinportToolStripMenuItem";
this.joinportToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.joinportToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.joinportToolStripMenuItem.Text = "%joinport%";
this.joinportToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// validatedextrafilesToolStripMenuItem
//
this.validatedextrafilesToolStripMenuItem.Name = "validatedextrafilesToolStripMenuItem";
this.validatedextrafilesToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.validatedextrafilesToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.validatedextrafilesToolStripMenuItem.Text = "%validatedextrafiles%";
this.validatedextrafilesToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// argstringToolStripMenuItem
//
this.argstringToolStripMenuItem.Name = "argstringToolStripMenuItem";
this.argstringToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.argstringToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.argstringToolStripMenuItem.Text = "%argstring%";
this.argstringToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// newguiToolStripMenuItem
//
this.newguiToolStripMenuItem.Name = "newguiToolStripMenuItem";
this.newguiToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
this.newguiToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.newguiToolStripMenuItem.Text = "%newgui%";
this.newguiToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
@ -540,7 +546,7 @@ partial class ClientinfoEditor
this.notificationsToolStripMenuItem,
this.portToolStripMenuItem});
this.serverToolStripMenuItem1.Name = "serverToolStripMenuItem1";
this.serverToolStripMenuItem1.Size = new System.Drawing.Size(163, 22);
this.serverToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
this.serverToolStripMenuItem1.Text = "Server";
//
// limitToolStripMenuItem
@ -575,7 +581,7 @@ partial class ClientinfoEditor
this.md5sToolStripMenuItem,
this.md5sdToolStripMenuItem});
this.securityToolStripMenuItem.Name = "securityToolStripMenuItem";
this.securityToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.securityToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.securityToolStripMenuItem.Text = "Security";
//
// md5launcherToolStripMenuItem
@ -635,7 +641,7 @@ partial class ClientinfoEditor
this.idToolStripMenuItem,
this.tripcodeToolStripMenuItem});
this.playerToolStripMenuItem.Name = "playerToolStripMenuItem";
this.playerToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.playerToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.playerToolStripMenuItem.Text = "Player";
//
// customizationToolStripMenuItem
@ -1048,7 +1054,7 @@ partial class ClientinfoEditor
this.donothingToolStripMenuItem,
this.disabledToolStripMenuItem});
this.debuggingToolStripMenuItem.Name = "debuggingToolStripMenuItem";
this.debuggingToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.debuggingToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.debuggingToolStripMenuItem.Text = "Debugging/Misc";
//
// donothingToolStripMenuItem
@ -1068,14 +1074,14 @@ partial class ClientinfoEditor
// argsToolStripMenuItem
//
this.argsToolStripMenuItem.Name = "argsToolStripMenuItem";
this.argsToolStripMenuItem.Size = new System.Drawing.Size(163, 22);
this.argsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.argsToolStripMenuItem.Text = "%args%";
this.argsToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// documentationToolStripMenuItem1
//
this.documentationToolStripMenuItem1.Name = "documentationToolStripMenuItem1";
this.documentationToolStripMenuItem1.Size = new System.Drawing.Size(157, 22);
this.documentationToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
this.documentationToolStripMenuItem1.Text = "Documentation";
this.documentationToolStripMenuItem1.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click);
//
@ -1232,6 +1238,27 @@ partial class ClientinfoEditor
this.label3.TabIndex = 37;
this.label3.Text = "EXE Name:";
//
// signScriptManuallyModernClientsToolStripMenuItem
//
this.signScriptManuallyModernClientsToolStripMenuItem.Name = "signScriptManuallyModernClientsToolStripMenuItem";
this.signScriptManuallyModernClientsToolStripMenuItem.Size = new System.Drawing.Size(294, 22);
this.signScriptManuallyModernClientsToolStripMenuItem.Text = "Sign Script Manually (For Modern Clients)";
this.signScriptManuallyModernClientsToolStripMenuItem.Click += new System.EventHandler(this.signScriptManuallyModernClientsToolStripMenuItem_click);
//
// signgeneratedjoinscriptToolStripMenuItem
//
this.signgeneratedjoinscriptToolStripMenuItem.Name = "signgeneratedjoinscriptToolStripMenuItem";
this.signgeneratedjoinscriptToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.signgeneratedjoinscriptToolStripMenuItem.Text = "%signgeneratedjoinscript%";
this.signgeneratedjoinscriptToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// usenewsignformatToolStripMenuItem
//
this.usenewsignformatToolStripMenuItem.Name = "usenewsignformatToolStripMenuItem";
this.usenewsignformatToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
this.usenewsignformatToolStripMenuItem.Text = "%usenewsignformat%";
this.usenewsignformatToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// ClientinfoEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -1398,4 +1425,7 @@ partial class ClientinfoEditor
private System.Windows.Forms.CheckBox checkBox8;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ToolStripMenuItem signScriptManuallyModernClientsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem signgeneratedjoinscriptToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem usenewsignformatToolStripMenuItem;
}

View File

@ -463,6 +463,32 @@ public partial class ClientinfoEditor : Form
MessageBox.Show("This client info file is not saved in your client's directory. Please save it in your client's directory before using.", "Novetus Client SDK - Error when adding Validate tags.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void signScriptManuallyModernClientsToolStripMenuItem_click(object sender, EventArgs e)
{
using (var ofd = new OpenFileDialog())
{
ofd.Filter = "Lua Script (*.lua)|*.lua";
ofd.FilterIndex = 1;
ofd.Title = "Load Lua Script";
if (ofd.ShowDialog() == DialogResult.OK)
{
bool newFormat = false;
DialogResult res = MessageBox.Show("Would you like to use the newer client signing format featured in newer clients (2014+)?", "Novetus Client SDK - Use New Format?", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (res == DialogResult.Yes)
{
newFormat = true;
}
ScriptFuncs.Generator.SignGeneratedScript(ofd.FileName, newFormat);
MessageBox.Show("Script signed!", "Novetus Client SDK - Script Signed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
#endregion
#region Functions

View File

@ -300,6 +300,7 @@ All credit for the LUA code used with "non-modern" clients goes to Scripter John
All credit for the LUA code used for character customization goes to RBXBanLand.
Parts of the codebase use bits and pieces of code from Stack Overflow, MSDN Forums, the Novetus GitHub Pull Requests and Codeproject.
The original concept for the Diogenes editor was suggested by Carrot. The concept code was then modified to be smaller, more efficient, and more customizable.
The script signing and key generation code was created by Carrot, but was slimmed down to work properly in Novetus and modified to be more efficient.
ObjToRBXMesh was made by coke. Modified to support 1.00 and 1.01. (https://github.com/Novetus/ObjToRBXMesh)
Roblox Legacy Place Converter was made by BakonBot. (https://github.com/BakonBot/legacy-place-converter)
ROBLOX Script Generator was made by S. Costeira.

View File

@ -1,18 +1,38 @@
1.3 v?.2022.1
Changes from v12.2021.2:
New Features:
Changes from 1.3 v2.2022.1:
Enhancements:
- Added the ability to sign scripts.
- There are 2 ways to sign scripts, use the new ClientScript variables for generated join scripts, or use the File -> Sign Script Manually (For Modern Clients) option.
- New ClientScript variables:
- %signgeneratedjoinscript% - Signs the generated join script if "Generate scripts and fix map loading for 2007/2012+" is enabled.
- %usenewsignformat% - for %signgeneratedjoinscript%, uses the new client signature format found on newer clients.
----------------------------------------------------------------------------
1.3 v2.2022.1
Changes from v12.2021.2:
Enhancements:
- All places will now use the Novetus asset redirect.
- All assets are now fixed on places.
- Note that some places may crash Novetus. Let Bitl know on the Discord server or the Forums if such crashes occur.
- The Asset Fixer in the asset SDK now properly shows an error when an invalid file (i.e, a modern Roblox place file) is loaded.
Added items:
Hats:
- Snowman Teapot
- 2012 Roblox Visor
- 2012 Roblox Visor (Original)
Fixes:
- Fixed characters not loading up in medium to large size maps in 2011E and 2011M.
- Fixed the Wintertime R&R&R Hoodie being the TBC hoodie.
- Remade the Blue Flame Jacket's texture from scratch as the original was broken.
Misc:
- Removed epicgamers.xyz from the Content Providers as it is no longer functional.
- Rise of the Killbots: Reverted Killbot behaviors to how they were in 1.3 v11.2021.1.
- Added a background image behind the character shown in the color select screen in the Stylish style.
- The background image is replaceable by changing the image in bin/data to something else.
----------------------------------------------------------------------------
1.3 v12.2021.2
Changes from v12.2021.1:

View File

@ -26,6 +26,8 @@ General:
%validatedfiles% - Returns the total number of files that have been validated.
%validatedextrafiles% - Returns the total number of files that have been validated with <validate>.
%newgui% - Returns if the 2011L interface is enabled on 2011M clients. Can be used as a toggle switch for other client-side CoreScript features.
%signgeneratedjoinscript% - Signs the generated join script if "Generate scripts and fix map loading for 2007/2012+" is enabled.
%usenewsignformat% - for %signgeneratedjoinscript%, uses the new client signature format found on newer clients.
Server:
%limit% - Max Player limit.

View File

@ -7,11 +7,11 @@
<URL>http://novetus.mygamesonline.org/asset?id=</URL>
<Icon>robloxnovetus.png</Icon>
</Provider>
<Provider>
<!--Provider>
<Name>Roblox (Novetus+ Redirect)</Name>
<URL>http://epicgamers.xyz/asset/?id=</URL>
<Icon>robloxnplus.png</Icon>
</Provider>
</Provider-->
<Provider>
<Name>Roblox (Asset Delivery, Incompatible w/ older clients)</Name>
<URL>https://assetdelivery.roblox.com/v1/asset/?id=</URL>

View File

@ -171,7 +171,7 @@ Not a metaverse!
[stylish]We both know that there are a thousand ways I could destroy you right now.|And 941 of them hurt.
IT WAS 99 CENTS!
PRETTY PRETTY NINE!|DEATH GRIPS IS ONLINE!
I AM GONNA TAKE YOUR COAT|SAY THANKS
I AM GONNA TAKE YOUR COAT.|SAY THANKS.
[normal]Wear your heart on your sleeve!|It's the only way to live! Everything will fall into place, you'll see!
[stylish]Wear your heart on your sleeve! It's the only way to live!|Everything will fall into place, you'll see!
[normal]If the entire world is getting banned by admins...|I'm taking a physgun with me.
@ -190,4 +190,18 @@ gib t1x pl0x
[stylish]Friendly reminder: Rocket jumping is physically impossible.
I play Novetus more than Roblox|Minecraft too!
Lego/brick game, not block game!
Why do we all have to wear these ridiculous ties?|From Half-Life
Why do we all have to wear these ridiculous ties?|From Half-Life
It just ain't right!
HOW VERY DARE YOU|BEHAVE YOURSPELF!
Trying to feel alive.
Portable!
[normal]Gordon doesn't need to hear all this.|He's a highly trained professional. From Half-Life
[stylish]Gordon doesn't need to hear all this, he's a highly trained professional.|From Half-Life
No NFTs!
Látom.
[normal]print(error())|The biggest mystery in Lua programming.
[stylish]print(error()) The biggest mystery in Lua programming.
[normal]Tell me how it felt when you walked on water.|Did you get your wish?
[stylish]Tell me how it felt when you walked on water. Did you get your wish?
[normal]GET TO THE SHIPS! IT'S OUR ONLY CHANCE!|From the 1986 Transformers movie.
Standing here, I realize...