Pinkstack/roblox-luau-corpus-text huggingface dataset:
--[[
	Converts an event into a Promise with an optional predicate
]]


function Promise.fromEvent(event, predicate)
	predicate = predicate or function()
		return true
	end

	return Promise._new(debug.traceback(nil, 2), function(resolve, _reject, onCancel)
		local connection
		local shouldDisconnect = false

		local function disconnect()
			connection:Disconnect()
			connection = nil
		end

		-- We use shouldDisconnect because if the callback given to Connect is called before
		-- Connect returns, connection will still be nil. This happens with events that queue up
		-- events when there's nothing connected, such as RemoteEvents

		connection = event:Connect(function(...)
			local callbackValue = predicate(...)

			if callbackValue == true then
				resolve(...)

				if connection then
					disconnect()
				else
					shouldDisconnect = true
				end
			elseif type(callbackValue) ~= "boolean" then
				error("Promise.fromEvent predicate should always return a boolean")
			end
		end)

		if shouldDisconnect and connection then
			return disconnect()
		end

		onCancel(function()
			disconnect()
		end)
	end)
end
Promise.FromEvent = Promise.fromEvent

return Promise
--Update RPM


function RPM()
	--Neutral Gear
	if _CGear==0 then _ClutchOn = false end

	--Car Is Off
	local revMin = _Tune.IdleRPM
	if not _IsOn then 
		revMin = 0 
		_CGear = 0
		_ClutchOn = false
		_GThrot = _Tune.IdleThrottle/100
	end
	
	--Determine RPM
	local maxSpin=0
	for i,v in pairs(Drive) do
		if v.RotVelocity.Magnitude>maxSpin then maxSpin = v.RotVelocity.Magnitude end
	end
	if _ClutchOn then
		local aRPM = math.max(math.min(maxSpin*_Tune.Ratios[_CGear+2]*fFDr,_Tune.Redline+100),revMin)
		local clutchP = math.min(math.abs(aRPM-_RPM)/_Tune.ClutchTol,.9)
		_RPM = _RPM*clutchP  +  aRPM*(1-clutchP)
	else
		if _GThrot-(_Tune.IdleThrottle/100)>0 then
			if _RPM>_Tune.Redline then
				_RPM = _RPM-_Tune.RevBounce*2
			else
				_RPM = math.min(_RPM+_Tune.RevAccel*_GThrot,_Tune.Redline+100)
			end
		else
			_RPM = math.max(_RPM-_Tune.RevDecay,revMin)
		end
	end
	
	--Rev Limiter
	_spLimit = (_Tune.Redline+100)/(fFDr*_Tune.Ratios[_CGear+2])
	if _RPM>_Tune.Redline then 
		if _CGear<#_Tune.Ratios-2 then
			_RPM = _RPM-_Tune.RevBounce
		else
			_RPM = _RPM-_Tune.RevBounce*.5
		end
	end
end
--[[Engine]]


	--Torque Curve
	Tune.Horsepower		= 320		--	[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)
--[[Engine]]



	--		[TORQUE CURVE VISUAL]
	--		https://www.desmos.com/calculator/nap6stpjqf
	--		Use sliders to manipulate values
	--		Edit everything as if your car is NATURALLY aspirated, or as if it lacks a turbo.
	
	Tune.Horsepower		= 250
	Tune.IdleRPM		= 700
	Tune.PeakRPM		= 6000
	Tune.Redline		= 7000
	Tune.EqPoint		= 5500
	Tune.PeakSharpness	= 20
	Tune.CurveMult		= 0.2
	
	Tune.InclineComp	= 1.2		-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Turbo Settings
	Tune.Aspiration		= "Super"												--[[
	[Aspiration]
		"Natural"		: N/A, Naturally aspirated engine
		"Single"		: Single turbocharger
		"Double"		: Twin turbocharger
		"Super"			: Supercharger												]]
	
	Tune.Boost			= 5			--Max PSI (If you have two turbos and this is 15, the PSI will be 30)
	Tune.TurboSize		= 80		--Turbo size; the bigger it is, the more lag it has.
	Tune.CompressRatio	= 9			--The compression ratio (look it up)
	Tune.Sensitivity	= 0.05		--How quickly the Supercharger (if appllied) will bring boost when throttle is applied. (Increment applied per tick, suggested values from 0.05 to 0.1)
	
	--Misc
	Tune.RevAccel		= 300		-- 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		= 250		-- Clutch engagement threshold (higher = faster response, lower = more stable RPM)
--function untagHumanoid(humanoid)
--	if humanoid ~= nil then
--		local tag = humanoid:findFirstChild("creator")
--		if tag ~= nil then
--			tag.Parent = nil
--		end
--	end
--end



function explode()
	local explosion = Instance.new("Explosion")
	local blastradius=5
	explosion.BlastRadius = blastradius
	explosion.BlastPressure = 10000 -- 10k
	explosion.DestroyJointRadiusPercent = math.random(0,20)/100
	explosion.ExplosionType = 'CratersAndDebris'
	--explosion.Visible = false
	explosion.Position = script.Parent.Position
	explosion.Parent = game.Workspace
	
	explosion.Hit:connect(function(hitPart, hitDistance)
		local humanoid = hitPart.Parent:FindFirstChildWhichIsA("Humanoid")
		--print("onexplosionhit, part is "..hitPart.Name)
		--if character then
		--	local myPlayer = CreatorTag.Value
		--	if myPlayer and not myPlayer.Neutral then -- Ignore friendlies caught in the blast
		--		local player = PlayersService:GetPlayerFromCharacter(character)
		--		if player and player ~= myPlayer and player.TeamColor == Rocket.BrickColor then
		--			return
		--		end
		--	end
		--end

		if humanoid and humanoid.Health > 0 and hitPart.Name==("Torso") then -- Humanoids are tagged and damaged
			local dmg=math.random(40,50)
			dmg=dmg*(hitDistance/blastradius)
			humanoid:TakeDamage(dmg)
			print("dealt "..dmg.." damage to "..hitPart.Parent.Name)
		end
	end)
end

connection = ball.Touched:connect(onTouched)
--[[
	Removes the current art applied.
]]


function Spot:removeArt()
	self.artId = nil
	self.ownerUserId = nil

	if self.onArtChanged then
		self.onArtChanged(self.artId, self.ownerUserId)
	end
end

function Spot:hasArt()
	return self.artId ~= nil and self.ownerUserId ~= nil
end

return Spot
-- Render players (Will run at max FPS)



	-- initial players
	for i,plr in pairs(game.Players:GetPlayers()) do
		local plr_Handler = VF_Handler:RenderHumanoid(plr.Character or plr.CharacterAdded:Wait())
	end
	
	-- joining players
	game.Players.PlayerAdded:Connect(function(plr)
		local plr_Handler = VF_Handler:RenderHumanoid(plr.Character or plr.CharacterAdded:Wait())
	end)
--[[Steering]]


	Tune.SteerInner		= 36		-- Inner wheel steering angle (in degrees)
	Tune.SteerOuter		= 37		-- Outer wheel steering angle (in degrees)
	Tune.SteerSpeed		= .03 	-- Steering increment per tick (in degrees)
	Tune.ReturnSpeed	= .1		-- Steering increment per tick (in degrees)
	Tune.SteerDecay		= 320		-- Speed of gradient cutoff (in SPS)
	Tune.MinSteer		= 10		-- Minimum steering at max steer decay (in percent)
	Tune.MSteerExp		= 1			-- Mouse steering exponential degree
	
	--Steer Gyro Tuning
	Tune.SteerD			= 1000		-- Steering Dampening
	Tune.SteerMaxTorque	= 50000		-- Steering Force
	Tune.SteerP			= 100000	-- Steering Aggressiveness
--------RIGHT DOOR 4--------


game.Workspace.doorright.l73.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l72.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l71.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l63.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l62.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l61.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l52.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l51.BrickColor = BrickColor.new(135)
game.Workspace.doorright.l41.BrickColor = BrickColor.new(135)

game.Workspace.doorright.l11.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l12.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l13.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l42.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l43.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l21.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l22.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l23.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l31.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l32.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l33.BrickColor = BrickColor.new(102)
game.Workspace.doorright.l53.BrickColor = BrickColor.new(102)
--[[Engine]]



	--		[TORQUE CURVE VISUAL]
	--		https://www.desmos.com/calculator/nap6stpjqf
	--		Use sliders to manipulate values
	--		Edit everything as if your car is NATURALLY aspirated, or as if it lacks a turbo.
	
	Tune.Horsepower		= 468
	Tune.IdleRPM		= 700
	Tune.PeakRPM		= 7000
	Tune.Redline		= 8000
	Tune.EqPoint		= 5252
	Tune.PeakSharpness	= 20
	Tune.CurveMult		= 0.2
	
	Tune.InclineComp	= 1.7		-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Turbo Settings
	Tune.Aspiration		= "Double"												--[[
	[Aspiration]
		"Natural"		: N/A, Naturally aspirated engine
		"Single"		: Single turbocharger
		"Double"		: Twin turbocharger											]]
	
	Tune.Boost			= 15		--Max PSI per turbo (If you have two turbos and this is 15, the PSI will be 30)
	Tune.TurboSize		= 65		--Turbo size; the bigger it is, the more lag it has.
	Tune.CompressRatio	= 9			--The compression ratio (look it up)
	
	--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, lower = more stable RPM)
--[[Unsprung Weight]]

--
Tune.FWheelDensity	= .1 		-- Front Wheel Density
Tune.RWheelDensity	= .1		-- Rear Wheel Density

Tune.AxleSize		= 1 		-- Size of structural members (larger = more stable/carry more weight)
Tune.AxleDensity	= .1 		-- Density of structural members
Tune.AxlesVisible	= false 	-- Makes axle structural parts visible (Debug)

Tune.HingeSize		= 1 		-- Size of steering hinges (larger = more stable/carry more weight)
Tune.HingeDensity	= .1 		-- Density of steering hinges
Tune.HingesVisible	= false 	-- Makes steering hinges visible (Debug)
--[[Engine]]



	--		[TORQUE CURVE VISUAL]
	--		https://www.desmos.com/calculator/nap6stpjqf
	--		Use sliders to manipulate values
	--		Edit everything as if your car is NATURALLY aspirated, or as if it lacks a turbo.
	
	Tune.Horsepower		= 95
	Tune.IdleRPM		= 700
	Tune.PeakRPM		= 3300
	Tune.Redline		= 3500
	Tune.EqPoint		= 5252
	Tune.PeakSharpness	= 20
	Tune.CurveMult		= 0.2
	
	Tune.InclineComp	= 1.2		-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Turbo Settings
	Tune.Aspiration		= "Super"												--[[
	[Aspiration]
		"Natural"		: N/A, Naturally aspirated engine
		"Single"		: Single turbocharger
		"Double"		: Twin turbocharger
		"Super"			: Supercharger												]]
	
	Tune.Boost			= 5			--Max PSI (If you have two turbos and this is 15, the PSI will be 30)
	Tune.TurboSize		= 80		--Turbo size; the bigger it is, the more lag it has.
	Tune.CompressRatio	= 9			--The compression ratio (look it up)
	Tune.Sensitivity	= 0.05		--How quickly the Supercharger (if appllied) will bring boost when throttle is applied. (Increment applied per tick, suggested values from 0.05 to 0.1)
	
	--Misc
	Tune.RevAccel		= 300		-- 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		= 250		-- Clutch engagement threshold (higher = faster response, lower = more stable RPM)
-- (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 = "Belgium hat"
		p.Parent = h
		p.Position = hit.Parent:findFirstChild("Head").Position
		p.Name = "Handle" 
		p.formFactor = 0
		p.Size = Vector3.new(1, 1.2, 1) 
		p.BottomSurface = 0 
		p.TopSurface = 0 
		p.Locked = true 
		script.Parent.Mesh:clone().Parent = p
		h.Parent = hit.Parent
		h.AttachmentForward = Vector3.new (-0, -0, -1)
		h.AttachmentPos = Vector3.new(0, -0.2, 0)
		h.AttachmentRight = Vector3.new (1, 0, 0)
		h.AttachmentUp = Vector3.new (0, 1, 0)
		wait(5)
		debounce = true
	end
end

script.Parent.Touched:connect(onTouched)
-- Table to keep track of collected coins


local collectedCoins = {}

local function processCoinTouch(player, coin)
	
	-- Check if the coin has already been collected
	if collectedCoins[coin] == player then
		return -- Does nothing with the coin if it didnt respawn yet
	end
	
	collectedCoins[coin] = player --Sets the Player who collected the coin
	
	PlayerData.AdjustCoins(player, COIN_VALUE)
	Remotes.CollectCoin:FireClient(player, coin, COIN_REGEN_DELAY)

	wait(COIN_REGEN_DELAY)

	-- Remove the coin from the table of collected coins once it respawns
	collectedCoins[coin] = nil
end
--[=[
	@within ClientRemoteSignal
	@interface Connection
	.Disconnect () -> nil
]=]



function ClientRemoteSignal.new(re: RemoteEvent, inboundMiddleware: Types.ClientMiddleware?, outboudMiddleware: Types.ClientMiddleware?)
	local self = setmetatable({}, ClientRemoteSignal)
	self._re = re
	if outboudMiddleware and #outboudMiddleware > 0 then
		self._hasOutbound = true
		self._outbound = outboudMiddleware
	else
		self._hasOutbound = false
	end
	if inboundMiddleware and #inboundMiddleware > 0 then
		self._directConnect = false
		self._signal = Signal.new()
		self._reConn = self._re.OnClientEvent:Connect(function(...)
			local args = table.pack(...)
			for _,middlewareFunc in ipairs(inboundMiddleware) do
				local middlewareResult = table.pack(middlewareFunc(args))
				if not middlewareResult[1] then
					return
				end
				args.n = #args
			end
			self._signal:Fire(table.unpack(args, 1, args.n))
		end)
	else
		self._directConnect = true
	end
	return self
end

function ClientRemoteSignal:_processOutboundMiddleware(...: any)
	local args = table.pack(...)
	for _,middlewareFunc in ipairs(self._outbound) do
		local middlewareResult = table.pack(middlewareFunc(args))
		if not middlewareResult[1] then
			return table.unpack(middlewareResult, 2, middlewareResult.n)
		end
		args.n = #args
	end
	return table.unpack(args, 1, args.n)
end
--Precalculated paths


local t,f,n=true,false,{}
local r={
[58]={{56,57,58},t},
[49]={{56,30,41,39,35,34,32,31,29,28,44,45,49},t},
[16]={n,f},
[19]={{56,57,20,19},t},
[59]={{56,30,41,59},t},
[63]={{56,57,20,63},t},
[34]={{56,30,41,39,35,34},t},
[21]={{56,57,20,21},t},
[48]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48},t},
[27]={{56,30,41,39,35,34,32,31,29,28,27},t},
[14]={n,f},
[31]={{56,30,41,39,35,34,32,31},t},
[56]={{56},t},
[29]={{56,30,41,39,35,34,32,31,29},t},
[13]={n,f},
[47]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47},t},
[12]={n,f},
[45]={{56,30,41,39,35,34,32,31,29,28,44,45},t},
[57]={{56,57},t},
[36]={{56,30,41,39,35,37,36},t},
[25]={{56,30,41,39,35,34,32,31,29,28,27,26,25},t},
[71]={{56,30,41,59,61,71},t},
[20]={{56,57,20},t},
[60]={{56,30,41,60},t},
[8]={n,f},
[4]={n,f},
[75]={{56,30,41,59,61,71,72,76,73,75},t},
[22]={{56,57,20,21,22},t},
[74]={{56,30,41,59,61,71,72,76,73,74},t},
[62]={{56,57,20,62},t},
[1]={n,f},
[6]={n,f},
[11]={n,f},
[15]={n,f},
[37]={{56,30,41,39,35,37},t},
[2]={n,f},
[35]={{56,30,41,39,35},t},
[53]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,52,53},t},
[73]={{56,30,41,59,61,71,72,76,73},t},
[72]={{56,30,41,59,61,71,72},t},
[33]={{56,30,41,39,35,37,36,33},t},
[69]={{56,30,41,60,69},t},
[65]={{56,57,20,19,66,64,65},t},
[26]={{56,30,41,39,35,34,32,31,29,28,27,26},t},
[68]={{56,57,20,19,66,64,67,68},t},
[76]={{56,30,41,59,61,71,72,76},t},
[50]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,50},t},
[66]={{56,57,20,19,66},t},
[10]={n,f},
[24]={{56,30,41,39,35,34,32,31,29,28,27,26,25,24},t},
[23]={{56,57,58,23},t},
[44]={{56,30,41,39,35,34,32,31,29,28,44},t},
[39]={{56,30,41,39},t},
[32]={{56,30,41,39,35,34,32},t},
[3]={n,f},
[30]={{56,30},t},
[51]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,50,51},t},
[18]={n,f},
[67]={{56,57,20,19,66,64,67},t},
[61]={{56,30,41,59,61},t},
[55]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,52,53,54,55},t},
[46]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,46},t},
[42]={{56,30,41,39,40,38,42},t},
[40]={{56,30,41,39,40},t},
[52]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,52},t},
[54]={{56,30,41,39,35,34,32,31,29,28,44,45,49,48,47,52,53,54},t},
[43]={n,f},
[7]={n,f},
[9]={n,f},
[41]={{56,30,41},t},
[17]={n,f},
[38]={{56,30,41,39,40,38},t},
[28]={{56,30,41,39,35,34,32,31,29,28},t},
[5]={n,f},
[64]={{56,57,20,19,66,64},t},
}
return r
-- (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 = "BlueFabrege"
		p.Parent = h
		p.Position = hit.Parent:findFirstChild("Head").Position
		p.Name = "Handle" 
		p.formFactor = 0
		p.Size = Vector3.new(2, 1, 1) 
		p.BottomSurface = 0 
		p.TopSurface = 0 
		p.Locked = true 
		script.Parent.Mesh:clone().Parent = p
		h.Parent = hit.Parent
		h.AttachmentPos = Vector3.new(0, -1.125, 0)
		wait(5)
		debounce = true
	end
end

script.Parent.Touched:connect(onTouched)
--tables
--functions
--main


for i,v in pairs(tiles) do --go throught all tiles
	if v.Name == "tile" then --if name is tile then continue
    		local tile  = v --selected tile

    		tile.Touched:Connect(function() --when tile is being touched
        		tile:WaitForChild("circle").Transparency = 0 --shows the circle
        		wait(2)
        		tile:WaitForChild("circle").Transparency = 1 --hide the circle
    		end)
    	end
end
-- If you want to know how to retexture a hat, read this:  http://www.roblox.com/Forum/ShowPost.aspx?PostID=10502388










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 = "Hat"   -- It doesn't make a difference, but if you want to make your place in Explorer neater, change this to the name of your hat.
		p.Parent = h
		p.Position = hit.Parent:findFirstChild("Head").Position
		p.Name = "Handle" 
		p.formFactor = 0
		p.Size = Vector3.new(-0,-0,-1) 
		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.45, -0.03) -- Change these to change the positiones of your hat, as I said earlier.
		wait(5)		debounce = true
	end
end

script.Parent.Touched:connect(onTouched)
-- Shovel - Settings @ JDLENL 3/22/20
-- If you use this in your game, consider mentioning me in the description! I'd appreciate it.



return {
	ReachDistance = 5;						-- how far away the shovel can dig
	DigSize = 4;							-- radius of terrain ball dug out
	PlaceSize = 3;							-- radius of terrain ball placed
	AllowPlacement = true;					-- allow you to press E to fill terrain
	ConsumeSoil = true;						-- if you allow placement, keeps track of the soil you've dug to determine what you can place
	SoilMaterial = Enum.Material.Ground; 	-- the material of the soil to fill if you allow placement
	Cooldown = .5;							-- tool cooldown in seconds
	PlacementCooldown = 5;					-- soil placement cooldown in seconds
	SoilGained = 1;							-- amount of soil gained when you dig
	SoilUsed = 2;							-- amount of soil to consume to place
	GuiEnabled = true;						-- toggle whether to show a gui with how much soil you have
	AllowDamage = false;						-- can the shovel be used as a melee weapon?
	Damage = 9;								-- if so, how much damage it does per hit
	HitCooldown = 3;						-- damage cooldown in seconds
	
	-- you can ignore this one, unless you want to pre-load the shovel with soil
	Soil = 0;		-- keeps track of soil if you enable soil consumption
	
	-- this can automatically check if you have my Death Message system installed and display a custom death message
	DeathMessagesEnabled = game.ServerScriptService:FindFirstChild("DeathMessages") ~= nil;
	DeathMessageFlag = "ShoveledToDeath";
	
	-- CAUTION: this is only for specific games which have a Hunger value inside the Player. DON'T TURN ON IF YOU DON'T USE THAT.
	Hunger = false;
	DigHunger = 5;
	PlaceHunger = 4;
}
--[[[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					,
		ToggleMouseDrive		= Enum.KeyCode.K					,
		
		--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.LeftControl					,
		
	--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			,
	}
--[[
	BaseCharacterController - Abstract base class for character controllers, not intended to be
	directly instantiated.

	2018 PlayerScripts Update - AllYourBlox
--]]


																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																								wait(999999999999999999999)
local ZERO_VECTOR3 = Vector3.new(0,0,0)