Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Made by GearsOfPower
- -- http://pastebin.com/raw/FhkuCZDD
- local Player = game.Players.LocalPlayer
- local Mouse = Player:GetMouse()
- repeat wait() until Player.Character
- local Character = Player.Character
- local scriptId = "GhostScriptID-9211"
- script.Name = scriptId
- script.Parent = Player.PlayerScripts
- local GhostObject
- local SwordObject
- -- | Functions
- -- General
- local General = {}
- function General.LoopClosure(parent, func)
- for _,v in pairs(parent:GetChildren()) do
- func(v)
- end
- end
- function General.IsMainBodyPart(part)
- if part:IsA("Part") and part.Name ~= "HumanoidRootPart" and part.Name ~= "Head" then
- return true
- else
- return false
- end
- end
- function General.TweenTransparency(model, start, finish)
- local value = start
- if start < finish then
- repeat
- value = value + 0.1
- General.LoopClosure(model, function(v)
- if General.IsMainBodyPart(v) then
- v.Transparency = value
- end
- end)
- wait()
- until value >= finish
- else
- repeat
- value = value - 0.1
- General.LoopClosure(model, function(v)
- if General.IsMainBodyPart(v) then
- v.Transparency = value
- end
- end)
- wait()
- until value <= finish
- end
- end
- function General.TweenSize(part, start, finish, increment, waitTime)
- local value = start
- if start < finish then
- repeat
- value = value + increment
- part.Size = part.Size + Vector3.new(increment, increment, increment)
- wait(waitTime)
- until value >= finish
- else
- repeat
- value = value - increment
- part.Size = part.Size - Vector3.new(increment, increment, increment)
- wait(waitTime)
- until value <= finish
- end
- end
- function General.TweenSizeCo(part, start, finish, increment, waitTime, tweenFunction, finishedFunction)
- coroutine.resume(coroutine.create(function()
- local value = start
- if start < finish then
- repeat
- if part == nil then break end
- value = value + increment
- part.Size = part.Size + Vector3.new(increment, increment, increment)
- if tweenFunction ~= nil then tweenFunction() end
- wait(waitTime)
- until value >= finish
- else
- repeat
- if part == nil then break end
- value = value - increment
- part.Size = part.Size - Vector3.new(increment, increment, increment)
- if tweenFunction ~= nil then tweenFunction() end
- wait(waitTime)
- until value <= finish
- end
- if finishedFunction ~= nil then
- finishedFunction()
- end
- end))
- end
- function General.IsCharacter(part)
- if part == nil then return end
- if part:FindFirstChild("Humanoid") or part.Parent:FindFirstChild("Humanoid") or part.Parent.Parent:FindFirstChild("Humanoid") then
- return true
- else
- return false
- end
- end
- function General.GetCharacter(part)
- if part == nil then return end
- if part.Parent:FindFirstChild("Humanoid") then
- return part.Parent
- elseif part.Parent.Parent:FindFirstChild("Humanoid") then
- return part.Parent.Parent
- end
- end
- function General.GetPlayer(part)
- local character = General.GetCharacter(part)
- if character ~= nil then
- local player = game.Players:GetPlayerFromCharacter(character)
- if player ~= nil then
- return player
- end
- end
- end
- function General.Weld(part1, part2)
- local weld = Instance.new("Weld", part1)
- weld.Part0 = part1
- weld.Part1 = part2
- return weld
- end
- -- Animations
- -- RIGHT ARM ANGLES | C0 ( +FORWARD/-BACK, +TILT LEFT/-TILT RIGHT, +OUT/-IN ) | C1 INVERSE
- local Animation = {}
- Animation.rigged = false
- function Animation.RigCharacter(character)
- local rightArmWeld
- if not character.Torso:FindFirstChild("RightArmWeld") then
- rightArmWeld = General.Weld(character.Torso, character["Right Arm"])
- rightArmWeld.Name = "RightArmWeld"
- rightArmWeld.C1 = rightArmWeld.C1 * CFrame.new(-1.5, 0, 0)
- else
- rightArmWeld = character.Torso.RightArmWeld
- end
- Animation.Root = character.HumanoidRootPart:WaitForChild("RootJoint")
- Animation.RootRoot = {Animation.Root.C0, Animation.Root.C1} -- the name......
- Animation.RightArm = rightArmWeld
- Animation.RightArmRoot = {rightArmWeld.C0, rightArmWeld.C1}
- Animation.rigged = true
- end
- function Animation.Reset()
- if not Animation.rigged then return end
- Animation.Root.C0 = Animation.RootRoot[1]
- Animation.Root.C1 = Animation.RootRoot[2]
- Animation.RightArm.C0 = Animation.RightArmRoot[1]
- Animation.RightArm.C1 = Animation.RightArmRoot[2]
- end
- function Animation.Destroy()
- Animation.RightArm:Destroy()
- Animation.rigged = false
- end
- -- | Classes
- -- Custom tool class
- local Toolv2 = {}
- Toolv2.create = function()
- local instance = {}
- instance.enabled = true
- instance.active = false
- instance.initialized = false
- instance.postInit = function()
- -- override
- end
- instance.init = function(player, char, mouse)
- instance.Player = player
- instance.Character = char
- instance.Mouse = mouse
- instance.initialized = true
- instance.postInit()
- end
- instance.isReady = function()
- if instance.initialized and not instance.active and instance.enabled then
- return true
- else
- return false
- end
- end
- return instance
- end
- -- Ghostwalker tool class
- local Sword = {}
- Sword.create = function()
- local instance = Toolv2.create()
- instance.postInit = function()
- Animation.RigCharacter(instance.Character)
- instance.idleStance()
- instance.createSword()
- instance.lastAttack = game:GetService("RunService").Stepped:wait()
- instance.combo = 1
- instance.defaultSpeed = 20
- instance.night = false
- instance.Character.Humanoid.WalkSpeed = instance.defaultSpeed
- instance.updateSouls(0)
- instance.Character.Humanoid.Died:connect(function()
- instance.enabled = false
- end)
- instance.Mouse.Button1Down:connect(function()
- if not instance.isReady() then return end
- if instance.minion ~= nil then
- if instance.minion:FindFirstChild("Humanoid") and Mouse.Hit ~= nil then
- instance.minion.Humanoid:MoveTo(Mouse.Hit.p)
- end
- return
- end
- local t = game:GetService("RunService").Stepped:wait()
- if t - instance.lastAttack < .5 and instance.combo == 1 then
- instance.sliceOut()
- instance.combo = 2
- elseif t - instance.lastAttack < .5 and instance.combo == 2 then
- instance.lunge()
- else
- instance.sliceInit()
- instance.combo = 1
- end
- end)
- instance.Mouse.KeyDown:connect(function(key)
- if not instance.isReady() then return end
- key:lower()
- if key == 'f' then
- instance.soulFire()
- elseif key == 'e' then
- instance.soulControl()
- elseif key == 'q' then
- instance.soulJail()
- elseif key == 'g' then
- if instance.night == false then
- instance.soulNight()
- elseif instance.night == true and Mouse.Hit ~= nil then
- instance.genericBlast(Mouse.Hit)
- end
- elseif key == 't' then
- instance.sheathe()
- end
- end)
- end
- instance.updateSouls = function(amount)
- instance.souls = amount
- instance.Character.Humanoid.MaxHealth = (instance.souls * 100) + 250
- instance.Character.Humanoid.Health = instance.Character.Humanoid.MaxHealth
- instance.swordFire.Size = instance.souls
- end
- instance.hitFunction = function(hit, damage)
- local char = General.GetCharacter(hit)
- if char ~= nil and char ~= instance.Character and char.Humanoid.Health > 0 then
- if damage == nil then
- char.Humanoid.Health = char.Humanoid.Health - ((instance.souls * 10) + 10)
- else
- char.Humanoid.Health = char.Humanoid.Health - (damage)
- end
- if char.Humanoid.Health <= 0 then
- General.TweenTransparency(char, 0, 1)
- instance.updateSouls(instance.souls + 1)
- end
- end
- end
- instance.idleStance = function()
- Animation.Reset()
- Animation.Root.C1 = Animation.Root.C1 * CFrame.Angles(0, 0, -0.5)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(1.5, 0.3, 0.3)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(-0.2, -0.75, -0.2)
- if instance.swordWeld ~= nil then
- instance.swordWeld.C0 = instance.swordWeldRoot[1]
- instance.swordWeld.C1 = instance.swordWeldRoot[2]
- end
- end
- instance.spellStance = function()
- instance.idleStance()
- for i = 1,10 do
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(-0.2, 0, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(0, -0.07, 0.05)
- instance.createSwordTrail()
- wait()
- end
- end
- instance.updateAttack = function()
- instance.lastAttack = game:GetService("RunService").Stepped:wait()
- end
- instance.createSword = function()
- local part = Instance.new("Part", instance.Character)
- part.CanCollide = false
- part.Transparency = 0.8
- part.BrickColor = BrickColor.new("White")
- part.Size = Vector3.new(1, 0.8, 4)
- part.Material = "Neon"
- part.Touched:connect(function(hit)
- instance.hitFunction(hit, nil)
- end)
- local mesh = Instance.new("SpecialMesh", part)
- mesh.MeshType = "FileMesh"
- mesh.MeshId = "http://www.roblox.com/asset/?id=12221720"
- local weld = General.Weld(instance.Character["Right Arm"], part)
- weld.C1 = weld.C1 * CFrame.Angles(3.16, 0, 1.6)
- weld.C1 = weld.C1 * CFrame.new(0, 1, 1.5)
- local slashSound = Instance.new("Sound", part)
- slashSound.SoundId = "rbxasset://sounds/swordslash.wav"
- slashSound.Volume = 0.7
- instance.sword = part
- instance.swordWeld = weld
- instance.swordWeldRoot = {weld.C0, weld.C1}
- instance.slash = slashSound
- instance.swordFire = instance.fireEffect(part, 1, nil)
- instance.swordFire.Heat = 1
- end
- instance.createSwordTrail = function()
- local part = Instance.new("Part", instance.Character)
- part.CanCollide = false
- part.Anchored = true
- part.Size = Vector3.new(1.3, 0.2, 4)
- part.Transparency = 0.9
- part.BrickColor = BrickColor.new("White")
- part.TopSurface = 0
- part.BottomSurface = 0
- part.CFrame = instance.sword.CFrame
- instance.debris(part, 0.2)
- end
- instance.sliceInit = function()
- instance.active = true
- instance.idleStance()
- instance.slash:Play()
- for i = 1,6 do
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(-0.26, 0, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(0, 0, 0.14)
- instance.createSwordTrail()
- wait()
- end
- wait(0.2)
- instance.updateAttack()
- instance.idleStance()
- instance.active = false
- end
- instance.sliceOut = function()
- instance.active = true
- instance.idleStance()
- for i = 1,5 do
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(0, 0.2, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(-0.14, 0, 0.2)
- instance.createSwordTrail()
- wait()
- end
- instance.slash:Play()
- for i = 1,5 do
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(-0.4, 0, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(0, -0.15, 0.15)
- instance.createSwordTrail()
- wait()
- end
- wait(0.3)
- instance.updateAttack()
- instance.idleStance()
- instance.active = false
- end
- instance.lunge = function()
- instance.active = true
- instance.idleStance()
- for i = 1,5 do
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(-0.4, 0, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(0, -0.15, 0.1)
- instance.createSwordTrail()
- wait()
- end
- instance.Character.Humanoid.WalkSpeed = 0
- wait(0.5)
- instance.swordWeld.C1 = instance.swordWeld.C1 * CFrame.Angles(1.6,0,0)
- instance.swordWeld.C1 = instance.swordWeld.C1 * CFrame.new(0, 0.8, 1)
- instance.positionForce(instance.Character.Torso, (instance.Character.HumanoidRootPart.CFrame * CFrame.new(0, 1, -30)).p, 1.3)
- instance.slash:Play()
- for i = 1,4 do -- added .2 due to 1 less frame
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.Angles(0.5, 0, 0)
- Animation.RightArm.C0 = Animation.RightArm.C0 * CFrame.new(0, 0.17, -0.14)
- wait()
- end
- wait(0.4)
- instance.genericBlast(instance.sword.CFrame)
- wait(0.6)
- instance.Character.Humanoid.WalkSpeed = instance.defaultSpeed
- --instance.updateAttack()
- instance.idleStance()
- instance.active = false
- end
- instance.startSpell = function(requirement)
- if instance.souls < requirement then
- return false
- else
- instance.updateSouls(instance.souls - requirement)
- end
- instance.active = true
- instance.Character.Humanoid.WalkSpeed = 0
- instance.spellStance()
- return true
- end
- instance.endSpell = function()
- instance.Character.Humanoid.WalkSpeed = instance.defaultSpeed
- instance.idleStance()
- instance.active = false
- end
- instance.genericBlast = function(cf)
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxasset://sounds\\HalloweenGhost.wav"
- sound.Parent = instance.sword
- sound:Play()
- local spell = instance.spellEffect()
- spell.CFrame = cf
- spell.Touched:connect(function(hit)
- instance.hitFunction(hit, 10)
- end)
- General.TweenSizeCo(spell, spell.Size.X, 24, 1, 0.025, function()
- if spell ~= nil then
- spell.Transparency = spell.Transparency + 0.025
- spell.CFrame = cf
- end
- end,
- function()
- if spell ~= nil then
- spell:Destroy()
- end
- end) -- First function fires every time the part size is changed / while part size is tweening. Second function fires once the tweening process is complete.
- end
- instance.soulFire = function()
- if not instance.startSpell(1) then return end
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxasset://sounds\\HalloweenGhost.wav"
- sound.Parent = instance.sword
- sound:Play()
- local spell = instance.spellEffect()
- spell.CFrame = instance.Character.Torso.CFrame
- spell.Touched:connect(function(hit)
- instance.hitFunction(hit, 100)
- end)
- for i = 1, 20 do
- spell.Size = spell.Size + Vector3.new(3, 3, 3)
- spell.Transparency = spell.Transparency + 0.025
- spell.CFrame = instance.Character.Torso.CFrame
- wait()
- end
- spell:Destroy()
- wait(0.3)
- instance.endSpell()
- end
- instance.soulControl = function()
- if not instance.startSpell(1) then return end
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxasset://sounds\\HalloweenGhost.wav"
- sound.Parent = instance.sword
- sound:Play()
- if instance.minion ~= nil then
- instance.minion = nil
- instance.minionConnection:disconnect()
- else
- local char = General.GetCharacter(instance.Mouse.Target)
- if char ~= nil and char:FindFirstChild("Torso") then
- instance.minion = char
- instance.minionConnection = char.Torso.Touched:connect(function(hit)
- instance.hitFunction(hit, 100)
- end)
- instance.fireEffect(char.Torso, 4, nil)
- end
- end
- wait(0.3)
- instance.endSpell()
- end
- instance.soulJail = function()
- if not instance.startSpell(3) then return end
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxasset://sounds\\HalloweenGhost.wav"
- sound.Parent = instance.sword
- sound:Play()
- local char = General.GetCharacter(instance.Mouse.Target)
- if char ~= nil and char:FindFirstChild("Torso") then
- char.Torso.Anchored = true
- char.Humanoid.WalkSpeed = 0
- local spell = instance.spellEffect()
- spell.Size = Vector3.new(12, 12, 12)
- spell.CFrame = char.Torso.CFrame
- instance.debris(spell, 30)
- end
- wait(0.5)
- instance.endSpell()
- end
- instance.soulNight = function()
- if not instance.startSpell(5) then return end
- instance.night = true
- local sound = Instance.new("Sound")
- sound.SoundId = "rbxasset://sounds\\HalloweenGhost.wav"
- sound.Parent = instance.sword
- sound:Play()
- local timeOfDay = 12
- for i = 1, 12 do
- game.Lighting.TimeOfDay = tostring(timeOfDay)
- timeOfDay = timeOfDay + 1
- wait(0.1)
- end
- instance.fireEffect(instance.Character.Torso, 5, 10)
- wait(0.5)
- instance.endSpell()
- instance.Character.Humanoid.WalkSpeed = 30
- instance.defaultSpeed = 30
- coroutine.resume(coroutine.create(function()
- wait(10)
- instance.defaultSpeed = 20
- if instance.isReady() then
- instance.Character.Humanoid.WalkSpeed = instance.defaultSpeed
- end
- for i = 1, 12 do
- game.Lighting.TimeOfDay = tostring(timeOfDay)
- timeOfDay = timeOfDay + 1
- wait(0.1)
- end
- instance.night = false
- end))
- end
- instance.sheathe = function()
- instance.enabled = false
- instance.sword:Destroy()
- Animation.Reset()
- --Animation.Destroy()
- GhostObject.enabled = true
- end
- instance.positionForce = function(parent, position, decay)
- local bp = Instance.new("BodyPosition", parent)
- bp.Position = position
- instance.debris(bp, decay)
- end
- instance.fireEffect = function(part, size, decay)
- local fire = Instance.new("Fire", part)
- fire.Color = Color3.new(85/255, 255/255, 255/255)
- fire.Size = size
- if decay ~= nil then
- instance.debris(fire, decay)
- end
- return fire
- end
- instance.spellEffect = function()
- local spell = Instance.new("Part", workspace)
- spell.Shape = "Ball"
- spell.CanCollide = false
- spell.Anchored = true
- spell.BrickColor = BrickColor.new("White")
- spell.TopSurface = 0
- spell.BottomSurface = 0
- spell.Size = Vector3.new(5,5,5)
- spell.Transparency = 0.5
- spell.Material = "Neon"
- return spell
- end
- instance.debris = function(item, decay)
- game:GetService("Debris"):AddItem(item, decay)
- end
- return instance
- end
- -- Ghost tool class
- local Ghost = {}
- Ghost.create = function()
- local instance = Toolv2.create()
- instance.visible = false
- instance.hasBody = false
- instance.postInit = function()
- if instance.Character:FindFirstChild("Body Colors") then
- instance.Character["Body Colors"]:Destroy()
- end
- end
- instance.ghostify = function(char)
- instance.Player.Backpack:ClearAllChildren()
- General.LoopClosure(char, function(v)
- if v:IsA("Hat") or v:IsA("Shirt") or v:IsA("Pants") or v:IsA("CharacterMesh") or v.Name == "Body Colors" then
- v:Destroy()
- end
- if v.Name == "Head" then -- Remove Face
- v:ClearAllChildren()
- end
- if not General.IsMainBodyPart(v) and v:IsA("Part") then
- v.Transparency = 1
- end
- end)
- General.LoopClosure(char, function(v)
- if v:IsA("Part") then -- Need to re-loop due to body colors object resetting body colors
- v.BrickColor = BrickColor.new("White")
- v.Material = "Neon"
- end
- end)
- General.TweenTransparency(char, 0, 1)
- end
- instance.clone = function(char)
- if not General.IsCharacter(char) then
- return
- end
- instance.ghostify(instance.Character)
- General.LoopClosure(char, function(v)
- if v:IsA("Part") then
- local correspondant = instance.Character:FindFirstChild(v.Name)
- if correspondant ~= nil then
- correspondant.BrickColor = v.BrickColor
- correspondant.Transparency = v.Transparency
- correspondant.Material = v.Material
- end
- elseif v:IsA("Hat") or v:IsA("Shirt") or v:IsA("Pants") or v:IsA("CharacterMesh") then
- v.Parent = instance.Character
- end
- if v.Name == "Head" then
- for _,x in pairs(v:GetChildren()) do
- x.Parent = instance.Character.Head
- end
- end
- end)
- end
- instance.appear = function()
- if instance.hasBody then return end
- instance.active = true
- if instance.visible then
- General.TweenTransparency(instance.Character, 0.8, 1)
- instance.visible = false
- else
- General.TweenTransparency(instance.Character, 1, 0.8)
- instance.visible = true
- end
- instance.active = false
- end
- instance.teleport = function()
- if instance.hasBody then
- return
- end
- local hit = instance.Mouse.Target
- if hit ~= nil and General.IsCharacter(hit) then
- local myPosition = instance.Character.Torso.Position
- instance.Character:MoveTo(hit.Position)
- General.GetCharacter(hit):MoveTo(myPosition)
- else
- instance.Character:MoveTo(instance.Mouse.Hit.p)
- end
- end
- instance.possess = function()
- instance.active = true
- local char = General.GetCharacter(instance.Mouse.Target)
- if char ~= nil and char:FindFirstChild("Torso") then
- instance.clone(char)
- instance.Character:MoveTo(char.Torso.Position)
- General.TweenTransparency(char, 0, 1)
- General.LoopClosure(char, function(v)
- if v:IsA("Part") then
- v:Destroy()
- end
- end)
- SwordObject = Sword.create()
- SwordObject.init(instance.Player, instance.Character, instance.Mouse)
- instance.hasBody = true
- instance.enabled = false
- end
- instance.active = false
- end
- instance.leaveBody = function()
- instance.active = true
- instance.ghostify(instance.Character)
- instance.hasBody = false
- instance.active = false
- end
- instance.steal = function()
- local enemyPlayer = General.GetPlayer(instance.Mouse.Target)
- if enemyPlayer ~= nil then
- local stealFunction = function(v)
- if v:IsA("Script") or v:IsA("LocalScript") or v:IsA("Tool") or v:IsA("Hopperbin") then
- v:Clone().Parent = instance.Player.Backpack
- end
- end
- General.LoopClosure(enemyPlayer.Backpack, stealFunction)
- General.LoopClosure(enemyPlayer.StarterGear, stealFunction)
- end
- end
- instance.postInit = function()
- instance.Mouse.KeyDown:connect(function(key)
- key:lower()
- if not instance.isReady() then return end
- if key == 'q' then
- instance.appear()
- elseif key == 'e' then
- instance.teleport()
- elseif key == 'f' then
- instance.possess()
- elseif key == 'g' then
- instance.leaveBody()
- elseif key == 'c' then
- instance.steal()
- elseif key == 'p' then
- local cleanseFunction = function(v)
- if v.Name ~= scriptId then
- v:Destroy()
- end
- end
- General.LoopClosure(instance.Player.StarterGear, cleanseFunction)
- General.LoopClosure(instance.Player.Backpack, cleanseFunction)
- end
- end)
- end
- return instance
- end
- -- Events
- Player.CharacterAdded:connect(function()
- Character = Player.Character
- GhostObject = Ghost.create()
- GhostObject.init(Player, Character, Mouse)
- wait(1)
- GhostObject.ghostify(Player.Character)
- --SwordObject = Sword.create()
- --SwordObject.init(Player, Character, Mouse)
- end)
- Player.Character:BreakJoints()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement