Pinkstack/roblox-luau-corpus-text huggingface dataset:
--[[ Touch Events ]]--
-- On touch devices we need to recreate the guis on character load.


local lastControlState = nil
LocalPlayer.CharacterAdded:connect(function(character)
	if UserInputService.TouchEnabled then
		createTouchGuiContainer()
	end
	
	if ControlState.Current == nil then
		ControlState:SwitchTo(lastControlState)
	end
end)

LocalPlayer.CharacterRemoving:connect(function(character)
	lastControlState = ControlState.Current
	ControlState:SwitchTo(nil)
end)
	
UserInputService.Changed:connect(function(property)
	if property == 'ModalEnabled' then
		IsModalEnabled = UserInputService.ModalEnabled

		if lastInputType == Enum.UserInputType.Touch then
			if ControlState.Current == ControlModules.Touch and IsModalEnabled then
				ControlState:SwitchTo(nil)
			elseif ControlState.Current == nil and not IsModalEnabled then
				ControlState:SwitchTo(ControlModules.Touch)
			end
		end
	end
end)

if BindableEvent_OnFailStateChanged then
	BindableEvent_OnFailStateChanged.Event:connect(function(isOn)
		if lastInputType == Enum.UserInputType.Touch and ClickToMoveTouchControls then
			if isOn then
				ControlState:SwitchTo(ClickToMoveTouchControls)
			else
				ControlState:SwitchTo(nil)
			end
		end
	end)
end

local switchToInputType = function(newLastInputType)
	lastInputType = newLastInputType
	
	if lastInputType == Enum.UserInputType.Touch then
				ControlState:SwitchTo(ControlModules.Touch)
	elseif lastInputType == Enum.UserInputType.Keyboard or
			lastInputType == Enum.UserInputType.MouseButton1 or
			lastInputType == Enum.UserInputType.MouseButton2 or
			lastInputType == Enum.UserInputType.MouseButton3 or
			lastInputType == Enum.UserInputType.MouseWheel or
			lastInputType == Enum.UserInputType.MouseMovement  then
				ControlState:SwitchTo(ControlModules.Keyboard)
	elseif lastInputType == Enum.UserInputType.Gamepad1 or
			lastInputType == Enum.UserInputType.Gamepad2 or
			lastInputType == Enum.UserInputType.Gamepad3 or
			lastInputType == Enum.UserInputType.Gamepad4 then
				ControlState:SwitchTo(ControlModules.Gamepad)
	end
end

if IsTouchDevice then
	createTouchGuiContainer()
end

MasterControl:Init()

UserInputService.GamepadDisconnected:connect(function(gamepadEnum)
	local connectedGamepads = UserInputService:GetConnectedGamepads()
	if #connectedGamepads > 0 then return end
	
	if UserInputService.KeyboardEnabled then
		ControlState:SwitchTo(ControlModules.Keyboard)
	elseif IsTouchDevice then
		ControlState:SwitchTo(ControlModules.Touch)
	end
end)

UserInputService.GamepadConnected:connect(function(gamepadEnum)
	ControlState:SwitchTo(ControlModules.Gamepad)
end)

switchToInputType(UserInputService:GetLastInputType())
UserInputService.LastInputTypeChanged:connect(switchToInputType)
--[[Engine]]


	--Torque Curve
Tune.Horsepower		= 900--	[TORQUE CURVE VISUAL]
	Tune.IdleRPM		= 800		--		https://www.desmos.com/calculator/2uo3hqwdhf
	Tune.PeakRPM		= 8000		--		Use sliders to manipulate values
	Tune.Redline		= 8500		--		Copy and paste slider values into the respective tune values
	Tune.EqPoint		= 6800
	Tune.PeakSharpness	= 3.8
	Tune.CurveMult		= 0.07
	
	--Incline Compensation
	Tune.InclineComp	= .5			-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Misc
	Tune.RevAccel		= 250		-- 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		= 150		-- Clutch engagement threshold (higher = faster response)
--[[Engine]]


	--Torque Curve
	Tune.Horsepower		= 169		--	[TORQUE CURVE VISUAL]
	Tune.IdleRPM		= 700		--		https://www.desmos.com/calculator/2uo3hqwdhf
	Tune.PeakRPM		= 5500		--		Use sliders to manipulate values
	Tune.Redline		= 6500		--		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	= 1.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		= 1		-- Clutch engagement threshold (higher = faster response)
-- دالة الاصطدام


local function onTouched(part)
	local humanoid = part.Parent:FindFirstChild("Humanoid")
	if humanoid then
		-- تشغيل التزعزع والسقوط في ترتيب متتالي
		shake()
		wait(0.5) -- انتظار قصير قبل السقوط لإعطاء انطباع التزعزع
		fall()
	end
end
--script.Parent.EE.Velocity = script.Parent.EE.CFrame.lookVector *script.Parent.Speed.Value
--script.Parent.EEE.Velocity = script.Parent.EEE.CFrame.lookVector *script.Parent.Speed.Value


script.Parent.EEEE.Velocity = script.Parent.EEEE.CFrame.lookVector *script.Parent.Speed.Value
script.Parent.F.Velocity = script.Parent.F.CFrame.lookVector *script.Parent.Speed.Value
--[[Weight and CG]]


Tune.Weight			= 1100          -- Total weight (in pounds)
Tune.WeightBSize	= {			-- Size of weight brick (dimmensions in studs ; larger = more stable)
	--[[Width]]		6.5		,
	--[[Height]]		4.8		,
	--[[Length]]		17		}
Tune.WeightDist		= 51		-- Weight distribution (0 - on rear wheels, 100 - on front wheels, can be <0 or >100)
Tune.CGHeight		= .7		-- Center of gravity height (studs relative to median of all wheels)
Tune.WBVisible		= false		-- Makes the weight brick visible
-- Existance in this list signifies that it is an emote, the value indicates if it is a looping emote


local emoteNames = { wave = false, point = false, dance = true, dance2 = true, dance3 = true, laugh = false, cheer = false}

math.randomseed(tick())

function configureAnimationSet(name, fileList)
	if animTable[name] then
		for _, connection in pairs(animTable[name].connections) do
			connection:disconnect()
		end
	end
	animTable[name] = {}
	animTable[name].count = 0
	animTable[name].totalWeight = 0	
	animTable[name].connections = {}

	-- check for config values
	local config = script:FindFirstChild(name)
	if config then
--//Server Animations


	RightHighReady = CFrame.new(-1, 0.55, -1.1) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0));
	LeftHighReady = CFrame.new(1,0.55,-1.15) * CFrame.Angles(math.rad(-90),math.rad(0),math.rad(0));

	RightLowReady = CFrame.new(-1, 0.55, -1.1) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0));
	LeftLowReady = CFrame.new(1,0.55,-1.15) * CFrame.Angles(math.rad(-90),math.rad(0),math.rad(0));

	RightPatrol = CFrame.new(-1, 0.55, -1.1) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0));
	LeftPatrol = CFrame.new(1,0.55,-1.15) * CFrame.Angles(math.rad(-90),math.rad(0),math.rad(0));

	RightAim = CFrame.new(-1, 0.55, -1.1) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0));
	LeftAim = CFrame.new(1,0.55,-1.15) * CFrame.Angles(math.rad(-90),math.rad(0),math.rad(0));
	
	RightSprint = CFrame.new(-1, 0.55, -1.1) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0));
	LeftSprint = CFrame.new(1,0.55,-1.15) * CFrame.Angles(math.rad(-90),math.rad(0),math.rad(0));

	ShootPos = CFrame.new(0,0,.25);
	
}

return module
--[[
	Function called upon entering the state
]]


function PlayerGame.onEnter(stateMachine, serverPlayer, event, from, to)
	local player = serverPlayer.player

	coroutine.wrap(
		function()
			local character = player.Character

			if not character or not character.PrimaryPart then
				player:LoadCharacter()
				character = player.Character or player.CharacterAdded:Wait()

				while not character.PrimaryPart do
					wait()
				end

				character:WaitForChild("Humanoid")
			end

			if from ~= "camera" then
				onCharacterAdded(player, character)
			end

			local humanoid = character:FindFirstChild("Humanoid")

			humanoid.WalkSpeed = 16

			local primaryPart = character.PrimaryPart

			connections.characterAdded =
				player.CharacterAdded:Connect(
				function(character)
					while not character.Parent or character:FindFirstChild("Humanoid") do
						wait()
					end

					onCharacterAdded(player, character)
				end
			)

			while stateMachine.current == "game" do
				if isMoving then
					local currentTick = tick()
					MonsterManager.createInterestWhileTrue(
						primaryPart.Position,
						NOISE_GENERATED,
						function()
							return not isMoving or tick() < currentTick + NOISE_TIMEOUT
						end
					)
				end
				wait(0.25)
			end
		end
	)()
end
--[[Engine]]


	--Torque Curve
	Tune.Horsepower		= 560		--	[TORQUE CURVE VISUAL]
	Tune.IdleRPM		= 500		--		https://www.desmos.com/calculator/2uo3hqwdhf
	Tune.PeakRPM		= 3900		--		Use sliders to manipulate values
	Tune.Redline		= 4500		--		Copy and paste slider values into the respective tune values
	Tune.EqPoint		= 4500
	Tune.PeakSharpness	= 7.5
	Tune.CurveMult		= 0.16
	
	--Incline Compensation
	Tune.InclineComp	= 1.3			-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Misc
	Tune.RevAccel		= 80		-- RPM acceleration when clutch is off
	Tune.RevDecay		= 70		-- RPM decay when clutch is off
	Tune.RevBounce		= 10		-- RPM kickback from redline
	Tune.IdleThrottle	= 1			-- Percent throttle at idle
	Tune.ClutchTol		= 500		-- Clutch engagement threshold (higher = faster response)
--[[[Default Controls]]


	--Peripheral Deadzones
	Tune.Peripherals = {
		MSteerWidth				= 67		,	-- Mouse steering control width	(0 - 100% of screen width)
		MSteerDZone				= 10		,	-- Mouse steering deadzone (0 - 100%)
		
		ControlLDZone			= 5			,	-- Controller steering L-deadzone (0 - 100%)
		ControlRDZone			= 5			,	-- Controller steering R-deadzone (0 - 100%)
	}
	
	--Control Mapping
	Tune.Controls = {
		
	--Keyboard Controls
		--Mode Toggles
		ToggleTCS				= Enum.KeyCode.T					,
		ToggleABS				= Enum.KeyCode.Y					,
		ToggleTransMode			= Enum.KeyCode.M					,
		
		--Primary Controls
		Throttle				= Enum.KeyCode.Up					,
		Brake					= Enum.KeyCode.Down					,
		SteerLeft				= Enum.KeyCode.Left					,
		SteerRight				= Enum.KeyCode.Right				,
		
		--Secondary Controls
		Throttle2				= Enum.KeyCode.W					,
		Brake2					= Enum.KeyCode.S					,
		SteerLeft2				= Enum.KeyCode.A					,
		SteerRight2				= Enum.KeyCode.D					,
		
		--Manual Transmission
		ShiftUp					= Enum.KeyCode.E					,
		ShiftDown				= Enum.KeyCode.Q					,
		Clutch					= Enum.KeyCode.LeftShift			,
		
		--Handbrake
		PBrake					= Enum.KeyCode.P					,
		
	--Mouse Controls
		MouseThrottle			= Enum.UserInputType.MouseButton1	,
		MouseBrake				= Enum.UserInputType.MouseButton2	,
		MouseClutch				= Enum.KeyCode.W					,
		MouseShiftUp			= Enum.KeyCode.E					,
		MouseShiftDown			= Enum.KeyCode.Q					,
		MousePBrake				= Enum.KeyCode.LeftShift			,
		
	--Controller Mapping
		ContlrThrottle			= Enum.KeyCode.ButtonR2				,
		ContlrBrake				= Enum.KeyCode.ButtonL2				,
		ContlrSteer				= Enum.KeyCode.Thumbstick1			,
		ContlrShiftUp			= Enum.KeyCode.ButtonY				,
		ContlrShiftDown			= Enum.KeyCode.ButtonX				,
		ContlrClutch			= Enum.KeyCode.ButtonR1				,
		ContlrPBrake			= Enum.KeyCode.ButtonL1				,
		ContlrToggleTMode		= Enum.KeyCode.DPadUp				,
		ContlrToggleTCS			= Enum.KeyCode.DPadDown				,
		ContlrToggleABS			= Enum.KeyCode.DPadRight			,
	}
--AudioLib.__index = function(s, i) return s[i] end



function AudioLib.new(container)
	local self = {}
	
	self.DefaultProperties = {
		Children = nil;
		--ClearAllChildren = true;

		Looped = false;
		PlaybackSpeed = 1;
		Playing = false;
		SoundId = nil;
		TimePosition = 0;
		Volume = 0.25;
	}

	self.Playlist = {}
	self.Shuffle = false
	
	function self:GetSound() -- Retrieve the sound used for playing all music
		return self.Sound
	end

	function self:UpdateSound(data) -- Loops through a table of properties used to overwrite those of an existing instance.
		for property,value in pairs(data) do
			self.Sound[property] = value
		end
		return self.Sound
	end

	function self:SoundEnded() -- Loads the next song in the playlist
		if #self.Playlist > 0 then
			local index = table.find(self.Playlist, self.Sound.SoundId)
			if self.Shuffle then index = math.random(0, #self.Playlist) end
			if (index + 1) > #self.Playlist then 
				index = 0
			end
			self.Sound.SoundId = self.Playlist[index + 1]
		end
	end
	
	local container = workspace:FindFirstChild(container.Name)
	self.Sound = container:FindFirstChild("AudioLib_Sound")
	if not self.Sound then
		self.Sound = Instance.new("Sound")
		self.Sound.Name = "AudioLib_Sound"
		self.Sound.Parent = container -- Don't ask me why I have to do this.
		self.Sound.Ended:Connect(function() self:SoundEnded() end)
		self:UpdateSound(self.DefaultProperties)
	end
	return self
end

return AudioLib
--Defining the parts of the shelf


local sp=script.Parent
local drawer=sp.DrawerModel.Drawer
local val = script.bool.Value
function onClicked(clicked)

	if val == true then
		val = false
		drawer.ClickDetector.MaxActivationDistance=0
		drawer.Sound:Play()
		for loop = 1, 20 do
		sp:SetPrimaryPartCFrame(sp.PrimaryPart.CFrame * CFrame.new(0, 0,-.1) * CFrame.fromEulerAnglesXYZ(0, 0, 0))
		wait(0.05)
		end
		val = false
		drawer.ClickDetector.MaxActivationDistance=5

	elseif val == false then
		val = true
		drawer.ClickDetector.MaxActivationDistance=0
		drawer.Sound:Play()
		for loop = 1, 20 do
		sp:SetPrimaryPartCFrame(sp.PrimaryPart.CFrame * CFrame.new(0, 0, .1) * CFrame.fromEulerAnglesXYZ(0, 0, 0))
		wait(0.05)
		end
		val = true
		drawer.ClickDetector.MaxActivationDistance=5
		end
		end

drawer.ClickDetector.MouseClick:connect(onClicked)
-- Basic Settings



AdminCredit=false;				-- Enables the credit GUI for that appears in the bottom right
AutoClean=false;				-- Enables automatic cleaning of hats & tools in the Workspace
AutoCleanDelay=60;				-- The delay between each AutoClean routine
CommandBar=true;				-- Enables the Command Bar | GLOBAL KEYBIND: \
FunCommands=true;				-- Enables fun yet unnecessary commands
FreeAdmin=false;				-- Set to 1-5 to grant admin powers to all, otherwise set to false
PublicLogs=false;				-- Allows all users to see the command & chat logs
Prefix=';';						-- Character to begin a command
								--[[
	Admin Powers
	
0			Player
1			VIP					Can use nonabusive commands only on self
2			Moderator			Can kick, mute, & use most commands
3			Administrator		Can ban, crash, & set Moderators/VIP
4			SuperAdmin			Can grant permanent powers, & shutdown the game
5			Owner				Can set SuperAdmins, & use all the commands
6			Game Creator		Can set owners & use all the commands

	Group & VIP Admin
	
		You can set multiple Groups & Ranks to grant users admin powers:
		
GroupAdmin={
[12345]={[254]=4,[253]=3};
[GROUPID]={[RANK]=ADMINPOWER}
};

		You can set multiple Assets to grant users admin powers:
		
VIPAdmin={
[12345]=3;
[54321]=4;
[ITEMID]=ADMINPOWER;
};								]]

GroupAdmin={

};

VIPAdmin={

};
--valava rotato..... fasta valava!!!!!!!!!! gooo.. goooooo!!!!! reaching maximum velocity!!!!!!!!!!!!!



local gabeNewell  = script.Parent.Valve
local TS = game:GetService("TweenService")
local CD = Instance.new("ClickDetector",gabeNewell)
CD.MaxActivationDistance = 4
local deb = false
CD.MouseClick:Connect(function()
	if not deb then
		deb = true
		local corp = TS:Create(gabeNewell,TweenInfo.new(1.5,Enum.EasingStyle.Cubic,Enum.EasingDirection.InOut,0,false,0),{CFrame = gabeNewell.CFrame * CFrame.Angles(math.pi,0,0)})
		corp.Completed:Connect(function()
			deb = false
		end)
		corp:Play()
	end
	
end)
--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)
Tune.ShiftTime = .25				-- The time delay in which you initiate a shift and the car changes gear
--[[

ADMIN POWERS

0		Player
1		VIP/Donor
2		Moderator
3		Administrator
4		Super Administrator
5		Owner
6		Game Creator

First table consists of the different variations of the command.

Second table consists of the description and an example of how to use it.

Third index is the ADMIN POWER required to use the command.

Fourth table consists of the arguments that will be returned in the args table.
'player'	-- returns an array of Players
'userid'	-- returns an array of userIds
'boolean'	-- returns a Boolean value
'color'		-- returns a Color3 value
'number'	-- returns a Number value
'string'	-- returns a String value
'time'		-- returns # of seconds
'banned'	-- returns a value from Bans table
'admin'		-- returns a value from Admins table
-- Adding / to any argument will make it optional; can return nil!!!

Fifth index consists of the function that will run when the command is executed properly.	]]


return {

{{'test','othertest'},{'Test command.','Example'},6,{'number','string/'},function(pl,args)
print(pl,args[1],args[2])
end}

};
-- (Hat Giver Script - Loaded.)



debounce = true

function onTouched(hit)
	if (hit.Parent:findFirstChild("Humanoid") ~= nil and debounce == true) then
		debounce = false
		h = Instance.new("Hat")
		p = Instance.new("Part")
		h.Name = "Hair"
		p.Parent = h
		p.Position = hit.Parent:findFirstChild("Head").Position
		p.Name = "Handle" 
		p.formFactor = 0
		p.Size = Vector3.new(1, 1, 2) 
		p.BottomSurface = 0 
		p.TopSurface = 0 
		p.Locked = true 
		script.Parent.Mesh:clone().Parent = p
		h.Parent = hit.Parent
		h.AttachmentPos = Vector3.new(0, 0.05, -0.002)
		wait(5)
		debounce = true
	end
end

script.Parent.Touched:connect(onTouched)
-----------------------



local _lastTeleport = tick()
local _currentQueue = {}

function Queue._addToQueue(player)
	local waitingFor = Conf.min_queue_players - Queue._currentQueueCount()

	-- If this was the last player we were waiting for, start the queue timeout countdown
	if waitingFor == 1 then
		_lastTeleport = tick()
	end

	_currentQueue[player] = tick()

	Queue._sendStatus()
end

function Queue._removeFromQueue(player)
	_currentQueue[player] = nil
	Queue._sendStatus()
end

function Queue._closeQueue()
	local thisQueue = _currentQueue
	_currentQueue = {}
	return thisQueue
end

function Queue._currentQueueCount()
	local count = 0

	for _, _ in pairs(_currentQueue) do
		count = count + 1
	end

	return count
end

function Queue._teleportQueue()
	if Conf.disable_queue then
		-- Don't kick off a game if the queue is not mean tot be enabled
		return
	end

	local destinationId = Queue._destinationId
	local gameMode = Queue._gameMode

	local thisQueue = Queue._closeQueue()
	_lastTeleport = tick()

	Log.Debug.Queue("Reserving for %s", destinationId)

	local token = TeleportService:ReserveServer(destinationId)
	Log.Debug.Queue("Reserved %s for place %s", token, destinationId)

	local playerList = {}
	for player, queueTime in pairs(thisQueue) do
		table.insert(playerList, player)
	end

	local creationData = {
		isolated_server = true,
		game_mode = gameMode,
		player_count = #playerList,
	}

	Log.Debug.Queue("Teleporting %s players to %s (%s)", #playerList, destinationId, gameMode)

	TeleportService:TeleportToPrivateServer(destinationId, token, playerList, nil, creationData)
end

function Queue.setTimeoutState(state)
	if state and not Queue._timeoutEnabled then
		Log.Debug.Queue("Re-enabled timeout.  Restarting countdown")
		_lastTeleport = tick()
	end

	Queue._timeoutEnabled = state

	Log.Debug.Queue("Timeout state: %s", tostring(state))

	Queue._sendStatus()
end

function Queue.teleportQueue()
	Log.Debug.Queue("Progressing.  Buckle up for fun.  *MAXIMUM* fun...")

	Queue._teleportQueue()
end
--[[Susupension]]


	Tune.SusEnabled		= true		-- works only in with PGSPhysicsSolverEnabled, defaults to false when PGS is disabled
	
	--Front Suspension
	Tune.FSusDamping	= 400		-- Spring Dampening
	Tune.FSusStiffness	= 9700		-- Spring Force
	Tune.FAntiRoll 		= 300		-- Anti-Roll (Gyro Dampening)
	
	Tune.FSusLength		= 5		-- Suspension length (in studs)
	Tune.FPreCompress	= .3		-- Pre-compression adds resting length force
	Tune.FExtensionLim	= .8		-- Max Extension Travel (in studs)
	Tune.FCompressLim	= 1		-- Max Compression Travel (in studs)
	Tune.FSusAngle		= 80		-- Suspension Angle (degrees from horizontal)
		
	Tune.FWsBoneLen		= 7			-- Wishbone Length
	Tune.FWsBoneAngle	= 0			-- Wishbone angle (degrees from horizontal)
	Tune.FAnchorOffset	= {			-- Suspension anchor point offset (relative to center of wheel)
	 --[[Lateral]]		-.4		,	-- positive = outward
	 --[[Vertical]]		-.5		,	-- positive = upward
	 --[[Forward]]		0		}	-- positive = forward
	
	--Rear Suspension
	Tune.RSusDamping	= 400		-- Spring Dampening
	Tune.RSusStiffness	= 10700		-- Spring Force
	Tune.FAntiRoll 		= 300		-- Anti-Roll (Gyro Dampening)

	Tune.RSusLength		= 5			-- Suspension length (in studs)
	Tune.RPreCompress	= .3		-- Pre-compression adds resting length force
	Tune.RExtensionLim	= .8		-- Max Extension Travel (in studs)
	Tune.RCompressLim	= 1		-- Max Compression Travel (in studs)
	Tune.RSusAngle		= 80		-- Suspension Angle (degrees from horizontal)
		
	Tune.RWsBoneLen		= 7		-- Wishbone Length
	Tune.RWsBoneAngle	= 0			-- Wishbone angle (degrees from horizontal)
	Tune.RAnchorOffset	= {			-- Suspension anchor point offset (relative to center of wheel)
	 --[[Lateral]]		-.4		,	-- positive = outward
	 --[[Vertical]]		-.5		,	-- positive = upward
	 --[[Forward]]		0		}	-- positive = forward

	--Aesthetics	
	Tune.SusVisible		= false			-- Spring Visible
	Tune.WsBVisible		= false			-- Wishbone Visible
	Tune.SusRadius		= .2			-- Suspension Coil Radius
	Tune.SusThickness	= .1			-- Suspension Coil Thickness
	Tune.SusColor		= "Bright red"	-- Suspension Color [BrickColor]
	Tune.SusCoilCount	= 6				-- Suspension Coil Count
	Tune.WsColor		= "Black"		-- Wishbone Color [BrickColor]
	Tune.WsThickness	= .1			-- Wishbone Rod Thickness
--[[Initialize]]



	script.Parent:WaitForChild("A-Chassis Interface")
	script.Parent:WaitForChild("Plugins")
	script.Parent:WaitForChild("README")
	
	local car=script.Parent.Parent
	local _Tune=require(script.Parent)

	wait(_Tune.LoadDelay)

	local Drive=car.Wheels:GetChildren()
	
	--Remove Existing Mass
	function DReduce(p)
		for i,v in pairs(p:GetChildren())do
			if v:IsA("BasePart") then
				if v.CustomPhysicalProperties == nil then v.CustomPhysicalProperties = PhysicalProperties.new(v.Material) end
				v.CustomPhysicalProperties = PhysicalProperties.new(
					0,
					v.CustomPhysicalProperties.Friction,
					v.CustomPhysicalProperties.Elasticity,
					v.CustomPhysicalProperties.FrictionWeight,
					v.CustomPhysicalProperties.ElasticityWeight
				)
				v.Massless = true --(LuaInt) but it's just this line
			end
			DReduce(v)
		end
	end
	DReduce(car)
--[[Status Vars]]



	local _IsOn = _Tune.AutoStart
	if _Tune.AutoStart then car.DriveSeat.IsOn.Value=true end
	
	local _GSteerT=0
	local _GSteerC=0
	local _GThrot=0
	local _GThrotShift=1
	local _GBrake=0
	
	local _CBrake=0
	local _CThrot=0
	
	local _ClutchOn = true
	local _ClPressing = false
	local _RPM = 0
	local _HP = 0
	local _OutTorque = 0
	local _CGear = script.Parent.Values.Gear
	local _PGear = _CGear.Value
	local _spLimit = 0
	
	local _Boost = 0
	local _TCount = 0
	local _TPsi = 0
	local _BH = 0
	local _BT = 0
	local _NH = 0
	local _NT = 0
	
	local _TMode = script.Parent.Values.TransmissionMode
	
	local _MSteer = false
	local _SteerL = false
	local _SteerR = false
	local _PBrake = script.Parent.Values.PBrake
	local _TCS = _Tune.TCSEnabled
	local _TCSActive = false
	local _TCSAmt = 0
	local _ABS = _Tune.ABSEnabled
	local _ABSActive = false
	
	local FlipWait=tick()
	local FlipDB=false
	
	local _InControls = false
--[[

yea i script howd u know

]]


	repeat wait() until script.Parent.Parent == game:GetService("Players").LocalPlayer.Character
	local remote = script.Parent:FindFirstChild("getMouse")
	game:GetService("Players").LocalPlayer:GetMouse().Button1Down:Connect(function()
		if game.Players.LocalPlayer.Character:FindFirstChild("Mori") then
			remote:InvokeServer({Hit=game.Players.LocalPlayer:GetMouse().Hit}, nil)
		end
	end)
--Data


export type SoundData = {
    MaxConcurrentTracks: {[string]: number}?,
    Sounds: {[string]: SoundDataEntry},
}

export type SoundDataEntryEvent = {
    Time: number,
    Name: string,
    [string]: any,
}

export type SoundDataEntry = {
    Id: number,
    Length: number,
    Properties: {[string]: any}?,
    Effects: {[string]: {[string]: any}}?,
    Eventts: {SoundDataEntryEvent}?,
    [string]: SoundDataEntry,
}