I made a blaster Skill:
https://gyazo.com/e206deec641768ce747f0eef579ea9ae
Have a simple concept, but i’m having trouble detecting the enemy and causing damage, this skill has 2 detections:
- Impact damage, players and NPCS, hit by the Frontal part of the skill will receive impact damage.
- Players and NPCS who stay within the skill area will receive AoE damage (Damage per Second)
But that inst the Skill hitbox, that is only the effects on client, the is the real hitbox on server:
https://gyazo.com/1c79381d2f132b95b51620cf00e8c3aa
So i tried use Touched and GetTouchingParts on that way:
Part.Touched:Connect(function() end) --Cause the part is cancollide off
while Part do
for i,v in pairs(Part:GetTouchingParts()) do
print(v.Name)
end
RunService.HeartBeat:Wait()
end
But for any reason only print “BetterBlasePlate”, that is because the part is moving so fast, and GetTouchingParts() cant detect that fast, so i need a another way to make detect correctly, i tried A LOT but i cant, if anyone can helpme found a better way.
That is the full Code:
--//Services
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TweenService = game:GetService("TweenService")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
--//Modules
local Casting = require(game:GetService("ServerStorage").Modules.CheckCastingSkill)
local CheckSkill = require(ServerStorage.Modules.CheckCanSkill)
local Damage = require(ServerStorage.Modules.DamageManager)
local Stun = require(game:GetService("ServerStorage").BadEffects.Stun)
local Shield = require(game:GetService("ServerStorage").Modules.Shields)
local LerpAP = require(game:GetService("ReplicatedStorage").Modules.LerpAPI)
local DelayManager = require(ServerStorage.Modules.DelayManager)
local Effects = require(ServerStorage.Modules.Effects)
local Skills = require(script.Parent.Parent.Script.Skills)
local DamageManager = require(ServerStorage.Modules.DamageManager)
--// Remotes Event
local StunEvent = ServerStorage.Events.Stun
local PureBlaster = ReplicatedStorage.Skills.Pure.PureBlaster.Remotes.PureBlaster
local PureEffects = ReplicatedStorage.Skills.Pure.PureBlaster.Remotes.PureEffects
local PureClients = ReplicatedStorage.Skills.Pure.PureBlaster.Remotes.PureClients
local PureB = {}
PureB.__index = PureB
function PureB.New(player,T,D,slot,Stage)
if Stage == 2 then
Casting.RemoveCast(player.UserId,0)
Skills.Cooldown(player,0,"PureBlaster",slot)
else
local newPure = {}
setmetatable(newPure,PureB)
newPure.Name = "PureBlaster"
newPure.T = T
newPure.D = D
newPure.Stage = 1
newPure.Slot = slot
newPure.Player = player
newPure.Size = 100
newPure.Particles = ReplicatedStorage.Skills.Pure.PureBlaster.Meshes.Particles:Clone()
newPure.Particles.Parent = workspace
newPure.Particles.PureParticle.Parent = newPure.Player.Character:WaitForChild("LeftHand")
newPure.Particles.PureParticle2.Parent = newPure.Player.Character:WaitForChild("RightHand")
newPure.Model = ReplicatedStorage.Skills.Pure.PureBlaster.Meshes.Model:Clone()
newPure.Model.Parent = workspace
newPure.Model.Name = player.Name.." PureBlaster"
newPure.Model.BlasterP.Transparency = 0.8
newPure.Model.BlasterP.Size = newPure.Model.BlasterP.Size + Vector3.new(5,0,0)
print("IS here cframe "..newPure.Player.Character:WaitForChild("HumanoidRootPart").CFrame.X..newPure.Player.Character:WaitForChild("HumanoidRootPart").CFrame.Y..newPure.Player.Character:WaitForChild("HumanoidRootPart").CFrame.Z)
print("SENSE ?"..DelayManager.getPredict(100,0.2,T,D))
newPure.Model.BlasterP.CFrame = newPure.Player.Character:WaitForChild("HumanoidRootPart").CFrame * CFrame.new(0,3,-2)
return newPure
end
end
function PureB:Damage(Part)
while Part do
for i,v in pairs(Part:GetTouchingParts())do
if not v:IsDescendantOf(self.Player.Character) then
print(v.Name)
end
end
RunService.Heartbeat:Wait()
end
end
function PureB:Finish()
print("FINISHDIN GALL")
Casting.RemoveCast(self.Player.UserId,0)
Skills.Cooldown(self.Player,10,self.Name,self.Slot)
self:Destroy()
end
function PureB:Destroy()
self.Model:Destroy()
self = nil
end
function PureB:CreateEffects(Values)
local Players = game:GetService("Players"):GetPlayers()
if self.Stage == 1 then
self.Stage = 2
print("sseting stage 2")
elseif self.Stage == 2 then
PureEffects:FireAllClients(time(),self.Player.Character:WaitForChild("HumanoidRootPart").CFrame,2,Values,self.Player.Character:WaitForChild("Humanoid"))
self.Stage = 0
self.Player.Character:WaitForChild("LeftHand").PureParticle.Rate = 0
self.Player.Character:WaitForChild("RightHand").PureParticle2.Rate = 0
wait(0.5)
self.Player.Character:WaitForChild("LeftHand").PureParticle:Destroy()
self.Player.Character:WaitForChild("RightHand").PureParticle2:Destroy()
print("sseting stage 0")
end
end
function PureB:Fire()
self.Model.BlasterP.Touched:Connect(function() end)
coroutine.wrap(function()
self:Damage(self.Model.BlasterP)
end)()
wait(0.2)
self.Model.BlasterP.CFrame = self.Player.Character:WaitForChild("HumanoidRootPart").CFrame * CFrame.new(0,3,-2)
self.Model.BlasterP.Orientation = self.Model.BlasterP.Orientation + Vector3.new(0,-90,0)
local Tween = TweenService:Create(self.Model.BlasterP,TweenInfo.new(0.2),{
CFrame = self.Model.BlasterP.CFrame * CFrame.new(-95,0,0)
})
Tween.Completed:Connect(function()
self:Finish()
end)
self:CreateEffects({0.2})
Tween:Play()
end
function PureB:CanFire()
if self.Stage == 1 then
print("STAGE 1")
self:CreateEffects()
elseif self.Stage == 2 then
print("STAGE 2")
self:Fire()
else
return
end
end
return PureB