Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Players = game:GetService("Players")
- local RS = game:GetService("ReplicatedStorage")
- local RunS = game:GetService("RunService")
- local TweenService = game:GetService("TweenService")
- local SETTINGS = {
- ResetComboTime = 2;
- CheckDist = 6;
- Cooldown = .45;
- AirCooldown = .4;
- Force = 105;
- }
- local PlayersData = {}
- local AnimationsF = RS.Animations
- local IdleAnim = AnimationsF.Blank
- local Animations = {
- AnimationsF.M1;
- AnimationsF.M2;
- AnimationsF.M3;
- AnimationsF.M4;
- AnimationsF.M5;
- }
- local FuncTable = {}
- local function setupPlayerData(Player)
- PlayersData[Player] = {}
- local PlayerData = PlayersData[Player]
- PlayerData.Deb = false
- PlayerData.LastHit = 0
- PlayerData.Combo = 1
- PlayerData.Target = nil
- PlayerData.Player = Player
- PlayerData.InAir = false
- PlayerData.Event = nil
- PlayerData.Cooldown = SETTINGS.Cooldown
- PlayerData.IdleAnim = nil
- setmetatable(PlayerData, {__index = FuncTable})
- --Just makes all the functions in FuncTable accessible
- end
- local function startMovement(Humanoid)
- Humanoid.WalkSpeed = 16
- Humanoid.JumpPower = 50
- end
- local function stopMovement(Humanoid)
- Humanoid.WalkSpeed = 0
- Humanoid.JumpPower = 0
- end
- function FuncTable:descend(PlayerData)
- --self = PlayerData
- local Char = self.Player.Character
- Char.PrimaryPart.Anchored = false
- if self.Target then
- self.Target.Parent.PrimaryPart.Anchored = false
- end
- end
- function FuncTable:resetCombo()
- --self = PlayerData
- if self.Target then
- startMovement(self.Target)
- end
- if self.InAir then
- self:descend()
- self.InAir = false
- end
- if self.IdleAnim then
- self.IdleAnim:Stop()
- self.IdleAnim:Destroy()
- self.IdleAnim = nil
- end
- self.Combo = 1
- self.Cooldown = SETTINGS.Cooldown
- RS.CombatEvent:FireClient(self.Player)
- self.Target = nil
- end
- function FuncTable:playAnimation()
- --self = PlayerData
- local Char = self.Player.Character
- if not Char then return end
- local Anim = Animations[self.Combo]
- local LoadAnim = Char.Humanoid:LoadAnimation(Anim)
- LoadAnim.Looped = false
- LoadAnim.Priority = Enum.AnimationPriority.Action
- LoadAnim:Play()
- end
- function FuncTable:ApplyParticle(Space)
- if self.Combo == 4 and Space then return end
- local PunchEffect = RS.Effect.PunchEffect:Clone()
- PunchEffect.Parent = self.Target.Parent.PrimaryPart
- PunchEffect.CFrame = self.Target.Parent.PrimaryPart.CFrame * CFrame.new(0,.2,0)
- game.Debris:AddItem(PunchEffect,SETTINGS.Cooldown + .15)
- end
- function FuncTable:checkDist(P1)
- --self = PlayerData
- local P2 = self.Player.Character.PrimaryPart.Position
- return (P1 - P2).magnitude <= SETTINGS.CheckDist
- end
- local function getHumanoid(Hit)
- return Hit.Parent:FindFirstChildWhichIsA("Humanoid") or Hit.Parent.Parent:FindFirstChildWhichIsA("Humanoid")
- end
- function FuncTable:resetComboChecks(Hit)
- --self = PlayerData
- if self.InAir then
- return true
- elseif self.Target then
- if not self:checkDist(self.Target.Parent.PrimaryPart.Position) then return end
- else
- if not Hit then return end
- local Humanoid = getHumanoid(Hit)
- if not getHumanoid(Hit) then return end
- if not self:checkDist(Humanoid.Parent.PrimaryPart.Position) then return end
- end
- return true
- end
- function FuncTable:hit(Humanoid)
- stopMovement(Humanoid)
- local Anim = self.Player.Character.Humanoid:LoadAnimation(Animations[self.Combo])
- local EnAnim = self.Target:LoadAnimation(RS.Animations.HitStun)
- EnAnim.Priority = Enum.AnimationPriority.Action4
- EnAnim.Looped = false
- Anim.Priority = Enum.AnimationPriority.Action4
- Anim.Looped = false
- Anim:Play()
- EnAnim:Play()
- Humanoid:TakeDamage(10)
- self.Combo = self.Combo + 1
- if self.Combo >= 6 then
- local EffectVelocity = Instance.new("BodyVelocity", self.Target.Parent.HumanoidRootPart)
- EffectVelocity.MaxForce = Vector3.new(1, 1, 1) * 100000;
- EffectVelocity.Velocity = Vector3.new(1, 1, 1) * self.Player.Character.HumanoidRootPart.CFrame.LookVector * math.random(10,SETTINGS.Force)
- game.Debris:AddItem(EffectVelocity,SETTINGS.Cooldown)
- end
- end
- function FuncTable:ascend(Humanoid: Humanoid?)
- --self = PlayerData
- local PlayerPP = self.Player.Character.PrimaryPart
- local HumPP = Humanoid.Parent.PrimaryPart
- if self.Combo == 5 then
- local RCParams = RaycastParams.new()
- RCParams.FilterDescendantsInstances = {self.Player}
- RCParams.FilterType = Enum.RaycastFilterType.Blacklist
- local StartRay = workspace:Raycast((self.Player.Character.PrimaryPart.CFrame * CFrame.new(0,0,-30)).Position,Vector3.new(0,-180,0),RCParams)
- if StartRay then
- for _,v in pairs(Humanoid.Parent:GetChildren()) do
- if not v:IsA("BasePart") then continue end
- local DownTween = TweenService:Create(v, TweenInfo.new(.2,Enum.EasingStyle.Linear), {
- Position = StartRay.Position + Vector3.new(0,1,0);
- }):Play()
- end
- end
- else
- if not Humanoid then return end
- self.Combo = self.Combo + 1
- self.Cooldown = SETTINGS.AirCooldown
- local Anim = AnimationsF.Ascend
- local LoadedAnim = self.Player.Character.Humanoid:LoadAnimation(Anim)
- LoadedAnim.Looped = false
- LoadedAnim.Priority = Enum.AnimationPriority.Action4
- local duration = .1
- local Speed = LoadedAnim.Length / .1
- LoadedAnim:AdjustSpeed(Speed)
- LoadedAnim:Play()
- self.IdleAnim = self.Player.Character.Humanoid:LoadAnimation(IdleAnim)
- self.IdleAnim.Priority = Enum.AnimationPriority.Action
- self.IdleAnim.Looped = true
- self.IdleAnim:Play()
- task.wait(.2)
- HumPP.Anchored = true
- PlayerPP.Anchored = true
- --local NewRootPartCFrame: CFrame = HumPP.CFrame + Vector3.new(0, 15, 0)
- --local newCFrame = CFrame.fromOrientation(0, NewRootPartCFrame.Rotation.Y, 0) + NewRootPartCFrame.Position
- local newCFrame = HumPP.CFrame * CFrame.new(0,15,-.4)
- for _,v in pairs(Humanoid.Parent:GetChildren()) do
- if not v:IsA("BasePart") then continue end
- local Tween = TweenService:Create(v, TweenInfo.new(.2, Enum.EasingStyle.Linear), {
- CFrame = newCFrame * (v.CFrame:ToObjectSpace(HumPP.CFrame))
- }):Play()
- end
- local Tween2 = TweenService:Create(PlayerPP, TweenInfo.new(.2, Enum.EasingStyle.Linear), {
- CFrame = newCFrame * CFrame.new(0, 2, -4) * CFrame.Angles(0, math.rad(180), 0)
- })
- Tween2:Play()
- self.InAir = true
- end
- end
- function deletePlayerData(Player)
- local PlayerData = PlayersData[Player]
- if not PlayerData then return end
- PlayerData:resetCombo()
- PlayersData[PlayerData.Player] = nil
- end
- Players.PlayerAdded:Connect(setupPlayerData)
- Players.PlayerRemoving:Connect(deletePlayerData)
- RS.CombatEvent.OnServerEvent:Connect(function(Player, Hit, Space)
- if not Player then return end
- local PlayerData = PlayersData[Player]
- if not PlayersData then setupPlayerData(Player) end
- if PlayerData.Deb then return end
- if not PlayerData.Player.Character then return end
- if tick() - PlayerData.LastHit <= PlayerData.Cooldown then return end
- PlayerData.Deb = true
- local success, errors = pcall(function() --If there's an error, this makes it so that the Debounce still gets reset
- if not PlayerData:resetComboChecks(Hit) then
- PlayerData:playAnimation()
- PlayerData.Combo = PlayerData.Combo + 1
- if PlayerData.Combo >= 6 then
- PlayerData:resetCombo()
- end
- else
- local Humanoid = PlayerData.Target or getHumanoid(Hit)
- PlayerData.Target = Humanoid
- PlayerData:ApplyParticle(Space)
- if not PlayerData.InAir then
- if PlayerData.Combo == 4 and Space then
- PlayerData:ascend(Humanoid)
- else
- PlayerData:hit(Humanoid)
- if PlayerData.Combo >= 6 then
- PlayerData:resetCombo()
- task.wait(SETTINGS.ResetComboTime + 1)
- end
- end
- else
- PlayerData.Target.Parent.PrimaryPart.Anchored = false
- PlayerData:ascend(Humanoid)
- local Anim = Animations[5]
- local LoadAnim = PlayerData.Player.Character.Humanoid:LoadAnimation(Anim)
- LoadAnim.Looped = false
- LoadAnim.Priority = Enum.AnimationPriority.Action3
- LoadAnim:AdjustSpeed(LoadAnim.Length / .2)
- LoadAnim:Play()
- Humanoid:TakeDamage(10)
- RS.CombatEvent:FireAllClients(PlayerData.Player,"Downed", PlayerData.Target.Parent.PrimaryPart.CFrame * CFrame.new(0,0,30))
- PlayerData:resetCombo()
- delay(.2, function() Humanoid:TakeDamage(10) end)
- end
- end
- end)
- if not success then warn(errors) end
- PlayerData.Deb = false
- PlayerData.LastHit = tick()
- if not PlayerData.Event then
- PlayerData.Event = RunS.Heartbeat:Connect(function()
- if tick() - PlayerData.LastHit <= SETTINGS.ResetComboTime + PlayerData.Cooldown then return end
- PlayerData:resetCombo(Player)
- PlayerData.Event:Disconnect()
- PlayerData.Event = nil
- end)
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement