Roblox/luau_corpus huggingface dataset:
-- ROBLOX deviation: replaced most get methods to reduce code repetition
local function getOption(options: OptionsReceived?, opt): any
	if options and options[opt] ~= nil then
		return options[opt]
	end
	return DEFAULT_OPTIONS[opt]
end

local function getIndent(options: OptionsReceived?)
	if options and options.min then
		return ""
	end
	local number = DEFAULT_OPTIONS.indent
	if options and options.indent ~= nil then
		number = options.indent
	end
	return createIndent(number)
end

local function getSpacingInner(options: OptionsReceived?)
	if options and options.min then
		return " "
	end
	return "\n"
end

local function getSpacingOuter(options: OptionsReceived?)
	if options and options.min then
		return ""
	end
	return "\n"
end
--Declare some variables
CamOffset = Vector3.new(0,3,0)
Sensitivity = UserSettings().GameSettings.MouseSensitivity
MaxLook = 89
FPSLock = Enum.KeyCode.F
-- ROBLOX FIXME: Can we define ClientChatModules statically in the project config
pcall(function() ChatLocalization = require((game:GetService("Chat") :: any).ClientChatModules.ChatLocalization :: any) end)
if ChatLocalization == nil then ChatLocalization = {} end

if not ChatLocalization.FormatMessageToSend or not ChatLocalization.LocalizeFormattedMessage then
	function ChatLocalization:FormatMessageToSend(key,default) return default end
end

local function EnterTimeIntoLog(tbl)
	table.insert(tbl, tick() + decayTimePeriod)
end

local function Run(ChatService)
	local function FloodDetectionProcessCommandsFunction(speakerName, message, channel)
		if (whitelistedSpeakers[speakerName]) then return false end

		local speakerObj = ChatService:GetSpeaker(speakerName)
		if (not speakerObj) then return false end
		if (chatBotsBypassFloodCheck and not speakerObj:GetPlayer()) then return false end

		if (not floodCheckTable[speakerName]) then
			floodCheckTable[speakerName] = {}
		end

		local t = nil

		if (doFloodCheckByChannel) then
			if (not floodCheckTable[speakerName][channel]) then
				floodCheckTable[speakerName][channel] = {}
			end

			t = floodCheckTable[speakerName][channel]
		else
			t = floodCheckTable[speakerName]
		end

		local now = tick()
		while (#t > 0 and t[1] < now) do
			table.remove(t, 1)
		end

		if (#t < numberMessagesAllowed) then
			EnterTimeIntoLog(t)
			return false
		else

			local timeDiff = math.ceil(t[1] - now)

			if (informSpeakersOfWaitTimes) then
				local msg = ChatLocalization:FormatMessageToSend("GameChat_ChatFloodDetector_MessageDisplaySeconds",
					string.format("You must wait %d %s before sending another message!", timeDiff, (timeDiff > 1) and "seconds" or "second"),
					"RBX_NUMBER",
					tostring(timeDiff)
				)
				speakerObj:SendSystemMessage(msg, channel)
			else
				speakerObj:SendSystemMessage(
					ChatLocalization:FormatMessageToSend(
						"GameChat_ChatFloodDetector_Message",
						"You must wait before sending another message!"
					)
				,channel)
			end

			return true
		end
	end

	ChatService:RegisterProcessCommandsFunction("flood_detection", FloodDetectionProcessCommandsFunction, ChatConstants.LowPriority)

	ChatService.SpeakerRemoved:connect(function(speakerName)
		floodCheckTable[speakerName] = nil
	end)
end

return Run
--хранилище и копии зелий
local storage = game:GetService("ServerStorage")
local healthPotion = storage["Health Potion"]:Clone()
local gun = storage["FAL"]:Clone()
local coins = storage["Coins"]:Clone()


char.Humanoid.Died:Connect(function()
	--подбрасываем кубик
	local rand = math.random(0,2)
	if rand == 0 then --если 0, то
		--падает зелье здоровья
		healthPotion.Handle.Position = char.HumanoidRootPart.Position
		healthPotion.Parent = workspace
		coins.Handle.Position = char.HumanoidRootPart.Position
		coins.Parent = workspace
		
		elseif rand == 1 then --если 1, то
		--падает оружее
		gun.Handle.Position = char.HumanoidRootPart.Position
		gun.Parent = workspace
		coins.Handle.Position = char.HumanoidRootPart.Position
		coins.Parent = workspace
	end
	-- а если на кубике выпадает 3, то ничего не выпадет
	wait(10)
	copy.Parent = workspace
	char:Remove()
	end)
--SSR&D AR TIMER MAIN
powerlmp = script.Parent.TimerDoorButtons.Door.PowerLamp.IsOn
signallmp =  script.Parent.TimerDoorButtons.Door.SigLamp.IsOn
-- 

local BLOCK_ARRAY = fromIndexArray(BLOCK)
local WEDGE_ARRAY = fromIndexArray(WEDGE)
local CORNERWEDGE_ARRAY = fromIndexArray(CORNERWEDGE)
local CYLINDER_ARRAY = cylinder(20)
local SPHERE_ARRAY = icoSphere(2)

return {
	Block = function(cf, size2) return vertShape(cf, size2, BLOCK_ARRAY) end;
	Wedge = function(cf, size2) return vertShape(cf, size2, WEDGE_ARRAY) end;
	CornerWedge = function(cf, size2) return vertShape(cf, size2, CORNERWEDGE_ARRAY) end;
	Cylinder = function(cf, size2) return vertShape(cf, size2, CYLINDER_ARRAY) end;
	Ball = function(cf, size2) return vertShape(cf, size2, SPHERE_ARRAY) end;
	
	GetCentroid = getCentroidFromSet;
	Classify = classify;
}
---------------------------------------------------------------
function onChildAdded(child)
	if child.Name == "SeatWeld" then
		local human = child.part1.Parent:findFirstChild("Humanoid") 
		if (human ~= nil) then
			print("Human IN")
			seat.SirenControl.Control.CarName.Value = human.Parent.Name.."'s Car"
			seat.Parent.Name = human.Parent.Name.."'s Car"
			s.Parent.SirenControl:clone().Parent = game.Players:findFirstChild(human.Parent.Name).PlayerGui
			seat.Start:Play()
			wait(1)
			seat.Start:Stop()
			seat.Engine:Play()
		end
	end
end

function onChildRemoved(child)
	if (child.Name == "SeatWeld") then	
		local human = child.part1.Parent:findFirstChild("Humanoid") 
		if (human ~= nil) then
			print("Human OUT")
			seat.Parent.Name = "Empty Car"
			seat.SirenControl.Control.CarName.Value = "Empty Car"
			game.Players:findFirstChild(human.Parent.Name).PlayerGui.SirenControl:remove()
			seat.Engine:Stop()
		end
	end
end


script.Parent.ChildAdded:connect(onChildAdded)
script.Parent.ChildRemoved:connect(onChildRemoved)
-- Tween a part up and down (ping-pong animation)
local TweenService = game:GetService("TweenService")
local partToTween = script.Parent
local inTween = false
--script.Parent.Parent.Parent.Sound.Idle:Stop()
--script.Parent.Parent.Parent.Sound.Grab:Play()
script.Parent.Parent.Prong1.Motor.HingeConstraint.TargetAngle = 75
script.Parent.Parent.Prong2.Motor.HingeConstraint.TargetAngle = 75
script.Parent.Parent.Prong3.Motor.HingeConstraint.TargetAngle = 75
--Control Mapping
Tune.Controls = {

	--Keyboard Controls
	--Mode Toggles
	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			,
}
-- Initialize the tool
local PaintTool = {

	Name = 'Paint Tool';
	Color = BrickColor.new 'Really red';

	-- Default options
	BrickColor = nil;

};
--returns the wielding player of this tool
function getPlayer()
	local char = Tool.Parent
	return game:GetService("Players"):GetPlayerFromCharacter(Character)
end

function Toss(direction)
	local handlePos = Vector3.new(Tool.Handle.Position.X, 0, Tool.Handle.Position.Z)
	local spawnPos = Character.Head.Position
	
	spawnPos  = spawnPos + (direction * 5)
	
	local Object = Tool.Handle:Clone()
	Object.Pin:Destroy()
	Object.ThinkFast:Destroy()
	Object.Parent = workspace
	Object.Swing.Pitch = Random.new():NextInteger(90, 110)/100
	Object.Swing:Play()
	Object.CanCollide = true
	Object.CFrame = Tool.Handle.CFrame
	Object.Velocity = (direction*AttackVelocity) + Vector3.new(0,AttackVelocity/7.5,0)
	Object.Trail.Enabled = true
	
	local rand = 11.25
	Object.RotVelocity = Vector3.new(Random.new():NextNumber(-rand,rand),Random.new():NextNumber(-rand,rand),Random.new():NextNumber(-rand,rand))
	Object:SetNetworkOwner(getPlayer())
	
	local ScriptClone = DamageScript:Clone()
	ScriptClone.Parent = Object
	ScriptClone.Disabled = false
	
	local tag = Instance.new("ObjectValue")
	tag.Value = getPlayer()
	tag.Name = "creator"
	tag.Parent = Object
end


PowerRemote.OnServerEvent:Connect(function(player, Power)
	local holder = getPlayer()
	if holder ~= player then return end
	
	AttackVelocity = Power
end)

TossRemote.OnServerEvent:Connect(function(player, mousePosition)
	local holder = getPlayer()
	if holder ~= player then return end
	
	if Cooldown.Value == true then return end
	Cooldown.Value = true
	
	if Humanoid and Humanoid.RigType == Enum.HumanoidRigType.R15 then
		TossRemote:FireClient(getPlayer(), "PlayAnimation", "Animation")
	end
	local targetPos = mousePosition.p
	local lookAt = (targetPos - Character.Head.Position).unit
	
	local SecretRNG = Random.new():NextInteger(1,10) --Change RNG value here
	if SecretRNG == 1 then
		local ChucklenutsSound = Tool.Handle.ThinkFast:Play()
	end
	
	Toss(lookAt)
	
	task.wait(CooldownTime)
	Cooldown.Value = false
end)

Tool.Equipped:Connect(function()
	Character = Tool.Parent
	Humanoid = Character:FindFirstChildOfClass("Humanoid")
end)

Tool.Unequipped:Connect(function()
	Character = nil
	Humanoid = nil
end)
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------


function onRunning(speed)
	if speed > 0.01 then
		if Humanoid.WalkSpeed > 16 then
			playAnimation("run", 0.1, Humanoid)
			pose = "Running"
		else
			playAnimation("walk", 0.1, Humanoid)
			pose = "Walking"
		end
	else
		if emoteNames[currentAnim] == nil then
			playAnimation("idle", 0.1, Humanoid)
			pose = "Standing"
		end
	end
end

function onDied()
	pose = "Dead"
end

function onJumping()
	playAnimation("jump", 0.1, Humanoid)
	jumpAnimTime = jumpAnimDuration
	pose = "Jumping"
end

function onClimbing(speed)
	playAnimation("climb", 0.1, Humanoid)
	setAnimationSpeed(speed / 12.0)
	pose = "Climbing"
end

function onGettingUp()
	pose = "GettingUp"
end

function onFreeFall()
	if (jumpAnimTime <= 0) then
		playAnimation("fall", fallTransitionTime, Humanoid)
	end
	pose = "FreeFall"
end

function onFallingDown()
	pose = "FallingDown"
end

function onSeated()
	pose = "Seated"
end

function onPlatformStanding()
	pose = "PlatformStanding"
end

function onSwimming(speed)
	if speed > 0 then
		pose = "Running"
	else
		pose = "Standing"
	end
end

function getTool()	
	for _, kid in ipairs(Figure:GetChildren()) do
		if kid.className == "Tool" then return kid end
	end
	return nil
end

function getToolAnim(tool)
	for _, c in ipairs(tool:GetChildren()) do
		if c.Name == "toolanim" and c.className == "StringValue" then
			return c
		end
	end
	return nil
end

function animateTool()
	
	if (toolAnim == "None") then
		playToolAnimation("toolnone", toolTransitionTime, Humanoid, Enum.AnimationPriority.Idle)
		return
	end

	if (toolAnim == "Slash") then
		playToolAnimation("toolslash", 0, Humanoid, Enum.AnimationPriority.Action)
		return
	end

	if (toolAnim == "Lunge") then
		playToolAnimation("toollunge", 0, Humanoid, Enum.AnimationPriority.Action)
		return
	end
end

function moveSit()
	RightShoulder.MaxVelocity = 0.15
	LeftShoulder.MaxVelocity = 0.15
	RightShoulder:SetDesiredAngle(3.14 /2)
	LeftShoulder:SetDesiredAngle(-3.14 /2)
	RightHip:SetDesiredAngle(3.14 /2)
	LeftHip:SetDesiredAngle(-3.14 /2)
end

local lastTick = 0

function move(time)
	local amplitude = 1
	local frequency = 1
  	local deltaTime = time - lastTick
  	lastTick = time

	local climbFudge = 0
	local setAngles = false

  	if (jumpAnimTime > 0) then
  		jumpAnimTime = jumpAnimTime - deltaTime
  	end

	if (pose == "FreeFall" and jumpAnimTime <= 0) then
		playAnimation("fall", fallTransitionTime, Humanoid)
	elseif (pose == "Seated") then
		playAnimation("sit", 0.5, Humanoid)
		return
	elseif (pose == "Running") then
		playAnimation("run", 0.1, Humanoid)
	elseif pose == "Walking" then
		playAnimation("walk", 0.1, Humanoid)
	elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then
--[[**
	Instantiates a new Janitor object.
	@returns [t:Janitor]
**--]]
function Janitor.new()
	return setmetatable({
		CurrentlyCleaning = false;
		[IndicesReference] = nil;
	}, Janitor)
end
-- ONLY SUPPORTS ORDINAL TABLES (ARRAYS). Merges tbl0 and tbl1 together.
Table.join = function (tbl0, tbl1)
	local nt = table.create(#tbl0 + #tbl1)
	local t2 = table.move(tbl0, 1, #tbl0, 1, nt)
	return table.move(tbl1, 1, #tbl1, #tbl0 + 1, nt)
end
--[[
	MouseLockController - Replacement for ShiftLockController, manages use of mouse-locked mode
	2018 Camera Update - AllYourBlox
--]]
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																								wait(999999999999999999999)
--	local now = os.time()
--	if now - lastMoan > 5 then	
--		if math.random() > .3 then
--			zombie.Moan:Play()
----			print("playing moan")
--			lastMoan = now
--		end
--	end
	wait(2)
end

local hum = script.Parent:WaitForChild("Humanoid")
local anim = hum:LoadAnimation(script:FindFirstChildOfClass("Animation"))
anim.Looped = true
anim:Play()
end
--//Events\\--
game:GetService("RunService").RenderStepped:Connect(function()
 --//Visible\\--
 for i, part in pairs(character:GetChildren())do
  if string.match(part.Name, "Arm")or string.match(part.Name, "Hand") then
   part.LocalTransparencyModifier = 0
  end
 end
end)
-- Validator for Roblox enums

local UtilityRoot = script.Parent
local UIBloxRoot = UtilityRoot.Parent

local t = require(UIBloxRoot.Parent.t)

local function enumValidator(enum)
	local validators = {}

	for _, enumItem in pairs(enum) do
		validators[#validators + 1] = t.literal(enumItem)
	end

	return t.union(unpack(validators))
end

return enumValidator
--[[
	ROBLOX deviation: checks for Roblox builtin data types
	https://developer.roblox.com/en-us/api-reference/data-types
]]
local function isRobloxBuiltin(value: any): boolean
	return type(value) ~= typeof(value)
end

local function getType(value: any): string
	--[[
		ROBLOX deviation: code omitted because lua has no primitive undefined type
		lua makes no distinction between null and undefined so we just return nil
	]]
	if value == nil then
		return "nil"
	end
	if typeof(value) == "boolean" then
		return "boolean"
	end
	if typeof(value) == "function" then
		return "function"
	end
	if typeof(value) == "number" then
		return "number"
	end
	if typeof(value) == "string" then
		return "string"
	end
	if typeof(value) == "DateTime" then
		return "DateTime"
	end
	if typeof(value) == "userdata" and tostring(value):match("Symbol%(.*%)") then
		return "symbol"
	end
	if typeof(value) == "table" then
		local ok, hasRegExpShape = pcall(function()
			return typeof(value.test) == "function" and typeof(value.exec) == "function"
		end)
		if ok and hasRegExpShape then
			RegExp = require(Packages.RegExp)

			if instanceof(value, RegExp) then
				return "regexp"
			end
		end
	end
	if instanceof(value, Error) then
		return "error"
	end
	if instanceof(value, Map) then
		return "map"
	end
	if instanceof(value, Set) then
		return "set"
	end
	--[[
		ROBLOX deviation: lua makes no distinction between tables, arrays, and objects
		we always return table here and consumers are expected to perform the check
	]]
	if typeof(value) == "table" then
		return "table"
	end

	--[[
		ROBLOX deviation: returns name of Roblox datatype
		https://developer.roblox.com/en-us/api-reference/data-types
	]]
	if isRobloxBuiltin(value) then
		return typeof(value)
	end

	-- ROBLOX deviation: added luau types for userdata and thread
	if type(value) == "userdata" then
		return "userdata"
	end
	if typeof(value) == "thread" then
		return "thread"
	end
	-- ROBLOX deviation: code omitted because lua has no primitive bigint type
	-- ROBLOX deviation: code omitted because lua makes no distinction between tables, arrays, and objects

	-- ROBLOX deviation: include the type in the error message
	error(string.format("value of unknown type: %s (%s)", typeof(value), tostring(value)))
end

local function isPrimitive(value: any): boolean
	-- ROBLOX deviation: explicitly define objects and functions and Instances as non primitives
	return typeof(value) ~= "table" and typeof(value) ~= "function" and not isRobloxBuiltin(value)
end

return {
	getType = getType,
	isPrimitive = isPrimitive,
	isRobloxBuiltin = isRobloxBuiltin,
}
-- Checking what mouth shape will be
function UpdateMouth()
if Mouth.Transparency == 1 then
Mouth1_2.Transparency = 1
Mouth1_2.MouthDecal.Transparency = 1
elseif Mouth.Transparency == 0 then
Mouth1_2.Transparency = 0.75
Mouth1_2.MouthDecal.Transparency = 0
end
if Mouth2.Transparency == 1 then
Mouth2_2.Transparency = 1
Mouth2_2.MouthDecal.Transparency = 1
elseif Mouth2.Transparency == 0 then
Mouth2_2.Transparency = 0.75
Mouth2_2.MouthDecal.Transparency = 0
end
end

Mouth.Changed:Connect(UpdateMouth)
Mouth2.Changed:Connect(UpdateMouth)
--- Installs listener for targeting mode toggling hotkeys.
-- @returns void
function TargetingModule:BindTargetingModeHotkeys()
	local function Callback(Action, State, Input)
		if (State.Name == 'End') then
			return Enum.ContextActionResult.Pass
		end

		-- Ensure shift is held
		local KeysPressed = UserInputService:GetKeysPressed()
		local IsShiftHeld = Input:IsModifierKeyDown(Enum.ModifierKey.Shift)
		if (#KeysPressed ~= 2) or (not IsShiftHeld) then
			return Enum.ContextActionResult.Pass
		end

		-- Toggle between targeting modes
		self:ToggleTargetingMode()
		self:UpdateTarget(nil, true)

		-- Sink input
		return Enum.ContextActionResult.Sink
	end

	-- Install listener for T key
	ContextActionService:BindAction('BT: Toggle Targeting Mode', Callback, false, Enum.KeyCode.T)

	-- Unbind hotkey when tool is disabled
	local Core = GetCore()
	Core.Connections.UnbindTargetingModeHotkeys = Core.Disabling:Connect(function ()
		ContextActionService:UnbindAction('BT: Toggle Targeting Mode')
	end)
end

function GetCore()
	return require(script.Parent);
end;

return TargetingModule;
-- Root variables 
local Tool = script.Parent
local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:wait()
local Humanoid = Character:WaitForChild("Humanoid")
local SettingsFolder = Tool:WaitForChild("Configuration")
local MaxSpeed = SettingsFolder:WaitForChild("MaxSpeed")
local TurnSpeed = SettingsFolder:WaitForChild("TurnSpeed")
local StarterColor = SettingsFolder:WaitForChild("StartingColor")
local ToolCoolDown = 2
-- The pixel dimensions in Figma for the outer circle and inner circle are 24px
-- and 16px, respectively. This ratio is used to set the scale of the inner
-- circle so that it is always proportionally the same regardless of what size
-- the outer circle is set to.
local SELECTION_INDICATOR_RATIO = 16 / 24

local RadioButton = Roact.Component:extend("RadioButton")

local defaultProps = {
	isSelected = false,
	isHovered = false,
	size = UDim2.fromOffset(24, 24),

	-- TODO: replace below props with theme system (SOCIALAPP-2401)
	buttonColor = constants.White,
	inactiveButtonColor = constants.Faded,
}

export type Props = typeof(defaultProps) & {
	layoutOrder: number?,
	onActivated: (() -> ())?,
	onHoverChanged: ((boolean) -> ())?,
}

RadioButton.defaultProps = defaultProps

function RadioButton:init()
	self.onActivated = function()
		local props: Props = self.props

		if not props.isSelected and props.onActivated then
			props.onActivated()
		end
	end

	self.onHoverChanged = function(isHovered: boolean)
		return function()
			local props: Props = self.props

			if props.onHoverChanged then
				props.onHoverChanged(isHovered)
			end
		end
	end
end

function RadioButton:render()
	local props: Props = self.props

	return Roact.createElement("ImageButton", {
		LayoutOrder = props.layoutOrder,
		Selectable = false,
		Size = props.size,
		Image = assets.RadioButtonOuter,
		ImageColor3 = if props.isSelected or props.isHovered then props.buttonColor else props.inactiveButtonColor,
		BackgroundTransparency = 1,
		[Roact.Event.Activated] = self.onActivated,
		[Roact.Event.MouseEnter] = self.onHoverChanged(true),
		[Roact.Event.MouseLeave] = self.onHoverChanged(false),
	}, {
		SelectionIndicator = props.isSelected and Roact.createElement("ImageLabel", {
			Image = assets.RadioButtonInner,
			Size = UDim2.fromScale(SELECTION_INDICATOR_RATIO, SELECTION_INDICATOR_RATIO),
			ImageColor3 = props.buttonColor,
			Position = UDim2.fromScale(0.5, 0.5),
			AnchorPoint = Vector2.new(0.5, 0.5),
			BackgroundTransparency = 1,
		}),
	})
end

return RadioButton
-- Don't use this as a learning example. It has no serverside verification and
-- is easily exploitable. This is fine for demo purposes, but not live games!
script.Parent.RemoteEvent.OnServerEvent:Connect(function(player, cursorPos)
	local projectile = Instance.new("Part")
	projectile.Size = Vector3.new(0.5, 0.5, 0.5)
	projectile.Material = "Neon"
	projectile.BrickColor = BrickColor.new("Neon orange")
	projectile.Transparency = 0.5
	projectile.Shape = Enum.PartType.Ball
	projectile.CFrame = tool.Handle.CFrame
	
	local attachment = Instance.new("Attachment", projectile)
	
	local vectorForce = Instance.new("VectorForce", projectile)
	vectorForce.RelativeTo = Enum.ActuatorRelativeTo.World
	vectorForce.Attachment0 = attachment
	vectorForce.Force = (cursorPos - tool.Handle.CFrame.p).unit * PROJECTILE_FORCE
	
	projectile.Parent = workspace
	projectile:SetNetworkOwner(player)
	Debris:AddItem(projectile, 5)
	
	projectile.Touched:Connect(function()
		projectile:Destroy()
	end)
end)