There are a few issues with what you're doing. Let me break it down for you.
Part.Touched:Connect(function(object)
if object.Parent:FindFirstChild("UpperTorso") then
local player = object.Parent:FindFirstChild("UpperTorso").Parent
local localplayer = game.Players:FindFirstChild(player.Name)
local playerteam = localplayer.Team
if playerteam.Name == "Axis" then
print("Detect")
wait(3)
With this, I'm going to assume this is an R15 game only, In which using UpperTorso is okay.
In my demonstration, I used HumanoidRootPart in which is valid for both R6 and R15.
also, I used
game:GetService("Players")
for the reason of game. Players could come up nil if the Players Service name was changed (Yes this is possible lol)
Another issue here is you are taking when they get detected and just waiting 3 seconds. What happens if they leave after 1.3 seconds? It Is still going to continue waiting that last 1.7 seconds.
Also, the reason why it continues to explode even if you are not in the area is that there is nothing stopping the function from firing again with each individual part on the player's character. (Left hand, left lower arm, left upper arm and so on) Basically, if the part is big enough this function will fire 16+ times ( R15 + HumanoidRootPart and then some due to touched being sensitive)
Example -- this is just from spawning in and falling into the part
So what you are going to want to do is add something to prevent that, as I did in my example was just checking to see if the object that touched was named HumanoidRootPart after it checked to see if it was within the character.
That's about it. Here's my completed code for this. Please do yourself a favor and take this code to learn from. Little advice, don't just copy and paste it. Have it side by side of what you're doing and rewrite the entire thing. (It's only like 70 lines, lol you'll be fine)
local timeToDetonate = 3
local Players = game:GetService("Players")
local part = script.Parent
local alreadyWaiting = {}
local function detionatePart(character)
local explosion = Instance.new("Explosion")
explosion.ExplosionType = Enum.ExplosionType.NoCraters
explosion.Position = character.UpperTorso.Position
explosion.BlastPressure = 1
explosion.Parent = game:GetService("Workspace")
end
local function startTimer(player,detonationTime)
print("Been Detected")
local begin = tick()
local timePassed = 0
repeat
timePassed = tick() - begin
wait()
until timePassed >= detonationTime or alreadyWaiting[player] == nil
return timePassed >= detonationTime and true or false
end
local function resetWaiting(player)
if player then
if alreadyWaiting[player] then
alreadyWaiting[player] = nil
end
end
end
part.Touched:Connect(function(object)
if object.Name ~= "HumanoidRootPart" then return end
local player = Players:GetPlayerFromCharacter(object.Parent)
if player then
local character = object.Parent
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid == nil or humanoid.Health <=0 then return end
if player.Team.Name == "Axis" then
if alreadyWaiting[player] ~= nil then return end
alreadyWaiting[player] = true
local detonate = startTimer(player,timeToDetonate)
if detonate then
detionatePart(character)
resetWaiting(player)
else
print("you are safe")
end
end
end
end)
part.TouchEnded:Connect(function(object)
if object.Name ~= "HumanoidRootPart" then return end
local player = Players:GetPlayerFromCharacter(object.Parent)
resetWaiting(player)
end)
Players.PlayerRemoving:Connect(function(player)
resetWaiting(player)
end)
If you have any questions, PLEASE feel free to ask. Even feel free to message me on Roblox!
It.
Also, if you check here, I have an Example Place That explains everything down to what "end" does.
That place is where I took your code and wrote my own and even tested things.
2 comments
are you wanting the player in the explosion to die?
That will be done manually by Humanoid:TakeDamage(100) along with the explosion instance, just dont have that in yet.