This is my server side script. When I shoot the weapon of choice most of the bullets are laggy. if clicking rapidly, bullets fly at set velocity. My question is, am I able to fix this. Also in the firefunction() how would i code in a player holding the mouse, coding that client side and bringing a boolean over to verify if the player is holding the mouse or not simply doesn't work.
local itemstore = require(game:GetService("ServerScriptService"):WaitForChild("Modules"):WaitForChild("ItemDatabase"))
local RE = game:GetService("ReplicatedStorage"):WaitForChild("Events"):WaitForChild("GunFiredEvent")
local TS = game:GetService("TweenService")
local goal = {}
local guntype = nil
local dmg = nil
local firerate = nil
local magazine = nil
local canfire = nil
local velocity = nil
RE.OnServerEvent:Connect(function(player, tool, weapon, firing, mousepos)
for i,v in pairs(itemstore.Weapons) do
print(tostring(i))
if i == weapon then
for x,y in pairs(v) do
-- gather item statistics
if x == "guntype" then
guntype = y
print("Weapon: "..guntype)
end
if x == "dmg" then
dmg = y
print("Damage: "..dmg)
end
if x == "firerate" then
firerate = y/60
print("Firerate (in rounds per second): "..firerate)
end
if x == "velocity" then
velocity = y
print("Velocity (in studs per second): "..velocity)
end
end
end
end
firefunction(player, tool, weapon, firing, mousepos)
end)
function firefunction(player, tool, weapon, firing, mousepos)
--if firing then -- [[Bullethole generation]]
-- local ray = Ray()
-- print(player.Name.." has fired weapon: "..weapon)
-- local x = Instance.new("Part")
-- x.Position = mouse
-- x.Parent = workspace
if firing then --add support for automatic weaponry
firing = false
local tip = tool:FindFirstChild("Tip")
local origin = tip.Position
local direction = (mousepos - origin).Unit
local result = workspace:Raycast(origin, direction*100)
local intersection = result and result.Position or origin + direction*300
local distance = (origin - intersection).Magnitude
local bullet = game:GetService("ServerStorage"):WaitForChild("Bullet"):Clone()
bullet.CFrame = CFrame.new(origin, intersection)*CFrame.new(0,0,-distance)
bullet.Position = tip.Position
bullet.Size = Vector3.new(.05,.05,.5)
bullet.Anchored = true
bullet.Parent = workspace
bullet.Touched:Connect(function(hit)
if hit.Parent.Name ~= weapon and hit.Parent.Name ~= player and hit.Parent.Parent.Name ~= player then
local hum = hit.Parent:FindFirstChild("Humanoid")
if hum ~= nil and hum.Parent.Name ~= player then
hum:TakeDamage(dmg)
end
end
end)
if mousepos ~= nil then
goal.Position = mousepos
else
goal.Position = origin + direction*300
end
local bullettime = distance/velocity
local tinfo = TweenInfo.new(bullettime)
local tween = TS:Create(bullet, tinfo, goal)
tween:Play()
game:GetService("Debris"):AddItem(bullet, bullettime)
firing = true
end
end

2 comments
Oh, and I am also having a hit detection issue. if anyone knows a better way to do it please feel free to fix it.
I fixed the hit detection issue by just not using the .Touched event as it is unreliable. Instead I now deal damage with the raycast itself and simply project the bullet for visuals.