local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local player = Players.LocalPlayer -------------------------------------------------------------------------------- -- 1. STATE TRACKING -------------------------------------------------------------------------------- local ejecutando = false local noclipConexion = nil local saltoConexion = nil local caminarConexion = nil local toolConexion = nil local toolEquipCount = 0 local currentTweens = {} -------------------------------------------------------------------------------- -- 2. HELPER FUNCTIONS -------------------------------------------------------------------------------- local function getRootAttachment(character) if not character then return nil end local hrp = character:FindFirstChild("HumanoidRootPart") if hrp then return hrp:FindFirstChild("RootRigAttachment") or hrp:FindFirstChild("RootAttachment") end return nil end local function resetInvisibility(character) if character then for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") then if part.Name == "HumanoidRootPart" then part.Transparency = 1 else part.Transparency = 0 end elseif part:IsA("Decal") or part:IsA("Texture") then part.Transparency = 0 end end end end local function restaurar(character, rootAttachment, originalPos) if noclipConexion then noclipConexion:Disconnect() noclipConexion = nil end if saltoConexion then saltoConexion:Disconnect() saltoConexion = nil end if caminarConexion then caminarConexion:Disconnect() caminarConexion = nil end if toolConexion then toolConexion:Disconnect() toolConexion = nil end toolEquipCount = 0 for _, tw in ipairs(currentTweens) do tw:Cancel() end table.clear(currentTweens) if rootAttachment and originalPos then rootAttachment.Position = originalPos end if character then local hrp = character:FindFirstChild("HumanoidRootPart") if hrp then local bav = hrp:FindFirstChild("FlingVelocity") if bav then bav:Destroy() end end for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") then part.CanCollide = true if part.Name == "HumanoidRootPart" then part.Transparency = 1 else part.Transparency = 0 end elseif part:IsA("Decal") or part:IsA("Texture") then part.Transparency = 0 end end end ejecutando = false end -------------------------------------------------------------------------------- -- 3. MASTER PROJECTION FUNCTION -------------------------------------------------------------------------------- local OFFSETS = { ["Forward150"] = Vector3.new(0, 0, -150), ["Down"] = Vector3.new(0, -200, 0), ["Up"] = Vector3.new(0, 200, 0), ["Left"] = Vector3.new(-30, 0, 0), ["Right"] = Vector3.new(30, 0, 0) } local function playProjection(directionOrOffset, timeIda, timeVuelta, mode, enableNoclip) if ejecutando then return end local character = player.Character if not character then return end local rootAttachment = getRootAttachment(character) local humanoid = character:FindFirstChildOfClass("Humanoid") local hrp = character:FindFirstChild("HumanoidRootPart") if not rootAttachment or not humanoid or not hrp then return end ejecutando = true local originalPos = rootAttachment.Position if enableNoclip and mode ~= "FlingBack" then noclipConexion = RunService.Stepped:Connect(function() if player.Character then for _, part in ipairs(player.Character:GetDescendants()) do if part:IsA("BasePart") then part.CanCollide = false end end end end) end ---------------------------------------------------------------------------- -- MODO: FLINGBACK ---------------------------------------------------------------------------- if mode == "FlingBack" then local bav = Instance.new("BodyAngularVelocity") bav.Name = "FlingVelocity" bav.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) bav.AngularVelocity = Vector3.new(0, 99999, 0) bav.Parent = hrp caminarConexion = humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function() if humanoid.MoveDirection.Magnitude > 0 then restaurar(character, rootAttachment, originalPos) end end) task.wait(1.5) if ejecutando then restaurar(character, rootAttachment, originalPos) end ---------------------------------------------------------------------------- -- MODO 1: WAVE ---------------------------------------------------------------------------- elseif mode == "Wave" then local targetPos = originalPos + OFFSETS["Up"] local tweenIr = TweenService:Create(rootAttachment, TweenInfo.new(timeIda or 2, Enum.EasingStyle.Linear), {Position = targetPos}) table.insert(currentTweens, tweenIr) if not noclipConexion then noclipConexion = RunService.Stepped:Connect(function() if player.Character then for _, part in ipairs(player.Character:GetDescendants()) do if part:IsA("BasePart") then part.CanCollide = false end end end end) end saltoConexion = humanoid.Jumping:Connect(function() if saltoConexion then saltoConexion:Disconnect() saltoConexion = nil end tweenIr:Cancel() local tweenVolver = TweenService:Create(rootAttachment, TweenInfo.new(timeVuelta or 2, Enum.EasingStyle.Linear), {Position = originalPos}) table.insert(currentTweens, tweenVolver) tweenVolver:Play() tweenVolver.Completed:Wait() restaurar(character, rootAttachment, originalPos) end) tweenIr:Play() ---------------------------------------------------------------------------- -- MODO 2: LAUGHTER ---------------------------------------------------------------------------- elseif mode == "Laugh" then local targetPos = originalPos + OFFSETS["Forward150"] local tweenIr = TweenService:Create(rootAttachment, TweenInfo.new(timeIda or 15, Enum.EasingStyle.Linear), {Position = targetPos}) local tweenVolver = TweenService:Create(rootAttachment, TweenInfo.new(2, Enum.EasingStyle.Linear), {Position = originalPos}) table.insert(currentTweens, tweenIr) table.insert(currentTweens, tweenVolver) caminarConexion = humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function() if humanoid.MoveDirection.Magnitude > 0 then restaurar(character, rootAttachment, originalPos) end end) tweenIr:Play() tweenIr.Completed:Wait() if ejecutando then tweenVolver:Play() tweenVolver.Completed:Wait() restaurar(character, rootAttachment, originalPos) end ---------------------------------------------------------------------------- -- MODO 3: ESTÁNDAR ---------------------------------------------------------------------------- else local offsetVector = Vector3.zero if typeof(directionOrOffset) == "Vector3" then offsetVector = directionOrOffset elseif typeof(directionOrOffset) == "string" then offsetVector = OFFSETS[directionOrOffset] or Vector3.zero end local targetPos = originalPos + offsetVector local tweenIr = TweenService:Create(rootAttachment, TweenInfo.new(timeIda or 1.5, Enum.EasingStyle.Linear), {Position = targetPos}) local tweenVolver = TweenService:Create(rootAttachment, TweenInfo.new(timeVuelta or 1.5, Enum.EasingStyle.Linear), {Position = originalPos}) table.insert(currentTweens, tweenIr) table.insert(currentTweens, tweenVolver) caminarConexion = humanoid:GetPropertyChangedSignal("MoveDirection"):Connect(function() if humanoid.MoveDirection.Magnitude > 0 then restaurar(character, rootAttachment, originalPos) end end) tweenIr:Play() tweenIr.Completed:Wait() if ejecutando then tweenVolver:Play() tweenVolver.Completed:Wait() restaurar(character, rootAttachment, originalPos) end end end -------------------------------------------------------------------------------- -- 4. SPECIAL MODES -------------------------------------------------------------------------------- local function playSpecialMode(mode) local character = player.Character if not character then return end local rootAttachment = getRootAttachment(character) local humanoid = character:FindFirstChildOfClass("Humanoid") restaurar(character, rootAttachment, nil) if mode == "Invisible" then ejecutando = true toolEquipCount = 0 for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") or part:IsA("Decal") or part:IsA("Texture") then part.Transparency = 1 end end noclipConexion = RunService.Stepped:Connect(function() if player.Character then for _, part in ipairs(player.Character:GetDescendants()) do if part:IsA("BasePart") then part.CanCollide = false end end end end) if humanoid then saltoConexion = humanoid.Jumping:Connect(function() resetInvisibility(player.Character) end) end toolConexion = character.ChildAdded:Connect(function(child) if child:IsA("Tool") then toolEquipCount = toolEquipCount + 1 if toolEquipCount >= 2 then restaurar(player.Character, getRootAttachment(player.Character), nil) end end end) end end -------------------------------------------------------------------------------- -- 5. CHAT COMMAND LISTENER -------------------------------------------------------------------------------- local function processCommand(msg) local cleanMsg = string.lower(msg) if cleanMsg == "/e laugh" or cleanMsg == "laugh" or cleanMsg == "/e laughter" or cleanMsg == "laughter" then task.spawn(function() playProjection(nil, 15, 2, "Laugh") end) elseif cleanMsg == "/e wave" or cleanMsg == "wave" then task.spawn(function() playProjection("Up", 2, 2, "Wave") end) elseif cleanMsg == "/e dance" or cleanMsg == "dance" then task.spawn(function() playProjection("Right", 1.5, 1.5, "Standard") end) elseif cleanMsg == "/e dance2" or cleanMsg == "dance2" then task.spawn(function() playProjection("Left", 1.5, 1.5, "Standard") end) elseif cleanMsg == "/e dance3" or cleanMsg == "dance3" then task.spawn(function() playProjection("Up", 2, 2, "Standard") end) elseif cleanMsg == "/e point" or cleanMsg == "point" then task.spawn(function() playProjection("Down", 2, 2, "Standard") end) elseif cleanMsg == "/e point2" or cleanMsg == "point2" then task.spawn(function() playProjection(Vector3.new(0, 0, -150), 1.5, 1.5, "Standard", true) end) elseif cleanMsg == "/e hello" or cleanMsg == "hello" then task.spawn(function() playProjection(Vector3.new(0, -80, 0), 1.5, 1.5, "Standard", true) end) elseif cleanMsg == "/e hello2" or cleanMsg == "hello2" then task.spawn(function() playProjection(Vector3.new(0, 80, 0), 1.5, 1.5, "Standard", true) end) elseif cleanMsg == "/e moonwalk" or cleanMsg == "/e moon walk" or cleanMsg == "moonwalk" then task.spawn(function() playProjection(Vector3.new(0, 0, 50), 3, 1.5, "Standard", true) end) elseif cleanMsg == "/e babyqueen" or cleanMsg == "/e baby queen" or cleanMsg == "babyqueen" then task.spawn(function() playProjection(Vector3.new(0, 80, -80), 2, 2, "Standard", true) end) elseif cleanMsg == "/e flingback" or cleanMsg == "/e fling back" or cleanMsg == "flingback" then task.spawn(function() playProjection(nil, nil, nil, "FlingBack", false) end) elseif cleanMsg == "/e invisible" or cleanMsg == "invisible" or cleanMsg == "/e invis" or cleanMsg == "invis" or cleanMsg == "/e ghost" or cleanMsg == "ghost" then task.spawn(function() playSpecialMode("Invisible") end) end end -------------------------------------------------------------------------------- -- 6. RESPONSIVE CHARACTER SETUP (AUTO-RENEWAL ON RESET) -------------------------------------------------------------------------------- local function setupCharacter(char) restaurar(char, getRootAttachment(char), nil) end -- Limpieza y reinicio automático al morir / reaparecer player.CharacterAdded:Connect(setupCharacter) if player.Character then setupCharacter(player.Character) end -- Listener del chat que persiste al morir player.Chatted:Connect(processCommand)