Ad
Still have questions? Join our Discord server and get real time help.
Log in to vote
0

BodyForce Not Working Properly for Unanchored Part?

Asked by 2 days ago

I'm working on a gun that fires out bullets like any typical one. I've had to unanchor the bullets to allow them to trigger collisions, and since doing so will make them affected by gravity, I've attached a BodyForce them. However, what ends up happening is that the bullets end up going vertically rather than to the target. What did I do wrong? Here's the snippet that deals with gravity:

local force = Instance.new("BodyForce")
force.Parent = bullet
local mass = bullet:GetMass()
bullet.BodyForce.Force = Vector3.new(0, 1, 0) * mass * game.Workspace.Gravity

and here's the entire serverscript in case you need it:

local weapon = script.Parent
local fireRemote = weapon.Fire
local configs = weapon.Configuration
local speed = configs.Speed.Value
local dropDistance = configs.DropDistance.Value
local damage = configs.Damage.Value
local dropAngle = configs.DropAngle.Value

local function CreateFire(startPosition, direction, playerteam)
    local range = 1.5
    local ray, object, position
    local bullet = Instance.new("Part")
    bullet.Name = "basicbullet"
    bullet.FormFactor = Enum.FormFactor.Custom
    bullet.Anchored = false
    bullet.CanCollide = false
    bullet.Massless = false
    bullet.Locked = true
    bullet.Parent = game.Workspace
    local force = Instance.new("BodyForce")
    force.Parent = bullet
    local mass = bullet:GetMass()
    bullet.BodyForce.Force = Vector3.new(0, 1, 0) * mass * game.Workspace.Gravity
    local teamtag = Instance.new("StringValue")
    teamtag.Value = playerteam
    teamtag.Name = "team"
    teamtag.Parent = bullet
    print(teamtag.Value)
    game:GetService("Debris"):AddItem(bullet, range)

    local function RayCast()
        ray = Ray.new(bullet.CFrame.p, bullet.CFrame.LookVector * speed)
        object, position = game.Workspace:FindPartOnRayWithIgnoreList(ray, {weapon.Parent}, false, true)
        if object and bullet and object.CanCollide then
            local humanoid = object.Parent:FindFirstChildWhichIsA("Humanoid")
            if humanoid then
                humanoid:TakeDamage(damage)
            end
            game:GetService("Debris"):AddItem(bullet, 0.01)
            bullet = nil
        end
    end
    bullet.Color = Color3.fromRGB(255, 150, 0)
    bullet.Material = Enum.Material.Neon
    bullet.Transparency = 0
    bullet.Size = Vector3.new(0.2, 0.2, 2)
    bullet.CFrame = CFrame.new(startPosition, startPosition + direction) * CFrame.new(0, 0, 0)
    RayCast()
    local createBulletTrajectory = coroutine.wrap(function()
        while bullet do
            bullet.CFrame = bullet.CFrame * CFrame.new(0, 0, -speed) * CFrame.Angles(-dropAngle, 0, 0)
            RayCast()
            wait()
        end
    end)
    createBulletTrajectory()
end
fireRemote.OnServerEvent:Connect(function(player, mousePos, startPos)
    local direction = (mousePos - startPos).Unit
    local team = "neutral"
    if game.Players:FindFirstChild(player.Name).Team == game.Teams.Black then
        team = "black"
    else
        team = "red"
    end
    CreateFire(startPos, direction, team)
end)

I would also really appreciate it if you could help me with this: https://scriptinghelpers.org/questions/116122/assign-player-to-team-on-join

Thanks for your help :)

Answer this question