So, I have made a raycast pistol. I use tweening to move the bullet along the ray. Although I have encountered a problem, when I set the bullets to move along quickly (as they should) they do not visualize at the correct place, being several studs off. I tried tinkering with the trail in the block which is being moved along, but realized it's in the script, if I lower it to lower speeds the bullets visualize great, and are not off. Is there any way to fix this or is this just due to the roblox engine and is out of my control?
Gyazo GIF of normal (fast speed) bullets: https://gyazo.com/b693caffa5c605839ef9d5f52e9e4d89
Gyazo GIF of slowed down bullets: https://gyazo.com/24b701898a1c559bcf28b1654d218b44
Script, I've highlighted the bullet visualization part between 2 lines so it's easier to find:
local Present = true
local RS = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local tab = {workspace.IgnoreModel}
local first = true
local Hole
local Part,Position,Normal
script.Parent.BulletEvent.OnServerEvent:Connect(function(Player, FromP, ToP, BulletPos)
if script.Parent.AbleToShoot.Value == true then
if first == true then
table.insert(tab, Player.Character)
first = false
end
local RayCast = Ray.new(FromP,(ToP-FromP).unit*500)
Part,Position,Normal = game.Workspace:FindPartOnRayWithIgnoreList(RayCast,tab,false,true)
local Dist = (ToP-FromP).magnitude
if not Dist then Dist = 300 end
Hole = game.ReplicatedStorage:FindFirstChild("GlockBulletHole"):Clone()
-------------------------------------------------------------------
local projectile = script.Parent.Bullet.Projectile:Clone()
projectile.Parent = game.Workspace
projectile.CFrame = CFrame.new(BulletPos, ToP)
projectile.Tracer.Enabled = true
local Info = TweenInfo.new(
(ToP-script.Parent.Parts.BE.Position).magnitude/457,
Enum.EasingStyle.Sine,
Enum.EasingDirection.Out,
0,
false,
0
)
local Goals =
{
Position = ToP
}
local BulletTween = TweenService:Create(projectile, Info, Goals)
BulletTween:Play()
if (ToP-script.Parent.Parts.BE.Position).magnitude <= 1000 then
game.Debris:AddItem(projectile, (ToP-script.Parent.Parts.BE.Position).magnitude/457)
elseif (ToP-script.Parent.Parts.BE.Position).magnitude > 1000 then
game.Debris:AddItem(projectile, 2.2)
end
end
-------------------------------------------------------------------
wait((ToP-script.Parent.Parts.BE.Position).magnitude/457)
if Part ~= nil then
Hole.Parent = Part
Hole.Position = Position
Hole.Material = Part.Material
Hole.Color = Part.Color
Hole.CFrame = CFrame.new(Hole.Position, Hole.Position+Normal)
table.insert(tab, Hole)
local breakoffParts = {Instance.new("Part", workspace),Instance.new("Part", workspace),Instance.new("Part", workspace),Instance.new("Part", workspace)}
for i, v in pairs(breakoffParts) do
v.Position = Hole.Position
v.Orientation = Vector3.new(math.random(0,360),math.random(0,360),math.random(0,360))
local mesh = Instance.new("SpecialMesh", v)
mesh.MeshType = Enum.MeshType.Wedge
v.Size = Vector3.new(0.05,0.05,0.05)
v.Material = Part.Material
v.Color = Part.Color
v.Transparency = Part.Transparency
v.Reflectance = Part.Reflectance
v.Velocity = Vector3.new(math.random(-5,5),math.random(-5,5),math.random(-5,5))
table.insert(tab, v)
game.Debris:AddItem(v, 2)
end
if Part.Material == Enum.Material.Slate or Part.Material == Enum.Material.Sand or Part.Material == Enum.Material.Pebble or Part.Material == Enum.Material.Brick or Part.Material == Enum.Material.Concrete or Part.Material == Enum.Material.Cobblestone or Part.Material == Enum.Material.Granite or Part.Material == Enum.Material.Marble or Part.Material == Enum.Material.Wood or Part.Material == Enum.Material.WoodPlanks or Part.Material == Enum.Material.Plastic or Part.Material == Enum.Material.SmoothPlastic then
Hole.Dust.Enabled = true
end
if Part.Material == Enum.Material.Wood or Part.Material == Enum.Material.WoodPlanks then
Hole.Splinter.Enabled = true
end
if Part.Material == Enum.Material.Glass then
if Part.CanCollide == true then
Part.CanCollide = false
local BreakSound = script.Parent.Glass:Clone()
BreakSound.Parent = Part
BreakSound:Play()
game.Debris:AddItem(BreakSound, BreakSound.TimeLength)
Part.CanCollide = false
if Part:FindFirstChild("Shatter") == nil then
local eft = script.Parent.Shatter:Clone()
eft.Parent = Part
eft.Enabled = true
eft.Color = ColorSequence.new(Part.Color)
eft.Transparency = NumberSequence.new(Part.Transparency)
Hole.H1.Transparency = 1
Hole.H2.Transparency = 1
end
else
Hole.H1.Transparency = 1
Hole.H2.Transparency = 1
end
end
if Part.Material == Enum.Material.Slate or Part.Material == Enum.Material.Pebble or Part.Material == Enum.Material.Brick or Part.Material == Enum.Material.Concrete or Part.Material == Enum.Material.Cobblestone or Part.Material == Enum.Material.Granite or Part.Material == Enum.Material.Marble then
Hole.Rock.Enabled = true
Hole.Rock.Color = ColorSequence.new(Part.Color)
end
if Part.Material == Enum.Material.ForceField then
Hole.Energy.Enabled = true
Hole.H1.Transparency = 1
Hole.H2.Transparency = 1
end
if Part.Material == Enum.Material.Plastic or Part.Material == Enum.Material.SmoothPlastic or Part.Material == Enum.Material.Foil then
Hole.Plastic.Enabled = true
Hole.Plastic.Color = ColorSequence.new(Part.Color)
end
if Part.Material == Enum.Material.Metal or Part.Material == Enum.Material.DiamondPlate or Part.Material == Enum.Material.CorrodedMetal then
Hole.Sparks.Enabled = true
end
if Part.Material == Enum.Material.Grass then
Hole.Grass.Enabled = true
Hole.Grass.Color = ColorSequence.new(Part.Color)
end
if Part.Material == Enum.Material.Fabric then
Hole.Fabric.Enabled = true
Hole.Fabric.Color = ColorSequence.new(Part.Color)
Hole.TornFabric.Enabled = true
Hole.TornFabric.Color = ColorSequence.new(Part.Color)
end
Hole.H1.Color3 = Part.Color
Hole.H2.Color3 = Part.Color
local Weld = Instance.new("Weld")
Weld.Part0 = Part
Weld.Part1 = Hole
Weld.C0 = Part.CFrame:Inverse()
Weld.C1 = Hole.CFrame:Inverse()
Weld.Parent = Hole
if Part and Part.Parent:FindFirstChild("Humanoid") ~= nil then
for i, v in pairs(breakoffParts) do
v:Destroy()
end
local bleed = script.Parent.Bleeding:Clone()
bleed.Parent = Part.Parent:FindFirstChild("Humanoid")
bleed.Value = true
local damage = 10
if Part.Name == "Head" then
damage = math.random(50,70)
bleed.BleedDamage.Value = 42
end
if Part.Name == "Torso" or Part.Name == "HumanoidRootPart" then
damage = math.random(20,22.5)
bleed.BleedDamage.Value = 50
end
if Part.Parent:IsA("Accessory") then
if (Part.Position-Part.Parent.Parent.Head.Position).magnitude > (Part.Position-Part.Parent.Parent.Torso.Position).magnitude then
damage = math.random(20,25)
bleed.BleedDamage.Value = 50
elseif (Part.Position-Part.Parent.Parent.Head.Position).magnitude < (Part.Position-Part.Parent.Parent.Torso.Position).magnitude then
damage = math.random(50,70)
bleed.BleedDamage.Value = 42
end
end
Part.Parent.Humanoid:TakeDamage(damage)
Hole.BloodCloud.Enabled = true
Hole.Bleed.Enabled = true
Hole.Blood.Enabled = true
Hole.Dust.Enabled = false
Hole.Splinter.Enabled = false
Hole.Rock.Enabled = false
Hole.Plastic.Enabled = false
Hole.Grass.Enabled = false
Hole.Fabric.Enabled = false
Hole.H1.Transparency = 1
Hole.H2.Transparency = 1
Hole.B1.Transparency = 0.4
Hole.B2.Transparency = 0.4
else if Part.Parent.Parent:FindFirstChild("Humanoid") and Part ~= nil then
for i, v in pairs(breakoffParts) do
v:Destroy()
end
local bleed = script.Parent.Bleeding:Clone()
bleed.Parent = Part.Parent:FindFirstChild("Humanoid")
bleed.Value = true
local damage = 10
if Part.Name == "Head" then
damage = math.random(50,70)
bleed.BleedDamage.Value = 42
end
if Part.Name == "Torso" or Part.Name == "HumanoidRootPart" then
damage = math.random(20,25)
bleed.BleedDamage.Value = 50
end
Part.Parent.Parent:FindFirstChild("Humanoid"):TakeDamage(damage)
Hole.BloodCloud.Enabled = true
Hole.Bleed.Enabled = true
Hole.Blood.Enabled = true
Hole.Dust.Enabled = false
Hole.Splinter.Enabled = false
Hole.Rock.Enabled = false
Hole.Grass.Enabled = false
Hole.Plastic.Enabled = false
Hole.Fabric.Enabled = false
Hole.H1.Transparency = 1
Hole.H2.Transparency = 1
Hole.B1.Transparency = 0.4
Hole.B2.Transparency = 0.4
end
end
Hole.Dust.Color = ColorSequence.new(Part.Color)
end
if Part then
if Part.Parent ~= nil then
game.Debris:AddItem(Hole,15)
end
end
end)
