Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How can I make this projectile fire in the right direction?

I am very new to scripting so I'm sorry if this scripts untidiness makes you cringe.

local tool = script.Parent
local player = tool.Parent.Parent
local mouse = player:GetMouse()
local root = player.Character.HumanoidRootPart


tool.RemoteEvent.OnServerEvent:connect(function(player,mousehit)
	if player.Character:FindFirstChild("multiattackprevention") then return end
	local multiattackprevention = Instance.new("StringValue")
	multiattackprevention.Parent = player.Character
	multiattackprevention.Name = ("multiattackprevention")
	local hitcooldown = false
	local animation = player.Character.Humanoid:LoadAnimation(player.Character:FindFirstChild("SuperJump"))
	animation:Play()
	wait(0.5)
	local bv = Instance.new("BodyVelocity")
	bv.Parent = player.Character.Torso
	bv.Velocity = Vector3.new(0,200,0)
	wait(0.7)
	bv:Destroy()
	root.CFrame = mouse.Origin
	player.Character.Head.Anchored = true
	local animation = player.Character.Humanoid:LoadAnimation(tool.Cast)
	animation:Play()
	wait(0.4)
	local projectile = Instance.new("Part")
	projectile.Transparency = 1
	projectile.Parent = game.Workspace
	projectile.Position = player.Character:FindFirstChild("Right Arm").Position
	projectile.CanCollide = false
	projectile.TopSurface = ("Smooth")
	projectile.BottomSurface = ("Smooth")
	projectile.Size = Vector3.new(10,10,10)
	local fireparticle = Instance.new("Fire")
	fireparticle.Parent = projectile
	fireparticle.Size = 20
	fireparticle.Heat = 25
	local bv = Instance.new("BodyVelocity")
	bv.Parent = projectile	
	bv.MaxForce = Vector3.new(1e8,1e8,1e8)	
	bv.Velocity =  root.CFrame.p * 150
	local sound = Instance.new("Sound")
	wait(0.2)
	multiattackprevention:Destroy()
	projectile.CanCollide = true
	player.Character.Head.Anchored = false
	projectile.Touched:connect(function(hit)
		projectile.Anchored = true
		fireparticle.Size = 30
		bv.Velocity = mousehit.lookVector * 0
		if hitcooldown == true then return end
		local enemy = hit.Parent:FindFirstChild("Humanoid")
		if enemy == player.Character.Humanoid then return end
		if enemy then
			enemy.Health = enemy.Health - 250
			hitcooldown = true
			wait(1)
			projectile:Destroy()
		else wait(1)
			projectile:Destroy()
			wait(3)
		end
	end)	
	wait(10)
	projectile:Destroy()
	multiattackprevention:Destroy()
end)	

This works with no output error, however the projectile doesn't spawn.

The error is to do with:

bv.Velocity =  root.CFrame.p * 150

I know this because when I put:

bv.Velocity = mousehit.lookVector * 150

the projectile fires, just in the wrong direction.

What should I make bv.Velocity equal to?

2 comments

0

use raycasting!1!! stop using terrible roblox physics!!1

0

bv.Velocity = (root.Position - mousehit.p).unit * 150. Normalise the two vectors then multiply by an arbitrary speed (in this case 150)

3 answers

✓ Accepted answer

If you want your projectile to fire in the direction the player's torso is facing, which is what it seems like, you were very close. When you had:

bv.Velocity =  root.CFrame.p * 150

The projectile DID spawn, it was just moving so quickly you couldn't catch a glimpse of it, because you used position, which is usually a large value, so your projectile went shooting off at the speed of sound. What you want is lookVector, which is the unit vector of the direction a CFrame is facing.

bv.Velocity =  root.CFrame.lookVector * 150

Enjoy :)

Also, a tip: When using Instance.new(), you can assign a parent instantly, without using another line. Just put a comma, and then what you want to parent the new object to.

 local bv = Instance.new("BodyVelocity", player.Character.Torso)

--Instead of 

local bv = Instance.new("BodyVelocity")
bv.Parent = player.Character.Torso

1 comment

0

Thank you very much!

Here's an idea

  1. Make the projectile face to where the mouse is
projectile.CFrame = CFrame.new(projectile.CFrame,(mouse.hit.p.x,mouse.hit.p.y,mouse.hit.p.z))
  1. Make the BodyVelocity go to where the projectile is facing

If you want the BodyVelocity's velocity to "face" your mouse.

Projectile.MaxForce = Vector3.new(1e8,1e8,1e8)
Projectile.Velocity = (mouse.hit.p - root.Position).unit * bulletSpeed

To make the projectile face your mouse. (Makes the projectile look nicer)

Projectile.CFrame = CFrame.new(Projectile.Position, mouse.hit.p)

You can get the mouse using the player got from the RemoteEvent.

Here's my gun's script. Don't blame me for untidy lines, I just wanted to make it quick.

--Defines
local tool = script.Parent
local fire = tool.Fire
local remote = tool:WaitForChild("RemoteEvent")

--Settings
local damage = 40 -- Headshot damage is * 2.5
local bulletSpeed = 500 -- Don't go for too much please

--Startup
if tool.Parent:IsA("Model") then
	if game.Players:GetPlayerFromCharacter(tool.Parent) then
		for i,v in pairs(tool:GetChildren()) do
			if v:IsA("Part") or v:IsA("BasePart") then
				v.CanCollide = false
			end
		end
	else
		for i,v in pairs(tool:GetChildren()) do
			if v:IsA("Part") or v:IsA("BasePart") then
				v.CanCollide = true
			end
	    end
	end
else
	for i,v in pairs(tool:GetChildren()) do
		if v:IsA("Part") or v:IsA("BasePart") then
			v.CanCollide = true
		end
	end
end
--CanCollide stuff
tool.AncestryChanged:Connect(function()
	if tool.Parent:IsA("Model") then
		if game.Players:GetPlayerFromCharacter(tool.Parent) then
			for i,v in pairs(tool:GetChildren()) do
				if v:IsA("Part") or v:IsA("BasePart") then
					v.CanCollide = false
				end
			end
		else
		    for i,v in pairs(tool:GetChildren()) do
			    if v:IsA("Part") or v:IsA("BasePart") then
				    v.CanCollide = true
			    end
		    end
	    end
	else
		for i,v in pairs(tool:GetChildren()) do
			if v:IsA("Part") or v:IsA("BasePart") then
				v.CanCollide = true
			end
		end
	end
end)

--Functions
local function getChildrenWithClassProvided(index, class)
	for i,v in pairs(index:GetChildren()) do
		if v:IsA(class) then
			return v
		end
	end
end

local function onRemoteFired(plr, cmd, value1, value2)
	if cmd == "fire" then
		-- value1 is end point, value2 is the spread
		-- Yay realistic bullet xd
		local root = plr.Character.HumanoidRootPart
		local startPos = fire.Position
		local bullet = Instance.new("Part")
		bullet.Parent = game.Workspace
		--Properties
		bullet.Anchored = true
		bullet.CanCollide = false
		bullet.BrickColor = BrickColor.new("New Yeller")
		bullet.Material = Enum.Material.Neon
		bullet.Size = Vector3.new(0.25, 0.25, 2.5)
		bullet.CFrame = CFrame.new(startPos, value1)
		bullet.Transparency = 1
		bullet.Name = "Bullet"
		--Realistic effects
		fire.smoke.Enabled = true
		fire.flash.Enabled = true
		fire.light.Enabled = true
		wait(0.1)
		fire.smoke.Enabled = false
		fire.flash.Enabled = false
		fire.light.Enabled = false
		bullet.Transparency = 0
		bullet.Anchored = false
	    local bulletLight = Instance.new("PointLight")
	    bulletLight.Brightness = 10
	    bulletLight.Range = 6
	    bulletLight.Color = Color3.new(255, 255, 127)
	    bulletLight.Enabled = true
	    bulletLight.Shadows = true
	    bulletLight.Parent = bullet
	    bulletLight.Name = "Light"
	    --Movement
	    --A lot of physic and math stuff that will get your brain explode
	    local mouse = plr:GetMouse()
	    local direction = (value1 - fire.Position).unit
	    local spawnPos = fire.Position + direction * 2
	    bullet.Velocity = direction * 100 -- yay more math
	    bullet.CFrame = CFrame.new(bullet.Position, mouse.hit.p)
	    local bodyForce = Instance.new("BodyVelocity")
	    bodyForce.Parent = bullet
	    bodyForce.MaxForce = Vector3.new(1e8,1e8,1e8)
	    bodyForce.Velocity = (mouse.hit.p - root.Position).unit * bulletSpeed
	    bullet.Touched:Connect(function(part)
		    if part.Parent:IsA("Model") then
		        local enemyhum = getChildrenWithClassProvided(part.Parent, "Humanoid")
		        if enemyhum then
			        if enemyhum ~= tool.Parent.Humanoid then
			            local dmgpt = damage
			            if part.Name == "Head" or part.Parent:IsA("Accessory") then -- That hurt .-.
				            dmgpt = dmgpt * 2.5 -- Instant kill
			            end
			            enemyhum:TakeDamage(dmgpt)
				        bullet:Destroy()
				    end
		        end
		    end
	    end)
	   game:GetService("Debris"):AddItem(bullet, 2.5) -- Remove bullet if it's here too long
	end
end

remote.OnServerEvent:Connect(onRemoteFired)

It's unfinished so don't try.

This discussion is preserved as it was. New answers, comments, and votes are closed.