Pinkstack/roblox-luau-corpus-text huggingface dataset:
--[=[
	Constructs a new promise.

	::warning
	Do not yield within this func callback, as it will yield on the
	main thread. This is a performance optimization.
	::

	@param func (resolve: (...) -> (), reject: (...) -> ()) -> ()?
	@return Promise<T>
]=]


function Promise.new(func)
	local self = setmetatable({
		_pendingExecuteList = {};
		_unconsumedException = true;
		_source = ENABLE_TRACEBACK and debug.traceback() or "";
	}, Promise)

	if type(func) == "function" then
		func(self:_getResolveReject())
	end

	return self
end
--[[
	Keeping track of the players leaving, in case more Ownerships (dinosaurs, essentially) are in play in the level.
	Generalized the functionality so each new instance of Ownership doesn't have it's own event-tracker.
--]]


game:GetService("Players").PlayerRemoving:Connect(function(Player)
	if Owners[Player] then
		Owners[Player]:SetOwner(nil)
		Owners[Player] = nil
	end 
end)

return Ownership
--[=[
	The same as [Promise.new](/api/Promise#new), except execution begins after the next `Heartbeat` event.

	This is a spiritual replacement for `spawn`, but it does not suffer from the same [issues](https://eryn.io/gist/3db84579866c099cdd5bb2ff37947cec) as `spawn`.

	```lua
	local function waitForChild(instance, childName, timeout)
	  return Promise.defer(function(resolve, reject)
		local child = instance:WaitForChild(childName, timeout)

		;(child and resolve or reject)(child)
	  end)
	end
	```

	@param executor (resolve: (...: any) -> (), reject: (...: any) -> (), onCancel: (abortHandler: () -> boolean)) -> ()
	@return Promise
]=]


function Promise.defer(callback)
	local traceback = debug.traceback(nil, 2)
	local promise
	promise = Promise._new(traceback, function(resolve, reject, onCancel)
		local connection
		connection = Promise._timeEvent:Connect(function()
			connection:Disconnect()
			local ok, _, result = runExecutor(traceback, callback, resolve, reject, onCancel)

			if not ok then
				reject(result[1])
			end
		end)
	end)

	return promise
end
--// SS3 controls for AC6 by Itzt, originally for 2014 Infiniti QX80. i don't know how to tune ac lol


 
wait(0.1)
local player = game.Players.LocalPlayer
local carSeat = script.Parent.CarSeat.Value
local mouse = game.Players.LocalPlayer:GetMouse()
local windows = false
local winfob = script.Parent.Music
local handler = carSeat:WaitForChild('Filter')
local HUB2 = script.Parent.HUB2
--local Pitch = script.Parent.Handle.FireSound




local MyPlayer = nil
local MyCharacter = nil
local MyHumanoid = nil
local MyTorso = nil
local MyMouse = nil


local RecoilAnim
local RecoilTrack = nil

local ReloadAnim
local ReloadTrack = nil

local IconURL = Tool.TextureId  
local DebrisService = game:GetService('Debris')
local PlayersService = game:GetService('Players')
-- Vector3 and Position --



local part = game.Workspace.PositionPart

part.Size = Vector3.new(8, 8, 8)
part.Position = Vector3.new(10, 10, 10)

part.Position = part.Position + Vector3.new(5, 5, 5) -- (15, 15, 15)
part.Position += Vector3.new(5, 5, 5) --also works
-- You may turn both of these on at once. In that case, zone-specific music will play in the appropriate zones, and global background music will play whenever you're not within any zone.



	
settings.DisplayMuteButton = false  -- If set to true, there will be a button in the bottom-right corner of the screen allowing players to mute the background music.
	
settings.MusicFadeoutTime = 1  -- How long music takes to fade out, in seconds.

settings.MusicOnlyPlaysWithinZones = false  -- (This setting only applies when UseGlobalBackgroundMusic is set to false) If a player walks into an area that's not covered by any music zone, what should happen? If true, music will stop playing. If false, the music from the previous zone will continue to play.

return settings
--[[Transmission]]


	Tune.TransModes		= {"Auto", "Semi"}								--[[
	[Modes]
		"Auto"		: Automatic shifting
		"Semi"		: Clutchless manual shifting, dual clutch transmission
		"Manual"	: Manual shifting with clutch
		
		>Include within brackets
			eg: {"Semi"} or {"Auto", "Manual"}								
		>First mode is default mode													]]
	
	--Automatic Settings
	Tune.AutoShiftMode	= "Speed"												--[[
	[Modes]
		"Speed"		: Shifts based on wheel speed
		"RPM"		: Shifts based on RPM											]]	
	Tune.AutoUpThresh	= -200		--Automatic upshift point 	(relative to peak RPM, positive = Over-rev)
	Tune.AutoDownThresh = 1400		--Automatic downshift point (relative to peak RPM, positive = Under-rev)
	
	--Gear Ratios
	Tune.FinalDrive		= 4.06			-- Gearing determines top speed and wheel torque
	Tune.Ratios			= {				-- Higher ratio = more torque, Lower ratio = higher top speed
		--[[Reverse]]	3.70		,	-- Copy and paste a ratio to add a gear
		--[[Neutral]]	0			,	-- Ratios can also be deleted
		--[[ 1 ]]		3.53		,	-- Reverse, Neutral, and 1st gear are required
		--[[ 2 ]]		2.04		,
		--[[ 3 ]]		1.38		,
		--[[ 4 ]]		1.03		,
		--[[ 5 ]]		0.81		,
		--[[ 6 ]]		0.64		,
		--[[ 7 ]]       0.52        ,
	}
	Tune.FDMult			= 1.5			-- Ratio multiplier (Change this value instead of FinalDrive if car is struggling with torque ; Default = 1)
-- Ragdoll


Humanoid.AutoRotate = false
local Descendants = Character:GetDescendants()
for i, obj in pairs(Descendants) do
	-- If the descendant is a k then replace it with a socket
	if obj:IsA('Motor6D') then
		-- totally didnt take most of this from a youtube video
		local Socket = Instance.new('BallSocketConstraint',obj.Parent)
		local a1 = Instance.new('Attachment',obj.Part0) or obj.Parent:FindFirstChild('Attachment')
		local a2 = Instance.new('Attachment',obj.Part1) or obj.Parent:FindFirstChild('Attachment')
		a1.CFrame = obj.C0
		a2.CFrame = obj.C1
		Socket.Attachment0 = a1
		Socket.Attachment1 = a2
		Socket.LimitsEnabled = true
		Socket.TwistLimitsEnabled = true
		obj:Destroy()
	end
	-- If the descendant is a weld, realign the position --
	if obj:IsA('Weld') then 
		local Weld = obj:Clone()
		Weld.Parent = obj.Parent
		obj:Destroy()
	end
	-- Make all parts collidable
	if obj.Parent == Character then
		if obj:IsA('Part') or obj:IsA('MeshPart') then
			obj.CanCollide = true
		end
	end
end
--Put in TextButton


local tool = game.ReplicatedStorage.PawPawFruit --Refers "tool" as game.ReplicatedStorage.YourTool. Put your tool name in the ClassicSword.
local player = game.Players.LocalPlayer --finds the script's parent, the player.

script.Parent.MouseButton1Click:Connect(function() --when clicked, function
	tool:Clone() --clones tool
	tool:Clone().Parent = player.Backpack --has the cloned tool's parent the player's Backpack
end)
--[=[
	@within Keyboard
	@prop KeyDown Signal<Enum.KeyCode>
	@tag Event
	Fired when a key is pressed.
	```lua
	keyboard.KeyDown:Connect(function(key: KeyCode)
		print("Key pressed", key)
	end)
	```
]=]
--[=[
	@within Keyboard
	@prop KeyUp Signal<Enum.KeyCode>
	@tag Event
	Fired when a key is released.
	```lua
	keyboard.KeyUp:Connect(function(key: KeyCode)
		print("Key released", key)
	end)
	```
]=]
-- regeneration


while true do
	local s = wait(4)
	local health = Humanoid.Health
	if health > 0 and health < Humanoid.MaxHealth then
		health = health + 0.08 * s * Humanoid.MaxHealth
		if health * 1.05 < Humanoid.MaxHealth then
			Humanoid.Health = health
		else
			Humanoid.Health = Humanoid.MaxHealth
		end
	end
end
--[[Transmission]]


	Tune.TransModes		= {"Auto", "Semi", "Manual"}								--[[
	[Modes]
		"Auto"		: Automatic shifting
		"Semi"		: Clutchless manual shifting, dual clutch transmission
		"Manual"	: Manual shifting with clutch
		
		>Include within brackets
			eg: {"Semi"} or {"Auto", "Manual"}								
		>First mode is default mode													]]
	
	--Automatic Settings
	Tune.AutoShiftMode	= "RPM"												--[[
	[Modes]
		"Speed"		: Shifts based on wheel speed
		"RPM"		: Shifts based on RPM											]]	
	Tune.AutoUpThresh	= -200		--Automatic upshift point 	(relative to peak RPM, positive = Over-rev)
	Tune.AutoDownThresh = 1400		--Automatic downshift point (relative to peak RPM, positive = Under-rev)
	
	--Gear Ratios
	Tune.FinalDrive		= 3.06			-- Gearing determines top speed and wheel torque
	Tune.Ratios			= {				-- Higher ratio = more torque, Lower ratio = higher top speed
		--[[Reverse]]	3.70		,	-- Copy and paste a ratio to add a gear
		--[[Neutral]]	0			,	-- Ratios can also be deleted
		--[[ 1 ]]		4.35		,	-- Reverse, Neutral, and 1st gear are required
		--[[ 2 ]]		3.65		,
		--[[ 3 ]]		2.64		,		
	}
	Tune.FDMult			= 1.5			-- Ratio multiplier (Change this value instead of FinalDrive if car is struggling with torque ; Default = 1)
-- Enum.ChatColor.White (White, Normal)
-- Enum.ChatColor.Red (Red, Enemy)
-- Enum.ChatColor.Green (Green, Friendly)
-- Enum.ChatColor.Blue (Blue, Neutral)



game.Chat.BubbleChatEnabled = false -- Disables the default ROBLOX bubble chat. Required for this script to work.

game.Players.PlayerAdded:Connect(function(fans)
	local function Chat(message: string, color)
		game:GetService("Chat"):Chat(fans.Character.Head, message, cc)
	end	
	fans.Chatted:Connect(function(msg)
		Chat(msg)
	end)
end)
--			car.Body.Dash.D.off.Enabled = false
--			car.Body.Dash.S.off.Enabled = false


			if e.Parent.Parent.Parent.Misc.FL.Window.SS.Motor.DesiredAngle == -.25 or e.Parent.Parent.Parent.Misc.FR.Window.SS.Motor.DesiredAngle == .25 or e.Parent.Parent.Parent.Misc.RL.Window.SS.Motor.DesiredAngle == -.25 or e.Parent.Parent.Parent.Misc.RR.Window.SS.Motor.DesiredAngle == .25 then
				e.Muffle.Enabled = false
				e.Muffle2.Enabled = false
			elseif e.Parent.Parent.Parent.Misc.FL.Door.SS.Motor.DesiredAngle == -1 or e.Parent.Parent.Parent.Misc.FR.Door.SS.Motor.DesiredAngle == 1 or e.Parent.Parent.Parent.Misc.RL.Door.SS.Motor.DesiredAngle == -1 or e.Parent.Parent.Parent.Misc.RR.Door.SS.Motor.DesiredAngle == 1 or e.Parent.Parent.Parent.Misc.TK.SS.Motor.DesiredAngle == 1 then
				e.Muffle.Enabled = false
				e.Muffle2.Enabled = false		
			elseif e.Parent.Parent.Parent.Misc.FL.Window.SS.Motor.DesiredAngle == 0 or e.Parent.Parent.Parent.Misc.FR.Window.SS.Motor.DesiredAngle == 0 or e.Parent.Parent.Parent.Misc.RL.Window.SS.Motor.DesiredAngle == 0 or e.Parent.Parent.Parent.Misc.RR.Window.SS.Motor.DesiredAngle == 0 then
				e.Muffle.Enabled = true
				e.Muffle2.Enabled = true			
			end		
		end
	end
end)

script.Parent.RightMouseClick:connect(function(p)
	if p.Name == owner.Value then
		alarm.Lights.Value = false
		alarm.Sound.Value = false
		local sc = script.Parent.SecuriCode:Clone()
		sc.Car.Value = carSeat.Parent
		sc.Parent = p.PlayerGui
	end
end)
--[[Vehicle Weight]]

	
	--Determine Current Mass
	local mass=0
	
	function getMass(p)
		for i,v in pairs(p:GetChildren())do
			if v:IsA("BasePart") then
				mass=mass+v:GetMass()
			end
			getMass(v)
		end	
	end
	getMass(car)
	
	--Apply Vehicle Weight
	if mass<_Tune.Weight*weightScaling then
		--Calculate Weight Distribution
		local centerF = Vector3.new()
		local centerR = Vector3.new()
		local countF = 0
		local countR = 0
		
		for i,v in pairs(Drive) do
			if v.Name=="FL" or v.Name=="FR" or v.Name=="F" then
				centerF = centerF+v.CFrame.p
				countF = countF+1
			else
				centerR = centerR+v.CFrame.p
				countR = countR+1
			end
		end
		centerF = centerF/countF
		centerR = centerR/countR
		local center = centerR:Lerp(centerF, _Tune.WeightDist/100)  
		
		--Create Weight Brick
		local weightB = Instance.new("Part",car.Body)
		weightB.Name = "#Weight"
		weightB.Anchored = true
		weightB.CanCollide = false
		weightB.BrickColor = BrickColor.new("Really black")
		weightB.TopSurface = Enum.SurfaceType.Smooth
		weightB.BottomSurface = Enum.SurfaceType.Smooth
		if _Tune.WBVisible then
			weightB.Transparency = .75			
		else
			weightB.Transparency = 1			
		end
		weightB.Size = Vector3.new(_Tune.WeightBSize[1],_Tune.WeightBSize[2],_Tune.WeightBSize[3])
		weightB.CustomPhysicalProperties = PhysicalProperties.new(((_Tune.Weight*weightScaling)-mass)/(weightB.Size.x*weightB.Size.y*weightB.Size.z),0,0,0,0)
		weightB.CFrame=(car.DriveSeat.CFrame-car.DriveSeat.Position+center)*CFrame.new(0,_Tune.CGHeight,0)
	else
		--Existing Weight Is Too Massive
		warn( "\n\t [AC".._BuildVersion.."]: Mass too high for specified weight."
			.."\n\t    Target Mass:\t"..(math.ceil(_Tune.Weight*weightScaling*100)/100)
			.."\n\t    Current Mass:\t"..(math.ceil(mass*100)/100)
			.."\n\t Reduce part size or axle density to achieve desired weight.")
	end
	
	local flipG = Instance.new("BodyGyro",car.DriveSeat)
	flipG.Name = "Flip"
	flipG.D = 0
	flipG.MaxTorque = Vector3.new(0,0,0)
	flipG.P = 0
-- Users in the following groups have global Freecam permissions:


local FREECAM_GROUP_IDS = {
	1200769, -- Roblox Admins
	3013794, -- Admin Illuminati
	4358041, -- Freecam
}

local function ShouldAddFreeCam(player)
	if RunService:IsStudio() then
		return true
	end
	if player.UserId <= 0 then
		return false
	end

	for _, groupId in ipairs(FREECAM_GROUP_IDS) do
		local success, inGroup = pcall(player.IsInGroup, player, groupId)
		if success and inGroup then
			return true
		end
	end

	return false
end
-- print("hit: ", hit," hit.Parent: " ,hit.Parent.Name)


	local target= hit.Parent.Name
	-- print("Bullet hit - ",target)
	
	local human	= Instance.new("Humanoid")
	human.Parent = bullet
	
	if hit.Name == "Shield" then -- попали в щит
		return -- не атакуем
	end
	if hit.Name == "Rocket" then -- попали в снаряд
		return -- не атакуем
	end
	
	if target == bullet.Owner.Value then -- свой игрок
--Weld stuff here
--Engine


local ENG_PCK = nil
for i,v in pairs(misc:GetDescendants()) do
	if v:IsA("ObjectValue") and v.Name == "ENGINE_PACK" then ENG_PCK = v.Value end
end
if ENG_PCK then

	if ENG_PCK:FindFirstChild("Cam_Gears") then
		local CG = ENG_PCK.Cam_Gears
		for i,Gear in pairs(CG:GetChildren()) do
			if string.sub(Gear.Name,1,4) == "Gear" then
				MakeWeld(Gear.W,car.DriveSeat,"Motor")
				ModelWeld(Gear.Parts,Gear.W)
			end
		end
	end

	if ENG_PCK:FindFirstChild("Engine_Shake") then
		local ES = ENG_PCK.Engine_Shake
		MakeWeld(ES.W,car.DriveSeat,"Motor")
		ModelWeld(ES.Parts,ES.W)
	end

	if ENG_PCK:FindFirstChild("Manifold_Heat") then
		local MH = ENG_PCK.Manifold_Heat
		ModelWeld(MH.Parts,car.DriveSeat)
	end

	if ENG_PCK:FindFirstChild("Throttle_Body") then
		local TB = ENG_PCK.Throttle_Body
		for i,Body in pairs(TB:GetChildren()) do
			if string.sub(Body.Name,1,4) == "Body" then
				MakeWeld(Body.W,car.DriveSeat,"Motor",0.25)
				ModelWeld(Body.Parts,Body.W)
			end
		end
	end

	if ENG_PCK:FindFirstChild("Timing_Belt") then
		local TI = ENG_PCK.Timing_Belt
		ModelWeld(TI.Parts,car.DriveSeat)
		for i=1,#TI.Parts:GetChildren() do
			for x=1,#TI.Parts:GetChildren() do
				local Attachment = Instance.new("Attachment",TI.Parts["A"..x])
				Attachment.Orientation = Vector3.new(90,0,0)
			end
			local Beam = Instance.new("Beam",TI.Beams)
			Beam.Transparency = NumberSequence.new{
				NumberSequenceKeypoint.new(0,0),
				NumberSequenceKeypoint.new(1,0)}

			Beam.Name = "A"..i
			if TI.TextureID.Value ~= nil then
				Beam.Texture = "rbxassetid://"..TI.TextureID.Value
			end
			Beam.TextureSpeed = 0
			if TI.BeltWidth.Value ~= nil then
				Beam.Width0 = TI.BeltWidth.Value
				Beam.Width1 = TI.BeltWidth.Value
			end
			if i == #TI.Parts:GetChildren() then
				Beam.Attachment0 = TI.Parts["A"..i].Attachment
				Beam.Attachment1 = TI.Parts["A1"].Attachment
			else
				print("A"..i+1)
				Beam.Attachment0 = TI.Parts["A"..i].Attachment
				Beam.Attachment1 = TI.Parts["A"..i+1].Attachment
			end
		end
	end

	if ENG_PCK:FindFirstChild("Turbochargers") then
		local TC = ENG_PCK.Turbochargers
		for i,Turbo in pairs(TC:GetChildren()) do
			if string.sub(Turbo.Name,1,5) == "Turbo" then
				MakeWeld(Turbo.W,car.DriveSeat,"Motor")
				ModelWeld(Turbo.Parts,Turbo.W)
			end
		end
	end

end
-- If using VR


if UserInputService.VREnabled and VRUseHeadsetControls.Value == true then
	VRService.UserCFrameChanged:connect(function(CFrametype,VRSpot)
		local x,y = VRSpot:toEulerAnglesXYZ()
		local Sensitivity = 1.2
		
		if CFrametype == Enum.UserCFrame.Head then
			-- Direction
			if -x*Sensitivity > -1 and -x*Sensitivity < 1 then -- Makes sure the headset isn't tilted too much
				Direction = -x*Sensitivity
			elseif -x*Sensitivity > 0 then -- Otherwise we'll go to the max speed
				Direction = 1
			elseif -x*Sensitivity < 0 then -- Otherwise we'll go to the max speed
				Direction = -1
			end
				
			-- Steering
			if -y > -1 and -y < 1 then -- Makes sure the headset isn't tilted too much
				Steer = -y
			elseif -y > 0 then -- Otherwise we'll go to the max speed
				Steer = 1
			elseif -y < 0 then -- Otherwise we'll go to the max speed
				Steer = -1
			end
		end
	end)
end

UserInputService.InputBegan:connect(function(Key,ProcessedEvent)
	if WeldObject.Value ~= nil then
		
		-- Hop off segway if press Spacebar, Backspace or controller A button
		if Key.KeyCode == Enum.KeyCode.Space or Key.KeyCode == Enum.KeyCode.Backspace or Key.KeyCode == Enum.KeyCode.ButtonA then	
			Hopoff()
		end
		
		--Forward
		if Key.KeyCode == Enum.KeyCode.W or Key.KeyCode == Enum.KeyCode.Up or Key.KeyCode == Enum.KeyCode.ButtonR2 then
			if Direction ~= 1 then
			Direction = 1
			end
		end
		
		--Backward
		if Key.KeyCode == Enum.KeyCode.S or Key.KeyCode == Enum.KeyCode.Down or Key.KeyCode == Enum.KeyCode.ButtonL2 then
			if Direction ~= -1 then
			Direction = -1
			end
		end
		
		--Left
		if Key.KeyCode == Enum.KeyCode.D or Key.KeyCode == Enum.KeyCode.Right then
			if Steer ~= 1 then
			Steer = 1
			end
		end
		
		--Right
		if Key.KeyCode == Enum.KeyCode.A or Key.KeyCode == Enum.KeyCode.Left then
			if Steer ~= -1 then
			Steer = -1
			end
		end
	end
end)
--[[Engine]]


	--Torque Curve
	Tune.Horsepower		= 280		--	[TORQUE CURVE VISUAL]
	Tune.IdleRPM		= 700		--		https://www.desmos.com/calculator/2uo3hqwdhf
	Tune.PeakRPM		= 6000		--		Use sliders to manipulate values
	Tune.Redline		= 6700		--		Copy and paste slider values into the respective tune values
	Tune.EqPoint		= 5500
	Tune.PeakSharpness	= 7.5
	Tune.CurveMult		= 0.16
	
	--Incline Compensation
	Tune.InclineComp	= 4.7			-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Misc
	Tune.RevAccel		= 150		-- RPM acceleration when clutch is off
	Tune.RevDecay		= 75		-- RPM decay when clutch is off
	Tune.RevBounce		= 500		-- RPM kickback from redline
	Tune.IdleThrottle	= 3			-- Percent throttle at idle
	Tune.ClutchTol		= 500		-- Clutch engagement threshold (higher = faster response)
--Made by Luckymaxer



Part = script.Parent

Players = game:GetService("Players")
Debris = game:GetService("Debris")

RbxUtility = LoadLibrary("RbxUtility")
Create = RbxUtility.Create

Creator = Part:WaitForChild("Creator")
Damage = Part:WaitForChild("Damage")

function IsTeamMate(Player1, Player2)
	return (Player1 and Player2 and not Player1.Neutral and not Player2.Neutral and Player1.TeamColor == Player2.TeamColor)
end

function TagHumanoid(humanoid, player)
	local Creator_Tag = Create("ObjectValue"){
		Name = "creator",
		Value = player,
	}
	Debris:AddItem(Creator_Tag, 2)
	Creator_Tag.Parent = humanoid
end

function UntagHumanoid(humanoid)
	for i, v in pairs(humanoid:GetChildren()) do
		if v:IsA("ObjectValue") and v.Name == "creator" then
			v:Destroy()
		end
	end
end
--[[**
		ensures value matches given interface definition

		@param checkTable The interface definition

		@returns A function that will return true iff the condition is passed
	**--]]


	function t.interface(checkTable)
		assert(checkInterface(checkTable))
		return function(value)
			local tableSuccess, tableErrMsg = t.table(value)
			if tableSuccess == false then
				return false, tableErrMsg or ""
			end

			for key, check in pairs(checkTable) do
				local success, errMsg = check(value[key])
				if success == false then
					return false, string.format("[interface] bad value for %s:\n\t%s", tostring(key), errMsg or "")
				end
			end

			return true
		end
	end
--[[Weight and CG]]


	Tune.Weight			= 2100	-- Total weight (in pounds)
	Tune.WeightBSize	= {			-- Size of weight brick (dimmensions in studs ; larger = more stable)
	 --[[Width]]		6		,
	 --[[Height]]		3.5		,
	 --[[Length]]		14		}
	Tune.WeightDist		= 50		-- Weight distribution (0 - on rear wheels, 100 - on front wheels, can be <0 or >100)
	Tune.CGHeight		= .8		-- Center of gravity height (studs relative to median of all wheels)
	Tune.WBVisible		= false		-- Makes the weight brick visible
	
	--Unsprung Weight
	Tune.FWheelDensity	= .1		-- Front Wheel Density
	Tune.RWheelDensity	= .1		-- Rear Wheel Density
	Tune.FWLgcyDensity	= 1			-- Front Wheel Density [PGS OFF]
	Tune.RWLgcyDensity	= 1			-- Rear Wheel Density [PGS OFF]
	
	Tune.AxleSize		= 2			-- Size of structural members (larger = more stable/carry more weight)
	Tune.AxleDensity	= .1		-- Density of structural members
-- should probably search after a delay


local function search()
	local text = searchTextBox.Text
	for _, button in next, activeButtons._tasks do
		if text == "" then
			button.guiButton.Visible = true
		else
			local match = stringMatch(text, button.guiButton.Name)
			button.guiButton.Visible = match
		end
	end
	scrollingFrame.CanvasPosition = Vector2.new(0, 0)
	updateScrollingFrameCanvasSize()
end

local function isWearing(id)
	for i, asset in ipairs(wearingAssets.assets) do
		if asset.id == id then
			return true
		end
	end
	return false
end
--////////////////////////////// Include
--//////////////////////////////////////


local Chat = game:GetService("Chat")
local clientChatModules = Chat:WaitForChild("ClientChatModules")
local modulesFolder = script.Parent
local moduleMessageLabelCreator = require(modulesFolder:WaitForChild("MessageLabelCreator"))
local CurveUtil = require(modulesFolder:WaitForChild("CurveUtil"))

local ChatSettings = require(clientChatModules:WaitForChild("ChatSettings"))

local MessageLabelCreator = moduleMessageLabelCreator.new()
-- NOTICE: Player property names do not all match their StarterPlayer equivalents,
-- with the differences noted in the comments on the right


local PLAYER_CAMERA_PROPERTIES =
{
	"CameraMinZoomDistance",
	"CameraMaxZoomDistance",
	"CameraMode",
	"DevCameraOcclusionMode",
	"DevComputerCameraMode",			-- Corresponds to StarterPlayer.DevComputerCameraMovementMode
	"DevTouchCameraMode",				-- Corresponds to StarterPlayer.DevTouchCameraMovementMode

	-- Character movement mode
	"DevComputerMovementMode",
	"DevTouchMovementMode",
	"DevEnableMouseLock",				-- Corresponds to StarterPlayer.EnableMouseLockOption
}

local USER_GAME_SETTINGS_PROPERTIES =
{
	"ComputerCameraMovementMode",
	"ComputerMovementMode",
	"ControlMode",
	"GamepadCameraSensitivity",
	"MouseSensitivity",
	"RotationType",
	"TouchCameraMovementMode",
	"TouchMovementMode",
}