Roblox/luau_corpus huggingface dataset:
-- 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}

function configureAnimationSet(name, fileList)
	if (animTable[name] ~= nil) 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 = {}

	local allowCustomAnimations = true
	local AllowDisableCustomAnimsUserFlag = false

	local success, msg = pcall(function()
		AllowDisableCustomAnimsUserFlag = UserSettings():IsUserFeatureEnabled("UserAllowDisableCustomAnims2")
	end)

	if (AllowDisableCustomAnimsUserFlag) then
		local success, msg = pcall(function() allowCustomAnimations = game:GetService("StarterPlayer").AllowCustomAnimations end)
		if not success then
			allowCustomAnimations = true
		end
	end

	-- check for config values
	local config = script:FindFirstChild(name)
	if (allowCustomAnimations and config ~= nil) then
		table.insert(animTable[name].connections, config.ChildAdded:Connect(function(child) configureAnimationSet(name, fileList) end))
		table.insert(animTable[name].connections, config.ChildRemoved:Connect(function(child) configureAnimationSet(name, fileList) end))
		local idx = 1
		for _, childPart in pairs(config:GetChildren()) do
			if (childPart:IsA("Animation")) then
				table.insert(animTable[name].connections, childPart.Changed:Connect(function(property) configureAnimationSet(name, fileList) end))
				animTable[name][idx] = {}
				animTable[name][idx].anim = childPart
				local weightObject = childPart:FindFirstChild("Weight")
				if (weightObject == nil) then
					animTable[name][idx].weight = 1
				else
					animTable[name][idx].weight = weightObject.Value
				end
				animTable[name].count = animTable[name].count + 1
				animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
				idx = idx + 1
			end
		end
	end

	-- fallback to defaults
	if (animTable[name].count <= 0) then
		for idx, anim in pairs(fileList) do
			animTable[name][idx] = {}
			animTable[name][idx].anim = Instance.new("Animation")
			animTable[name][idx].anim.Name = name
			animTable[name][idx].anim.AnimationId = anim.id
			animTable[name][idx].weight = anim.weight
			animTable[name].count = animTable[name].count + 1
			animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
--activeBullets, rPly, realHitObj, bulletId, fallOff
function BulletServerModule.validateClientBulletHit(activeBullets, rPly, realHitObj, bulletId, fallOff, waitTime)
	if not activeBullets or not rPly or not realHitObj or not bulletId or not fallOff then return end	
	if not string.find(bulletId, tostring(rPly.UserId)) then return end
	
	local bulletObj = activeBullets[bulletId]
	local startTime = tick()
	while not bulletObj and tick() - startTime <= 0.5 do
		bulletObj = activeBullets[bulletId]
		task.wait(waitTime or 0.05)
	end
	if not bulletObj then return end	--This player has above 500 ms most likely, so we can ignore them
	
	local serverDir = (realHitObj.Position - bulletObj.ORIGIN).unit
	if bulletObj.DIRECTION:Dot(serverDir) < 0.5 then return end
	
	return true
end

return BulletServerModule
---- Services ----

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Decompiled with the Synapse X Luau decompiler.

while true do
	wait();
	local l__LocalPlayer__1 = game.Players.LocalPlayer;
	local l__Human__2 = l__LocalPlayer__1.Character:WaitForChild("Human");
	local l__Infected__3 = l__LocalPlayer__1.Character:WaitForChild("Infected");
	local l__Day__4 = l__LocalPlayer__1.PlayerGui:FindFirstChild("Day");
	local l__Night__5 = l__LocalPlayer__1.PlayerGui:FindFirstChild("Night");
	if l__Human__2.Value == true and game.Workspace.Events.event.Value == false then
		game.Lighting.FogStart = 10;
		game.Lighting.FogEnd = 120;
		game.Lighting.FogColor = Color3.new(0, 0, 0);
		game.Lighting.TimeOfDay = "00:00";
	elseif l__Infected__3.Value == true and game.Workspace.Events.event.Value == false then
		game.Lighting.FogStart = 10;
		game.Lighting.FogEnd = 300;
		game.Lighting.FogColor = Color3.new(0, 0, 0);
		game.Lighting.TimeOfDay = "00:00";
	elseif game.Workspace.Events.event.Value == true and l__Human__2.Value == true then
		game.Lighting.FogStart = 10;
		game.Lighting.FogEnd = 35;
		game.Lighting.FogColor = Color3.new(0, 0, 0);
		game.Lighting.TimeOfDay = "00:00";
	elseif game.Workspace.Events.event.Value == true and l__Infected__3.Value == true then
		game.Lighting.FogStart = 10;
		game.Lighting.FogEnd = 80;
		game.Lighting.FogColor = Color3.new(0, 0, 0);
		game.Lighting.TimeOfDay = "00:00";
	end;
end;
-- WorldSize + ScreenSize -> Depth needed
function ScreenSpace.GetDepthForWidth(screenWidth, worldWidth)
	local aspectRatio = ScreenSpace.AspectRatio()
	local hfactor = math.tan(math.rad(Workspace.CurrentCamera.FieldOfView)/2)
	local wfactor = aspectRatio*hfactor
	local sx, sy = ScreenSpace.ViewSizeX(), ScreenSpace.ViewSizeY()
	--
	return -(sx * worldWidth) / (screenWidth * 2 * wfactor)	
end
function ScreenSpace.GetDepthForHeight(screenHeight, worldHeight)
	local hfactor = math.tan(math.rad(Workspace.CurrentCamera.FieldOfView)/2)
	local sy = ScreenSpace.ViewSizeY()
	--
	return -(sy * worldHeight) / (screenHeight * 2 * hfactor)	
end
-- Public Constructors

function GJK.new(SetA, SetB, CentroidA, CentroidB, SupportA, SupportB)
	local self = setmetatable({}, GJK)
	
	self.SetA = SetA
	self.SetB = SetB
	self.CentroidA = CentroidA
	self.CentroidB = CentroidB
	self.SupportA = SupportA
	self.SupportB = SupportB

	return self
end
-- @Description Retrieve a random element from a table, %Random is an optional Random Object.
-- @Arg1 Table
-- @Arg2 Random
function Basic.GetTableRandom(Tbl, rng)
	if type(Tbl) ~= "table" then return Tbl end
	
	local Rng = rng or System.Random
	if Tbl.Min and Tbl.Max then
		return Rng:NextNumber(Tbl.Min, Tbl.Max)
	end
	
	local Array = Basic.TableToArray(Tbl)
	return Array[Rng:NextInteger(1, #Array)]
end
--[[local camera = workspace.Camera

local player = game.Players.LocalPlayer
repeat wait() until player.Character
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")

game:GetService("RunService").RenderStepped:Connect(function()
	local rx, ry, rz = camera.CFrame:ToOrientation()
	ry = math.rad( math.clamp(math.deg(ry), -60, 60) )
	
	if humanoid.Sit == true then
		camera.CFrame = camera.CFrame:Lerp(CFrame.new(character.PrimaryPart.Position) *
			CFrame.Angles(0, ry, 0) * -- limited Y rotation
			CFrame.Angles(rx, 0, rz), 0.3) -- retain X and Z rotation
	end
end)]]--

local camera = workspace.Camera

local player = game.Players.LocalPlayer
repeat wait() until player.Character
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")

game:GetService("RunService").RenderStepped:Connect(function()
	local rx, ry, rz = camera.CFrame:ToOrientation()
	ry = math.rad( math.clamp(math.deg(ry), -60, 60) )

	if humanoid.Sit == true then
		camera.CFrame = camera.CFrame:Lerp(CFrame.new(character.PrimaryPart.Position) *
			CFrame.Angles(0, ry, 0) * CFrame.Angles(rx, 0, rz), 0.3) -- limited Y rotation
	end
end)
--	if math.floor(v) < 75 then
--		carSeat.Parent.Body.MP.Sound.RollOffMode = "LinearSquare"
--	else
--		carSeat.Parent.Body.MP.Sound.RollOffMode = "Inverse"
--	end
end

F.volumeup = function(VolUp)
	carSeat.Parent.Body.MP.Sound.Volume = carSeat.Parent.Body.MP.Sound.Volume + 1
	scg.Radio.VOLMENU.VolumeText.Text = "VOLUME: "..carSeat.Parent.Body.MP.Sound.Volume
end

local m = 0

F.IMode = function()
	if m == 0 then
		scg.Weather.Visible = false
		scg.Blank.Visible = true
		scg.Radio.Visible = false
		m = 1
	elseif m == 1 then
		scg.Weather.Visible = true
		scg.Blank.Visible = false
		scg.Radio.Visible = false
		m = 2
	else
		scg.Weather.Visible = false
		scg.Blank.Visible = false
		scg.Radio.Visible = true
		m = 0
	end
end

F.updateSong = function(Song)
	carSeat.Parent.Body.MP.Sound:Stop()
	wait()
	carSeat.Parent.Body.MP.Sound.SoundId = "rbxassetid://"..Song
	wait()
	carSeat.Parent.Body.MP.Sound:Play()
end

F.lg = function(n)
	carSeat.Parent.Body.MP.Sound.ES.HighGain = n
end

F.mg = function(n)
	carSeat.Parent.Body.MP.Sound.ES.HighGain = n
end

F.hg = function(n)
	carSeat.Parent.Body.MP.Sound.ES.HighGain = n
end

F.eq = function(n)
	carSeat.Parent.Body.MP.Sound.ES.Enabled = n
end

F.updateVolume = function(Vol)
	carSeat.Parent.Body.MP.Sound.Volume = carSeat.Parent.Body.MP.Sound.Volume + Vol
	scg.Radio.VOLMENU.VolumeText.Text = "VOLUME: "..carSeat.Parent.Body.MP.Sound.Volume
end
--while true do
--	wait(0.5)
--	script.Parent.Parent.Name=script.Parent.Owner.Value .. "'s Ship"
--end
seat.ChildAdded:connect(onChildAdded)
--[=[
	Constructs a new Observable

	```lua
	local function observeAllChildren(parent)
		return Observable.new(function(sub)
			local maid = Maid.new()

			for _, item in pairs(parent:GetChildren()) do
				sub:Fire(item)
			end
			maid:GiveTask(parent.ChildAdded:Connect(function(child)
				sub:Fire(child)
			end))

			return maid
		end)
	end

	-- Prints out all current children, and whenever a new
	-- child is added to workspace
	local maid = Maid.new()
	maid:GiveTask(observeAllChildren(workspace):Subscribe(print))
	```

	@param onSubscribe (subscription: Subscription<T>) -> MaidTask
	@return Observable<T>
]=]
function Observable.new(onSubscribe)
	assert(type(onSubscribe) == "function", "Bad onSubscribe")

	return setmetatable({
		_source = ENABLE_STACK_TRACING and debug.traceback() or "";
		_onSubscribe = onSubscribe;
	}, Observable)
end
--[[**
	ensures value is an enum of the correct type

	@param enum The enum to check

	@returns A function that will return true iff the condition is passed
**--]]
function t.enum(enum)
	assert(t.Enum(enum))
	return function(value)
		local enumItemSuccess = t.EnumItem(value)
		if not enumItemSuccess then
			return false
		end

		if value.EnumType == enum then
			return true
		else
			return false
		end
	end
end

do
	local checkWrap = t.tuple(t.callback, t.callback)
-- << Functions >> --

UserInputService.MouseIconEnabled = true

function lerp(a, b, c)
	return a + (b - a) * c
end

bobbing = game:GetService("RunService").RenderStepped:Connect(function(deltaTime)
	deltaTime = deltaTime * 60
	if Humanoid.Health <= 0 then
		bobbing:Disconnect()
		return
	end
	local rootMagnitude = Humanoid.RootPart and Vector3.new(Humanoid.RootPart.Velocity.X, 0, Humanoid.RootPart.Velocity.Z).Magnitude or 0
	local calcRootMagnitude = math.min(rootMagnitude, 50)
	if deltaTime > 3 then
		func1 = 0
		func2 = 0
	else
		func1 = lerp(func1, math.cos(tick() * 0.5 * math.random(10, 15)) * (math.random(5, 20) / 200) * deltaTime, 0.05 * deltaTime)
		func2 = lerp(func2, math.cos(tick() * 0.5 * math.random(5, 10)) * (math.random(2, 10) / 200) * deltaTime, 0.05 * deltaTime)
	end
	Camera.CFrame = Camera.CFrame * (CFrame.fromEulerAnglesXYZ(0, 0, math.rad(func3)) * CFrame.fromEulerAnglesXYZ(math.rad(func4 * deltaTime), math.rad(val * deltaTime), val2) * CFrame.Angles(0, 0, math.rad(func4 * deltaTime * (calcRootMagnitude / 5))) * CFrame.fromEulerAnglesXYZ(math.rad(func1), math.rad(func2), math.rad(func2 * 10)))
	val2 = math.clamp(lerp(val2, -Camera.CFrame:VectorToObjectSpace((Humanoid.RootPart and Humanoid.RootPart.Velocity or Vector3.new()) / math.max(Humanoid.WalkSpeed, 0.01)).X * 0.08, 0.1 * deltaTime), -0.35, 0.2)
	func3 = lerp(func3, math.clamp(UserInputService:GetMouseDelta().X, -5, 5), 0.25 * deltaTime)
	func4 = lerp(func4, math.sin(tick() * int) / 5 * math.min(1, int2 / 10), 0.25 * deltaTime)
	if rootMagnitude > 1 then
		val = lerp(val, math.cos(tick() * 0.5 * math.floor(int)) * (int / 200), 0.25 * deltaTime)
	else
		val = lerp(val, 0, 0.05 * deltaTime)
	end
	if rootMagnitude > 12 then
		int = 20
		int2 = 18
	elseif rootMagnitude > 0.1 then
		int = 12
		int2 = 14
	else
		int2 = 0
	end
	Player.CameraMaxZoomDistance = 0.5
	Player.CameraMinZoomDistance = 0.5
	vect3 = lerp(vect3, Camera.CFrame.LookVector, 0.125 * deltaTime)
end)
-- Any arguments passed into Tree:run() can be received after the first parameter, obj
-- Example: Tree:run(deltaTime) - > task:start(obj,deltaTime)

function task:start(obj)
	--[[
		(optional) this function is called directly before the run method
  		is called. It allows you to setup things before starting to run
  		Beware: if task is resumed after calling running(), start is not called.
	--]]
	
end
function task:finish(obj)
	--[[
		(optional) this function is called directly after the run method
		is completed with either success() or fail(). It allows you to clean up
		things, after you run the task.
	--]]
		
end	
function task:run(obj)
	--[[
		This is the meat of your task. The run method does everything you want it to do.
			
  	 	Finish it with one of these method calls:
  		success() - The task did run successfully
  		fail()    - The task did fail
  		running() - The task is still running and will be called directly from parent node
	--]]
	--obj:print("Run Enemy Sequence")
	local Type = obj.Model.HostileType.Value
	local TypeFolder = game.ServerScriptService.Source.HostileNPCs.NPCs.HostileTypes:FindFirstChild(Type)
	if TypeFolder then
		local treeType = TypeFolder[Node].Value
		local tree = TreeCreator:Create(obj,treeType..Node)
		tree:run()
	end
	
	self:success();
	return
end
return task;
-- Rapid Flash Rates 
-- 120 flashes/min -> wait(.25) (Canadian protected turns)
-- 150 flashes/min -> wait(.2) (Canadian protected turns)

FlashRate = script.Parent.Parent.Configuration.BasicSettings.FlashRate.Value
RapidFlashRate = script.Parent.Parent.Configuration.BasicSettings.FlashRate.RapidFlashRate.Value
RapidFlashRateCheck = script.Parent.Parent.Configuration.BasicSettings.FlashRate.EnableRapidFlashRate.Value

while true do
	script.Parent.Value = true
	wait(FlashRate)
	script.Parent.Value = false
	if RapidFlashRateCheck == true then
		wait(RapidFlashRate)
	elseif RapidFlashRateCheck == false then
		wait(FlashRate)
		end
end
-- Event binding
Players.PlayerAdded:connect(OnPlayerAdded)
Players.PlayerRemoving:connect(OnPlayerRemoving)

return PlayerManager
--[[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		= 270		--	[TORQUE CURVE VISUAL]
	Tune.IdleRPM		= 700		--		https://www.desmos.com/calculator/2uo3hqwdhf
	Tune.PeakRPM		= 5800
	Tune.Redline		= 6500
	Tune.EqPoint		= 5250
	Tune.PeakSharpness	= 3.5
	Tune.CurveMult		= 0.02
	
	Tune.InclineComp	= 1.2		-- Torque compensation multiplier for inclines (applies gradient from 0-90 degrees)
	
	--Turbo Settings
	Tune.Aspiration		= "Single"												--[[
	[Aspiration]
		"Natural"		: N/A, Naturally aspirated engine
		"Single"		: Single turbocharger
		"Double"		: Twin turbocharger											]]
	
	Tune.Boost			= 6		--Max PSI per turbo (If you have two turbos and this is 15, the PSI will be 30)
	Tune.TurboSize		= 45		--Turbo size; the bigger it is, the more lag it has.
	Tune.CompressRatio	= 4.6			--The compression ratio (look it up)
	
	--Misc
	Tune.RevAccel		= 220		-- 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		= 450		-- Clutch engagement threshold (higher = faster response, lower = more stable RPM)
--

local Triangle = {}
Triangle.__index = Triangle

function Triangle.new(parent)
	local self = setmetatable({}, Triangle)
	
	self.a = nil
	self.b = nil
	self.c = nil
	
	self.Beam = BEAM:Clone()
	self.Attachment0 = ATTACHMENT:Clone()
	self.Attachment1 = ATTACHMENT:Clone()
	self.Parent = nil
	
	self.Beam.Attachment0 = self.Attachment0
	self.Beam.Attachment1 = self.Attachment1
	
	self:SetParent(parent)
	
	return self
end
---
local  Paint = false
	
script.Parent.MouseButton1Click:connect(function()
	Paint = not Paint
	handler:FireServer("Lightblue",Paint)
end)
---
local  Paint = false
	
script.Parent.MouseButton1Click:connect(function()
	Paint = not Paint
	handler:FireServer("Mauve",Paint)
end)
-- copied from `expect` - should be shared
export type ExpectationResult = {
	pass: boolean,
	message: () -> string,
}

return {}
--//Shifting//-
if key == "k" then
		 carSeat.DriveSeat.Idle.Volume = .5
			carSeat.DriveSeat.Idle.MaxDistance = 250
			carSeat.DriveSeat.Idle.EmitterSize = 5
	
		 carSeat.DriveSeat.Rev.Volume = .5
			carSeat.DriveSeat.Rev.MaxDistance = 250
			carSeat.DriveSeat.Rev.EmitterSize = 5
	  carSeat.DriveSeat.Rev2.Volume = .4
			carSeat.DriveSeat.Rev2.MaxDistance = 250
			carSeat.DriveSeat.Rev2.EmitterSize = 5
	  carSeat.DriveSeat.Rev3.Volume = .5
			carSeat.DriveSeat.Rev3.MaxDistance = 250
			carSeat.DriveSeat.Rev3.EmitterSize = 5

	  carSeat.DriveSeat.Start2.Volume = .5
			carSeat.DriveSeat.Start2.MaxDistance = 250
			carSeat.DriveSeat.Start2.EmitterSize = 5

	  carSeat.Body.RipEars.Rev.Volume = 2
			carSeat.Body.RipEars.Rev.MaxDistance = 250
			carSeat.Body.RipEars.Rev.EmitterSize = 5
elseif key == "l" then
	  carSeat.DriveSeat.Idle.Volume = 5.5
			carSeat.DriveSeat.Idle.MaxDistance = 450
		 
		 carSeat.DriveSeat.Rev.Volume = 1
			carSeat.DriveSeat.Rev.MaxDistance = 450
	  carSeat.DriveSeat.Rev2.Volume = 0.8
			carSeat.DriveSeat.Rev2.MaxDistance = 450
		 carSeat.DriveSeat.Rev3.Volume = 1
			carSeat.DriveSeat.Rev3.MaxDistance = 450
	 
	 carSeat.DriveSeat.Start2.Volume = 8.5
			carSeat.DriveSeat.Start2.MaxDistance = 450
			
		 carSeat.Body.RipEars.Rev.Volume = 10
			carSeat.Body.RipEars.Rev.MaxDistance = 450
			carSeat.Body.RipEars.Rev.EmitterSize = 10
	end
end)
--// F key, Horn
mouse.KeyDown:connect(function(key)
	if key=="f" then 
		veh.Lightbar.middle.Airhorn:Play()
	end
end)
--[[
TODO: Delete
@param int amount
]]
function Cell:SetNeighbours(amount)
	self.Neighbours = amount
	self.Label.Text = amount
end
--Made by Stickmasterluke


sp = script.Parent

speedboost = 1		--100% speed bonus
speedforsmoke = math.huge	--smoke apears when character running >= 10 studs/second.


local tooltag = script:WaitForChild("ToolTag",2)

if tooltag~=nil then
	local tool=tooltag.Value
	local h=sp:FindFirstChild("Humanoid")
	if h~=nil then
		h.WalkSpeed=16+16*speedboost
		local hrp = sp:FindFirstChild("HumanoidRootPart")
		if hrp ~= nil then
			smokepart=Instance.new("Part")
			smokepart.FormFactor="Custom"
			smokepart.Size=Vector3.new(0,0,0)
			smokepart.TopSurface="Smooth"
			smokepart.BottomSurface="Smooth"
			smokepart.CanCollide=false
			smokepart.Transparency=1
			local weld=Instance.new("Weld")
			weld.Name="SmokePartWeld"
			weld.Part0 = hrp
			weld.Part1=smokepart
			weld.C0=CFrame.new(0,-3.5,0)*CFrame.Angles(math.pi/4,0,0)
			weld.Parent=smokepart
			smokepart.Parent=sp
			smoke=Instance.new("Smoke")
			smoke.Enabled = hrp.Velocity.magnitude>speedforsmoke
			smoke.RiseVelocity=2
			smoke.Opacity=0
			smoke.Size=0
			smoke.Parent=smokepart
			h.Running:connect(function(speed)
				if smoke and smoke~=nil then
					smoke.Enabled=speed>speedforsmoke
				end
			end)
		end
	end
	while tool~=nil and tool.Parent==sp and h~=nil do
		sp.ChildRemoved:wait()
	end
	local h=sp:FindFirstChild("Humanoid")
	if h~=nil then
		h.WalkSpeed=16
	end
end

if smokepart~=nil then
	smokepart:Destroy()
end
script:Destroy()
--[[Steering]]
	Tune.SteerInner		= 34		-- Inner wheel steering angle (in degrees)
	Tune.SteerOuter		= 34		-- Outer wheel steering angle (in degrees)
	Tune.SteerSpeed		= .06		-- Steering increment per tick (in degrees)
	Tune.ReturnSpeed	= .06		-- Steering increment per tick (in degrees)
	Tune.SteerDecay		= 330		-- 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
---
local  Paint = false
	
script.Parent.MouseButton1Click:connect(function()
	Paint = not Paint
	handler:FireServer("Mint",Paint)
end)
-- Get player control module
function GuiController:_getPlayerControls()
	if not self._playerControls then
		pcall(function()
			self._playerControls = require(self.player.PlayerScripts.PlayerModule):GetControls()
		end)
	end
	return self._playerControls
end
-- May return NaN or inf or -inf
local function findAngleBetweenXZVectors(vec2, vec1)
	-- This is a way of finding the angle between the two vectors:
	return math.atan2(vec1.X*vec2.Z-vec1.Z*vec2.X, vec1.X*vec2.X + vec1.Z*vec2.Z)
end
--// Requst
local CameraModule = require(rp.Shared['Camera'])
--[[
	Runs the given TestPlan and returns a TestResults object representing the
	results of the run.
]]
function TestRunner.runPlan(plan)
	local session = TestSession.new(plan)
	local lifecycleHooks = LifecycleHooks.new()

	local exclusiveNodes = plan:findNodes(function(node)
		return node.modifier == TestEnum.NodeModifier.Focus
	end)

	session.hasFocusNodes = #exclusiveNodes > 0

	TestRunner.runPlanNode(session, plan, lifecycleHooks)

	return session:finalize()
end
--[[Transmission]]
	Tune.TransModes		= {"Auto"}								--[[
	[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 ]]		3.53		,	-- Reverse, Neutral, and 1st gear are required
		--[[ 2 ]]		2.04		,
		--[[ 3 ]]		1.38		,
		--[[ 4 ]]		1.03		,
		--[[ 5 ]]		0.81		,
		--[[ 6 ]]		0.64		,
	}
	Tune.FDMult			= 1.5			-- Ratio multiplier (Change this value instead of FinalDrive if car is struggling with torque ; Default = 1)
--Loop For Making Rays For The Bullet's Trajectory
for i = 1, 30 do
	local thisOffset = offset + Vector3.new(0, yOffset*(i-1), 0)
	local travelRay = Ray.new(point1,thisOffset)
	local hit, position = workspace:FindPartOnRay(travelRay, parts.Parent)

	local distance 		= (position - point1).magnitude
	round.Size				= Vector3.new(1, distance, 1)
	round.CFrame			= CFrame.new(position, point1)
								* CFrame.new(0, 0, -distance/2)
								* CFrame.Angles(math.rad(90),0,0)
	round.Parent			= workspace
	point1					= point1 + thisOffset
	
	if hit then
		round:remove()
		local e = Instance.new("Explosion")
		e.BlastRadius = 4
		e.ExplosionType = "NoCraters"
		e.BlastPressure = 1
		e.Position = position
		e.Parent = workspace
		
		local players = game.Players:getChildren()
		for i = 1, #players do
			
			if players[i].TeamColor ~= script.Parent.Parent.Tank.Value then --if he's not an ally
				character = players[i].Character
				if character then
					torso = character:findFirstChild'Torso'
					if torso then
						
						torsoPos = torso.Position
						origPos = round.Position
						
						local ray = Ray.new(origPos, torsoPos-origPos)
						local hit, position = game.Workspace:FindPartOnRayWithIgnoreList(ray,ignoreList)
						if hit then
							if hit.Parent == character then
								human = hit.Parent:findFirstChild("Humanoid")
								if human then
									distance = (position-origPos).magnitude
-- SAVE --

function API:SavePlayerBoothText(TargetId, Text)
	
	rawset(BoothText, TargetId, Text)
	
end

function API:SavePlayerSingText(TargetId, Text)

	rawset(SingText, TargetId, Text)

end

function API:SavePlayerBooth(TargetId, Id)

	rawset(CurrentBooth, TargetId, Id)

end