Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local player = game.Players.LocalPlayer
- local char = player.Character or player.CharacterAdded:Wait()
- local humanoid = char:FindFirstChildOfClass("Humanoid")
- local rootPart = char:FindFirstChild("HumanoidRootPart")
- local userInput = game:GetService("UserInputService")
- local runService = game:GetService("RunService")
- local tweenService = game:GetService("TweenService")
- local debris = game:GetService("Debris")
- -- Tabela de animações principal
- local ANIMATIONS = {
- CrouchStart = "rbxassetid://98606150731314",
- CrouchIdle = "rbxassetid://74530436512522",
- CrouchWalk = "rbxassetid://94721495253171",
- CrouchRun = "rbxassetid://93499989310243",
- Stab = "rbxassetid://133133989835533",
- CrouchStab = "rbxassetid://119256819262245",
- Ritual = "rbxassetid://117339039533356",
- CrouchEnd = "rbxassetid://122093265676661",
- Stand = "rbxassetid://112995614541035",
- Hit = "rbxassetid://96032371062643",
- Respawn = "rbxassetid://75804462760596"
- }
- -- Tabela de sons
- local SOUNDS = {
- ShadowStepDash = "93315212708186",
- ShadowStepHit = "100981628806546",
- ShadowStepImpact = "99820161736138",
- CrouchOn = "93315212708186",
- CrouchOff = "112995614541035",
- Ritual = "117339039533356",
- Mark = "100981628806546",
- Respawn = "84260460113659"
- }
- -- Variáveis de estado
- local isCrouching = false
- local currentCrouchAnim = nil
- local crouchConnection = nil
- local shadowStepCooldown = false
- local ritualCooldown = false
- local crouchCooldown = false
- local ritualPosition = nil
- local originalWalkSpeed = humanoid.WalkSpeed
- local buttonsDraggable = true
- local abilityButtons = {}
- local cooldownLabels = {}
- -- Cooldowns ajustados
- local COOLDOWNS = {
- Crouch = 1,
- ShadowStep = 25,
- Ritual = 60
- }
- -- Verificar se o jogador está usando o personagem "TwoTime"
- local function isTwoTime()
- return char.Name == "TwoTime"
- end
- -- Carregar o acessório da sombra
- local function loadKnifeAccessory()
- local knife = Instance.new("Accessory")
- knife.Name = "ShadowBladeAccessory"
- local handle = Instance.new("Part")
- handle.Name = "Handle"
- handle.Size = Vector3.new(1, 1, 1)
- handle.CanCollide = false
- handle.Anchored = false
- handle.Transparency = 0.5
- handle.Color = Color3.new(0.1, 0.1, 0.1)
- handle.Parent = knife
- local mesh = Instance.new("SpecialMesh")
- mesh.MeshId = "rbxassetid://18420062942"
- mesh.TextureId = "rbxassetid://12492575000"
- mesh.Parent = handle
- local weld = Instance.new("Weld")
- weld.Part0 = handle
- weld.Part1 = char:FindFirstChild("Left Arm")
- weld.C0 = CFrame.new(-0.0130882263, 2.0306406, 0.595284879, 1, 0, 0, 0, 1, 0, 0, 0, 1)
- weld.C1 = CFrame.new(0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1)
- weld.Parent = handle
- knife.Parent = char
- end
- -- Função para carregar animações
- local function loadAnimation(animationId)
- local animation = Instance.new("Animation")
- animation.AnimationId = animationId
- return humanoid:LoadAnimation(animation)
- end
- -- Carregar todas as animações
- local animations = {}
- for name, id in pairs(ANIMATIONS) do
- animations[name] = loadAnimation(id)
- end
- -- Função para tocar sons
- local function playSound(soundId, parent, volume)
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxassetid://" .. soundId
- sound.Volume = volume or 1
- sound.Parent = parent or workspace
- sound:Play()
- debris:AddItem(sound, sound.TimeLength + 1)
- end
- -- Efeitos de fumaça
- local function createSmokeEffect(position)
- local smoke = Instance.new("Part")
- smoke.Size = Vector3.new(1, 1, 1)
- smoke.Position = position
- smoke.Transparency = 1
- smoke.CanCollide = false
- smoke.Anchored = true
- smoke.Parent = workspace
- local particleEmitter = Instance.new("ParticleEmitter")
- particleEmitter.Size = NumberSequence.new(0.5, 2)
- particleEmitter.Texture = "rbxassetid://241840574"
- particleEmitter.Lifetime = NumberRange.new(1, 3)
- particleEmitter.Rate = 50
- particleEmitter.Speed = NumberRange.new(5, 10)
- particleEmitter.Parent = smoke
- debris:AddItem(smoke, 3)
- end
- -- Função para congelar/descongelar personagem
- local function setCharacterFrozen(freeze)
- if freeze then
- rootPart.Anchored = true
- humanoid.WalkSpeed = 0
- humanoid.JumpPower = 0
- else
- rootPart.Anchored = false
- humanoid.JumpPower = isCrouching and 0 or 50
- end
- end
- -- Função para aumentar velocidade do jogador
- local function boostPlayerSpeed()
- local originalSpeed = humanoid.WalkSpeed
- humanoid.WalkSpeed = 35
- task.delay(3, function()
- if humanoid then
- humanoid.WalkSpeed = isCrouching and 16 or originalSpeed
- end
- end)
- end
- -- Função de cooldown melhorada
- local function startCooldown(buttonName, duration, cooldownVar)
- cooldownVar = true
- abilityButtons[buttonName].Active = false
- cooldownLabels[buttonName].Visible = true
- local endTime = os.time() + duration
- local cooldownLoop = runService.Heartbeat:Connect(function()
- local remaining = endTime - os.time()
- if remaining > 0 then
- cooldownLabels[buttonName].Text = tostring(math.ceil(remaining))
- else
- cooldownLabels[buttonName].Visible = false
- abilityButtons[buttonName].Active = true
- cooldownVar = false
- cooldownLoop:Disconnect()
- end
- end)
- end
- -- Teleportar Survivors com Life2 para o ritual
- local function teleportSurvivorsToRitual(position)
- for _, survivor in ipairs(workspace.Players.Survivors:GetChildren()) do
- if survivor:FindFirstChild("Life2") then
- local hrp = survivor:FindFirstChild("HumanoidRootPart")
- if hrp then
- hrp.CFrame = position + Vector3.new(0, 3, 0)
- end
- end
- end
- end
- -- Habilidade Crouch com cooldown
- local function toggleCrouch()
- if not crouchCooldown then
- startCooldown("Crouch", COOLDOWNS.Crouch, crouchCooldown)
- if isCrouching then -- Desativar crouch
- setCharacterFrozen(true)
- playSound(SOUNDS.CrouchOff, char)
- animations.CrouchEnd:Play()
- task.delay(animations.CrouchEnd.Length, function()
- setCharacterFrozen(false)
- isCrouching = false
- humanoid.WalkSpeed = originalWalkSpeed
- humanoid.JumpPower = 50
- if currentCrouchAnim then
- currentCrouchAnim:Stop()
- end
- if crouchConnection then
- crouchConnection:Disconnect()
- crouchConnection = nil
- end
- end)
- else -- Ativar crouch
- setCharacterFrozen(true)
- playSound(SOUNDS.CrouchOn, char)
- animations.CrouchStart:Play()
- task.delay(animations.CrouchStart.Length, function()
- isCrouching = true
- humanoid.WalkSpeed = 16
- humanoid.JumpPower = 0
- setCharacterFrozen(false)
- -- Iniciar animação de idle agachado
- animations.CrouchIdle:Play()
- currentCrouchAnim = animations.CrouchIdle
- if crouchConnection then
- crouchConnection:Disconnect()
- end
- -- Monitorar movimento enquanto agachado
- crouchConnection = humanoid.Running:Connect(function(speed)
- if currentCrouchAnim then
- currentCrouchAnim:Stop()
- end
- if speed > 0 then
- if speed > 16 then
- animations.CrouchRun:Play()
- currentCrouchAnim = animations.CrouchRun
- else
- animations.CrouchWalk:Play()
- currentCrouchAnim = animations.CrouchWalk
- end
- else
- animations.CrouchIdle:Play()
- currentCrouchAnim = animations.CrouchIdle
- end
- end)
- end)
- end
- end
- end
- -- Habilidade Shadow Step com cooldown e dash reduzido
- local function useShadowStep()
- if not shadowStepCooldown then
- startCooldown("ShadowStep", COOLDOWNS.ShadowStep, shadowStepCooldown)
- local stabAnim = isCrouching and animations.CrouchStab or animations.Stab
- stabAnim:Play()
- playSound(SOUNDS.ShadowStepDash, char)
- task.delay(0.5, function()
- playSound(SOUNDS.ShadowStepHit, char)
- end)
- -- Dash reduzido (de 70 para 50)
- local dashVelocity = Instance.new("BodyVelocity")
- dashVelocity.Velocity = rootPart.CFrame.LookVector * 50
- dashVelocity.MaxForce = Vector3.new(1, 1, 1) * math.huge
- dashVelocity.Parent = rootPart
- debris:AddItem(dashVelocity, 0.25)
- local hitbox = Instance.new("Part")
- hitbox.Size = Vector3.new(6, 6, 8)
- hitbox.CFrame = rootPart.CFrame + rootPart.CFrame.LookVector * 6
- hitbox.CanCollide = false
- hitbox.Transparency = 1
- hitbox.Parent = workspace
- hitbox.Touched:Connect(function(hit)
- local targetPlayer = game.Players:GetPlayerFromCharacter(hit.Parent)
- if targetPlayer and (targetPlayer.Character.Name == "c00lkidd" or
- targetPlayer.Character.Name == "Jason" or
- targetPlayer.Character.Name == "JohnDoe" or
- targetPlayer.Character.Name == "1x1x1x1") then
- local flingVelocity = Instance.new("BodyVelocity")
- flingVelocity.Velocity = rootPart.CFrame.LookVector * -25
- flingVelocity.MaxForce = Vector3.new(1, 1, 1) * math.huge
- flingVelocity.Parent = targetPlayer.Character.HumanoidRootPart
- debris:AddItem(flingVelocity, 0.6)
- boostPlayerSpeed()
- playSound(SOUNDS.ShadowStepImpact, char)
- end
- end)
- debris:AddItem(hitbox, 0.6)
- end
- end
- -- Habilidade Ritual
- local function useRitual()
- if not ritualCooldown then
- startCooldown("Ritual", COOLDOWNS.Ritual, ritualCooldown)
- playSound(SOUNDS.Ritual, char)
- animations.Ritual:Play()
- ritualPosition = rootPart.CFrame - Vector3.new(0, 3, 0)
- local ritualSymbol = Instance.new("Part")
- ritualSymbol.Size = Vector3.new(5, 0.2, 5)
- ritualSymbol.CFrame = ritualPosition
- ritualSymbol.Anchored = true
- ritualSymbol.CanCollide = false
- ritualSymbol.Transparency = 0.5
- ritualSymbol.Color = Color3.new(0, 0, 0)
- -- Aplicar a textura personalizada
- local decal = Instance.new("Decal")
- decal.Texture = "rbxassetid://80566262142997"
- decal.Face = Enum.NormalId.Top
- decal.Parent = ritualSymbol
- ritualSymbol.Parent = workspace
- createSmokeEffect(ritualSymbol.Position)
- -- Teleportar Survivors com Life2
- teleportSurvivorsToRitual(ritualPosition)
- humanoid.Health = humanoid.Health + 20
- humanoid.WalkSpeed = humanoid.WalkSpeed + 3
- task.delay(7, function()
- humanoid.WalkSpeed = humanoid.WalkSpeed - 3
- end)
- humanoid.Died:Connect(function()
- playSound(SOUNDS.Respawn, char)
- animations.Respawn:Play()
- task.delay(1.5, function()
- if ritualPosition then
- rootPart.CFrame = ritualPosition + Vector3.new(0, 3, 0)
- end
- end)
- end)
- end
- end
- -- Função para criar botões de habilidade PERFEITAMENTE CIRCULARES
- local function createAbilityButtons()
- local screenGui = Instance.new("ScreenGui")
- screenGui.Name = "AbilityGUI"
- screenGui.ResetOnSpawn = false
- screenGui.Parent = player:WaitForChild("PlayerGui")
- -- Função para criar um botão de habilidade circular
- local function createAbilityButton(name, position, callback)
- -- Container principal (invisível, apenas para posicionamento)
- local buttonContainer = Instance.new("Frame")
- buttonContainer.Name = name.."Container"
- buttonContainer.Size = UDim2.new(0.08, 0, 0.08, 0)
- buttonContainer.Position = position
- buttonContainer.BackgroundTransparency = 1
- buttonContainer.Parent = screenGui
- -- Círculo externo (borda branca)
- local outerCircle = Instance.new("Frame")
- outerCircle.Name = "OuterCircle"
- outerCircle.Size = UDim2.new(1, 0, 1, 0)
- outerCircle.BackgroundColor3 = Color3.new(1, 1, 1)
- outerCircle.BackgroundTransparency = 0.7
- outerCircle.Parent = buttonContainer
- -- Tornar PERFEITAMENTE circular
- local corner = Instance.new("UICorner")
- corner.CornerRadius = UDim.new(1, 0)
- corner.Parent = outerCircle
- -- Círculo interno (fundo transparente)
- local innerCircle = Instance.new("Frame")
- innerCircle.Name = "InnerCircle"
- innerCircle.Size = UDim2.new(0.8, 0, 0.8, 0)
- innerCircle.Position = UDim2.new(0.1, 0, 0.1, 0)
- innerCircle.BackgroundColor3 = Color3.new(1, 1, 1)
- innerCircle.BackgroundTransparency = 0.9
- innerCircle.Parent = outerCircle
- -- Tornar PERFEITAMENTE circular
- local innerCorner = Instance.new("UICorner")
- innerCorner.CornerRadius = UDim.new(1, 0)
- innerCorner.Parent = innerCircle
- -- Texto do botão
- local label = Instance.new("TextLabel")
- label.Name = "Label"
- label.Size = UDim2.new(1, 0, 1, 0)
- label.BackgroundTransparency = 1
- label.Text = name
- label.TextColor3 = Color3.new(0, 0, 0)
- label.TextScaled = true
- label.Font = Enum.Font.GothamBold
- label.Parent = outerCircle
- -- Label de cooldown
- local cooldownLabel = Instance.new("TextLabel")
- cooldownLabel.Name = "CooldownLabel"
- cooldownLabel.Size = UDim2.new(1, 0, 1, 0)
- cooldownLabel.BackgroundTransparency = 0.7
- cooldownLabel.BackgroundColor3 = Color3.new(0, 0, 0)
- cooldownLabel.Text = ""
- cooldownLabel.TextColor3 = Color3.new(1, 1, 1)
- cooldownLabel.TextScaled = true
- cooldownLabel.Font = Enum.Font.GothamBold
- cooldownLabel.Visible = false
- cooldownLabel.Parent = outerCircle
- -- Adicionar funcionalidade de arrastar
- local dragStartPos, buttonStartPos
- outerCircle.InputBegan:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 and buttonsDraggable then
- dragStartPos = Vector2.new(input.Position.X, input.Position.Y)
- buttonStartPos = buttonContainer.Position
- end
- end)
- outerCircle.InputChanged:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseMovement and dragStartPos and buttonsDraggable then
- local delta = Vector2.new(input.Position.X, input.Position.Y) - dragStartPos
- buttonContainer.Position = UDim2.new(
- buttonStartPos.X.Scale,
- buttonStartPos.X.Offset + delta.X,
- buttonStartPos.Y.Scale,
- buttonStartPos.Y.Offset + delta.Y
- )
- end
- end)
- outerCircle.InputEnded:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- dragStartPos = nil
- end
- end)
- outerCircle.MouseButton1Click:Connect(function()
- if outerCircle.Active then
- callback()
- end
- end)
- abilityButtons[name] = outerCircle
- cooldownLabels[name] = cooldownLabel
- return buttonContainer
- end
- -- Criar botões de habilidades
- createAbilityButton("Crouch", UDim2.new(0.1, 0, 0.7, 0), toggleCrouch)
- createAbilityButton("ShadowStep", UDim2.new(0.2, 0, 0.7, 0), useShadowStep)
- createAbilityButton("Ritual", UDim2.new(0.3, 0, 0.7, 0), useRitual)
- -- Botão de trava para arrastar
- local lockButton = Instance.new("TextButton")
- lockButton.Name = "LockButton"
- lockButton.Size = UDim2.new(0.05, 0, 0.05, 0)
- lockButton.Position = UDim2.new(0.95, 0, 0.05, 0)
- lockButton.BackgroundColor3 = Color3.new(1, 1, 1)
- lockButton.BackgroundTransparency = 0.5
- lockButton.TextColor3 = Color3.new(0, 0, 0)
- lockButton.Text = "🔓"
- lockButton.TextScaled = true
- lockButton.Parent = screenGui
- -- Tornar o botão circular
- local corner = Instance.new("UICorner")
- corner.CornerRadius = UDim.new(1, 0)
- corner.Parent = lockButton
- lockButton.MouseButton1Click:Connect(function()
- buttonsDraggable = not buttonsDraggable
- if buttonsDraggable then
- lockButton.Text = "🔓"
- else
- lockButton.Text = "🔒"
- end
- for _, button in pairs(abilityButtons) do
- button.Draggable = buttonsDraggable
- end
- end)
- return screenGui
- end
- -- Função para mostrar/ocultar botões baseado no personagem
- local function updateAbilityButtonsVisibility()
- local abilityGUI = player.PlayerGui:FindFirstChild("AbilityGUI")
- if abilityGUI then
- local visible = isTwoTime()
- for _, button in pairs(abilityButtons) do
- button.Parent.Visible = visible
- end
- abilityGUI.LockButton.Visible = visible
- end
- end
- -- Inicialização
- local function initialize()
- -- Carregar animações
- for name, id in pairs(ANIMATIONS) do
- animations[name] = loadAnimation(id)
- end
- -- Criar GUI de habilidades
- createAbilityButtons()
- -- Carregar faca se for TwoTime
- if isTwoTime() then
- loadKnifeAccessory()
- end
- -- Atualizar visibilidade dos botões
- updateAbilityButtonsVisibility()
- -- Monitorar mudanças de personagem
- player.CharacterAdded:Connect(function(newChar)
- char = newChar
- humanoid = char:FindFirstChildOfClass("Humanoid")
- rootPart = char:FindFirstChild("HumanoidRootPart")
- originalWalkSpeed = humanoid.WalkSpeed
- -- Recarregar animações para o novo personagem
- for name, id in pairs(ANIMATIONS) do
- animations[name] = loadAnimation(id)
- end
- -- Carregar faca se for TwoTime
- if isTwoTime() then
- loadKnifeAccessory()
- end
- -- Atualizar visibilidade dos botões
- updateAbilityButtonsVisibility()
- end)
- end
- -- Iniciar o script
- initialize()
Advertisement
Add Comment
Please, Sign In to add comment