Hehehe I make funny J?o?j?o? ?g?a?m?e? World of trollge game
Anyway, I am making an ability for a morph which lets you time freeze, currently It works (I guess) but the problem Is that the user also gets frozen from Its own timefreeze (I also don't know If the bodyparts get unanchored or not)
Script:
local Tool = script.Parent local Debounce = false Tool.RemoteEvent.OnServerEvent:Connect(function() Tool.Parent.TIMESTOP:Play() wait(2) local TIMEFREEZE = Instance.new("Part",game.Workspace) TIMEFREEZE.Position = Tool.Parent.Torso.Position TIMEFREEZE.Shape = Enum.PartType.Ball TIMEFREEZE.Anchored = true TIMEFREEZE.CanCollide = false TIMEFREEZE.CastShadow = false TIMEFREEZE.Material = Enum.Material.Neon TIMEFREEZE.BrickColor = BrickColor.new("Neon orange") TIMEFREEZE.Size = Vector3.new(1,1,1) for i=0, 100 do TIMEFREEZE.Size = TIMEFREEZE.Size + Vector3.new(10,10,10) TIMEFREEZE.Touched:Connect(function(hit) local Humanoid = hit.Parent:WaitForChild("Humanoid") if Humanoid ~= Tool.Parent then hit.Anchored = true wait(10) hit.Anchored = false end end) wait() end game:GetService("Debris"):AddItem(TIMEFREEZE,10) end)
The error is inside of the Touched
event handler.
Humanoid
, which is a humanoid object, is being compared with Tool.Parent
, which is the player’s model, so this will never evaluate to false. However, accessing Tool.Parent
‘s humanoid will not fix the issue either.
Since we want to differentiate between the player who invoked the time freeze and everyone else, we must compare using a property that is unique to each player—their names! The new implementation is as follows:
TIMEFREEZE.Touched:Connect(function(hit) --get the player who invoked the time freeze local Holder = Tool.Parent --get the player who was hit by the time freeze local Hit = hit.Parent --check if they’re both humanoids if Hit:FindFirstChild‘Humanoid’ and Holder:FindFirstChild‘Humanoid’ then --check if they are not the same player if Hit.Name ~= Holder.Name then --freeze the player hit.Anchored = true --wait 10 seconds task.wait(10) --unfreeze hit.Anchored = false end end end)
EDIT:
Method 1: Anchoring HumanoidRootPart
You could try finding Hit
's HumanoidRootPart
and anchoring it to freeze the player:
if Hit.Name ~= Holder.Name then Hit:FindFirstChild'HumanoidRootPart'.Anchored = true task.wait(10) Hit:FindFirstChild'HumanoidRootPart'.Anchored = false end
Pros:
- Good performance (no loops, you could make it even more efficient by storing Hit:FindFirstChild'HumanoidRootPart'
in a variable so it doesn't have to do the same operation twice)
Cons:
- Arms and legs will still be moving while player is frozen
- After unfreezing, player may teleport forward a little
Method 2: Freeze Every Body Part
This method requires that we define a filter function to filter out the player's body parts from everything else.
--returns a table containing all t fields that satisfy f local function filter(t, f) local nt = {} for _,v in ipairs(t) do if f(v) then table.insert(nt, v) end end return nt end
Alright, now let's use it in the freeze block:
if Hit.Name ~= Holder.Name then --make a table consisting of Hit's freezable parts local freezed = filter(Hit:GetChildren(),function(field) return field:IsA'Part' end) --freeze every part for _,v in ipairs(freezed) do v.Anchored = true end task.wait(10) --unfreeze every part for _,v in ipairs(freezed) do v.Anchored = false end end
Pros: - Will totally freeze the player - No jumping forward after being frozen! Cons: - I'd assume it's not as fast as the other, but I have no tested in with many players, although there are definitely ways to optimize this (like memoization) - For some reason, it will freeze the players for 18-19 seconds no matter what is passed into task.wait() and I can't figure out why