Hi, I've been searching up everywhere for a script that allows a certain key on your keyboard that makes you respawn/load your character. I'd prefer the key be held down for a specific amount of time to respawn but still no luck. I'm sorry if this seems very simple but it would be amazing if you could help. :)
game.Players.LocalPlayer:GetResetButton().KeyDown:connect(function(k) if k == "r" then -- is this where the player/humanoid health = 0? -- and where do i create a specific time for the key to be held? end end)
I'm still learning.
I would firstly like to thank you for being so patient, as most learning developers tend to rush and miss out on important stuff. Scripting takes great patience, especially in Roblox since the API can seem quite menacing. I'll be showing you step-by-step how to solve this seemingly simple problem. The answer is simple, but requires explaining.
Services in Roblox are top-class objects that can be obtained using the GetService
method of game
(game:GetService()
). They make things much easier on the developer by coming packed with an array of useful functions and events.
Usually shortened to UIS, this service comes in handy when detecting user input (the name says it all). This can be obtained by doing game:GetService("UserInputService")
, as with any other service. Please note that this service can only be used in LocalScripts.
UIS.InputBegan
is like any other event, as it can be Connect
ed to a function. It fires whenever a user input is detected (typically a key press).
This is a lot to take in, so let's see where we are so far.
local uis = game:GetService("UserInputService") -- Get the service and store it in the "uis" variable uis.InputBegan:Connect(function(key) -- Connects the function print(key.KeyCode) -- This will print the KeyCode in the event of a key being pressed end)
Loops are essential in Lua: Loops allow portions of code to be repeated until a condition is met (or indefinitely, commonly referred to as an infinite loop).
We can use loops to constantly check whether the key is pressed or not, using variable isPressed
:
local uis = game:GetService("UserInputService") -- Same as before local isPressed = false -- This is our main variable uis.InputBegan:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then -- This will detect if the keycode is equal to keycode F isPressed = true -- If so, set the variable to true end end) uis.InputEnded:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then isPressed = true -- Set to false to indicate the key is no longer pressed end end) while true do -- This will repeat endlessly, as true is *always* equal to true print(isPressed) wait() -- This is required in an infinite loop to avoid a game-breaking hang end
InputEnded
fires when a key is becomes unpressed.
We're very close; try it out. If you hold F, it will print true
, elsewise it will print false
.
What we can do now is use a holdTime
variable to see how long we've been holding the key. This determines whether we've held the key long enough once we release the key.
local uis = game:GetService("UserInputService") local isPressed = false local holdTime = 0 uis.InputBegan:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then isPressed = true end end) uis.InputEnded:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then isPressed = true end end) while true do while isPressed or holdTime < 2 do -- While the key is pressed and holdTime is less than 2, repeat the following: wait(0.1) holdTime = holdTime + 0.1 -- This increases holdTime by 0.1 every 0.1 seconds (1 per second) end -- Loops inside of loops are completely valid print(holdTime) -- This will print how long we've held the key down to 1/10th of a second holdTime = 0 wait() end
Our input mechanic is almost complete! Now, we just need to send a message to the Server saying we need to reset. We can do so using RemoteEvents. Don't worry, we won't be doing anything too complicated:
Insert a RemoteEvent into ReplicatedStorage, and a (regular) Script into ServerScriptService:
-- Local script local uis = game:GetService("UserInputService") local isPressed = false local holdTime = 0 uis.InputBegan:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then isPressed = true end end) uis.InputEnded:Connect(function(key) if key.KeyCode == Enum.KeyCode.F then isPressed = true end end) while true do while isPressed or holdTime < 2 do wait(0.1) holdTime = holdTime + 0.1 end if holdTime >= 2 then game.ReplicatedStorage.RemoteEvent:FireServer() end repeat wait() until isPressed == false -- Continues once you release the key holdTime = 0 wait() end
-- Server script in ServerScriptService game.ReplicatedStorage.RemoteEvent.OnServerEvent:Connect(function(plr) if plr.Character then plr.Character.Humanoid.Health = 0 end end)
Hope I helped! Remember: the Wiki is your goto if you don't know how something works.