i want to kill anyone who is inside a killbrick but it requires the player to be moving and most of the time its the animation causing them to be killed. how can i get them to die without them needing to move?
part = script.Parent
kill = script.Parent.Parent.KillBrick
part.Touched:Connect(function()
kill.Touched:Connect(function(playerpart)
if playerpart.Parent:FindFirstChild("Humanoid") then
playerpart.Parent.Humanoid.Health = 0
end
end)
end)
That’s a really odd connection with the following logic:
First touch creates the kill connection first
Second touch does the killing
Consequently, there will be a delay as you said where the player will be required to move twice. Also, the script will create a memory leak as every time the part is touched an additional kill brick connection will be made which stacks up.
Why not do it the usual way with only one kill brick connection like so?
kill = script.Parent.Parent.KillBrick
kill.Touched:Connect(function(playerpart)
if playerpart.Parent:FindFirstChild("Humanoid") then
playerpart.Parent.Humanoid.Health = 0
end
end)
Otherwise, if you have further issues it’s probably due to the RigType, R15 has a weird collision hitbox which may not trigger the touch event in the first place.
Maybe try using raycast and cast the ray every something and if it hits the player then deal damage to the player, or just move the lasers by like 0.001 every something and it should do the same.
as stated above you are creating a connection each time the first part is touched for the kill you need this connection created seperate else it won’t be there until something touches the part
also if these touch events don’t work you can use :GetTouchingParts() to find out if a part is touching it without the part having to move just use it with a loop most likely
the correct way you would normally write the script is like this:
local part = script.Parent
local kill = script.Parent.Parent.KillBrick
part.Touched:Connect(function(hit)
local Player = game.Players:GetPlayerFromCharacter(hit.Parent)
if Player then -- this prints when a player's cahracter touches the finish line
print(Player.Name, ' playertouchedFinish')
end
end)
kill.Touched:Connect(function(hit)
local Player = game.Players:GetPlayerFromCharacter(hit.Parent)
local Humanoid = hit.Parent:FindFirstChild('Humanoid')
if Player and Humanoid then -- if this is a player's character and humanoid is found
Humanoid.Health = 0
end
end)
but see here in this script, the kill brick is always running. in my game, the kill brick is an invisible brick that covers the entire map. if i do this, every single player would die. my issue is just that the touched event requires a player to move to work
thats exactly what i want in my script. that is not my issue. my issue is that i want it to kill everyone who is inside the kill brick but it doesnt kill the players if they arent moving
This should work to fit your needs; let me know if there’s any errors.
part = script.Parent
kill = script.Parent.Parent.KillBrick
local function GetTouchingParts(part)
local connection = part.Touched:Connect(function() end)
local results = part:GetTouchingParts()
connection:Disconnect()
return results
end
part.Touched.Connect(function(hit)
local blacklisted
if hit.Parent:FindFirstChild("Humanoid") then
blacklisted = hit.Parent.Name
end
local touching = GetTouchingParts(kill)
for i, v in pairs(touching) do
if v.Parent:FindFirstChild("Humanoid") and v.Parent.Name ~= blacklisted then
v.Parent.Humanoid.Health = 0
end
end
blacklisted = nil
end)
Basically, when the player touches the finish line, it will kill all other players that are currently inside of the killBrick except the player that touched the finish line.
And also, I found this method of using :GetTouchingParts() from here.
EDIT: Added blacklisted = nil to reset the variable after killing the other players.
Here’s a simple script that I wrote up quickly that may work for you. Instead of requiring a separate killbrick it simply gets all players in the game and if they are not the winner it kills them.
local Players = game:GetService("Players")
local finishLine = workspace.FinishLinePart -- finish line part
finishLine.Touched:Connect(function(obj)
if Players:GetPlayerFromCharacter(obj.Parent) then
local winner = Players:GetPlayerFromCharacter(obj.Parent)
for i, player in pairs(Players:GetChildren()) do
if player ~= winner and player.Character then
player.Character.Humanoid.Health = 0
end
end
end
end)
i think this script should work but this only works if both players are touching the finish line im going to edit it accordingly and type here if anything goes wrong
Oh, I’m not sure I understand what you’re saying. From what I understand, you want all other players besides the player who touched the finish line to die; directly after the player touches the finish line that is. The script I wrote will wait for any one person to touch the finish line. When this happens, it will kill all other players besides the single person who touched the finish line. So it shouldn’t work only if multiple players are touching the finish line, but rather when a single player does.