diff --git a/changelog.txt b/changelog.txt
index 9f1184e..70678e9 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,4 +1,12 @@
1.3 Snapshot v22.8288.28158.1
+Notes:
+- The Novetus/Roblox soundtrack has been removed to respect the rights of copyright holders.
+
+Enhancements:
+- Re-added and updated 2009L!
+ - Thanks to MenderMan and Coke/Natalie for fixes!
+----------------------------------------------------------------------------
+1.3 Snapshot v22.8288.28158.1
Enhancements:
- Reverted the safechat.xml in all clients to the original version distributed in each client for accuracy reasons.
- Fixed an exploit where players were able to inject places into online games.
diff --git a/scripts/batch/clean_junk.bat b/scripts/batch/clean_junk.bat
index 543e690..d67db09 100644
--- a/scripts/batch/clean_junk.bat
+++ b/scripts/batch/clean_junk.bat
@@ -65,6 +65,12 @@ del /s /q Novetus\clients\2009E-HD\opengl32.dll
del /s /q Novetus\clients\2009E-HD\DefaultPreset.ini
del /s /q Novetus\clients\2009E-HD\content\temp.rbxl
+del /s /q Novetus\clients\2009L\ReShade.ini
+del /s /q Novetus\clients\2009L\OPENGL32.log
+del /s /q Novetus\clients\2009L\opengl32.dll
+del /s /q Novetus\clients\2009L\DefaultPreset.ini
+del /s /q Novetus\clients\2009L\content\temp.rbxl
+
del /s /q Novetus\clients\2010L\ReShade.ini
del /s /q Novetus\clients\2010L\OPENGL32.log
del /s /q Novetus\clients\2010L\opengl32.dll
diff --git a/scripts/batch/github_sync.bat b/scripts/batch/github_sync.bat
index 9e89bbc..99986a9 100644
--- a/scripts/batch/github_sync.bat
+++ b/scripts/batch/github_sync.bat
@@ -14,6 +14,7 @@ if not exist "%gamescriptdir%/2007M-Shaders" mkdir "%gamescriptdir%/2007M-Shader
if not exist "%gamescriptdir%/2008M" mkdir "%gamescriptdir%/2008M"
if not exist "%gamescriptdir%/2009E" mkdir "%gamescriptdir%/2009E"
if not exist "%gamescriptdir%/2009E-HD" mkdir "%gamescriptdir%/2009E-HD"
+if not exist "%gamescriptdir%/2009L" mkdir "%gamescriptdir%/2009L"
if not exist "%gamescriptdir%/2010L" mkdir "%gamescriptdir%/2010L"
if not exist "%gamescriptdir%/2011E" mkdir "%gamescriptdir%/2011E"
if not exist "%gamescriptdir%/2011M" mkdir "%gamescriptdir%/2011M"
@@ -29,6 +30,7 @@ XCOPY "%cd%\Novetus\clients\2007M-Shaders\content\scripts\CSMPFunctions.lua" "%g
XCOPY "%cd%\Novetus\clients\2008M\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2008M" /y
XCOPY "%cd%\Novetus\clients\2009E\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2009E" /y
XCOPY "%cd%\Novetus\clients\2009E-HD\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2009E-HD" /y
+XCOPY "%cd%\Novetus\clients\2009L\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2009L" /y
XCOPY "%cd%\Novetus\clients\2010L\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2010L" /y
XCOPY "%cd%\Novetus\clients\2011E\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2011E" /y
XCOPY "%cd%\Novetus\clients\2011M\content\scripts\CSMPFunctions.lua" "%gamescriptdir%/2011M" /y
@@ -65,6 +67,7 @@ XCOPY "%cd%\Novetus\clients\2007M-Shaders\content\fonts\libraries.rbxm" "%gamesc
XCOPY "%cd%\Novetus\clients\2008M\content\fonts\libraries.rbxm" "%gamescriptdir%/2008M" /y
XCOPY "%cd%\Novetus\clients\2009E\content\fonts\libraries.rbxm" "%gamescriptdir%/2009E" /y
XCOPY "%cd%\Novetus\clients\2009E-HD\content\fonts\libraries.rbxm" "%gamescriptdir%/2009E-HD" /y
+XCOPY "%cd%\Novetus\clients\2009L\content\fonts\libraries.rbxm" "%gamescriptdir%/2009L" /y
XCOPY "%cd%\Novetus\clients\2010L\content\fonts\libraries.rbxm" "%gamescriptdir%/2010L" /y
XCOPY "%cd%\Novetus\clients\2011E\content\fonts\libraries.rbxm" "%gamescriptdir%/2011E" /y
XCOPY "%cd%\Novetus\clients\2011M\content\fonts\libraries.rbxm" "%gamescriptdir%/2011M" /y
@@ -79,6 +82,7 @@ del /s /q "%tempdir%\GlobalSettings2_2007E.xml"
del /s /q "%tempdir%\GlobalSettings2_2007E-Shaders.xml"
del /s /q "%tempdir%\GlobalSettings_4_2009E.xml"
del /s /q "%tempdir%\GlobalSettings_4_2009E-HD.xml"
+del /s /q "%tempdir%\GlobalSettings_4_2009L.xml"
del /s /q "%tempdir%\GlobalSettings_4_2010L.xml"
del /s /q "%tempdir%\GlobalSettings_4_2011E.xml"
del /s /q "%tempdir%\GlobalSettings_4_2011M.xml"
@@ -93,6 +97,7 @@ XCOPY "%tempdir%\GlobalSettings2_2007E_default.xml" "%gamescriptdir%/2007E" /y
XCOPY "%tempdir%\GlobalSettings2_2007E-Shaders_default.xml" "%gamescriptdir%/2007E-Shaders" /y
XCOPY "%tempdir%\GlobalSettings_4_2009E_default.xml" "%gamescriptdir%/2009E" /y
XCOPY "%tempdir%\GlobalSettings_4_2009E-HD_default.xml" "%gamescriptdir%/2009E-HD" /y
+XCOPY "%tempdir%\GlobalSettings_4_2009L_default.xml" "%gamescriptdir%/2009L" /y
XCOPY "%tempdir%\GlobalSettings_4_2010L_default.xml" "%gamescriptdir%/2010L" /y
XCOPY "%tempdir%\GlobalSettings_4_2011E_default.xml" "%gamescriptdir%/2011E" /y
XCOPY "%tempdir%\GlobalSettings_4_2011M_default.xml" "%gamescriptdir%/2011M" /y
diff --git a/scripts/batch/liteexclude.txt b/scripts/batch/liteexclude.txt
index 6469415..febd2b6 100644
--- a/scripts/batch/liteexclude.txt
+++ b/scripts/batch/liteexclude.txt
@@ -9,5 +9,4 @@ Roblox_Legacy_Place_Converter.exe
ClientScriptTester
NetFx20SP2_x64.exe
NetFx20SP2_x86.exe
-models
-soundtrack
\ No newline at end of file
+models
\ No newline at end of file
diff --git a/scripts/game/2009L/CSMPFunctions.lua b/scripts/game/2009L/CSMPFunctions.lua
new file mode 100644
index 0000000..2de2145
--- /dev/null
+++ b/scripts/game/2009L/CSMPFunctions.lua
@@ -0,0 +1,801 @@
+showServerNotifications = true
+pcall(function() game:GetService("ScriptContext").ScriptsDisabled = false end)
+
+--function made by rbxbanland
+function newWaitForChild(newParent,name)
+ local returnable = nil
+ if newParent:FindFirstChild(name) then
+ returnable = newParent:FindFirstChild(name)
+ else
+ repeat wait() returnable = newParent:FindFirstChild(name) until returnable ~= nil
+ end
+ return returnable
+end
+
+function KickPlayer(Player,reason)
+ pcall(function() _G.CSScript_OnPrePlayerKicked(Player,reason) end)
+
+ if (game.Lighting:FindFirstChild("SkipSecurity") ~= nil) then
+ do return end
+ end
+
+ Server = game:GetService("NetworkServer")
+
+ if (Player ~= nil) then
+ pcall(function() _G.CSScript_OnPlayerKicked(Player,reason) end)
+
+ for _,Child in pairs(Server:children()) do
+ name = "ServerReplicator|"..Player.Name.."|"..Player.userId.."|"..Player.AnonymousIdentifier.Value
+ if (Server:findFirstChild(name) ~= nil and Child.Name == name) then
+ --2010L crashes if we don't do this.
+ wait(0.3)
+ Child:CloseConnection()
+ print("Player '" .. Player.Name .. "' Kicked. Reason: "..reason)
+ end
+ end
+ end
+end
+
+function newWaitForChildSecurity(newParent,name)
+ local returnable = nil
+ local loadAttempts = 0
+ local maxAttempts = 5
+ while loadAttempts < maxAttempts do
+ if newParent:FindFirstChild(name) then
+ returnable = newParent:FindFirstChild(name)
+ break
+ end
+ -- this should fix a rare issue where 2010L kicks players after rejoining.
+ wait(0.5)
+ loadAttempts = loadAttempts + 1
+ print("Player '" .. newParent.Name .. "' trying to connect. Number of attempts: "..loadAttempts)
+ end
+
+ if (loadAttempts == maxAttempts) then
+ KickPlayer(newParent, "Modified Client")
+ end
+
+ return returnable
+end
+
+function LoadCharacterNew(playerApp,newChar)
+ if (game.Lighting:findFirstChild("DisableCustomization") ~= nil) then
+ do return end
+ end
+
+ PlayerService = game:GetService("Players")
+ Player = PlayerService:GetPlayerFromCharacter(newChar)
+
+ local function kick()
+ KickPlayer(Player, "Modified Client")
+ end
+
+ if (playerApp == nil) then
+ kick()
+ end
+
+ if (not Player:FindFirstChild("Appearance")) then
+ kick()
+ end
+
+ if ((playerApp:GetChildren() == 0) or (playerApp:GetChildren() == nil)) then
+ kick()
+ end
+
+ local path = "rbxasset://../../../shareddata/charcustom/"
+
+ local charparts = {[1] = newWaitForChild(newChar,"Head"),[2] = newWaitForChild(newChar,"Torso"),[3] = newWaitForChild(newChar,"Left Arm"),[4] = newWaitForChild(newChar,"Right Arm"),[5] = newWaitForChild(newChar,"Left Leg"),[6] = newWaitForChild(newChar,"Right Leg")}
+ for _,newVal in pairs(playerApp:GetChildren()) do
+ local customtype = newVal.CustomizationType.Value
+ if (customtype == 1) then
+ pcall(function()
+ charparts[newVal.ColorIndex.Value].BrickColor = newVal.Value
+ end)
+ elseif (customtype == 2) then
+ pcall(function()
+ local newHat = game.Workspace:InsertContent(path.."hats/"..newVal.Value)
+ if newHat[1] then
+ if newHat[1].className == "Hat" then
+ newHat[1].Parent = newChar
+ else
+ newHat[1]:remove()
+ end
+ end
+ end)
+ elseif (customtype == 3) then
+ pcall(function()
+ local newTShirt = "";
+ if (string.match(newVal.Value, "http") == "http") then
+ if (pcall(function()
+ newTShirt = game.Workspace:InsertContent(newVal.Value)
+ if newTShirt[1] then
+ if newTShirt[1].className == "ShirtGraphic" then
+ newTShirt[1].Parent = newChar
+ local oldTexture = newTShirt[1].Graphic;
+ OldURL,OldID = oldTexture:match("(.+)=(.+)")
+ NewURL,NewID = newVal.Value:match("(.+)=(.+)")
+ newTShirt[1].Graphic = NewURL .. '=' .. OldID
+ else
+ newTShirt[1]:remove()
+ end
+ end
+ end)) then
+ --nothing
+ print("success");
+ else
+ print("fail");
+ newTShirt = Instance.new("ShirtGraphic")
+ newTShirt.Graphic = newVal.Value
+ newTShirt.Parent = newChar
+ end
+ else
+ newTShirt = game.Workspace:InsertContent(path.."tshirts/"..newVal.Value)
+ if newTShirt[1] then
+ if newTShirt[1].className == "ShirtGraphic" then
+ newTShirt[1].Parent = newChar
+ else
+ newTShirt[1]:remove()
+ end
+ end
+ end
+ end)
+ elseif (customtype == 4) then
+ pcall(function()
+ local newShirt = "";
+ if (string.match(newVal.Value, "http") == "http") then
+ if (pcall(function()
+ newShirt = game.Workspace:InsertContent(newVal.Value)
+ if newShirt[1] then
+ if newShirt[1].className == "Shirt" then
+ newShirt[1].Parent = newChar
+ local oldTexture = newShirt[1].ShirtTemplate;
+ OldURL,OldID = oldTexture:match("(.+)=(.+)")
+ NewURL,NewID = newVal.Value:match("(.+)=(.+)")
+ newShirt[1].ShirtTemplate = NewURL .. '=' .. OldID
+ else
+ newShirt[1]:remove()
+ end
+ end
+ end)) then
+ --nothing
+ print("success");
+ else
+ print("fail");
+ newShirt = Instance.new("Shirt")
+ newShirt.ShirtTemplate = newVal.Value
+ newShirt.Parent = newChar
+ end
+ else
+ newShirt = game.Workspace:InsertContent(path.."shirts/"..newVal.Value)
+ if newShirt[1] then
+ if newShirt[1].className == "Shirt" then
+ newShirt[1].Parent = newChar
+ else
+ newShirt[1]:remove()
+ end
+ end
+ end
+ end)
+ elseif (customtype == 5) then
+ pcall(function()
+ local newPants = "";
+ if (string.match(newVal.Value, "http") == "http") then
+ if (pcall(function()
+ newPants = game.Workspace:InsertContent(newVal.Value)
+ if newPants[1] then
+ if newPants[1].className == "Pants" then
+ newPants[1].Parent = newChar
+ local oldTexture = newPants[1].PantsTemplate;
+ OldURL,OldID = oldTexture:match("(.+)=(.+)")
+ NewURL,NewID = newVal.Value:match("(.+)=(.+)")
+ newPants[1].PantsTemplate = NewURL .. '=' .. OldID
+ else
+ newPants[1]:remove()
+ end
+ end
+ end)) then
+ --nothing
+ print("success");
+ else
+ print("fail");
+ newPants = Instance.new("Pants")
+ newPants.PantsTemplate = newVal.Value
+ newPants.Parent = newChar
+ end
+ else
+ newPants = game.Workspace:InsertContent(path.."pants/"..newVal.Value)
+ if newPants[1] then
+ if newPants[1].className == "Pants" then
+ newPants[1].Parent = newChar
+ else
+ newPants[1]:remove()
+ end
+ end
+ end
+ end)
+ elseif (customtype == 6) then
+ pcall(function()
+ local newFace = "";
+ if (string.match(newVal.Value, "http") == "http") then
+ if (pcall(function()
+ newFace = game.Workspace:InsertContent(newVal.Value)
+ if newFace[1] then
+ if newFace[1].className == "Decal" then
+ newWaitForChild(charparts[1],"face"):remove()
+ newFace[1].Parent = charparts[1]
+ newFace[1].Face = "Front"
+ local oldTexture = newFace[1].Texture;
+ OldURL,OldID = oldTexture:match("(.+)=(.+)")
+ NewURL,NewID = newVal.Value:match("(.+)=(.+)")
+ newFace[1].Texture = NewURL .. '=' .. OldID
+ else
+ newFace[1]:remove()
+ end
+ end
+ end)) then
+ --nothing
+ print("success");
+ else
+ print("fail");
+ newWaitForChild(charparts[1],"face"):remove()
+ newFace = Instance.new("Decal")
+ newFace.Texture = newVal.Value
+ newFace.Face = "Front"
+ newFace.Parent = charparts[1]
+ end
+ else
+ newFace = game.Workspace:InsertContent(path.."faces/"..newVal.Value)
+ if newFace[1] then
+ if newFace[1].className == "Decal" then
+ newWaitForChild(charparts[1],"face"):remove()
+ newFace[1].Parent = charparts[1]
+ newFace[1].Face = "Front"
+ else
+ newFace[1]:remove()
+ end
+ end
+ end
+ end)
+ elseif (customtype == 7) then
+ pcall(function()
+ local newPart = game.Workspace:InsertContent(path.."heads/"..newVal.Value)
+ if newPart[1] then
+ if newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
+ newWaitForChild(charparts[1],"Mesh"):remove()
+ newPart[1].Parent = charparts[1]
+ else
+ newPart[1]:remove()
+ end
+ end
+ end)
+ elseif (customtype == 8) then
+ pcall(function()
+ local newHat = game.Workspace:InsertContent(path.."hats/"..newVal.Value)
+ if newHat[1] then
+ if newHat[1].className == "Hat" then
+ newHat[1].Parent = newChar
+ else
+ newHat[1]:remove()
+ end
+ end
+ end)
+
+ pcall(function()
+ local newItem = game.Workspace:InsertContent(path.."custom/"..newVal.Value)
+ if newItem[1] then
+ if newItem[1].className == "Decal" then
+ newWaitForChild(charparts[1],"face"):remove()
+ newItem[1].Parent = charparts[1]
+ newItem[1].Face = "Front"
+ elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
+ newWaitForChild(charparts[1],"Mesh"):remove()
+ newItem[1].Parent = charparts[1]
+ else
+ newItem[1].Parent = newChar
+ end
+ end
+ end)
+ end
+ end
+
+ pcall(function() _G.CSScript_OnLoadCharacter(Player, playerApp) end)
+end
+
+function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
+ local newCharApp = Instance.new("IntValue",Player)
+ newCharApp.Name = "Appearance"
+ --BODY COLORS
+ for i=1,6,1 do
+ local BodyColor = Instance.new("BrickColorValue",newCharApp)
+ if (i == 1) then
+ if (HeadColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(HeadColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Head Color"
+ elseif (i == 2) then
+ if (TorsoColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(TorsoColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Torso Color"
+ elseif (i == 3) then
+ if (LeftArmColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(LeftArmColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Left Arm Color"
+ elseif (i == 4) then
+ if (RightArmColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(RightArmColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Right Arm Color"
+ elseif (i == 5) then
+ if (LeftLegColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(LeftLegColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Left Leg Color"
+ elseif (i == 6) then
+ if (RightLegColorID ~= nil) then
+ BodyColor.Value = BrickColor.new(RightLegColorID)
+ else
+ BodyColor.Value = BrickColor.new(1)
+ end
+ BodyColor.Name = "Right Leg Color"
+ end
+ local indexValue = Instance.new("NumberValue")
+ indexValue.Name = "ColorIndex"
+ indexValue.Parent = BodyColor
+ indexValue.Value = i
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = BodyColor
+ typeValue.Value = 1
+ end
+ --HATS
+ for i=1,3,1 do
+ local newHat = Instance.new("StringValue",newCharApp)
+ if (i == 1) then
+ if (Hat1ID ~= nil) then
+ newHat.Value = Hat1ID
+ newHat.Name = "Hat 1 - "..Hat1ID
+ else
+ newHat.Value = "NoHat.rbxm"
+ newHat.Name = "Hat 1 - NoHat.rbxm"
+ end
+ elseif (i == 2) then
+ if (Hat2ID ~= nil) then
+ newHat.Value = Hat2ID
+ newHat.Name = "Hat 2 - "..Hat2ID
+ else
+ newHat.Value = "NoHat.rbxm"
+ newHat.Name = "Hat 2 - NoHat.rbxm"
+ end
+ elseif (i == 3) then
+ if (Hat3ID ~= nil) then
+ newHat.Value = Hat3ID
+ newHat.Name = "Hat 3 - "..Hat3ID
+ else
+ newHat.Value = "NoHat.rbxm"
+ newHat.Name = "Hat 3 - NoHat.rbxm"
+ end
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newHat
+ typeValue.Value = 2
+ end
+ --T-SHIRT
+ local newTShirt = Instance.new("StringValue",newCharApp)
+ if (TShirtID ~= nil) then
+ newTShirt.Value = TShirtID
+ newTShirt.Name = "T-Shirt - "..TShirtID
+ else
+ newTShirt.Value = "NoTShirt.rbxm"
+ newTShirt.Name = "T-Shirt - NoTShirt.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newTShirt
+ typeValue.Value = 3
+ --SHIRT
+ local newShirt = Instance.new("StringValue",newCharApp)
+ if (ShirtID ~= nil) then
+ newShirt.Value = ShirtID
+ newShirt.Name = "Shirt - "..ShirtID
+ else
+ newShirt.Value = "NoShirt.rbxm"
+ newShirt.Name = "Shirt - NoShirt.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newShirt
+ typeValue.Value = 4
+ --PANTS
+ local newPants = Instance.new("StringValue",newCharApp)
+ if (PantsID ~= nil) then
+ newPants.Value = PantsID
+ newPants.Name = "Pants - "..PantsID
+ else
+ newPants.Value = "NoPants.rbxm"
+ newPants.Name = "Pants - NoPants.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newPants
+ typeValue.Value = 5
+ --FACE
+ local newFace = Instance.new("StringValue",newCharApp)
+ if (FaceID ~= nil) then
+ newFace.Value = FaceID
+ newFace.Name = "Face - "..FaceID
+ else
+ newFace.Value = "DefaultFace.rbxm"
+ newFace.Name = "Face - DefaultFace.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newFace
+ typeValue.Value = 6
+ --HEADS
+ local newHead = Instance.new("StringValue",newCharApp)
+ if (HeadID ~= nil) then
+ newHead.Value = HeadID
+ newHead.Name = "Head - "..HeadID
+ else
+ newHead.Value = "DefaultHead.rbxm"
+ newHead.Name = "Head - DefaultHead.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newHead
+ typeValue.Value = 7
+ --EXTRA
+ local newItem = Instance.new("StringValue",newCharApp)
+ if (ItemID ~= nil) then
+ newItem.Value = ItemID
+ newItem.Name = "Extra - "..ItemID
+ else
+ newItem.Value = "NoExtra.rbxm"
+ newItem.Name = "Extra - NoExtra.rbxm"
+ end
+ local typeValue = Instance.new("NumberValue")
+ typeValue.Name = "CustomizationType"
+ typeValue.Parent = newItem
+ typeValue.Value = 8
+end
+
+function LoadSecurity(playerApp,Player,ServerSecurityLocation)
+ local function kick()
+ KickPlayer(Player, "Modified Client")
+ end
+
+ if (playerApp == nil) then
+ kick()
+ end
+
+ if (not Player:FindFirstChild("Security")) then
+ kick()
+ end
+
+ if (not playerApp:FindFirstChild("ClientEXEMD5") or not playerApp:FindFirstChild("LauncherMD5") or not playerApp:FindFirstChild("ClientScriptMD5")) then
+ kick()
+ end
+
+ for _,newVal in pairs(playerApp:GetChildren()) do
+ if (newVal.Name == "ClientEXEMD5") then
+ if (newVal.Value ~= ServerSecurityLocation.Security.ClientEXEMD5.Value or newVal.Value == "") then
+ kick()
+ break
+ end
+ end
+
+ if (newVal.Name == "LauncherMD5") then
+ if (newVal.Value ~= ServerSecurityLocation.Security.LauncherMD5.Value or newVal.Value == "") then
+ kick()
+ break
+ end
+ end
+
+ if (newVal.Name == "ClientScriptMD5") then
+ if (newVal.Value ~= ServerSecurityLocation.Security.ClientScriptMD5.Value or newVal.Value == "") then
+ kick()
+ break
+ end
+ end
+ end
+end
+
+function InitalizeSecurityValues(Location,ClientEXEMD5,LauncherMD5,ClientScriptMD5)
+ Location = Instance.new("IntValue", Location)
+ Location.Name = "Security"
+
+ local clientValue = Instance.new("StringValue", Location)
+ clientValue.Value = ClientEXEMD5 or ""
+ clientValue.Name = "ClientEXEMD5"
+
+ local launcherValue = Instance.new("StringValue", Location)
+ launcherValue.Value = LauncherMD5 or ""
+ launcherValue.Name = "LauncherMD5"
+
+ local scriptValue = Instance.new("StringValue", Location)
+ scriptValue.Value = ClientScriptMD5 or ""
+ scriptValue.Name = "ClientScriptMD5"
+end
+
+function InitalizeTripcode(Location,Tripcode)
+ local code = Instance.new("StringValue", Location)
+ code.Value = Tripcode or ""
+ code.Name = "Tripcode"
+end
+
+function LoadTripcode(Player)
+ local function kick()
+ KickPlayer(Player, "Modified Client")
+ end
+
+ if (not Player:FindFirstChild("Tripcode")) then
+ kick()
+ end
+
+ for _,newVal in pairs(Player:GetChildren()) do
+ if (newVal.Name == "Tripcode") then
+ if (newVal.Value == "") then
+ kick()
+ break
+ end
+ end
+ end
+end
+
+rbxversion = version()
+print("ROBLOX Client version '" .. rbxversion .. "' loaded.")
+
+function CSServer(Port,PlayerLimit,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Notifications)
+ pcall(function() dofile("rbxasset://..//..//..//addons//core//AddonLoader.lua") end)
+ pcall(function() _G.CSScript_PreInit("Server", "2009L") end)
+ Server = game:GetService("NetworkServer")
+ RunService = game:GetService("RunService")
+ Server:start(Port, 20)
+ RunService:run()
+ game.Workspace:InsertContent("rbxasset://Fonts//libraries.rbxm")
+ showServerNotifications = Notifications
+ PlayerService = game:GetService("Players")
+ game:GetService("Visit"):SetUploadUrl("")
+ if (showServerNotifications) then
+ PlayerService.MaxPlayers = PlayerLimit + 1
+ --create a fake player to record connections and disconnections
+ notifyPlayer = game:GetService("Players"):CreateLocalPlayer(-1)
+ notifyPlayer.Name = "[SERVER]"
+ else
+ PlayerService.MaxPlayers = PlayerLimit
+ end
+
+ local playerCount = 0
+ PlayerService.PlayerAdded:connect(function(Player)
+ -- create anonymous player identifier. This is so we can track clients without tripcodes
+ playerCount = playerCount + 1
+
+ local code = Instance.new("StringValue", Player)
+ code.Value = playerCount
+ code.Name = "AnonymousIdentifier"
+
+ -- rename all Server replicators in NetworkServer to "ServerReplicator"
+ for _,Child in pairs(Server:children()) do
+ name = "ServerReplicator|"..Player.Name.."|"..Player.userId.."|"..Player.AnonymousIdentifier.Value
+ if (Server:findFirstChild(name) == nil) then
+ if (string.match(Child.Name, "ServerReplicator") == nil) then
+ Child.Name = name
+ end
+ end
+ end
+
+ Player.Chatted:connect(function(msg)
+ print(Player.Name.."; "..msg)
+ end)
+
+ if (PlayerService.NumPlayers > PlayerService.MaxPlayers) then
+ KickPlayer(Player, "Too many players on server.")
+ else
+ print("Player '" .. Player.Name .. "' with ID '" .. Player.userId .. "' added")
+ if (showServerNotifications) then
+ game.Players:Chat("Player '" .. Player.Name .. "' joined")
+ end
+ Player:LoadCharacter()
+ LoadSecurity(newWaitForChildSecurity(Player,"Security"),Player,game.Lighting)
+ newWaitForChildSecurity(Player,"Tripcode")
+ LoadTripcode(Player)
+ pcall(function() print("Player '" .. Player.Name .. "-" .. Player.userId .. "' security check success. Tripcode: '" .. Player.Tripcode.Value .. "'") end)
+ if (Player.Character ~= nil) then
+ LoadCharacterNew(newWaitForChildSecurity(Player,"Appearance"),Player.Character)
+ end
+ end
+
+ pcall(function() _G.CSScript_OnPlayerAdded(Player) end)
+
+ while true do
+ wait(0.001)
+ if (game.Lighting:findFirstChild("DisableRespawns") == nil) then
+ if (Player.Character ~= nil) then
+ if (Player.Character:FindFirstChild("Humanoid") and (Player.Character.Humanoid.Health == 0)) then
+ wait(5)
+ Player:LoadCharacter()
+ LoadCharacterNew(newWaitForChildSecurity(Player,"Appearance"),Player.Character)
+ elseif (Player.Character.Parent == nil) then
+ wait(5)
+ Player:LoadCharacter() -- to make sure nobody is deleted.
+ LoadCharacterNew(newWaitForChildSecurity(Player,"Appearance"),Player.Character)
+ end
+ end
+ end
+ end
+ end)
+ PlayerService.PlayerRemoving:connect(function(Player)
+ print("Player '" .. Player.Name .. "' with ID '" .. Player.userId .. "' leaving")
+ if (showServerNotifications) then
+ game.Players:Chat("Player '" .. Player.Name .. "' left")
+ end
+
+ pcall(function() _G.CSScript_OnPlayerRemoved(Player) end)
+ end)
+ InitalizeSecurityValues(game.Lighting,ClientEXEMD5,LauncherMD5,ClientScriptMD5)
+ Server.IncommingConnection:connect(IncommingConnection)
+ pcall(function() game.Close:connect(function() Server:Stop() end) end)
+ pcall(function() _G.CSScript_PostInit() end)
+ coroutine.resume(coroutine.create(function()
+ while true do
+ wait(0.1)
+ pcall(function() _G.CSScript_Update() end)
+ end
+ end))
+end
+
+function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,Ticket)
+ pcall(function() game:SetPlaceID(-1, false) end)
+ pcall(function() game:GetService("Players"):SetChatStyle(Enum.ChatStyle.ClassicAndBubble) end)
+
+ pcall(function()
+ game:GetService("GuiService").Changed:connect(function()
+ pcall(function() game:GetService("GuiService").ShowLegacyPlayerList=true end)
+ pcall(function() game.CoreGui.RobloxGui.PlayerListScript:Remove() end)
+ pcall(function() game.CoreGui.RobloxGui.PlayerListTopRightFrame:Remove() end)
+ pcall(function() game.CoreGui.RobloxGui.BigPlayerListWindowImposter:Remove() end)
+ pcall(function() game.CoreGui.RobloxGui.BigPlayerlist:Remove() end)
+ end)
+ end)
+
+ local suc, err = pcall(function()
+ client = game:GetService("NetworkClient")
+ player = game:GetService("Players"):CreateLocalPlayer(UserID)
+ player:SetSuperSafeChat(false)
+ pcall(function() player:SetUnder13(false) end)
+ pcall(function() player:SetMembershipType(Enum.MembershipType.BuildersClub) end)
+ pcall(function() player:SetAccountAge(365) end)
+ player.CharacterAppearance=0
+ pcall(function() player.Name=PlayerName or "" end)
+ game:GetService("Visit"):SetUploadUrl("")
+ InitalizeClientAppearance(player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
+ InitalizeSecurityValues(player,ClientEXEMD5,LauncherMD5,ClientScriptMD5)
+ InitalizeTripcode(player,Tripcode)
+ end)
+
+ local function dieerror(errmsg)
+ game:SetMessage(errmsg)
+ wait(math.huge)
+ end
+
+ if not suc then
+ dieerror(err)
+ end
+
+ local function disconnect(peer,lostconnection)
+ game:SetMessage("You have lost connection to the game")
+ end
+
+ local function connected(url, replicator)
+ replicator.Disconnection:connect(disconnect)
+ local marker = nil
+ local suc, err = pcall(function()
+ game:SetMessageBrickCount()
+ marker = replicator:SendMarker()
+ end)
+ if not suc then
+ dieerror(err)
+ end
+ marker.Received:connect(function()
+ local suc, err = pcall(function()
+ game:ClearMessage()
+ end)
+ if not suc then
+ dieerror(err)
+ end
+ end)
+ end
+
+ local function rejected()
+ dieerror("Failed to connect to the Game. (Connection rejected)")
+ end
+
+ local function failed(peer, errcode, why)
+ dieerror("Failed to connect to the Game. (ID="..errcode..")")
+ end
+
+ local suc, err = pcall(function()
+ game:SetMessage("Connecting to server...")
+ client.ConnectionAccepted:connect(connected)
+ client.ConnectionRejected:connect(rejected)
+ client.ConnectionFailed:connect(failed)
+ client:Connect(ServerIP,ServerPort, 0, 20)
+ end)
+
+ if not suc then
+ local x = Instance.new("Message")
+ x.Text = err
+ x.Parent = workspace
+ wait(math.huge)
+ end
+end
+
+function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID)
+ pcall(function() dofile("rbxasset://..//..//..//addons//core//AddonLoader.lua") end)
+ pcall(function() _G.CSScript_PreInit("Solo", "2009L") end)
+ game:GetService("RunService"):Run()
+ local plr = game.Players:CreateLocalPlayer(UserID)
+ plr.Name = PlayerName
+ plr:LoadCharacter()
+ plr.CharacterAppearance=0
+ InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
+ wait(0.5)
+ LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character,false)
+ game.Workspace:InsertContent("rbxasset://Fonts//libraries.rbxm")
+ newWaitForChild(game.StarterGui, "Health")
+ game.StarterGui.Health:clone().Parent = plr.PlayerGui
+ game:GetService("Visit"):SetUploadUrl("")
+ pcall(function() _G.CSScript_PostInit() end)
+ coroutine.resume(coroutine.create(function()
+ while true do
+ wait(0.1)
+ pcall(function() _G.CSScript_Update() end)
+ end
+ end))
+ while true do
+ wait(0.001)
+ if (game.Lighting:findFirstChild("DisableRespawns") == nil) then
+ if (plr.Character ~= nil) then
+ if (plr.Character:findFirstChild("Humanoid") and (plr.Character.Humanoid.Health == 0)) then
+ wait(5)
+ plr:LoadCharacter()
+ LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character)
+ elseif (plr.Character.Parent == nil) then
+ wait(5)
+ plr:LoadCharacter() -- to make sure nobody is deleted.
+ LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character)
+ end
+ end
+ end
+ end
+end
+
+function CSStudio()
+ pcall(function() dofile("rbxasset://..//..//..//addons//core//AddonLoader.lua") end)
+ pcall(function() _G.CSScript_PreInit("Studio", "2009L") end)
+ pcall(function() _G.CSScript_PostInit() end)
+ coroutine.resume(coroutine.create(function()
+ while true do
+ wait(0.1)
+ pcall(function() _G.CSScript_Update() end)
+ end
+ end))
+end
+
+_G.CSServer=CSServer
+_G.CSConnect=CSConnect
+_G.CSSolo=CSSolo
+_G.CSStudio=CSStudio
\ No newline at end of file
diff --git a/scripts/game/2009L/GlobalSettings_4_2009L_default.xml b/scripts/game/2009L/GlobalSettings_4_2009L_default.xml
new file mode 100644
index 0000000..2f51fc2
--- /dev/null
+++ b/scripts/game/2009L/GlobalSettings_4_2009L_default.xml
@@ -0,0 +1,141 @@
+
+ null
+ nil
+ -
+
+ 50
+ 5
+ Game Options
+ false
+ true
+ true
+
+
+ -
+
+ true
+ 2
+ 0
+ false
+ false
+ true
+ 0
+ Diagnostics
+ false
+ false
+ 2
+ true
+
+
+ -
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ Physics
+ 0
+ true
+
+
+ -
+
+ Authoring
+ false
+ true
+ true
+
+
+ -
+
+ 1.1000000000000001
+ -200
+ 30
+ true
+ 1
+ 0
+ Network
+ 30
+ 1.5
+ -80
+ 1
+ 0
+ 20
+ 0
+ false
+ false
+ false
+ 60
+ true
+
+ false
+ 0
+ true
+
+
+ -
+
+ false
+ 2
+ Task Scheduler
+ 1
+ 2
+ 0
+ 0.01
+ true
+
+
+ -
+
+ 1
+ 0
+ 2
+ 20
+ 0
+ 0
+ 0
+ -1
+ false
+ false
+ false
+ false
+ 0
+ 2
+
+ 0
+ 0
+
+ 0
+ 0
+ false
+ false
+ false
+ Rendering
+ 0
+ 0
+ false
+ 0
+ true
+ 0
+
+ 0
+ 0
+
+ 0
+ true
+ 1
+
+
+
+ -
+
+ Selection
+ true
+
+
+
\ No newline at end of file
diff --git a/scripts/game/2009L/libraries.rbxm b/scripts/game/2009L/libraries.rbxm
new file mode 100644
index 0000000..56601b2
--- /dev/null
+++ b/scripts/game/2009L/libraries.rbxm
@@ -0,0 +1,28 @@
+
+ null
+ nil
+ -
+
+ false
+
+ ResetCommand
+ function onChatted(msg, speaker)
+
+ source = string.lower(speaker.Name)
+ msg = string.lower(msg)
+ -- Note: This one is NOT caps sensitive
+
+ if msg == "!!!reset" then
+ speaker.Character.Humanoid.Health = 0
+ end
+end
+
+function onPlayerEntered(newPlayer)
+ newPlayer.Chatted:connect(function(msg) onChatted(msg, newPlayer) end)
+end
+
+game.Players.ChildAdded:connect(onPlayerEntered)
+ true
+
+
+