Advertisement
SxScripting

AirCombat Server Script

Aug 21st, 2022
656
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.61 KB | None | 0 0
  1. local Players = game:GetService("Players")
  2. local RS = game:GetService("ReplicatedStorage")
  3. local RunS = game:GetService("RunService")
  4. local TweenService = game:GetService("TweenService")
  5.  
  6. local SETTINGS = {
  7. ResetComboTime = 2;
  8. CheckDist = 6;
  9. Cooldown = .45;
  10. AirCooldown = .4;
  11. Force = 105;
  12. }
  13.  
  14. local PlayersData = {}
  15.  
  16. local AnimationsF = RS.Animations
  17.  
  18. local IdleAnim = AnimationsF.Blank
  19.  
  20. local Animations = {
  21. AnimationsF.M1;
  22. AnimationsF.M2;
  23. AnimationsF.M3;
  24. AnimationsF.M4;
  25. AnimationsF.M5;
  26. }
  27.  
  28.  
  29. local FuncTable = {}
  30.  
  31. local function setupPlayerData(Player)
  32. PlayersData[Player] = {}
  33. local PlayerData = PlayersData[Player]
  34. PlayerData.Deb = false
  35. PlayerData.LastHit = 0
  36. PlayerData.Combo = 1
  37. PlayerData.Target = nil
  38. PlayerData.Player = Player
  39. PlayerData.InAir = false
  40. PlayerData.Event = nil
  41. PlayerData.Cooldown = SETTINGS.Cooldown
  42. PlayerData.IdleAnim = nil
  43.  
  44. setmetatable(PlayerData, {__index = FuncTable})
  45. --Just makes all the functions in FuncTable accessible
  46. end
  47.  
  48. local function startMovement(Humanoid)
  49. Humanoid.WalkSpeed = 16
  50. Humanoid.JumpPower = 50
  51. end
  52.  
  53. local function stopMovement(Humanoid)
  54. Humanoid.WalkSpeed = 0
  55. Humanoid.JumpPower = 0
  56. end
  57.  
  58. function FuncTable:descend(PlayerData)
  59. --self = PlayerData
  60. local Char = self.Player.Character
  61. Char.PrimaryPart.Anchored = false
  62.  
  63. if self.Target then
  64. self.Target.Parent.PrimaryPart.Anchored = false
  65. end
  66. end
  67.  
  68. function FuncTable:resetCombo()
  69. --self = PlayerData
  70. if self.Target then
  71. startMovement(self.Target)
  72. end
  73.  
  74. if self.InAir then
  75. self:descend()
  76. self.InAir = false
  77. end
  78.  
  79. if self.IdleAnim then
  80. self.IdleAnim:Stop()
  81. self.IdleAnim:Destroy()
  82. self.IdleAnim = nil
  83. end
  84.  
  85. self.Combo = 1
  86. self.Cooldown = SETTINGS.Cooldown
  87. RS.CombatEvent:FireClient(self.Player)
  88. self.Target = nil
  89. end
  90.  
  91. function FuncTable:playAnimation()
  92. --self = PlayerData
  93. local Char = self.Player.Character
  94. if not Char then return end
  95. local Anim = Animations[self.Combo]
  96. local LoadAnim = Char.Humanoid:LoadAnimation(Anim)
  97. LoadAnim.Looped = false
  98. LoadAnim.Priority = Enum.AnimationPriority.Action
  99. LoadAnim:Play()
  100. end
  101.  
  102. function FuncTable:ApplyParticle(Space)
  103. if self.Combo == 4 and Space then return end
  104. local PunchEffect = RS.Effect.PunchEffect:Clone()
  105. PunchEffect.Parent = self.Target.Parent.PrimaryPart
  106. PunchEffect.CFrame = self.Target.Parent.PrimaryPart.CFrame * CFrame.new(0,.2,0)
  107.  
  108. game.Debris:AddItem(PunchEffect,SETTINGS.Cooldown + .15)
  109. end
  110.  
  111. function FuncTable:checkDist(P1)
  112. --self = PlayerData
  113. local P2 = self.Player.Character.PrimaryPart.Position
  114. return (P1 - P2).magnitude <= SETTINGS.CheckDist
  115. end
  116.  
  117. local function getHumanoid(Hit)
  118. return Hit.Parent:FindFirstChildWhichIsA("Humanoid") or Hit.Parent.Parent:FindFirstChildWhichIsA("Humanoid")
  119. end
  120.  
  121. function FuncTable:resetComboChecks(Hit)
  122. --self = PlayerData
  123. if self.InAir then
  124. return true
  125. elseif self.Target then
  126. if not self:checkDist(self.Target.Parent.PrimaryPart.Position) then return end
  127. else
  128. if not Hit then return end
  129. local Humanoid = getHumanoid(Hit)
  130. if not getHumanoid(Hit) then return end
  131. if not self:checkDist(Humanoid.Parent.PrimaryPart.Position) then return end
  132. end
  133.  
  134. return true
  135. end
  136.  
  137. function FuncTable:hit(Humanoid)
  138. stopMovement(Humanoid)
  139. local Anim = self.Player.Character.Humanoid:LoadAnimation(Animations[self.Combo])
  140. local EnAnim = self.Target:LoadAnimation(RS.Animations.HitStun)
  141. EnAnim.Priority = Enum.AnimationPriority.Action4
  142. EnAnim.Looped = false
  143.  
  144. Anim.Priority = Enum.AnimationPriority.Action4
  145. Anim.Looped = false
  146. Anim:Play()
  147. EnAnim:Play()
  148. Humanoid:TakeDamage(10)
  149.  
  150.  
  151. self.Combo = self.Combo + 1
  152.  
  153. if self.Combo >= 6 then
  154.  
  155. local EffectVelocity = Instance.new("BodyVelocity", self.Target.Parent.HumanoidRootPart)
  156. EffectVelocity.MaxForce = Vector3.new(1, 1, 1) * 100000;
  157. EffectVelocity.Velocity = Vector3.new(1, 1, 1) * self.Player.Character.HumanoidRootPart.CFrame.LookVector * math.random(10,SETTINGS.Force)
  158.  
  159. game.Debris:AddItem(EffectVelocity,SETTINGS.Cooldown)
  160. end
  161.  
  162. end
  163.  
  164. function FuncTable:ascend(Humanoid: Humanoid?)
  165. --self = PlayerData
  166. local PlayerPP = self.Player.Character.PrimaryPart
  167. local HumPP = Humanoid.Parent.PrimaryPart
  168.  
  169. if self.Combo == 5 then
  170. local RCParams = RaycastParams.new()
  171. RCParams.FilterDescendantsInstances = {self.Player}
  172. RCParams.FilterType = Enum.RaycastFilterType.Blacklist
  173. local StartRay = workspace:Raycast((self.Player.Character.PrimaryPart.CFrame * CFrame.new(0,0,-30)).Position,Vector3.new(0,-180,0),RCParams)
  174.  
  175. if StartRay then
  176. for _,v in pairs(Humanoid.Parent:GetChildren()) do
  177. if not v:IsA("BasePart") then continue end
  178. local DownTween = TweenService:Create(v, TweenInfo.new(.2,Enum.EasingStyle.Linear), {
  179. Position = StartRay.Position + Vector3.new(0,1,0);
  180. }):Play()
  181. end
  182. end
  183. else
  184. if not Humanoid then return end
  185. self.Combo = self.Combo + 1
  186. self.Cooldown = SETTINGS.AirCooldown
  187.  
  188. local Anim = AnimationsF.Ascend
  189. local LoadedAnim = self.Player.Character.Humanoid:LoadAnimation(Anim)
  190. LoadedAnim.Looped = false
  191. LoadedAnim.Priority = Enum.AnimationPriority.Action4
  192.  
  193. local duration = .1
  194. local Speed = LoadedAnim.Length / .1
  195. LoadedAnim:AdjustSpeed(Speed)
  196. LoadedAnim:Play()
  197.  
  198.  
  199. self.IdleAnim = self.Player.Character.Humanoid:LoadAnimation(IdleAnim)
  200. self.IdleAnim.Priority = Enum.AnimationPriority.Action
  201. self.IdleAnim.Looped = true
  202. self.IdleAnim:Play()
  203.  
  204. task.wait(.2)
  205.  
  206. HumPP.Anchored = true
  207. PlayerPP.Anchored = true
  208.  
  209. --local NewRootPartCFrame: CFrame = HumPP.CFrame + Vector3.new(0, 15, 0)
  210.  
  211. --local newCFrame = CFrame.fromOrientation(0, NewRootPartCFrame.Rotation.Y, 0) + NewRootPartCFrame.Position
  212. local newCFrame = HumPP.CFrame * CFrame.new(0,15,-.4)
  213.  
  214. for _,v in pairs(Humanoid.Parent:GetChildren()) do
  215. if not v:IsA("BasePart") then continue end
  216. local Tween = TweenService:Create(v, TweenInfo.new(.2, Enum.EasingStyle.Linear), {
  217. CFrame = newCFrame * (v.CFrame:ToObjectSpace(HumPP.CFrame))
  218. }):Play()
  219. end
  220.  
  221. local Tween2 = TweenService:Create(PlayerPP, TweenInfo.new(.2, Enum.EasingStyle.Linear), {
  222. CFrame = newCFrame * CFrame.new(0, 2, -4) * CFrame.Angles(0, math.rad(180), 0)
  223. })
  224.  
  225. Tween2:Play()
  226.  
  227. self.InAir = true
  228. end
  229.  
  230.  
  231. end
  232.  
  233. function deletePlayerData(Player)
  234. local PlayerData = PlayersData[Player]
  235. if not PlayerData then return end
  236. PlayerData:resetCombo()
  237. PlayersData[PlayerData.Player] = nil
  238. end
  239.  
  240. Players.PlayerAdded:Connect(setupPlayerData)
  241. Players.PlayerRemoving:Connect(deletePlayerData)
  242.  
  243. RS.CombatEvent.OnServerEvent:Connect(function(Player, Hit, Space)
  244. if not Player then return end
  245. local PlayerData = PlayersData[Player]
  246.  
  247. if not PlayersData then setupPlayerData(Player) end
  248. if PlayerData.Deb then return end
  249. if not PlayerData.Player.Character then return end
  250. if tick() - PlayerData.LastHit <= PlayerData.Cooldown then return end
  251. PlayerData.Deb = true
  252.  
  253. local success, errors = pcall(function() --If there's an error, this makes it so that the Debounce still gets reset
  254. if not PlayerData:resetComboChecks(Hit) then
  255. PlayerData:playAnimation()
  256. PlayerData.Combo = PlayerData.Combo + 1
  257. if PlayerData.Combo >= 6 then
  258. PlayerData:resetCombo()
  259. end
  260. else
  261. local Humanoid = PlayerData.Target or getHumanoid(Hit)
  262. PlayerData.Target = Humanoid
  263. PlayerData:ApplyParticle(Space)
  264. if not PlayerData.InAir then
  265. if PlayerData.Combo == 4 and Space then
  266. PlayerData:ascend(Humanoid)
  267. else
  268. PlayerData:hit(Humanoid)
  269. if PlayerData.Combo >= 6 then
  270. PlayerData:resetCombo()
  271. task.wait(SETTINGS.ResetComboTime + 1)
  272. end
  273. end
  274. else
  275. PlayerData.Target.Parent.PrimaryPart.Anchored = false
  276. PlayerData:ascend(Humanoid)
  277.  
  278. local Anim = Animations[5]
  279. local LoadAnim = PlayerData.Player.Character.Humanoid:LoadAnimation(Anim)
  280. LoadAnim.Looped = false
  281. LoadAnim.Priority = Enum.AnimationPriority.Action3
  282. LoadAnim:AdjustSpeed(LoadAnim.Length / .2)
  283. LoadAnim:Play()
  284. Humanoid:TakeDamage(10)
  285.  
  286. RS.CombatEvent:FireAllClients(PlayerData.Player,"Downed", PlayerData.Target.Parent.PrimaryPart.CFrame * CFrame.new(0,0,30))
  287. PlayerData:resetCombo()
  288. delay(.2, function() Humanoid:TakeDamage(10) end)
  289. end
  290. end
  291. end)
  292.  
  293. if not success then warn(errors) end
  294.  
  295. PlayerData.Deb = false
  296. PlayerData.LastHit = tick()
  297.  
  298. if not PlayerData.Event then
  299. PlayerData.Event = RunS.Heartbeat:Connect(function()
  300. if tick() - PlayerData.LastHit <= SETTINGS.ResetComboTime + PlayerData.Cooldown then return end
  301. PlayerData:resetCombo(Player)
  302. PlayerData.Event:Disconnect()
  303. PlayerData.Event = nil
  304. end)
  305. end
  306.  
  307. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement